@rongcloud/plugin-call 5.1.2 → 5.2.0
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/README.md +11 -249
- package/dist/index.d.ts +961 -13
- package/dist/index.esm.js +2589 -15
- package/dist/index.umd.js +6 -15
- package/package.json +13 -21
- package/dist/RCCallClient.d.ts +0 -127
- package/dist/RCCallSession.d.ts +0 -237
- package/dist/enums.d.ts +0 -14
- package/dist/eventEmitter.d.ts +0 -4
- package/dist/helper.d.ts +0 -2
- package/dist/index.js +0 -16
- package/dist/interface.d.ts +0 -320
- package/dist/logger.d.ts +0 -4
- package/dist/timer.d.ts +0 -12
- package/dist/utils.d.ts +0 -9
- package/dist/validation.d.ts +0 -15
package/dist/index.umd.js
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-call-engine"),require("@rongcloud/plugin-rtc")):"function"==typeof define&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-call-engine","@rongcloud/plugin-rtc"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).RCCall={},e.RCEngine,e.RCCallEngine,e.RCRTC)}(this,(function(e,o,t,i){"use strict";
|
|
2
|
-
/*! *****************************************************************************
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
purpose with or without fee is hereby granted.
|
|
7
|
-
|
|
8
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
9
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
10
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
11
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
12
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
13
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
15
|
-
***************************************************************************** */function s(e,o,t,i){return new(t||(t=Promise))((function(s,r){function n(e){try{a(i.next(e))}catch(e){r(e)}}function l(e){try{a(i.throw(e))}catch(e){r(e)}}function a(e){var o;e.done?s(e.value):(o=e.value,o instanceof t?o:new t((function(e){e(o)}))).then(n,l)}a((i=i.apply(e,o||[])).next())}))}var r;!function(e){e[e.CALLER=1]="CALLER",e[e.CALLEE=2]="CALLEE"}(r||(r={}));var n=new class{constructor(){this.list={}}on(e,o){return(this.list[e]||(this.list[e]=[])).push(o),this}once(e,o){const t=i=>{this.off(e,t),o.call(this,i)};t.fun=o,this.on(e,t)}off(e,o){const t=this.list[e];if(!t)return!1;if(o){let e;for(let i=0,s=t.length;i<s;i++)if(e=t[i],e===o||e.fun===o){t.splice(i,1);break}}else t&&(t.length=0)}emit(e,o){const t=[...this.list[e]];if(!t||0===t.length)return!1;t.forEach((e=>{e.call(this,o)}))}};const l=e=>{if(!e)return{result:!1,msg:"Initialization missing parameter -> options"};if("object"!=typeof e)return{result:!1,msg:"Initialization options must be an object"};const i=Object.keys(e),s=[];return["rtcClient","onSession","onSessionClose"].forEach((e=>{i.includes(e)||s.push(e)})),s.length?{result:!1,msg:`Initialization missing parameter -> "${s.join(",")}"`}:"object"!=typeof e.rtcClient?{result:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:"function"!=typeof e.onSession?{result:!1,msg:"Initialization 'onSession' parameter must be of type 'function'"}:"function"!=typeof e.onSessionClose?{result:!1,msg:"Initialization 'onSessionClose' parameter must be of type 'function'"}:void 0!==e.isAllowSubscribeRetry&&"boolean"!=typeof e.isAllowSubscribeRetry?{result:!1,msg:"Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'"}:void 0!==e.isAllowPublishRetry&&"boolean"!=typeof e.isAllowPublishRetry?{result:!1,msg:"Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'"}:void 0!==e.isOffCameraWhenVideoDisable&&"boolean"!=typeof e.isOffCameraWhenVideoDisable?{result:!1,msg:"Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'"}:void 0===e.joinType||(r=e.joinType,Object.values(o.RTCJoinType).includes(r))?void 0!==e.isAllowDemotionGetStream&&"boolean"!=typeof e.isAllowDemotionGetStream?{result:!1,msg:"Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'"}:void 0===e.lang||function(e){return Object.values(t.RCCallLanguage).includes(e)}(e.lang)?void 0===e.logLevel||function(e){return Object.values(o.LogLevel).includes(e)}(e.logLevel)?void 0!==e.logStdout&&"function"!=typeof e.logStdout?{result:!1,msg:"Initialization 'logStdout' parameter must be of type 'function'"}:{result:!0}:{result:!1,msg:"Initialization 'logLevel' parameter must be of type correct type"}:{result:!1,msg:"Initialization 'lang' parameter must be of type correct type"}:{result:!1,msg:"Initialization 'joinType' parameter must be of type correct type"};var r},a=e=>{if(!e)return{result:!1,msg:"missing parameter -> listener"};if("object"!=typeof e)return{result:!1,msg:"listener must be an object"};const o=Object.keys(e),t=[];return["onRinging","onAccept","onHungup","onTrackReady"].forEach((e=>{o.includes(e)||t.push(e)})),t.length?{result:!1,msg:`missing parameter -> "${t.join(",")}"`}:"function"!=typeof e.onRinging?{result:!1,msg:"'onRinging' parameter must be of type 'function'"}:"function"!=typeof e.onAccept?{result:!1,msg:"'onAccept' parameter must be of type 'function'"}:"function"!=typeof e.onHungup?{result:!1,msg:"'onHungup' parameter must be of type 'function'"}:"function"!=typeof e.onTrackReady?{result:!1,msg:"'onTrackReady' parameter must be of type 'function'"}:{result:!0}},c=e=>e&&"string"==typeof e?{result:!0}:{result:!1,msg:"'targetId' parameter is required, must be of type 'string'"},C=e=>e===t.RCCallMediaType.AUDIO||e===t.RCCallMediaType.AUDIO_VIDEO?{result:!0}:{result:!1,msg:"'mediaType' parameter is required, must be of type 'RCCallMediaType'"},d=e=>"string"==typeof e?{result:!0}:{result:!1,msg:"'extra' parameter must be of type 'string'"},u=e=>"string"==typeof e?{result:!0}:{result:!1,msg:"'pushTitle' parameter must be of type 'string'"},h=e=>"string"==typeof e?{result:!0}:{result:!1,msg:"'pushContent' parameter must be of type 'string'"},_=e=>Array.isArray(e)&&e.length?e.every((e=>"string"==typeof e&&e.length>0))?{result:!0}:{result:!1,msg:"'userIds' parameter is required"}:{result:!1,msg:"'userIds' parameter is required, must be of type 'string[]'"};class R{constructor(e,o){this._timerId=0,this._startTime=0,e&&(this._timerId=((e,o)=>setTimeout(e,o))((()=>{e()}),o)),this._startTime=Date.now()}stop(){clearTimeout(this._timerId);const e=Date.now();let o=e-this._startTime;return 0===this._startTime&&(o=0),{startTime:this._startTime,endTime:e,duration:o}}reset(){this._startTime=0}}class g{constructor(e,o,i,r={}){this._stateMachine=e,this._rtcClient=o,this._logger=i,this._options=r,this._listener=null,this._RETRYCOUNT=2,this.joinRoomTimer=null,this._stateMachine.registerEventListener({onUserStateChange:({user:e,reason:o})=>{this._logger.info("_",`[RCCallSession onUserStateChange] userId->${null==e?void 0:e.userId} state->${null==e?void 0:e.state} reason->${o}`)},onStateChange:e=>s(this,void 0,void 0,(function*(){const{state:o,reason:i}=e;if(this._logger.info("_",`[RCCallSession onStateChange] : state->${o} reason->${i}`),o===t.RCCallSessionState.KEEPING){const e=this._stateMachine.getCallId();this._logger.info("_",`[RCCallSession onStateChange] roomId: ${e}`);try{yield this._joinRoom(e)}catch(o){this._exceptionClose(t.RCCallEndReason.NETWORK_ERROR),this._logger.error("_",`[RCCallSession onStateChange] joinRoom throw exception roomId -> ${e}`),console.error(o)}}else if(o===t.RCCallSessionState.END){if(!this._room){this._options.localTracks&&this._destroyTracks(this._options.localTracks);const e=this._stateMachine.getSummary();return void n.emit("sessionClose",{session:this,summaryInfo:e})}this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._logger.info("_","[RCCallSession onStateChange] localTracks destroyed"),this._leaveRoom(),this._room=null}})),onRinging:e=>{this._logger.info("_",`[RCCallSession onRinging]sender: sender.userId -> ${e.userId}`);try{this._listener.onRinging(e,this)}catch(e){this._logger.error("_","[RCCallSession onRinging] method exception -> onRinging"),console.error(e)}},onAccept:e=>{this._logger.info("_",`[RCCallSession onAccept]sender: sender.userId -> ${e.userId}`);try{this._listener.onAccept(e,this)}catch(e){this._logger.error("_","[RCCallSession onAccept] method exception -> onAccept"),console.error(e)}},onHungup:(e,o)=>{this._logger.info("_",`[RCCallSession onHungup]sender: sender.userId -> ${e.userId} reason->${o}`);try{this._listener.onHungup(e,o,this)}catch(e){this._logger.error("_","[RCCallSession onHungup] method exception -> onHungup"),console.error(e)}},onMemberModify:({sender:e,invitedUsers:o})=>{this._logger.info("_",`[RCCallSession onMemberModify] sender.userId -> ${e.userId}`);try{this._listener.onMemberModify(e,o,this)}catch(e){this._logger.error("_","[RCCallSession onMemberModify] method exception -> onMemberModify"),console.error(e)}},onMediaModify:({sender:e,mediaType:o})=>{this._logger.info("_",`[RCCallSession onMediaModify]sender: sender.userId -> ${e.userId} mediaType: ${o}`),o===t.RCCallMediaType.AUDIO&&this._setMediaTypeToAudio();try{this._listener.onMediaModify(e,o,this)}catch(e){this._logger.error("_","[RCCallSession onMediaModify] method exception -> onMediaModify"),console.error(e)}},crossAppkey:e=>{this._logger.info("_",`[RCCallSession crossAppkey] 是否跨 appkey: ${e}`),this._options.isCrossAppkey=e}});const{pushTitle:l,pushContent:a}=this._options.hungupPushConfig;this._stateMachine.setHungupPushConfig(l,a)}_joinRoom(e){return s(this,void 0,void 0,(function*(){let o;try{o=this._options.isCrossAppkey?yield this._rtcClient.joinCrossRTCRoom(e,this._options.joinType):yield this._rtcClient.joinRTCRoom(e,this._options.joinType);const{code:s,userIds:r,room:n}=o;if(s!==i.RCRTCCode.SUCCESS)return s===i.RCRTCCode.NOT_OPEN_VIDEO_AUDIO_SERVER&&this._exceptionClose(t.RCCallEndReason.SERVICE_NOT_OPENED),s===i.RCRTCCode.SIGNAL_JOIN_RTC_ROOM_REFUSED?this._exceptionClose(t.RCCallEndReason.OTHER_CLIENT_IN_CALL):this._exceptionClose(t.RCCallEndReason.NETWORK_ERROR),this._logger.info("_",`[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${s}`),{code:t.RCCallErrorCode.JOIN_ROOM_ERROR};if(this._stateMachine.getState()===t.RCCallSessionState.END)return yield this._rtcClient.leaveRoom(n),this._room=null,{code:t.RCCallErrorCode.SUCCESS};r.length<1&&(this.joinRoomTimer=new R((()=>{this._exceptionClose(t.RCCallEndReason.REMOTE_NETWORK_ERROR)}),6e4)),this._room=n}catch(o){return this._exceptionClose(t.RCCallEndReason.NETWORK_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`),console.error(o),{code:t.RCCallErrorCode.JOIN_ROOM_ERROR}}this._registerRoomEventListener(),this._registerReportListener();try{yield this._subscribeInRoomRemoteTrack()}catch(o){return this._exceptionClose(t.RCCallEndReason.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`),console.error(o),{code:t.RCCallErrorCode.JOIN_ROOM_ERROR}}try{yield this._publish()}catch(o){return this._exceptionClose(t.RCCallEndReason.PUBLISH_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`),console.error(o),{code:t.RCCallErrorCode.JOIN_ROOM_ERROR}}return{code:t.RCCallErrorCode.SUCCESS}}))}_subscribeInRoomRemoteTrack(){return s(this,void 0,void 0,(function*(){const e=this._room.getRemoteTracks();if(e.length){const{code:o}=yield this._subscribeRetry(e,this._options.isAllowSubscribeRetry,this._RETRYCOUNT);o!==i.RCRTCCode.SUCCESS&&(this._exceptionClose(t.RCCallEndReason.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${o}`))}}))}_subscribeRetry(e,o=!1,t=0){return s(this,void 0,void 0,(function*(){const{code:s}=yield this._room.subscribe(e);if(s!==i.RCRTCCode.SUCCESS){try{this._listener.onTrackSubscribeFail&&this._listener.onTrackSubscribeFail(s,this)}catch(e){this._logger.error("_","[RCCallSession] _listener.onTrackSubscribeFail exception"),console.error(e)}if(!o)return{code:s};if(t>0)return t--,this._subscribeRetry(e,o,t)}return{code:s}}))}_publish(){return s(this,void 0,void 0,(function*(){const e=this._options.localTracks,{code:o}=yield this._publishRetry(e,this._options.isAllowPublishRetry,this._RETRYCOUNT);if(o!==i.RCRTCCode.SUCCESS)return this._exceptionClose(t.RCCallEndReason.PUBLISH_ERROR),void this._logger.info("_",`[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${o}`);this._options.produceType===r.CALLEE&&this._notifyTrackReady(e)}))}_publishRetry(e,o=!1,t=0){return s(this,void 0,void 0,(function*(){const{code:s}=yield this._room.publish(e);if(s!==i.RCRTCCode.SUCCESS){try{this._listener.onTrackPublishFail&&this._listener.onTrackPublishFail(s,this)}catch(e){this._logger.error("_","[RCCallSession] _listener.onTrackPublishFail exception"),console.error(e)}if(!o)return{code:s};if(t>0)return t--,this._publishRetry(e,o,t)}return{code:s}}))}_leaveRoom(){return s(this,void 0,void 0,(function*(){try{const e=yield this._rtcClient.leaveRoom(this._room);this._logger.info("_",`[RCCallSession _leaveRoom] Successfully exited the room code: ${e.code}`)}catch(e){this._logger.error("_","[RCCallSession _leaveRoom] leaveRoom throw exception"),console.error(e)}finally{const e=this._stateMachine.getSummary();n.emit("sessionClose",{session:this,summaryInfo:e})}}))}_exceptionClose(e){this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._stateMachine.close(e)}registerSessionListener(e){const o=a(e);if(!o.result)throw new Error(`[RCCallSession registerSessionListener] ${o.msg}`);this._listener=Object.assign({},e)}_getLocalTrackCore(e,o){return s(this,void 0,void 0,(function*(){if(e===t.RCCallMediaType.AUDIO){const{code:e,track:s}=yield this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",o&&o.audio&&Object.assign({},o.audio));return e!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio local tracks failed RCT code -> ${e}`),{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"),{code:t.RCCallErrorCode.SUCCESS,tracks:[s]})}{const{code:e,tracks:s}=yield this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",o&&Object.assign({},o));return e!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio and Video local tracks failed RCT code -> ${e}`),{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"),{code:t.RCCallErrorCode.SUCCESS,tracks:s})}}))}_getLocalTrack(e,o){return s(this,void 0,void 0,(function*(){if(this._options.isAllowDemotionGetStream&&e===t.RCCallMediaType.AUDIO_VIDEO){const{code:e,tracks:i}=yield this._getLocalTrackCore(t.RCCallMediaType.AUDIO_VIDEO,o);if(e!==t.RCCallErrorCode.SUCCESS){const{code:e,tracks:i}=yield this._getLocalTrackCore(t.RCCallMediaType.AUDIO,o);return e!==t.RCCallErrorCode.SUCCESS?(this._exceptionClose(t.RCCallEndReason.GET_MEDIA_RESOURCES_ERROR),{code:e}):{code:e,tracks:i}}return{code:e,tracks:i}}{const{code:i,tracks:s}=yield this._getLocalTrackCore(e,o);return i!==t.RCCallErrorCode.SUCCESS?(this._exceptionClose(t.RCCallEndReason.GET_MEDIA_RESOURCES_ERROR),{code:i}):{code:i,tracks:s}}}))}changeAudioDevice(e){return s(this,void 0,void 0,(function*(){const o=[],s=[],{code:r,track:n}=yield this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",e);if(r!==i.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession changeDevice] get local Audio tracks failed RCTLib code -> ${r}`),{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_TRACK_ERROR};if(this._options.localTracks&&this._options.localTracks.forEach((e=>{e.isAudioTrack()||s.push(e)})),o.push(n),s.push(n),this._options.localTracks=s,this._notifyTrackReady(o),this._room){const{code:e}=yield this._room.publish(o);if(e!==i.RCRTCCode.SUCCESS)return{code:t.RCCallErrorCode.AUDIO_PUBLISH_ERROR}}return{code:t.RCCallErrorCode.SUCCESS}}))}invite(e,o={}){var t,i;return s(this,void 0,void 0,(function*(){const{extra:s=""}=o,{pushTitle:r="",pushContent:n=""}=(null===(t=this._options.callPushConfig)||void 0===t?void 0:t.pushTitle)||(null===(i=this._options.callPushConfig)||void 0===i?void 0:i.pushContent)?this._options.callPushConfig:o,l=[_(e),d(s),u(r),h(n)],a=[];if(!l.every((e=>(!e.result&&a.push(e.msg),e.result))))throw new Error(`[RCCallClient invite] ${a.join("\n")}`);const{code:c}=yield this._stateMachine.invite(e,{extra:s,pushTitle:r,pushContent:n});return{code:c}}))}accept(e){return s(this,void 0,void 0,(function*(){const o=(e=>{return e&&e.audio&&void 0!==e.audio.micphoneId&&"string"!=typeof e.audio.micphoneId?{result:!1,msg:"'constraints.audio.micphoneId' must be of type 'string'"}:e&&e.audio&&void 0!==e.audio.sampleRate&&"number"!=typeof e.audio.sampleRate?{result:!1,msg:"'constraints.audio.sampleRate' must be of type 'number'"}:e&&e.video&&void 0!==e.video.cameraId&&"string"!=typeof e.video.cameraId?{result:!1,msg:"'constraints.video.cameraId' must be of type 'string'"}:e&&e.video&&void 0!==e.video.frameRate&&"string"!=typeof e.video.frameRate?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:e&&e.video&&void 0!==e.video.frameRate&&(o=e.video.frameRate,!["FPS_10","FPS_15","FPS_24","FPS_30"].includes(o))?{result:!1,msg:"'frameRate' value is out of range"}:e&&e.video&&void 0!==e.video.resolution&&"string"!=typeof e.video.resolution?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:e&&e.video&&void 0!==e.video.resolution&&!function(e){return["W176_H132","W176_H144","W256_H144","W320_H180","W240_H240","W320_H240","W480_H360","W640_H360","W480_H480","W640_H480","W720_H480","W1280_H720","W1920_H1080"].includes(e)}(e.video.resolution)?{result:!1,msg:"'resolution' value is out of range"}:!e||!e.video||e.video.frameRate&&e.video.resolution?{result:!0}:{result:!1,msg:"'resolution' and 'resolution' is required"};var o})(e);if(!o.result)throw new Error(`[RCCallSession accept] ${o.msg}`);n.emit("hungupOtherSession",{session:this});const i=this._stateMachine.getMediaType(),{code:s,tracks:r}=yield this._getLocalTrack(i,e);if(s!==t.RCCallErrorCode.SUCCESS)return{code:s};this._options.localTracks=r;const{code:l}=yield this._stateMachine.accept();return l!==t.RCCallErrorCode.SUCCESS?(this._logger.error("_",`[RCCallSession accept]Send accept message failed -> code: ${l}`),{code:l}):{code:l}}))}hungup(){return s(this,void 0,void 0,(function*(){return this._stateMachine.hungup()}))}_changeMediaType(e){return s(this,void 0,void 0,(function*(){const{code:o}=yield this._stateMachine.changeMediaType(e);return o!==t.RCCallErrorCode.SUCCESS&&this._logger.error("_",`[RCCallSession _changeMediaType] change media type fail code-> ${o}`),{code:o}}))}_getLocalVideoTracks(){let e=[];return this._room?(this._options.localTracks&&(e=this._options.localTracks.filter((e=>e.isVideoTrack()))),e):e}_getLocalAudioTracks(){let e=[];return this._room?(this._options.localTracks&&(e=this._options.localTracks.filter((e=>e.isAudioTrack()))),e):e}_setMediaTypeToAudioAndVideo(){return s(this,void 0,void 0,(function*(){const{code:e,track:o}=yield this._rtcClient.createCameraVideoTrack();if(e!==i.RCRTCCode.SUCCESS)return{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR};const{code:s}=yield this._room.publish([o]);s===i.RCRTCCode.SUCCESS?(this._notifyTrackReady([o]),this._changeMediaType(t.RCCallMediaType.AUDIO_VIDEO)):this._logger.error("_",`[RCCallSession _enableVideo] Resource publishing failed: RCRTCCode -> ${e}`)}))}_setMediaTypeToAudio(){return s(this,void 0,void 0,(function*(){const e=this._getLocalVideoTracks();if(e.length){e.forEach((e=>{e.mute()}));const{code:o}=yield this._room.unpublish(e);o!==i.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${o}`),this._destroyTracks(e)}}))}descendAbility(){return s(this,void 0,void 0,(function*(){const{code:e}=yield this._changeMediaType(t.RCCallMediaType.AUDIO);return e===t.RCCallErrorCode.SUCCESS&&this._setMediaTypeToAudio(),{code:e}}))}disableVideoTrack(){return s(this,void 0,void 0,(function*(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${t.RCCallErrorCode.NOT_IN_ROOM_ERROR}`),{code:t.RCCallErrorCode.NOT_IN_ROOM_ERROR};const e=this._getLocalVideoTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableVideoTrack] Room missing video track -> ${t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR}`),{code:t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR};if(e.forEach((e=>{e.mute()})),!this._options.isOffCameraWhenVideoDisable)return{code:t.RCCallErrorCode.SUCCESS};const{code:o}=yield this._room.unpublish(e);return o!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${o}`),{code:t.RCCallErrorCode.UNPUBLISH_VIDEO_ERROR}):(e.forEach((e=>{e.destroy()})),{code:t.RCCallErrorCode.SUCCESS})}))}enableVideoTrack(){return s(this,void 0,void 0,(function*(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${t.RCCallErrorCode.NOT_IN_ROOM_ERROR}`),{code:t.RCCallErrorCode.NOT_IN_ROOM_ERROR};if(!this._options.isOffCameraWhenVideoDisable){const e=this._getLocalVideoTracks();return e.length?(e.forEach((e=>{e.unmute()})),{code:t.RCCallErrorCode.SUCCESS}):(this._logger.error("_",`[RCCallSession EnableVideoTrack] Room missing video track -> ${t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR}`),{code:t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR})}const{code:e,track:o}=yield this._rtcClient.createCameraVideoTrack();if(e!==i.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession EnableVideoTrack] Get Resource failed: RCRTCCode -> ${e}`),{code:t.RCCallErrorCode.GET_LOCAL_VIDEO_TRACK_ERROR};const s=[];this._options.localTracks&&this._options.localTracks.forEach((e=>{e.isVideoTrack()?e.destroy():s.push(e)})),s.push(o),this._options.localTracks=s,o.mute();const{code:r}=yield this._room.publish([o]);return r!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession EnableVideoTrack] Resource publishing failed: RCRTCCode -> ${e}`),{code:t.RCCallErrorCode.VIDEO_PUBLISH_ERROR}):(o.unmute(),this._notifyTrackReady([o]),{code:t.RCCallErrorCode.SUCCESS})}))}disableAudioTrack(){return s(this,void 0,void 0,(function*(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${t.RCCallErrorCode.NOT_IN_ROOM_ERROR}`),{code:t.RCCallErrorCode.NOT_IN_ROOM_ERROR};this._getLocalAudioTracks().forEach((e=>{e.mute()}))}))}enableAudioTrack(){return s(this,void 0,void 0,(function*(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${t.RCCallErrorCode.NOT_IN_ROOM_ERROR}`),{code:t.RCCallErrorCode.NOT_IN_ROOM_ERROR};const e=this._getLocalAudioTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR}`),{code:t.RCCallErrorCode.MISSING_VIDEO_TRACK_ERROR};e.forEach((e=>{e.unmute()}))}))}_destroyTracks(e){e.forEach((e=>{e.destroy()}))}_notifyTrackReady(e){e.forEach((e=>{try{this._listener.onTrackReady(e,this)}catch(e){this._logger.error("_","[RCCallSession _notifyTrackReady] _listener onTrackReady exception"),console.error(e)}}))}_registerRoomEventListener(){this._room.registerRoomEventListener({onKickOff:(e,o)=>{const s=this._rtcClient.getCurrentId();this._stateMachine.userLeave([s]),e?(o===i.RCKickReason.SERVER_KICK&&this._exceptionClose(t.RCCallEndReason.KICKED_BY_SERVER),o===i.RCKickReason.OTHER_KICK&&this._exceptionClose(t.RCCallEndReason.OTHER_CLIENT_JOINED_CALL)):this._exceptionClose(t.RCCallEndReason.NETWORK_ERROR)},onMessageReceive(e,o,t,i){},onRoomAttributeChange(e,o){},onAudioMuteChange:e=>{this._logger.info("_",`[RCCallSession onAudioMuteChange] userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const o={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"audio",trackId:e.getTrackId()};try{this._listener.onAudioMuteChange(o,this)}catch(e){this._logger.error("_","[RCCallSession onAudioMuteChange] Missing listening method -> onTrackMuteChange"),console.error(e)}},onVideoMuteChange:e=>{this._logger.info("_",`[RCCallSession onVideoMuteChange]userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const o={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"video",trackId:e.getTrackId()};try{this._listener.onVideoMuteChange(o,this)}catch(e){this._logger.error("_","[RCCallSession onVideoMuteChange] Missing listening method -> onVideoMuteChange"),console.error(e)}},onTrackPublish:e=>s(this,void 0,void 0,(function*(){if(this._room){const{code:o}=yield this._room.subscribe(e);o!==i.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession onTrackPublish] subscribe failed RTCCode ->${o}`)}})),onTrackUnpublish:e=>{},onTrackReady:e=>{this._stateMachine.getMediaType()===t.RCCallMediaType.AUDIO&&e.isVideoTrack()||this._notifyTrackReady([e])},onUserJoin:e=>{this.joinRoomTimer&&this.joinRoomTimer.stop(),this._stateMachine.userJoin(e)},onUserLeave:e=>{this._logger.info("_",`[RCCallSession onUserLeave] listening onUserLeave userIds -> ${null==e?void 0:e.join(",")}`),this._stateMachine.userLeave(e)},onPing:e=>{this._logger.info("_",`[RCCallSession onPing]${e}`);try{this._listener.onPing&&this._listener.onPing(e,this)}catch(e){this._logger.error("_","[RCCallSession onPing] listening onPing exception"),console.error(e)}}})}_registerReportListener(){this._room.registerReportListener({onStateReport:e=>{try{this._listener.onRTCStateReport&&this._listener.onRTCStateReport(e,this)}catch(e){this._logger.error("_","[RCCallSession onStateReport] listener onStateReport exception"),console.error(e)}},onICEConnectionStateChange:e=>{try{this._listener.onICEConnectionStateChange&&this._listener.onICEConnectionStateChange(e,this)}catch(e){this._logger.error("_","[RCCallSession onICEConnectionStateChange] onICEConnectionStateChange exception"),console.error(e)}}})}getSessionId(){return this._stateMachine.getCallId()}getRTCSessionId(){return this._room?this._room.getSessionId():null}getTargetId(){return this._stateMachine.getTargetId()}getConversationType(){return this._stateMachine.getConversationType()}getChannelId(){return this._stateMachine.getChannelId()}getRemoteUsers(){return this._stateMachine.getRemoteUsers()}getUsers(){return this._stateMachine.getRemoteUsers()}getUserState(e){if(!e||"string"!=typeof e)throw new Error("userId is required, must be of type 'string'");return this._stateMachine.getUserState(e)}getState(){return this._stateMachine.getState()}getCallerId(){return this._stateMachine.getCallerId()}getMediaType(){return this._stateMachine.getMediaType()}}class p{constructor(e,i,s,r){this._context=e,this._runtime=i,this._logger=s,this._sessionList=[],this._callPushConfig={},this._hungupPushConfig={},this._rtcClient=r.rtcClient,this._options=Object.assign({isAllowPublishRetry:!1,isAllowSubscribeRetry:!1,isOffCameraWhenVideoDisable:!0,joinType:o.RTCJoinType.COEXIST,isAllowDemotionGetStream:!1,lang:t.RCCallLanguage.ZH},r),this._callEngine=new t.RCCallEngine(this._context,i,this._logger,{onInvite:this._onInvite.bind(this),onOfflineRecord:this._onOfflineRecord.bind(this)},{lang:this._options.lang||t.RCCallLanguage.ZH}),n.on("sessionClose",(({session:e,summaryInfo:o})=>{this._removeSession(e);try{this._options.onSessionClose(e,o)}catch(e){this._logger.error("_","[RCCCallClient] options.onSessionClose exception"),console.log(e)}})),n.on("hungupOtherSession",(({session:e})=>{const o=e.getSessionId();this._logger.info("_",`[RCCallClient hungupOtherSession] sessionId ready to accept -> ${o}`),this._logger.info("_",`[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map((e=>e.getSessionId())).join(",")}`);let t=0;for(;this._sessionList.length>1;)this._sessionList[t].getSessionId()!==o?(this._sessionList[t].hungup(),this._sessionList.splice(t,1)):t++;this._logger.info("_",`[RCCallClient hungupOtherSession] current sessionList length ->${this._sessionList.length}`)}))}_onInvite(e,o){this._logger.info("_","[RCCallClient _onInvite] Received invite message");const t=new g(e,this._rtcClient,this._logger,{isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:r.CALLEE,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});this._logger.info("_","[RCCallClient _onInvite] Received invite message, successfully created session"),this._sessionList.push(t);try{this._options.onSession(t,o)}catch(e){this._logger.error("_","[RCCallClient _options.onSession] onSession exception"),console.log(e)}if(!t._listener)throw this._logger.error("_","[RCCallClient _options.onSession] session Must Have Listener"),new Error("[RCCallSession _options.onSession] session Must Have Listener");{const e=a(t._listener);if(!e.result)throw new Error(e.msg)}}_onOfflineRecord(e){try{this._options.onOfflineRecord&&this._options.onOfflineRecord(e)}catch(e){this._logger.error("_","[RCCallClient _options.onOfflineRecord] onOfflineRecord exception"),console.log(e)}}registerUserInfo(e={}){this._callEngine.registerUserInfo(e),this._logger.info("_","[RCCallClient registerUserInfo] successfully register user info data")}startCrossCall({targetId:e,mediaType:o=t.RCCallMediaType.AUDIO,listener:i,constraints:r,channelId:n="",extra:l="",pushTitle:a="",pushContent:c="",bitrate:C}){return s(this,void 0,void 0,(function*(){return this.__call({targetId:e,mediaType:o,listener:i,constraints:r,channelId:n,extra:l,pushTitle:a,pushContent:c,bitrate:C,isCrossAppkey:!0})}))}call({targetId:e,mediaType:o=t.RCCallMediaType.AUDIO,listener:i,constraints:r,channelId:n="",extra:l="",pushTitle:a="",pushContent:c="",bitrate:C}){return s(this,void 0,void 0,(function*(){return this.__call({targetId:e,mediaType:o,listener:i,constraints:r,channelId:n,extra:l,pushTitle:a,pushContent:c,bitrate:C})}))}__call({targetId:e,mediaType:o=t.RCCallMediaType.AUDIO,listener:i,constraints:n,channelId:l="",extra:_="",pushTitle:R="",pushContent:p="",bitrate:f,isCrossAppkey:m=!1}){return s(this,void 0,void 0,(function*(){const{pushTitle:s="",pushContent:S=""}=this._callPushConfig.pushTitle||this._callPushConfig.pushContent?this._callPushConfig:{pushTitle:R,pushContent:p};this._logger.info("_",`[RCCallClient call] extra->${_} pushTitle->${s} pushContent->${S}`);const T=[c(e),C(o),a(i),d(_),u(s),h(S)],y=[];if(!T.every((e=>(!e.result&&y.push(e.msg),e.result))))throw new Error(`[RCCallClient call] ${y.join("\n")}`);let E=[];const{code:I,tracks:b}=yield this._getLocalTrack(o,n);if(I!==t.RCCallErrorCode.SUCCESS)return{code:I};E=b,E.forEach((e=>{var o,t,s;e.isAudioTrack()&&(null==f?void 0:f.audio)&&e.setBitrate(null==f?void 0:f.audio),e.isVideoTrack()&&(null==f?void 0:f.video)&&e.setBitrate(null===(o=null==f?void 0:f.video)||void 0===o?void 0:o.max,null===(t=null==f?void 0:f.video)||void 0===t?void 0:t.min,null===(s=null==f?void 0:f.video)||void 0===s?void 0:s.start),i.onTrackReady(e)}));const{code:v,stateMachine:O}=yield this._callEngine.call(l,e,o,_,s,S,m);if(v===t.RCCallErrorCode.SUCCESS&&O){this._logger.info("_","[RCCallClient call] successfully created state machine");const e=new g(O,this._rtcClient,this._logger,{localTracks:E,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:r.CALLER,isCrossAppkey:m,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return e.registerSessionListener(i),this._sessionList.push(e),this._logger.info("_",`[RCCallClient call] successfully created session object, sessionId: ${e.getSessionId()}`),{code:v,session:e}}return this._logger.error("_",`[RCCallClient call] call failed code ->: ${v}`),E.forEach((e=>{e.mute(),e.destroy()})),{code:v}}))}callInGroup({targetId:e,userIds:o,mediaType:i=t.RCCallMediaType.AUDIO,listener:n,constraints:l,channelId:R="",extra:p="",pushTitle:f="",pushContent:m="",bitrate:S}){return s(this,void 0,void 0,(function*(){const{pushTitle:s="",pushContent:T=""}=this._callPushConfig.pushTitle||this._callPushConfig.pushContent?this._callPushConfig:{pushTitle:f,pushContent:m},y=[c(e),_(o),C(i),a(n),d(p),u(s),h(T)],E=[];if(!y.every((e=>(!e.result&&E.push(e.msg),e.result))))throw new Error(`[RCCallClient callInGroup] ${E.join("\n")}`);let I=[];const{code:b,tracks:v}=yield this._getLocalTrack(i,l);if(b!==t.RCCallErrorCode.SUCCESS)return{code:b};I=v,I.forEach((e=>{var o,t,i;e.isAudioTrack()&&(null==S?void 0:S.audio)&&e.setBitrate(null==S?void 0:S.audio),e.isVideoTrack()&&(null==S?void 0:S.video)&&e.setBitrate(null===(o=null==S?void 0:S.video)||void 0===o?void 0:o.max,null===(t=null==S?void 0:S.video)||void 0===t?void 0:t.min,null===(i=null==S?void 0:S.video)||void 0===i?void 0:i.start),n.onTrackReady(e)}));const{code:O,stateMachine:k}=yield this._callEngine.callInGroup(R,e,i,o,p,s,T);if(O===t.RCCallErrorCode.SUCCESS&&k){this._logger.info("_","[RCCallClient callInGroup] successfully created state machine");const e=new g(k,this._rtcClient,this._logger,{localTracks:I,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:r.CALLER,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return e.registerSessionListener(n),this._sessionList.push(e),this._logger.info("_",`[RCCallClient callInGroup] successfully created session object, sessionId: ${e.getSessionId()}`),{code:O,session:e}}return this._logger.info("_",`[RCCallClient callInGroup] callInGroup failed code -> ${O}`),I.forEach((e=>{e.mute(),e.destroy()})),{code:O}}))}_getLocalTrackCore(e,o){return s(this,void 0,void 0,(function*(){if(e===t.RCCallMediaType.AUDIO){const{code:e,track:s}=yield this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",o&&o.audio&&Object.assign({},o.audio));return e!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio local tracks failed RCT code -> ${e}`),{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get Audio local tracks"),{code:t.RCCallErrorCode.SUCCESS,tracks:[s]})}{const{code:e,tracks:s}=yield this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",o&&Object.assign({},o));return e!==i.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio and Video local tracks failed RCT code -> ${e}`),{code:t.RCCallErrorCode.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get audio and video local tracks"),{code:t.RCCallErrorCode.SUCCESS,tracks:s})}}))}_getLocalTrack(e,o){return s(this,void 0,void 0,(function*(){if(this._options.isAllowDemotionGetStream&&e===t.RCCallMediaType.AUDIO_VIDEO){const{code:e,tracks:i}=yield this._getLocalTrackCore(t.RCCallMediaType.AUDIO_VIDEO,o);if(e!==t.RCCallErrorCode.SUCCESS){const{code:e,tracks:i}=yield this._getLocalTrackCore(t.RCCallMediaType.AUDIO,o);return e!==t.RCCallErrorCode.SUCCESS?{code:e}:{code:e,tracks:i}}return{code:e,tracks:i}}{const{code:i,tracks:s}=yield this._getLocalTrackCore(e,o);return i!==t.RCCallErrorCode.SUCCESS?{code:i}:{code:i,tracks:s}}}))}_removeSession(e){const o=e.getSessionId();this._sessionList=this._sessionList.filter((e=>e.getSessionId()!==o))}getJoinedRoomInfo(){return s(this,void 0,void 0,(function*(){const{code:e,data:i}=yield this._context.getRTCJoinedUserInfo(this._context.getCurrentId());return e!==o.ErrorCode.SUCCESS?(this._logger.error("_",`getJoinedUserInfo error code: ${e}`),{code:t.RCCallErrorCode.QUERY_JOINED_USER_INFO_ERROR}):{code:t.RCCallErrorCode.SUCCESS,data:i}}))}setPushConfig(e={},o={}){const t=[e,o].map((e=>(e=>{const{pushTitle:o="",pushContent:t=""}=e,i=[];return i.push(u(o)),i.push(h(t)),i})(e)))[0],i=[];if(!t.every((e=>(!e.result&&i.push(e.msg),e.result))))throw new Error(`[RCCallClient callInGroup callPushConfig or hungupPushConfig] ${i.join("\n")}`);this._callPushConfig=e,this._hungupPushConfig=o}}o.VersionManage.add("plugin-call","5.1.2");const f={tag:"RCCall",verify:e=>"browser"===e.tag,setup(e,t,i){const s=l(i);if(!s.result)throw new Error(`[RCCallLib installer steup]${s.msg}`);if(!o.VersionManage.validEngine("^5.7.3"))throw new Error(`The current engine version '${o.VersionManage.getInfo().engine}' error, plugin-call required engine version at least '^5.7.3'.`);const r=e.createLogger("RCCall","RTC");return r.warn("_","RCCall Version: 5.1.2, Commit: 89ba2ed5a9c788362ba96f084fdc3c18106a64c4"),new p(e,t,r,i)}};Object.defineProperty(e,"RCCallEndReason",{enumerable:!0,get:function(){return t.RCCallEndReason}}),Object.defineProperty(e,"RCCallErrorCode",{enumerable:!0,get:function(){return t.RCCallErrorCode}}),Object.defineProperty(e,"RCCallLanguage",{enumerable:!0,get:function(){return t.RCCallLanguage}}),Object.defineProperty(e,"RCCallMediaType",{enumerable:!0,get:function(){return t.RCCallMediaType}}),Object.defineProperty(e,"RCCallSessionState",{enumerable:!0,get:function(){return t.RCCallSessionState}}),Object.defineProperty(e,"RCCallUserState",{enumerable:!0,get:function(){return t.RCCallUserState}}),e.RCCallClient=p,e.RCCallSession=g,e.installer=f,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
1
|
+
(function(M,E){typeof exports=="object"&&typeof module<"u"?E(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],E):(M=typeof globalThis<"u"?globalThis:M||self,E(M.RCRTC={},M.RCEngine,M.RCRTC))})(this,function(M,E,m){"use strict";var Ne=Object.defineProperty;var Ae=(M,E,m)=>E in M?Ne(M,E,{enumerable:!0,configurable:!0,writable:!0,value:m}):M[E]=m;var f=(M,E,m)=>(Ae(M,typeof E!="symbol"?E+"":E,m),m);const oe=s=>{const e="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),t=e.length+1;let i=+s;const n=[];do{const o=i%t;i=(i-o)/t,n.unshift(e[o])}while(i);return n.join("")},re=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{const e=Math.random()*16|0;return(s==="x"?e:e&3|8).toString(16)}),q=()=>{let s=re();return s=`${s.replace(/-/g,"")}0`,s=parseInt(s,16),s=oe(s),s.length>22&&(s=s.slice(0,22)),s},X=()=>{const s=Math.floor(Math.random()*1e3);let e=q();return e=e.replace(/\//g,"0"),[e,Date.now(),s].join("_")},ae=(s,e)=>setTimeout(s,e),Z=new E.EventEmitter,Y=s=>{const e="RCCallDeviceId";let t=s.sessionStorage.getItem(e);return t||(t=q(),s.sessionStorage.setItem(e,t)),t};var k=(s=>(s[s.OUTGOING=1]="OUTGOING",s[s.INCOMING=2]="INCOMING",s[s.RINGING=3]="RINGING",s[s.CONNECTED=4]="CONNECTED",s[s.IDLE=5]="IDLE",s[s.ACCEPTED=6]="ACCEPTED",s))(k||{}),h=(s=>(s[s.SUCCESS=1e4]="SUCCESS",s[s.STATE_MACHINE_EXIT=53200]="STATE_MACHINE_EXIT",s[s.SEND_MSG_ERROR=53201]="SEND_MSG_ERROR",s[s.REJECTED_BY_BLACKLIST=53202]="REJECTED_BY_BLACKLIST",s[s.NOT_IN_GROUP=53203]="NOT_IN_GROUP",s[s.GET_LOCAL_AUDIO_TRACK_ERROR=53301]="GET_LOCAL_AUDIO_TRACK_ERROR",s[s.GET_LOCAL_VIDEO_TRACK_ERROR=53302]="GET_LOCAL_VIDEO_TRACK_ERROR",s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR=53303]="GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR",s[s.JOIN_ROOM_ERROR=53304]="JOIN_ROOM_ERROR",s[s.AUDIO_PUBLISH_ERROR=53305]="AUDIO_PUBLISH_ERROR",s[s.VIDEO_PUBLISH_ERROR=53306]="VIDEO_PUBLISH_ERROR",s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR=53307]="AUDIO_AND_VIDEO_PUBLISH_ERROR",s[s.QUERY_JOINED_USER_INFO_ERROR=53308]="QUERY_JOINED_USER_INFO_ERROR",s[s.MISSING_VIDEO_TRACK_ERROR=53309]="MISSING_VIDEO_TRACK_ERROR",s[s.UNPUBLISH_VIDEO_ERROR=53310]="UNPUBLISH_VIDEO_ERROR",s[s.CONVERSATION_NOT_GROUP_ERROR=53311]="CONVERSATION_NOT_GROUP_ERROR",s[s.NOT_IN_ROOM_ERROR=53312]="NOT_IN_ROOM_ERROR",s))(h||{}),u=(s=>(s[s.CANCEL=1]="CANCEL",s[s.REJECT=2]="REJECT",s[s.HANGUP=3]="HANGUP",s[s.BUSY_LINE=4]="BUSY_LINE",s[s.NO_RESPONSE=5]="NO_RESPONSE",s[s.ENGINE_UNSUPPORTED=6]="ENGINE_UNSUPPORTED",s[s.NETWORK_ERROR=7]="NETWORK_ERROR",s[s.GET_MEDIA_RESOURCES_ERROR=8]="GET_MEDIA_RESOURCES_ERROR",s[s.PUBLISH_ERROR=9]="PUBLISH_ERROR",s[s.SUBSCRIBE_ERROR=10]="SUBSCRIBE_ERROR",s[s.REMOTE_CANCEL=11]="REMOTE_CANCEL",s[s.REMOTE_REJECT=12]="REMOTE_REJECT",s[s.REMOTE_HANGUP=13]="REMOTE_HANGUP",s[s.REMOTE_BUSY_LINE=14]="REMOTE_BUSY_LINE",s[s.REMOTE_NO_RESPONSE=15]="REMOTE_NO_RESPONSE",s[s.REMOTE_ENGINE_UNSUPPORTED=16]="REMOTE_ENGINE_UNSUPPORTED",s[s.REMOTE_NETWORK_ERROR=17]="REMOTE_NETWORK_ERROR",s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR=18]="REMOTE_GET_MEDIA_RESOURCE_ERROR",s[s.REMOTE_PUBLISH_ERROR=19]="REMOTE_PUBLISH_ERROR",s[s.REMOTE_SUBSCRIBE_ERROR=20]="REMOTE_SUBSCRIBE_ERROR",s[s.OTHER_CLIENT_JOINED_CALL=21]="OTHER_CLIENT_JOINED_CALL",s[s.OTHER_CLIENT_IN_CALL=22]="OTHER_CLIENT_IN_CALL",s[s.KICKED_BY_SERVER=23]="KICKED_BY_SERVER",s[s.ACCEPT_SYSTEM_CALL=24]="ACCEPT_SYSTEM_CALL",s[s.REMOTE_OTHER_CLIENT_JOINED_CALL=31]="REMOTE_OTHER_CLIENT_JOINED_CALL",s[s.REMOTE_OTHER_CLIENT_IN_CALL=32]="REMOTE_OTHER_CLIENT_IN_CALL",s[s.REMOTE_KICKED_BY_SERVER=33]="REMOTE_KICKED_BY_SERVER",s[s.REMOTE_ACCEPT_SYSTEM_CALL=34]="REMOTE_ACCEPT_SYSTEM_CALL",s[s.ACCEPT_BY_OTHER_CLIENT=101]="ACCEPT_BY_OTHER_CLIENT",s[s.HANGUP_BY_OTHER_CLIENT=102]="HANGUP_BY_OTHER_CLIENT",s[s.ADDED_TO_BLACKLIST=103]="ADDED_TO_BLACKLIST",s[s.SERVICE_NOT_OPENED=104]="SERVICE_NOT_OPENED",s))(u||{});const V={[1]:11,[2]:12,[3]:13,[4]:14,[5]:15,[6]:16,[7]:17,[8]:18,[9]:19,[10]:20,[21]:31,[22]:32,[23]:33,[15]:5,[24]:34};var T=(s=>(s.VCInvite="RC:VCInvite",s.VCRinging="RC:VCRinging",s.VCAccept="RC:VCAccept",s.VCHangup="RC:VCHangup",s.VCModifyMem="RC:VCModifyMem",s.VCModifyMedia="RC:VCModifyMedia",s))(T||{}),S=(s=>(s[s.WAITING=0]="WAITING",s[s.KEEPING=1]="KEEPING",s[s.END=2]="END",s))(S||{}),p=(s=>(s[s.NONE=0]="NONE",s[s.WAITING=1]="WAITING",s[s.KEEPING=2]="KEEPING",s))(p||{}),H=(s=>(s[s.RCCallRoomTypeNormalCall=0]="RCCallRoomTypeNormalCall",s[s.RCCallRoomTypeAcrossCall=7]="RCCallRoomTypeAcrossCall",s))(H||{});let G=class{constructor(e,t){f(this,"_timerId",0);f(this,"_startTime",0);e&&(this._timerId=ae(()=>{e()},t)),this._startTime=Date.now()}stop(){clearTimeout(this._timerId);const e=Date.now();let t=e-this._startTime;return this._startTime===0&&(t=0),{startTime:this._startTime,endTime:e,duration:t}}reset(){this._startTime=0}};class z{constructor(e,t,i,n,o,r,a,_,l){f(this,"_sessionState",null);f(this,"_userInfo",{});f(this,"_userTimers",{});f(this,"_watchers");f(this,"_callTimeout",60*1e3);f(this,"_beginTimestamp",0);f(this,"_endTimestamp",0);f(this,"_endReason",null);f(this,"_callerId",null);f(this,"_inviterId",null);f(this,"_isCrossAppkey",!1);f(this,"_hungupPushTitle","");f(this,"_hungupPushContent","");this._context=e,this._runtime=t,this._logger=i,this._callMsgHandler=n,this._channelId=o,this._conversationType=r,this._targetId=a,this._mediaType=_,this._callId=l,this._callMsgHandler.registerStateMachineEvent(this._callId,"onRinging",this._onRinging.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onAccept",this._onAccept.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onMediaModify",this._onMediaModify.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onHungup",this._onHungup.bind(this))}_getTimeout(e){let t=this._context.getServerTime()-e;t<0&&(t=500);const i=this._callTimeout-t;return this._logger.warn("_",`_getTimeout -> timeout: ${i}`),i}_clearTimerById(e){this._logger.debug("_",`[RCCallStateMachine] before _clearTimerById -> userId: ${e} userTimers: ${JSON.stringify(this._userTimers)}`),this._userTimers[e]&&(this._userTimers[e].stop(),delete this._userTimers[e]),this._logger.debug("_",`[RCCallStateMachine] after _clearTimerById -> userTimers: ${JSON.stringify(this._userTimers)}`)}_notifyStateChange(e,t){var i;this._logger.warn("_",`[RCCallStateMachine] notifyStateChange -> info: ${JSON.stringify({state:e,reason:t})}`),this._endReason=t||null,this._sessionState!==e&&(this._sessionState=e,(i=this._watchers)==null||i.onStateChange({state:e,reason:t})),e===S.END&&(Z.emit("onStateMachineClose",this._callId),this._callMsgHandler.unregisterStateMachineEvent(this._callId))}_notifyUserStateChange(e,t){var i;this._logger.warn("_",`[RCCallStateMachine] notifyUserStateChange -> info: ${JSON.stringify({user:e,reason:t})}`),(i=this._watchers)==null||i.onUserStateChange({user:e,reason:t})}_otherClientHandle(e){const{senderUserId:t,content:{user:i,reason:n},messageType:o}=e;this._userInfo[t]={userId:t,state:p.NONE,isCaller:!1,isRemote:!1};for(const a in this._userTimers)this._clearTimerById(a);let r=u.ACCEPT_BY_OTHER_CLIENT;o===T.VCHangup&&(n===u.BUSY_LINE?r=u.OTHER_CLIENT_IN_CALL:n===u.NO_RESPONSE?r=u.NO_RESPONSE:r=u.HANGUP_BY_OTHER_CLIENT),Object.assign(this._userInfo[t],i),this._notifyUserStateChange(this._userInfo[t],r),this._notifyStateChange(S.END,r)}_isRemoteInvalidMsg(e,t){return!this._userInfo[e]||!this._userInfo[e].deviceId||!t?!1:this._userInfo[e].state===p.KEEPING&&this._userInfo[e].deviceId!==t}_onRinging(e){const{senderUserId:t,content:{user:i,deviceId:n}}=e,o=this._isCrossAppkey?t.split("_")[1]:t;if(this._isRemoteInvalidMsg(o,n)){this._logger.debug("_","[RCCallStateMachine] onRinging -> not the remote device that is currently talking");return}this._context.getCurrentId()!==o&&this._watchers.onRinging({userId:o,...i})}_onAccept(e){const{senderUserId:t,content:{user:i,deviceId:n},sentTime:o}=e,r=this._isCrossAppkey?t.split("_")[1]:t,a=this._context.getCurrentId();if(this._isRemoteInvalidMsg(r,n)){this._logger.debug("_","[RCCallStateMachine] _onAccept -> not the remote device that is currently talking");return}if(a===r){this._otherClientHandle(e);return}this._userTimers[r]&&this._clearTimerById(r),(this._conversationType===E.ConversationType.PRIVATE?[a,r]:[r]).forEach(l=>{const c=l===a;this._userInfo[l]={userId:l,state:p.KEEPING,isCaller:c,isRemote:c,deviceId:c?Y(this._runtime):n},c||(this._beginTimestamp=Date.now(),Object.assign(this._userInfo[r],i)),this._notifyUserStateChange(this._userInfo[l])}),this.getCallerId()===a&&this._notifyStateChange(S.KEEPING),this._watchers.onAccept({userId:r})}_onMediaModify(e){const{senderUserId:t,content:{mediaType:i,user:n,deviceId:o}}=e;if(this._isRemoteInvalidMsg(t,o)){this._logger.debug("_","[RCCallStateMachine] _onMediaModify -> not the remote device that is currently talking");return}this._context.getCurrentId()!==t&&(this._mediaType=i,this._watchers.onMediaModify({sender:{userId:t,...n},mediaType:i}))}_onHungup(e){const{senderUserId:t,content:i}=e,n=this._isCrossAppkey?t.split("_")[1]:t,{reason:o,user:r,deviceId:a}=i,_=this._context.getCurrentId();if(this._isRemoteInvalidMsg(n,a)){this._logger.debug("_","[RCCallStateMachine] _onHungup -> not the remote device that is currently talking");return}if(_===n){this._otherClientHandle(e);return}if(this._sessionState===S.END){this._logger.info("_",`[RCCallStateMachine] Invalid hang up message, current room status has ended -> sessionState: ${this._sessionState}`);return}this._userInfo[n]&&(this._userInfo[n].state=p.NONE,this._endTimestamp=Date.now(),Object.assign(this._userInfo[n],r),this._notifyUserStateChange(this._userInfo[n],V[o]),delete this._userInfo[n]),V[o]===u.REMOTE_CANCEL?this.getRemoteUserIds().length<1&&this._clearTimerById(_):this.getInviterId()===_?this._clearTimerById(n):this.getRemoteUserIds().length<1&&this._clearTimerById(_);const l=Object.keys(this._userInfo).length<2,c=this._inviterId===n,d=Object.values(this._userInfo).every(C=>C.state!==p.KEEPING);(l||c&&d)&&this._notifyStateChange(S.END,V[o]),this._watchers.onHungup({userId:n,...r},V[o])}registerEventListener(e){this._watchers=e}__onInvite(e){const{senderUserId:t,content:i,sentTime:n}=e,{inviteUserIds:o,user:r,deviceId:a,roomType:_}=i;let l;_===H.RCCallRoomTypeAcrossCall?([,l]=t.split("_"),this._watchers.crossAppkey(!0),this._isCrossAppkey=!0):l=t;const c=this._context.getCurrentId();if(this._isRemoteInvalidMsg(l,a)){this._logger.debug("_","[RCCallStateMachine] __onInvite -> not the remote device that is currently talking");return}if(c===l)return;this._callerId=this._inviterId=l;const d=[t,...o];this._callMsgHandler.sendRinging({conversationType:this._conversationType,targetId:this._targetId,channelId:this._channelId,callId:this._callId,userIds:d.filter(g=>this._isCrossAppkey?g.split("_")[1]!==c:g!==c)});const C=this._isCrossAppkey?[o[0].split("_")[1]]:o;[l,...C].forEach(g=>{this._userInfo[g]={userId:g,state:p.WAITING,isCaller:g===l,isRemote:g!==c},g===l&&Object.assign(this._userInfo[g],r,{deviceId:a}),this._notifyUserStateChange(this._userInfo[g]),g!==l&&(this._userTimers[g]=new G(()=>{const A=g===c?u.NO_RESPONSE:u.REMOTE_NO_RESPONSE;g===c?this._hungupHandle(A):(this._userInfo[g]&&(this._userInfo[g].state=p.NONE),this._notifyUserStateChange(this._userInfo[g]),this._watchers.onHungup(this._userInfo[g],A),delete this._userInfo[g])},this._getTimeout(n)))}),this._notifyStateChange(S.WAITING)}__onMemberModify(e){const{senderUserId:t,content:i,sentTime:n}=e,{user:o,existedUserPofiles:r,caller:a,deviceId:_,inviteUserIds:l,mediaType:c}=i,d=this._context.getCurrentId();if(this._isRemoteInvalidMsg(t,_)){this._logger.debug("_","[RCCallStateMachine] __onMemberModify -> not the remote device that is currently talking");return}if(d===t)return;if(this._callerId=a,this._inviterId=t,l.forEach(I=>{r.push({userId:I,mediaType:c,callStatus:k.INCOMING})}),l.includes(d)){const I=[];r.forEach(g=>{g.userId!==d&&I.push(g.userId)}),this._callMsgHandler.sendRinging({conversationType:this._conversationType,targetId:this._targetId,channelId:this._channelId,callId:this._callId,userIds:I}),this._notifyStateChange(S.WAITING)}else this._watchers.onMemberModify({sender:{userId:t,...o},invitedUsers:l.map(I=>({userId:I}))});r.forEach(I=>{const{userId:g,callStatus:A}=I;A!==k.IDLE&&(this._userInfo[g]={userId:g,state:A!==k.CONNECTED?p.WAITING:p.KEEPING,isCaller:t===g,isRemote:d===g},g===t&&Object.assign(this._userInfo[g],o,{deviceId:_}),this._notifyUserStateChange(this._userInfo[g]),A!==k.CONNECTED&&!this._userTimers[g]&&(this._userTimers[g]=new G(()=>{this._userInfo[g]&&(this._userInfo[g].state=p.NONE);const O=g===d?u.NO_RESPONSE:u.REMOTE_NO_RESPONSE;this._notifyUserStateChange(this._userInfo[g],O);try{this._watchers.onHungup(this._userInfo[g],O)}catch(y){this._logger.error("_",`[RCCallStateMachine] call onhungup error -> ${y==null?void 0:y.stack}`)}delete this._userInfo[g],(Object.keys(this._userInfo).length<2||g===d)&&this._notifyStateChange(S.END,O)},this._getTimeout(n))))})}__handleInviteInSession(){this._logger.info("_","StateMachine -> __handleInviteInSession");for(const e in this._userInfo)this._userInfo[e].state&&(this._userInfo[e].state=p.NONE),this._notifyUserStateChange(this._userInfo[e]),this._clearTimerById(e);this._notifyStateChange(S.END,u.BUSY_LINE),this._callMsgHandler.sendHungup({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,reason:u.BUSY_LINE,userIds:this.getRemoteUserIds()})}async __call(e,t="",i="",n="",o=!1){this._logger.debug("_",`[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);const r=this._callerId=this._inviterId=this._context.getCurrentId(),{code:a,message:_}=await this._callMsgHandler.sendInvite({roomType:o?H.RCCallRoomTypeAcrossCall:H.RCCallRoomTypeNormalCall,channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,extra:t,pushTitle:i,pushContent:n,mediaType:this._mediaType,inviteUserIds:e.filter(l=>l!==r)});if(this._isCrossAppkey=o,a===h.SUCCESS){const{sentTime:l}=_;(o?[r,e[0].split("_")[1]]:[r,...e]).forEach(d=>{const C=d===r;this._userInfo[d]={userId:d,state:p.WAITING,isCaller:C,isRemote:!C},this._notifyUserStateChange(this._userInfo[d]),C||(this._userTimers[d]=new G(()=>{this._userInfo[d]&&(this._userInfo[d].state=p.NONE),this._notifyUserStateChange(this._userInfo[d],u.REMOTE_NO_RESPONSE),this._watchers.onHungup(this._userInfo[d],u.REMOTE_NO_RESPONSE),delete this._userInfo[d],Object.keys(this._userInfo).length<2&&this._notifyStateChange(S.END,u.REMOTE_NO_RESPONSE),this.getRemoteUserIds().length===0&&this._userInfo[r].state!==p.KEEPING&&this._hungupHandle(u.REMOTE_NO_RESPONSE)},this._getTimeout(l)))}),this._notifyStateChange(S.WAITING)}else{const l=a===h.REJECTED_BY_BLACKLIST?u.ADDED_TO_BLACKLIST:u.NETWORK_ERROR;this._notifyStateChange(S.END,l)}return{code:a}}async accept(){this._logger.debug("_","[RCCallStateMachine] accept");const e=this._context.getCurrentId(),{code:t,message:i}=await this._callMsgHandler.sendAccept({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,mediaType:this._mediaType,userIds:this.getRemoteUserIds()});if(this._clearTimerById(e),t===h.SUCCESS)this._userInfo[e]&&(this._userInfo[e].state=p.KEEPING),this._beginTimestamp=Date.now(),this._notifyUserStateChange(this._userInfo[e]),this._notifyStateChange(S.KEEPING);else{this._userInfo[e]&&(this._userInfo[e].state=p.NONE),this._notifyUserStateChange(this._userInfo[e]);const n=t===h.REJECTED_BY_BLACKLIST?u.ADDED_TO_BLACKLIST:u.NETWORK_ERROR;this._notifyStateChange(S.END,n)}return{code:t}}async invite(e,t={}){if(this._conversationType!==E.ConversationType.GROUP)return{code:h.CONVERSATION_NOT_GROUP_ERROR};this._logger.debug("_",`[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);const i=this._context.getCurrentId(),n=Object.keys(this._userInfo),o=n.map(d=>{let C=k.CONNECTED;return(e.includes(d)||this._userInfo[d].state===p.WAITING)&&(C=k.RINGING),{userId:d,mediaType:this._mediaType,callStatus:C,mediaId:d}}),r=t.extra||"",a=t.pushTitle||"",_=t.pushContent||"",{code:l,message:c}=await this._callMsgHandler.sendMemeberModify({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,extra:r,pushTitle:a,pushContent:_,mediaType:this._mediaType,inviteUserIds:e.filter(d=>d!==i),callerId:this.getCallerId(),existedUserPofiles:o,directionalUserIdList:[...n,...e].filter(d=>d!==i)});if(l===h.SUCCESS){const{sentTime:d}=c;e.forEach(C=>{this._userInfo[C]={userId:C,state:p.WAITING,isCaller:!1,isRemote:!0},this._notifyUserStateChange(this._userInfo[C]),this._userTimers[C]=new G(()=>{this._userInfo[C]&&(this._userInfo[C].state=p.NONE),this._notifyUserStateChange(this._userInfo[C],u.REMOTE_NO_RESPONSE),this._watchers.onHungup(this._userInfo[C],u.REMOTE_NO_RESPONSE),delete this._userInfo[C],Object.keys(this._userInfo).length<2&&this._notifyStateChange(S.END,u.REMOTE_NO_RESPONSE)},this._getTimeout(d))})}else e.forEach(d=>{this._userInfo[d]={userId:d,state:p.NONE,isCaller:!1,isRemote:!0};const C=l===h.REJECTED_BY_BLACKLIST?u.ADDED_TO_BLACKLIST:u.NETWORK_ERROR;this._notifyUserStateChange(this._userInfo[d],C)});return{code:l}}async _hungupHandle(e){const t=this._context.getCurrentId();let i=h.SUCCESS;const n={channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,reason:e,userIds:this.getRemoteUserIds(),pushTitle:this._hungupPushTitle,pushContent:this._hungupPushContent};if(e===u.OTHER_CLIENT_JOINED_CALL)this._callMsgHandler.sendHungup(n);else{const{code:o}=await this._callMsgHandler.sendHungup(n);i=o}this._endTimestamp=Date.now();for(const o in this._userInfo)this._userInfo[o].state=p.NONE,o===t?this._notifyUserStateChange(this._userInfo[o],e):this._notifyUserStateChange(this._userInfo[o]),delete this._userInfo[o];return Object.keys(this._userInfo).length<2&&this._notifyStateChange(S.END,e),{code:i}}async hungup(e="",t=""){this._logger.debug("_","[RCCallStateMachine] hungup");const i=this._context.getCurrentId();let n=u.HANGUP;Object.keys(this._userTimers).length>0&&(this._userInfo[i].isCaller?n=u.CANCEL:n=u.REJECT);for(const o in this._userTimers)this._clearTimerById(o);return this._hungupHandle(n)}async changeMediaType(e){this._logger.debug("_",`[RCCallStateMachine] changeMediaType -> mediaType: ${e}`);const{code:t}=await this._callMsgHandler.sendMediaModify({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,mediaType:e,userIds:this.getRemoteUserIds()});return t===h.SUCCESS&&(this._mediaType=e),{code:t}}userJoin(e){this._logger.debug("_",`[RCCallStateMachine] userJoin -> userIds: ${JSON.stringify(e)}`),setTimeout(()=>{e.forEach(t=>{const i=this._userInfo[t];i&&i.state!==p.KEEPING&&(i.state=p.KEEPING,this._notifyUserStateChange(i)),this._sessionState!==S.KEEPING&&this._notifyStateChange(S.KEEPING),this._clearTimerById(t)})},300)}userLeave(e){this._logger.debug("_",`[RCCallStateMachine] userLeave -> userIds: ${JSON.stringify(e)}`),setTimeout(()=>{e.forEach(t=>{const i=this._userInfo[t];i&&i.state!==p.NONE&&(i.state=p.NONE,this._notifyUserStateChange(i,u.REMOTE_HANGUP),this._watchers.onHungup(i,u.REMOTE_HANGUP),delete this._userInfo[t]),new G(()=>{const n=this.getRemoteUsers();n.length===1&&n[0].state===1&&this._hungupHandle(u.REMOTE_NETWORK_ERROR)},6e4),Object.keys(this._userInfo).length<2&&this._sessionState!==S.END&&(this._endTimestamp=Date.now(),this._notifyStateChange(S.END,u.REMOTE_HANGUP))})},300)}close(e){this._hungupHandle(e)}setHungupPushConfig(e="",t=""){this._hungupPushTitle=e,this._hungupPushContent=t}getCallId(){return this._callId}getChannelId(){return this._channelId}getTargetId(){return this._targetId}getConversationType(){return this._conversationType}getRemoteUserIds(){return Object.keys(this._userInfo).filter(i=>this._context.getCurrentId()!==i)}getRemoteUsers(){const e=[],t=this._context.getCurrentId();for(const i in this._userInfo){const{userId:n}=this._userInfo[i];n!==t&&e.push(this._userInfo[i])}return e}getState(){return this._sessionState===null?S.END:this._sessionState}getUserState(e){var t;return(t=this._userInfo[e])==null?void 0:t.state}getCallerId(){return this._callerId}getInviterId(){return this._inviterId}getMediaType(){return this._mediaType}getSummary(){const e=this._beginTimestamp,t=this._endTimestamp;let i=0;t>e&&e!==0&&(i=t-e);const n={conversationType:this._conversationType,channelId:this._channelId,targetId:this._targetId,mediaType:this._mediaType,beginTimestamp:e,endTimestamp:t,duration:i,endReason:this._endReason};return this._logger.debug("_",`[RCCallStateMachine] getSummary -> summary: ${JSON.stringify(n)}`),n}}var N=(s=>(s[s.AUDIO=1]="AUDIO",s[s.AUDIO_VIDEO=2]="AUDIO_VIDEO",s))(N||{}),Q=(s=>(s[s.ADD=1]="ADD",s[s.REMOVE=2]="REMOVE",s))(Q||{}),b=(s=>(s.WEB="Web",s.IOS="iOS",s.ANDROID="Android",s))(b||{});class le{constructor(e,t,i){f(this,"_messages",[]);f(this,"_channelId");f(this,"_conversationType");f(this,"_targetId");f(this,"_mediaType");f(this,"_callId");f(this,"_callerId");f(this,"_inviterId");f(this,"_endReason");f(this,"_beginTimestamp",0);f(this,"_endTimestamp",0);this._context=e,this._logger=t,this._onRecord=i}_doInvite(e){const t=this._context.getCurrentId(),{channelId:i,conversationType:n,targetId:o,senderUserId:r,content:a}=e,{callId:_,mediaType:l}=a;this._channelId=i,this._conversationType=n,this._targetId=o,this._callId=_,this._mediaType=l;const c=r===t;this._inviterId=r,this._endReason=u.REMOTE_NO_RESPONSE,this._canGenRecord()}_doMemberModify(e){this._doInvite(e)}_doRinging(e){this._canGenRecord()}_doAccept(e){this._endReason=u.HANGUP,this._beginTimestamp=e.sentTime,this._canGenRecord()}_doHungup(e){const{content:t,sentTime:i,senderUserId:n}=e,{reason:o}=t,r=this._context.getCurrentId(),a=n===r;this._endReason=a?o:V[o],this._endTimestamp=i,this._canGenRecord()}_doMediaModify(e){const{content:t}=e,{mediaType:i}=t;this._mediaType=i,this._canGenRecord()}_canGenRecord(){if(this._messages.length===0){let e=0;[u.HANGUP,u.REMOTE_HANGUP,u.OTHER_CLIENT_JOINED_CALL,u.REMOTE_OTHER_CLIENT_JOINED_CALL,u.KICKED_BY_SERVER,u.REMOTE_KICKED_BY_SERVER,u.ACCEPT_SYSTEM_CALL,u.REMOTE_ACCEPT_SYSTEM_CALL].includes(this._endReason)&&(e=this._endTimestamp-this._beginTimestamp),this._onRecord({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,inviterId:this._inviterId,mediaType:this._mediaType,endReason:this._endReason,beginTimestamp:this._beginTimestamp,endTimestamp:this._endTimestamp,duration:e})}}onRecvOfflineMsgs(e){this._messages=e;do{const t=this._messages.shift(),{messageType:i,content:{callId:n}}=t;switch(i){case T.VCInvite:this._doInvite(t);break;case T.VCRinging:this._doRinging(t);break;case T.VCAccept:this._doAccept(t);break;case T.VCModifyMem:this._doMemberModify(t);break;case T.VCModifyMedia:this._doMediaModify(t);break;case T.VCHangup:this._doHungup(t);break;default:this._logger.debug("_",`[OfflineRecorder] onRecvOfflineMsgs -> unexpected message: ${JSON.stringify(t)}`);break}}while(this._messages.length>0)}}const _e=["RC:VCAccept","RC:VCRinging","RC:VCSummary","RC:VCHangup","RC:VCInvite","RC:VCModifyMedia","RC:VCModifyMem"],ce={[E.ErrorCode.REJECTED_BY_BLACKLIST]:h.REJECTED_BY_BLACKLIST,[E.ErrorCode.NOT_IN_GROUP]:h.NOT_IN_GROUP};class he extends E.EventEmitter{constructor(t,i,n,o=60*1e3,r){super();f(this,"_watchers",{});f(this,"_userInfo",{});f(this,"_msgBufferList",[]);f(this,"_hadHandleMsgTimer",!1);f(this,"_offlineRecorder");f(this,"_deviceId","");this._context=t,this._runtime=i,this._logger=n,this._offlineMsgItv=o,this._getStateMachine=r,this._deviceId=Y(i),this._context.onmessage=this._onMessage.bind(this),this._offlineRecorder=new le(this._context,this._logger,a=>{this._logger.info("_",`[CallMessageHandler] offlineRecorder -> ${JSON.stringify(a)}`),this._watchers.onOfflineRecord&&this._watchers.onOfflineRecord(a)})}_onMessage(t){if(_e.includes(t.messageType)){this._logger.debug("_",`[CallMessageHandler] _onMessage -> call message: ${JSON.stringify(t)}`);try{const n=Date.now(),{sentTime:o}=t;let r=0;this._msgBufferList.forEach(({msg:{sentTime:a}},_)=>{o>=a&&(r=_+1)}),this._msgBufferList.splice(r,0,{markTime:n,msg:t}),this._logger.warn("_",`onMessage -> msgBufferList: ${this._msgBufferList.length}`)}catch(n){this._logger.error("_",`[CallMessageHandler] splice buffer msg error -> ${n.message}`)}return this._handleBufferMsgs(),!0}return!1}_onRecvOnlineCallMsg(t){this._logger.info("_",`onMessage -> _onRecvOnlineCallMsg: ${t.messageType}`);const{content:{callId:i}}=t;switch(t.messageType){case T.VCInvite:this._watchers.onInvite&&this._watchers.onInvite(t);break;case T.VCRinging:super.emit(`${i}onRinging`,t);break;case T.VCAccept:super.emit(`${i}onAccept`,t);break;case T.VCModifyMem:this._watchers.onInvite&&this._watchers.onInvite(t);break;case T.VCModifyMedia:super.emit(`${i}onMediaModify`,t);break;case T.VCHangup:super.emit(`${i}onHungup`,t);break;default:this._logger.warn("_",`[CallMessageHandler] onRecvOnlineCallMsg -> unexpected message: ${JSON.stringify(t)}`);break}}_handleBufferMsgs(){if(this._msgBufferList.length===0||this._hadHandleMsgTimer){this._logger.warn("_","_handleBufferMsgs return");return}this._hadHandleMsgTimer=!0,setTimeout(()=>{const t=Date.now(),i=this._msgBufferList.filter(n=>t-n.markTime>=200);if(this._logger.debug("_",`[CallMessageHandler] handleBufferMsgs -> lists over 200ms : ${JSON.stringify(i.map(({msg:{messageUId:n,isOffLineMessage:o,content:{callId:r}}})=>({messageUId:n,isOffLineMessage:o,callId:r})))}`),i.length===0){this._hadHandleMsgTimer=!1,this._handleBufferMsgs();return}if(i[0].msg.isOffLineMessage){let n=this._msgBufferList.filter(o=>o.msg.isOffLineMessage);do{const{conversationType:o,messageType:r,sentTime:a,senderUserId:_,content:{callId:l,inviteUserIds:c}}=n[0].msg,d=[T.VCInvite,T.VCModifyMem].includes(r),C=Date.now()-a<this._offlineMsgItv;if(d){const I=[];for(let O=0;O<n.length;O++){const y=n[O].msg,{content:{callId:U}}=y;if(l===U)I.push(y);else break}if(this._logger.warn("_",`taskMsgList length: ${I.length}`),I.length>0){const O=this._msgBufferList.findIndex(U=>U.msg.messageUId===I[I.length-1].messageUId);this._msgBufferList=this._msgBufferList.slice(O+1);const y=n.findIndex(U=>U.msg.messageUId===I[I.length-1].messageUId);n=n.slice(y+1)}const g=(()=>{if(o!==E.ConversationType.PRIVATE)return!1;const O=I.length===1,y=I.every(U=>[T.VCInvite,T.VCModifyMedia,T.VCRinging].includes(U.messageType));return O||y})(),A=(()=>{if(o!==E.ConversationType.GROUP)return!1;let O=!1,y=!0,U=[_,...c],v=!1;for(let L=0;L<I.length;L++){const{senderUserId:R,messageType:D}=I[L];if(D===T.VCHangup&&R===this._context.getCurrentId())break;D===T.VCHangup&&(v=_===R,U=U.filter(P=>R!==P)),D===T.VCAccept&&(y=!1)}return!(y&&v)&&U.length>1&&(O=!0),O})();C&&(g||A)&&I.forEach(this._onRecvOnlineCallMsg,this),this._offlineRecorder.onRecvOfflineMsgs(I)}else C&&this._getStateMachine(l)?this._onRecvOnlineCallMsg(n[0].msg):this._logger.debug("_",`[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`),n.shift(),this._msgBufferList.shift()}while(n.length>0)}else{i.forEach(({msg:o})=>{this._onRecvOnlineCallMsg(o)});const n=i.length;this._msgBufferList.splice(0,n),this._logger.debug("_",`timer online msg handle -> delCount: ${n} msgBufferList: ${this._msgBufferList.length}`)}this._hadHandleMsgTimer=!1,this._handleBufferMsgs()},20)}registerEventListener(t){Object.assign(this._watchers,t)}registerStateMachineEvent(t,i,n){const o=t+i;super.on(o,n)}unregisterStateMachineEvent(t){["onRinging","onAccept","onHungup","onMediaModify"].forEach(i=>{const n=t+i;super.removeAll(n)})}registerUserInfo(t){this._userInfo=t}async _sendCallMessage(t){this._logger.debug("_",`CallMessageHandler] sendCallMesage -> message: ${JSON.stringify(t)}`);const{channelId:i,conversationType:n,targetId:o,content:r,messageType:a,directionalUserIdList:_,pushTitle:l,pushData:c,pushContent:d}=t,C={channelId:i,messageType:a,content:r,directionalUserIdList:_};let I={};[T.VCInvite,T.VCModifyMem,T.VCHangup].includes(a)&&(I={pushTitle:l||"",pushContent:d||"",pushData:c,androidConfig:{categoryHW:"VOIP",categoryVivo:"IM"}},Object.assign(C,{pushConfig:I}));const{code:g,data:A}=await this._context.sendMessage(n,o,C);return g!==E.ErrorCode.SUCCESS?(this._logger.error("_",`CallMessageHandler] sendCallMesage error -> code: ${g}`),{code:ce[g]||h.SEND_MSG_ERROR}):{code:h.SUCCESS,message:A}}async sendInvite(t){const{roomType:i,channelId:n,conversationType:o,targetId:r,callId:a,mediaType:_,inviteUserIds:l,extra:c,pushTitle:d,pushContent:C}=t;this._logger.warn("_","CallMessageHandler] sendCallMesage sendInvite",JSON.stringify(t)),this._watchers.sendAccept&&this._watchers.sendAccept({callId:a});const I={platform:b.WEB,deviceId:this._deviceId,callId:a,roomType:i,extra:c,engineType:4,channelInfo:{Id:a,Key:""},mediaType:_,inviteUserIds:l,observerUserIds:[],user:this._userInfo};return this._sendCallMessage({channelId:n,conversationType:o,targetId:r,content:I,messageType:T.VCInvite,directionalUserIdList:o===E.ConversationType.GROUP?l:[r],pushTitle:d,pushContent:C,pushData:JSON.stringify({mediaType:_,userIdList:l,callId:a})})}async sendMemeberModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,inviteUserIds:_,callerId:l,existedUserPofiles:c,directionalUserIdList:d,extra:C,pushTitle:I,pushContent:g}=t,A={platform:b.WEB,deviceId:this._deviceId,callId:r,extra:C,engineType:4,channelInfo:{Id:r,Key:""},mediaType:a,inviteUserIds:_,observerUserIds:[],user:this._userInfo,caller:l,modifyMemType:Q.ADD,existedUserPofiles:c};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:A,messageType:T.VCModifyMem,directionalUserIdList:d,pushTitle:I,pushContent:g,pushData:JSON.stringify({mediaType:a,userIdList:_,callId:r})})}sendRinging(t){const{channelId:i,conversationType:n,targetId:o,callId:r,userIds:a}=t,_={platform:b.WEB,deviceId:this._deviceId,callId:r,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:_,messageType:T.VCRinging,directionalUserIdList:a})}sendAccept(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,userIds:_}=t,l={platform:b.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:l,messageType:T.VCAccept,directionalUserIdList:_})}sendHungup(t){const{channelId:i,conversationType:n,targetId:o,callId:r,reason:a,userIds:_,pushTitle:l,pushContent:c}=t,d={platform:b.WEB,deviceId:this._deviceId,callId:r,reason:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:d,messageType:T.VCHangup,pushTitle:l,pushContent:c,pushData:JSON.stringify({callId:r,reason:a}),directionalUserIdList:_})}sendMediaModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,userIds:_}=t,l={platform:b.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:l,messageType:T.VCModifyMedia,directionalUserIdList:_})}}var w=(s=>(s.ZH="zh",s.EN="en",s))(w||{});const ue={PushTitle:{AUDIO:"You have a voice call",VIDEO:"You have a video call"}},de={PushTitle:{AUDIO:"您有一条音频通话",VIDEO:"您有一条视频通话"}};class ee{static set(e){this._lang=e}static get(){return this._lang===w.EN?ue:de}}f(ee,"_lang",w.ZH),E.VersionManage.add("call-engine","5.2.0"),E.VersionManage.validEngine("5.7.7")||console.error(`The current engine version '${E.VersionManage.getInfo().engine}' error,call-engine required engine version at least '5.7.7'.`);class ge{constructor(e,t,i,n,o){f(this,"_stateMachine",{});f(this,"_callMsgHandler");this._context=e,this._runtime=t,this._logger=i,this._watchers=n,this._options=o,this._logger.warn("_","RCCallEngine Version: 5.2.0 CommitId: 0e97428ebeef65512d62e174e37595eadbb7a039"),Y(t),this._callMsgHandler=new he(this._context,this._runtime,this._logger,this._options.offlineMsgItv,this._getStateMachine.bind(this)),this._callMsgHandler.registerEventListener({onInvite:this._onInvite.bind(this),sendAccept:this._handleSendAccept.bind(this),onOfflineRecord:this._watchers.onOfflineRecord}),Z.on("onStateMachineClose",r=>{delete this._stateMachine[r]}),ee.set(o.lang)}_onInvite(e){const{channelId:t,conversationType:i,targetId:n,content:o,messageType:r,senderUserId:a,pushConfig:_}=e;this._logger.warn("_",`RCCallEngine _onInvite:targetId ${n} senderUserId: ${a}`);const{mediaType:l,callId:c,extra:d,roomType:C}=o;let I;C!==H.RCCallRoomTypeAcrossCall?I=a:[,I]=a.split("_");const g=this._context.getCurrentId();if(this._context.getCurrentId()===I||r===T.VCModifyMem&&o.existedUserPofiles.some(y=>y.userId===g)&&!this._stateMachine[c])return;this._stateMachine[c]?r===T.VCModifyMem&&this._stateMachine[c].__onMemberModify(e):(this._stateMachine[c]=new z(this._context,this._runtime,this._logger,this._callMsgHandler,t,i,n,l,c),this._logger.info("_",`[RCCallEngine] RCCallStateMachine successfully created -> callId: ${c}`),r===T.VCInvite?this._stateMachine[c].__onInvite(e):r===T.VCModifyMem&&this._stateMachine[c].__onMemberModify(e),this._watchers.onInvite(this._stateMachine[c],d),Object.keys(this._stateMachine).filter(y=>c!==y).length>0&&!this._options.isAllowAcceptNewCall&&this._stateMachine[c].__handleInviteInSession())}_handleSendAccept(e){if(this._options.isAllowAcceptNewCall){const{callId:t}=e;for(const i in this._stateMachine)t!==i&&(this._stateMachine[i].hungup(),delete this._stateMachine[i])}}_getStateMachine(e){return this._stateMachine[e]}registerUserInfo(e){this._logger.debug("_",`[RCCallEngine] registerUserInfo -> userInfo: ${JSON.stringify(e)}`),this._callMsgHandler.registerUserInfo(e)}async call(e,t,i,n="",o="",r="",a=!1){this._logger.debug("_",`[RCCallEngine] call -> args: ${JSON.stringify({channelId:e,targetId:t,mediaType:i,extra:n,pushTitle:o,pushContent:r})}`);const _=X();if(Object.keys(this._stateMachine).length>0)return{code:h.STATE_MACHINE_EXIT};this._stateMachine[_]=new z(this._context,this._runtime,this._logger,this._callMsgHandler,e,E.ConversationType.PRIVATE,t,i,_);const{code:c}=await this._stateMachine[_].__call([t],n,o,r,a);return c===h.SUCCESS?{code:h.SUCCESS,stateMachine:this._stateMachine[_]}:{code:c}}async callInGroup(e,t,i,n,o="",r="",a=""){this._logger.debug("_",`[RCCallEngine] callInGroup -> args: ${JSON.stringify({channelId:e,targetId:t,mediaType:i})}`);const _=X();if(Object.keys(this._stateMachine).length>0)return{code:h.STATE_MACHINE_EXIT};this._stateMachine[_]=new z(this._context,this._runtime,this._logger,this._callMsgHandler,e,E.ConversationType.GROUP,t,i,_);const{code:c}=await this._stateMachine[_].__call(n,o,r,a);return c===h.SUCCESS?{code:h.SUCCESS,stateMachine:this._stateMachine[_]}:{code:c}}destroy(){this._logger.debug("_","[RCCallEngine] destroy"),this._stateMachine={}}}var $=(s=>(s[s.CALLER=1]="CALLER",s[s.CALLEE=2]="CALLEE",s))($||{});class fe{constructor(){f(this,"list",{})}on(e,t){return(this.list[e]||(this.list[e]=[])).push(t),this}once(e,t){const i=n=>{this.off(e,i),t.call(this,n)};i.fun=t,this.on(e,i)}off(e,t){const i=this.list[e];if(!i)return!1;if(!t)i&&(i.length=0);else{let n;for(let o=0,{length:r}=i;o<r;o++)if(n=i[o],n===t||n.fun===t){i.splice(o,1);break}}}emit(e,t){const i=[...this.list[e]];if(!i||i.length===0)return!1;i.forEach(n=>{n.call(this,t)})}}const x=new fe;function Ce(s){return Object.values(w).includes(s)}function Ie(s){return Object.values(E.RTCJoinType).includes(s)}function Re(s){return Object.values(E.LogLevel).includes(s)}const Te=s=>{if(!s)return{result:!1,msg:"Initialization missing parameter -> options"};if(typeof s!="object")return{result:!1,msg:"Initialization options must be an object"};const e=["rtcClient","onSession","onSessionClose"],t=Object.keys(s),i=[];return e.forEach(n=>{t.includes(n)||i.push(n)}),i.length?{result:!1,msg:`Initialization missing parameter -> "${i.join(",")}"`}:typeof s.rtcClient!="object"?{result:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:typeof s.onSession!="function"?{result:!1,msg:"Initialization 'onSession' parameter must be of type 'function'"}:typeof s.onSessionClose!="function"?{result:!1,msg:"Initialization 'onSessionClose' parameter must be of type 'function'"}:typeof s.isAllowSubscribeRetry<"u"&&typeof s.isAllowSubscribeRetry!="boolean"?{result:!1,msg:"Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'"}:typeof s.isAllowPublishRetry<"u"&&typeof s.isAllowPublishRetry!="boolean"?{result:!1,msg:"Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'"}:typeof s.isOffCameraWhenVideoDisable<"u"&&typeof s.isOffCameraWhenVideoDisable!="boolean"?{result:!1,msg:"Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'"}:typeof s.joinType<"u"&&!Ie(s.joinType)?{result:!1,msg:"Initialization 'joinType' parameter must be of type correct type"}:typeof s.isAllowDemotionGetStream<"u"&&typeof s.isAllowDemotionGetStream!="boolean"?{result:!1,msg:"Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'"}:typeof s.lang<"u"&&!Ce(s.lang)?{result:!1,msg:"Initialization 'lang' parameter must be of type correct type"}:typeof s.logLevel<"u"&&!Re(s.logLevel)?{result:!1,msg:"Initialization 'logLevel' parameter must be of type correct type"}:typeof s.logStdout<"u"&&typeof s.logStdout!="function"?{result:!1,msg:"Initialization 'logStdout' parameter must be of type 'function'"}:{result:!0}},K=s=>{if(!s)return{result:!1,msg:"missing parameter -> listener"};if(typeof s!="object")return{result:!1,msg:"listener must be an object"};const e=["onRinging","onAccept","onHungup","onTrackReady"],t=Object.keys(s),i=[];return e.forEach(n=>{t.includes(n)||i.push(n)}),i.length?{result:!1,msg:`missing parameter -> "${i.join(",")}"`}:typeof s.onRinging!="function"?{result:!1,msg:"'onRinging' parameter must be of type 'function'"}:typeof s.onAccept!="function"?{result:!1,msg:"'onAccept' parameter must be of type 'function'"}:typeof s.onHungup!="function"?{result:!1,msg:"'onHungup' parameter must be of type 'function'"}:typeof s.onTrackReady!="function"?{result:!1,msg:"'onTrackReady' parameter must be of type 'function'"}:{result:!0}},te=s=>s&&typeof s=="string"?{result:!0}:{result:!1,msg:"'targetId' parameter is required, must be of type 'string'"},se=s=>s===N.AUDIO||s===N.AUDIO_VIDEO?{result:!0}:{result:!1,msg:"'mediaType' parameter is required, must be of type 'RCCallMediaType'"},F=s=>typeof s=="string"?{result:!0}:{result:!1,msg:"'extra' parameter must be of type 'string'"},j=s=>typeof s=="string"?{result:!0}:{result:!1,msg:"'pushTitle' parameter must be of type 'string'"},J=s=>typeof s=="string"?{result:!0}:{result:!1,msg:"'pushContent' parameter must be of type 'string'"},Ee=s=>{const{pushTitle:e="",pushContent:t=""}=s,i=[];return i.push(j(e)),i.push(J(t)),i},ie=s=>Array.isArray(s)?s.length?s.every(e=>typeof e=="string"&&e.length>0)?{result:!0}:{result:!1,msg:"'userIds' parameter is required"}:{result:!1,msg:"'userIds' parameter is required, must be of type 'string[]'"}:{result:!1,msg:"'userIds' parameter is required, must be of type 'string[]'"};function me(s){return["FPS_10","FPS_15","FPS_24","FPS_30"].includes(s)}const pe=s=>!!m.RCResolution[s],Se=s=>s&&s.audio&&typeof s.audio.micphoneId<"u"&&typeof s.audio.micphoneId!="string"?{result:!1,msg:"'constraints.audio.micphoneId' must be of type 'string'"}:s&&s.audio&&typeof s.audio.sampleRate<"u"&&typeof s.audio.sampleRate!="number"?{result:!1,msg:"'constraints.audio.sampleRate' must be of type 'number'"}:s&&s.video&&typeof s.video.cameraId<"u"&&typeof s.video.cameraId!="string"?{result:!1,msg:"'constraints.video.cameraId' must be of type 'string'"}:s&&s.video&&typeof s.video.frameRate<"u"&&typeof s.video.frameRate!="string"?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:s&&s.video&&typeof s.video.frameRate<"u"&&!me(s.video.frameRate)?{result:!1,msg:"'frameRate' value is out of range"}:s&&s.video&&typeof s.video.resolution<"u"&&typeof s.video.resolution!="string"?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:s&&s.video&&typeof s.video.resolution<"u"&&!pe(s.video.resolution)?{result:!1,msg:"'resolution' value is out of range"}:s&&s.video&&(!s.video.frameRate||!s.video.resolution)?{result:!1,msg:"'resolution' and 'resolution' is required"}:{result:!0},Oe=(s,e)=>setTimeout(s,e);class ye{constructor(e,t){f(this,"_timerId",0);f(this,"_startTime",0);e&&(this._timerId=Oe(()=>{e()},t)),this._startTime=Date.now()}stop(){clearTimeout(this._timerId);const e=Date.now();let t=e-this._startTime;return this._startTime===0&&(t=0),{startTime:this._startTime,endTime:e,duration:t}}reset(){this._startTime=0}}class W{constructor(e,t,i,n={}){f(this,"_room");f(this,"_listener",null);f(this,"_RETRYCOUNT",2);f(this,"joinRoomTimer",null);this._stateMachine=e,this._rtcClient=t,this._logger=i,this._options=n,this._stateMachine.registerEventListener({onUserStateChange:({user:a,reason:_})=>{this._logger.info("_",`[RCCallSession onUserStateChange] userId->${a==null?void 0:a.userId} state->${a==null?void 0:a.state} reason->${_}`)},onStateChange:async a=>{const{state:_,reason:l}=a;if(this._logger.info("_",`[RCCallSession onStateChange] : state->${_} reason->${l}`),_===S.KEEPING){const c=this._stateMachine.getCallId();this._logger.info("_",`[RCCallSession onStateChange] roomId: ${c}`);try{await this._joinRoom(c)}catch(d){this._exceptionClose(u.NETWORK_ERROR),this._logger.error("_",`[RCCallSession onStateChange] joinRoom throw exception roomId -> ${c}`),console.error(d)}}else if(_===S.END){if(!this._room){this._options.localTracks&&this._destroyTracks(this._options.localTracks);const c=this._stateMachine.getSummary();x.emit("sessionClose",{session:this,summaryInfo:c});return}this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._logger.info("_","[RCCallSession onStateChange] localTracks destroyed"),this._leaveRoom(),this._room=null}},onRinging:a=>{this._logger.info("_",`[RCCallSession onRinging]sender: sender.userId -> ${a.userId}`);try{this._listener.onRinging(a,this)}catch(_){this._logger.error("_","[RCCallSession onRinging] method exception -> onRinging"),console.error(_)}},onAccept:a=>{this._logger.info("_",`[RCCallSession onAccept]sender: sender.userId -> ${a.userId}`);try{this._listener.onAccept(a,this)}catch(_){this._logger.error("_","[RCCallSession onAccept] method exception -> onAccept"),console.error(_)}},onHungup:(a,_)=>{this._logger.info("_",`[RCCallSession onHungup]sender: sender.userId -> ${a.userId} reason->${_}`);try{this._listener.onHungup(a,_,this)}catch(l){this._logger.error("_","[RCCallSession onHungup] method exception -> onHungup"),console.error(l)}},onMemberModify:({sender:a,invitedUsers:_})=>{this._logger.info("_",`[RCCallSession onMemberModify] sender.userId -> ${a.userId}`);try{this._listener.onMemberModify(a,_,this)}catch(l){this._logger.error("_","[RCCallSession onMemberModify] method exception -> onMemberModify"),console.error(l)}},onMediaModify:({sender:a,mediaType:_})=>{this._logger.info("_",`[RCCallSession onMediaModify]sender: sender.userId -> ${a.userId} mediaType: ${_}`),_===N.AUDIO&&this._setMediaTypeToAudio();try{this._listener.onMediaModify(a,_,this)}catch(l){this._logger.error("_","[RCCallSession onMediaModify] method exception -> onMediaModify"),console.error(l)}},crossAppkey:a=>{this._logger.info("_",`[RCCallSession crossAppkey] 是否跨 appkey: ${a}`),this._options.isCrossAppkey=a}});const{pushTitle:o,pushContent:r}=this._options.hungupPushConfig;this._stateMachine.setHungupPushConfig(o,r)}async _joinRoom(e){let t;try{this._options.isCrossAppkey?t=await this._rtcClient.joinCrossRTCRoom(e,this._options.joinType):t=await this._rtcClient.joinRTCRoom(e,this._options.joinType);const{code:i,userIds:n,room:o}=t;if(i!==m.RCRTCCode.SUCCESS)return i===m.RCRTCCode.NOT_OPEN_VIDEO_AUDIO_SERVER&&this._exceptionClose(u.SERVICE_NOT_OPENED),i===m.RCRTCCode.SIGNAL_JOIN_RTC_ROOM_REFUSED?this._exceptionClose(u.OTHER_CLIENT_IN_CALL):this._exceptionClose(u.NETWORK_ERROR),this._logger.info("_",`[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`),{code:h.JOIN_ROOM_ERROR};if(this._stateMachine.getState()===S.END)return await this._rtcClient.leaveRoom(o),this._room=null,{code:h.SUCCESS};n.length<1&&(this.joinRoomTimer=new ye(()=>{this._exceptionClose(u.REMOTE_NETWORK_ERROR)},6e4)),this._room=o}catch(i){return this._exceptionClose(u.NETWORK_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`),console.error(i),{code:h.JOIN_ROOM_ERROR}}this._registerRoomEventListener(),this._registerReportListener();try{await this._subscribeInRoomRemoteTrack()}catch(i){return this._exceptionClose(u.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`),console.error(i),{code:h.JOIN_ROOM_ERROR}}try{await this._publish()}catch(i){return this._exceptionClose(u.PUBLISH_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`),console.error(i),{code:h.JOIN_ROOM_ERROR}}return{code:h.SUCCESS}}async _subscribeInRoomRemoteTrack(){const e=this._room.getRemoteTracks();if(e.length){const{code:t}=await this._subscribeRetry(e,this._options.isAllowSubscribeRetry,this._RETRYCOUNT);t!==m.RCRTCCode.SUCCESS&&(this._exceptionClose(u.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`))}}async _subscribeRetry(e,t=!1,i=0){const{code:n}=await this._room.subscribe(e);if(n!==m.RCRTCCode.SUCCESS){try{this._listener.onTrackSubscribeFail&&this._listener.onTrackSubscribeFail(n,this)}catch(o){this._logger.error("_","[RCCallSession] _listener.onTrackSubscribeFail exception"),console.error(o)}if(!t)return{code:n};if(i>0)return i--,this._subscribeRetry(e,t,i)}return{code:n}}async _publish(){const e=this._options.localTracks,{code:t}=await this._publishRetry(e,this._options.isAllowPublishRetry,this._RETRYCOUNT);if(t!==m.RCRTCCode.SUCCESS){this._exceptionClose(u.PUBLISH_ERROR),this._logger.info("_",`[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);return}this._options.produceType===$.CALLEE&&this._notifyTrackReady(e)}async _publishRetry(e,t=!1,i=0){const{code:n}=await this._room.publish(e);if(n!==m.RCRTCCode.SUCCESS){try{this._listener.onTrackPublishFail&&this._listener.onTrackPublishFail(n,this)}catch(o){this._logger.error("_","[RCCallSession] _listener.onTrackPublishFail exception"),console.error(o)}if(!t)return{code:n};if(i>0)return i--,this._publishRetry(e,t,i)}return{code:n}}async _leaveRoom(){try{const e=await this._rtcClient.leaveRoom(this._room);this._logger.info("_",`[RCCallSession _leaveRoom] Successfully exited the room code: ${e.code}`)}catch(e){this._logger.error("_","[RCCallSession _leaveRoom] leaveRoom throw exception"),console.error(e)}finally{const e=this._stateMachine.getSummary();x.emit("sessionClose",{session:this,summaryInfo:e})}}_exceptionClose(e){this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._stateMachine.close(e)}registerSessionListener(e){const t=K(e);if(!t.result)throw new Error(`[RCCallSession registerSessionListener] ${t.msg}`);this._listener={...e}}async _getLocalTrackCore(e,t){if(e===N.AUDIO){const{code:o,track:r}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",t&&t.audio&&{...t.audio});return o!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio local tracks failed RCT code -> ${o}`),{code:h.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"),{code:h.SUCCESS,tracks:[r]})}const{code:i,tracks:n}=await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",t&&{...t});return i!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio and Video local tracks failed RCT code -> ${i}`),{code:h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"),{code:h.SUCCESS,tracks:n})}async _getLocalTrack(e,t){if(this._options.isAllowDemotionGetStream&&e===N.AUDIO_VIDEO){const{code:o,tracks:r}=await this._getLocalTrackCore(N.AUDIO_VIDEO,t);if(o!==h.SUCCESS){const{code:a,tracks:_}=await this._getLocalTrackCore(N.AUDIO,t);return a!==h.SUCCESS?(this._exceptionClose(u.GET_MEDIA_RESOURCES_ERROR),{code:a}):{code:a,tracks:_}}return{code:o,tracks:r}}const{code:i,tracks:n}=await this._getLocalTrackCore(e,t);return i!==h.SUCCESS?(this._exceptionClose(u.GET_MEDIA_RESOURCES_ERROR),{code:i}):{code:i,tracks:n}}async changeAudioDevice(e){const t=[],i=[],{code:n,track:o}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",e);if(n!==m.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession changeDevice] get local Audio tracks failed RCTLib code -> ${n}`),{code:h.GET_LOCAL_AUDIO_TRACK_ERROR};if(this._options.localTracks&&this._options.localTracks.forEach(r=>{r.isAudioTrack()||i.push(r)}),t.push(o),i.push(o),this._options.localTracks=i,this._notifyTrackReady(t),this._room){const{code:r}=await this._room.publish(t);if(r!==m.RCRTCCode.SUCCESS)return{code:h.AUDIO_PUBLISH_ERROR}}return{code:h.SUCCESS}}async invite(e,t={}){var c,d;const{extra:i=""}=t,{pushTitle:n="",pushContent:o=""}=(c=this._options.callPushConfig)!=null&&c.pushTitle||(d=this._options.callPushConfig)!=null&&d.pushContent?this._options.callPushConfig:t,r=[ie(e),F(i),j(n),J(o)],a=[];if(!r.every(C=>(!C.result&&a.push(C.msg),C.result)))throw new Error(`[RCCallClient invite] ${a.join(`
|
|
2
|
+
`)}`);const{code:l}=await this._stateMachine.invite(e,{extra:i,pushTitle:n,pushContent:o});return{code:l}}async accept(e){const t=Se(e);if(!t.result)throw new Error(`[RCCallSession accept] ${t.msg}`);x.emit("hungupOtherSession",{session:this});const i=this._stateMachine.getMediaType(),{code:n,tracks:o}=await this._getLocalTrack(i,e);if(n!==h.SUCCESS)return{code:n};this._options.localTracks=o;const{code:r}=await this._stateMachine.accept();return r!==h.SUCCESS?(this._logger.error("_",`[RCCallSession accept]Send accept message failed -> code: ${r}`),{code:r}):{code:r}}async hungup(){return this._stateMachine.hungup()}async _changeMediaType(e){const{code:t}=await this._stateMachine.changeMediaType(e);return t!==h.SUCCESS&&this._logger.error("_",`[RCCallSession _changeMediaType] change media type fail code-> ${t}`),{code:t}}_getLocalVideoTracks(){let e=[];return this._room&&this._options.localTracks&&(e=this._options.localTracks.filter(t=>t.isVideoTrack())),e}_getLocalAudioTracks(){let e=[];return this._room&&this._options.localTracks&&(e=this._options.localTracks.filter(t=>t.isAudioTrack())),e}async _setMediaTypeToAudioAndVideo(){const{code:e,track:t}=await this._rtcClient.createCameraVideoTrack();if(e!==m.RCRTCCode.SUCCESS)return{code:h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR};const{code:i}=await this._room.publish([t]);if(i!==m.RCRTCCode.SUCCESS){this._logger.error("_",`[RCCallSession _enableVideo] Resource publishing failed: RCRTCCode -> ${e}`);return}this._notifyTrackReady([t]),this._changeMediaType(N.AUDIO_VIDEO)}async _setMediaTypeToAudio(){const e=this._getLocalVideoTracks();if(e.length){e.forEach(i=>{i.mute()});const{code:t}=await this._room.unpublish(e);t!==m.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${t}`),this._destroyTracks(e)}}async descendAbility(){const{code:e}=await this._changeMediaType(N.AUDIO);return e===h.SUCCESS&&this._setMediaTypeToAudio(),{code:e}}async disableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`),{code:h.NOT_IN_ROOM_ERROR};const e=this._getLocalVideoTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableVideoTrack] Room missing video track -> ${h.MISSING_VIDEO_TRACK_ERROR}`),{code:h.MISSING_VIDEO_TRACK_ERROR};if(e.forEach(i=>{i.mute()}),!this._options.isOffCameraWhenVideoDisable)return{code:h.SUCCESS};const{code:t}=await this._room.unpublish(e);return t!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${t}`),{code:h.UNPUBLISH_VIDEO_ERROR}):(e.forEach(i=>{i.destroy()}),{code:h.SUCCESS})}async enableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`),{code:h.NOT_IN_ROOM_ERROR};if(!this._options.isOffCameraWhenVideoDisable){const o=this._getLocalVideoTracks();return o.length?(o.forEach(r=>{r.unmute()}),{code:h.SUCCESS}):(this._logger.error("_",`[RCCallSession EnableVideoTrack] Room missing video track -> ${h.MISSING_VIDEO_TRACK_ERROR}`),{code:h.MISSING_VIDEO_TRACK_ERROR})}const{code:e,track:t}=await this._rtcClient.createCameraVideoTrack();if(e!==m.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession EnableVideoTrack] Get Resource failed: RCRTCCode -> ${e}`),{code:h.GET_LOCAL_VIDEO_TRACK_ERROR};const i=[];this._options.localTracks&&this._options.localTracks.forEach(o=>{o.isVideoTrack()?o.destroy():i.push(o)}),i.push(t),this._options.localTracks=i,t.mute();const{code:n}=await this._room.publish([t]);return n!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession EnableVideoTrack] Resource publishing failed: RCRTCCode -> ${e}`),{code:h.VIDEO_PUBLISH_ERROR}):(t.unmute(),this._notifyTrackReady([t]),{code:h.SUCCESS})}async disableAudioTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`),{code:h.NOT_IN_ROOM_ERROR};this._getLocalAudioTracks().forEach(t=>{t.mute()})}async enableAudioTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${h.NOT_IN_ROOM_ERROR}`),{code:h.NOT_IN_ROOM_ERROR};const e=this._getLocalAudioTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${h.MISSING_VIDEO_TRACK_ERROR}`),{code:h.MISSING_VIDEO_TRACK_ERROR};e.forEach(t=>{t.unmute()})}_destroyTracks(e){e.forEach(t=>{t.destroy()})}_notifyTrackReady(e){e.forEach(t=>{try{this._listener.onTrackReady(t,this)}catch(i){this._logger.error("_","[RCCallSession _notifyTrackReady] _listener onTrackReady exception"),console.error(i)}})}_registerRoomEventListener(){this._room.registerRoomEventListener({onKickOff:(e,t)=>{const i=this._rtcClient.getCurrentId();this._stateMachine.userLeave([i]),e?(t===m.RCKickReason.SERVER_KICK&&this._exceptionClose(u.KICKED_BY_SERVER),t===m.RCKickReason.OTHER_KICK&&this._exceptionClose(u.OTHER_CLIENT_JOINED_CALL)):this._exceptionClose(u.NETWORK_ERROR)},onMessageReceive(e,t,i,n){},onRoomAttributeChange(e,t){},onAudioMuteChange:e=>{this._logger.info("_",`[RCCallSession onAudioMuteChange] userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const t={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"audio",trackId:e.getTrackId()};try{this._listener.onAudioMuteChange(t,this)}catch(i){this._logger.error("_","[RCCallSession onAudioMuteChange] Missing listening method -> onTrackMuteChange"),console.error(i)}},onVideoMuteChange:e=>{this._logger.info("_",`[RCCallSession onVideoMuteChange]userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const t={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"video",trackId:e.getTrackId()};try{this._listener.onVideoMuteChange(t,this)}catch(i){this._logger.error("_","[RCCallSession onVideoMuteChange] Missing listening method -> onVideoMuteChange"),console.error(i)}},onTrackPublish:async e=>{if(this._room){const{code:t}=await this._room.subscribe(e);t!==m.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession onTrackPublish] subscribe failed RTCCode ->${t}`)}},onTrackUnpublish:e=>{},onTrackReady:e=>{this._stateMachine.getMediaType()===N.AUDIO&&e.isVideoTrack()||this._notifyTrackReady([e])},onUserJoin:e=>{this.joinRoomTimer&&this.joinRoomTimer.stop(),this._stateMachine.userJoin(e)},onUserLeave:e=>{this._logger.info("_",`[RCCallSession onUserLeave] listening onUserLeave userIds -> ${e==null?void 0:e.join(",")}`),this._stateMachine.userLeave(e)},onPing:e=>{this._logger.info("_",`[RCCallSession onPing]${e}`);try{this._listener.onPing&&this._listener.onPing(e,this)}catch(t){this._logger.error("_","[RCCallSession onPing] listening onPing exception"),console.error(t)}}})}_registerReportListener(){this._room.registerReportListener({onStateReport:e=>{try{this._listener.onRTCStateReport&&this._listener.onRTCStateReport(e,this)}catch(t){this._logger.error("_","[RCCallSession onStateReport] listener onStateReport exception"),console.error(t)}},onICEConnectionStateChange:e=>{try{this._listener.onICEConnectionStateChange&&this._listener.onICEConnectionStateChange(e,this)}catch(t){this._logger.error("_","[RCCallSession onICEConnectionStateChange] onICEConnectionStateChange exception"),console.error(t)}}})}getSessionId(){return this._stateMachine.getCallId()}getRTCSessionId(){return this._room?this._room.getSessionId():null}getTargetId(){return this._stateMachine.getTargetId()}getConversationType(){return this._stateMachine.getConversationType()}getChannelId(){return this._stateMachine.getChannelId()}getRemoteUsers(){return this._stateMachine.getRemoteUsers()}getUsers(){return this._stateMachine.getRemoteUsers()}getUserState(e){if(!e||typeof e!="string")throw new Error("userId is required, must be of type 'string'");return this._stateMachine.getUserState(e)}getState(){return this._stateMachine.getState()}getCallerId(){return this._stateMachine.getCallerId()}getMediaType(){return this._stateMachine.getMediaType()}}class ne{constructor(e,t,i,n){f(this,"_rtcClient");f(this,"_callEngine");f(this,"_options");f(this,"_sessionList",[]);f(this,"_callPushConfig",{});f(this,"_hungupPushConfig",{});this._context=e,this._runtime=t,this._logger=i,this._rtcClient=n.rtcClient,this._options={isAllowPublishRetry:!1,isAllowSubscribeRetry:!1,isOffCameraWhenVideoDisable:!0,joinType:E.RTCJoinType.COEXIST,isAllowDemotionGetStream:!1,lang:w.ZH,...n},this._callEngine=new ge(this._context,t,this._logger,{onInvite:this._onInvite.bind(this),onOfflineRecord:this._onOfflineRecord.bind(this)},{lang:this._options.lang||w.ZH}),x.on("sessionClose",({session:o,summaryInfo:r})=>{this._removeSession(o);try{this._options.onSessionClose(o,r)}catch(a){this._logger.error("_","[RCCCallClient] options.onSessionClose exception"),console.log(a)}}),x.on("hungupOtherSession",({session:o})=>{const r=o.getSessionId();this._logger.info("_",`[RCCallClient hungupOtherSession] sessionId ready to accept -> ${r}`),this._logger.info("_",`[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map(_=>_.getSessionId()).join(",")}`);let a=0;for(;this._sessionList.length>1;)this._sessionList[a].getSessionId()!==r?(this._sessionList[a].hungup(),this._sessionList.splice(a,1)):a++;this._logger.info("_",`[RCCallClient hungupOtherSession] current sessionList length ->${this._sessionList.length}`)})}_onInvite(e,t){this._logger.info("_","[RCCallClient _onInvite] Received invite message");const i=new W(e,this._rtcClient,this._logger,{isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:$.CALLEE,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});this._logger.info("_","[RCCallClient _onInvite] Received invite message, successfully created session"),this._sessionList.push(i);try{this._options.onSession(i,t)}catch(n){this._logger.error("_","[RCCallClient _options.onSession] onSession exception"),console.log(n)}if(i._listener){const n=K(i._listener);if(!n.result)throw new Error(n.msg)}else throw this._logger.error("_","[RCCallClient _options.onSession] session Must Have Listener"),new Error("[RCCallSession _options.onSession] session Must Have Listener")}_onOfflineRecord(e){try{this._options.onOfflineRecord&&this._options.onOfflineRecord(e)}catch(t){this._logger.error("_","[RCCallClient _options.onOfflineRecord] onOfflineRecord exception"),console.log(t)}}registerUserInfo(e={}){this._callEngine.registerUserInfo(e),this._logger.info("_","[RCCallClient registerUserInfo] successfully register user info data")}async startCrossCall({targetId:e,mediaType:t=N.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:_="",bitrate:l}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:_,bitrate:l,isCrossAppkey:!0})}async call({targetId:e,mediaType:t=N.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:_="",bitrate:l}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:_,bitrate:l})}async __call({targetId:e,mediaType:t=N.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:_="",bitrate:l,isCrossAppkey:c=!1}){const{pushTitle:d="",pushContent:C=""}=this._callPushConfig.pushTitle||this._callPushConfig.pushContent?this._callPushConfig:{pushTitle:a,pushContent:_};this._logger.info("_",`[RCCallClient call] extra->${r} pushTitle->${d} pushContent->${C}`);const I=[te(e),se(t),K(i),F(r),j(d),J(C)],g=[];if(!I.every(R=>(!R.result&&g.push(R.msg),R.result)))throw new Error(`[RCCallClient call] ${g.join(`
|
|
3
|
+
`)}`);let O=[];const{code:y,tracks:U}=await this._getLocalTrack(t,n);if(y!==h.SUCCESS)return{code:y};O=U,O.forEach(R=>{var D,P,B;R.isAudioTrack()&&(l!=null&&l.audio)&&R.setBitrate(l==null?void 0:l.audio),R.isVideoTrack()&&(l!=null&&l.video)&&R.setBitrate((D=l==null?void 0:l.video)==null?void 0:D.max,(P=l==null?void 0:l.video)==null?void 0:P.min,(B=l==null?void 0:l.video)==null?void 0:B.start),i.onTrackReady(R)});const{code:v,stateMachine:L}=await this._callEngine.call(o,e,t,r,d,C,c);if(v===h.SUCCESS&&L){this._logger.info("_","[RCCallClient call] successfully created state machine");const R=new W(L,this._rtcClient,this._logger,{localTracks:O,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:$.CALLER,isCrossAppkey:c,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return R.registerSessionListener(i),this._sessionList.push(R),this._logger.info("_",`[RCCallClient call] successfully created session object, sessionId: ${R.getSessionId()}`),{code:v,session:R}}return this._logger.error("_",`[RCCallClient call] call failed code ->: ${v}`),O.forEach(R=>{R.mute(),R.destroy()}),{code:v}}async callInGroup({targetId:e,userIds:t,mediaType:i=N.AUDIO,listener:n,constraints:o,channelId:r="",extra:a="",pushTitle:_="",pushContent:l="",bitrate:c}){const{pushTitle:d="",pushContent:C=""}=this._callPushConfig.pushTitle||this._callPushConfig.pushContent?this._callPushConfig:{pushTitle:_,pushContent:l},I=[te(e),ie(t),se(i),K(n),F(a),j(d),J(C)],g=[];if(!I.every(R=>(!R.result&&g.push(R.msg),R.result)))throw new Error(`[RCCallClient callInGroup] ${g.join(`
|
|
4
|
+
`)}`);let O=[];const{code:y,tracks:U}=await this._getLocalTrack(i,o);if(y!==h.SUCCESS)return{code:y};O=U,O.forEach(R=>{var D,P,B;R.isAudioTrack()&&(c!=null&&c.audio)&&R.setBitrate(c==null?void 0:c.audio),R.isVideoTrack()&&(c!=null&&c.video)&&R.setBitrate((D=c==null?void 0:c.video)==null?void 0:D.max,(P=c==null?void 0:c.video)==null?void 0:P.min,(B=c==null?void 0:c.video)==null?void 0:B.start),n.onTrackReady(R)});const{code:v,stateMachine:L}=await this._callEngine.callInGroup(r,e,i,t,a,d,C);if(v===h.SUCCESS&&L){this._logger.info("_","[RCCallClient callInGroup] successfully created state machine");const R=new W(L,this._rtcClient,this._logger,{localTracks:O,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:$.CALLER,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return R.registerSessionListener(n),this._sessionList.push(R),this._logger.info("_",`[RCCallClient callInGroup] successfully created session object, sessionId: ${R.getSessionId()}`),{code:v,session:R}}return this._logger.info("_",`[RCCallClient callInGroup] callInGroup failed code -> ${v}`),O.forEach(R=>{R.mute(),R.destroy()}),{code:v}}async _getLocalTrackCore(e,t){if(e===N.AUDIO){const{code:o,track:r}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",t&&t.audio&&{...t.audio});return o!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio local tracks failed RCT code -> ${o}`),{code:h.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get Audio local tracks"),{code:h.SUCCESS,tracks:[r]})}const{code:i,tracks:n}=await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",t&&{...t});return i!==m.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio and Video local tracks failed RCT code -> ${i}`),{code:h.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get audio and video local tracks"),{code:h.SUCCESS,tracks:n})}async _getLocalTrack(e,t){if(this._options.isAllowDemotionGetStream&&e===N.AUDIO_VIDEO){const{code:o,tracks:r}=await this._getLocalTrackCore(N.AUDIO_VIDEO,t);if(o!==h.SUCCESS){const{code:a,tracks:_}=await this._getLocalTrackCore(N.AUDIO,t);return a!==h.SUCCESS?{code:a}:{code:a,tracks:_}}return{code:o,tracks:r}}const{code:i,tracks:n}=await this._getLocalTrackCore(e,t);return i!==h.SUCCESS?{code:i}:{code:i,tracks:n}}_removeSession(e){const t=e.getSessionId();this._sessionList=this._sessionList.filter(i=>i.getSessionId()!==t)}async getJoinedRoomInfo(){const{code:e,data:t}=await this._context.getRTCJoinedUserInfo(this._context.getCurrentId());return e!==E.ErrorCode.SUCCESS?(this._logger.error("_",`getJoinedUserInfo error code: ${e}`),{code:h.QUERY_JOINED_USER_INFO_ERROR}):{code:h.SUCCESS,data:t}}setPushConfig(e={},t={}){const i=[e,t].map(r=>Ee(r))[0],n=[];if(!i.every(r=>(!r.result&&n.push(r.msg),r.result)))throw new Error(`[RCCallClient callInGroup callPushConfig or hungupPushConfig] ${n.join(`
|
|
5
|
+
`)}`);this._callPushConfig=e,this._hungupPushConfig=t}}E.VersionManage.add("plugin-call","5.2.0");const Me={tag:"RCCall",verify(s){return s.tag==="browser"},setup(s,e,t){const i=Te(t);if(!i.result)throw new Error(`[RCCallLib installer steup]${i.msg}`);if(!E.VersionManage.validEngine("5.7.7"))throw new Error(`The current engine version '${E.VersionManage.getInfo().engine}' error, plugin-call required engine version at least '5.7.7'.`);const n=s.createLogger("RCCall","RTC");return n.warn("_","RCCall Version: 5.2.0, Commit: 0e97428ebeef65512d62e174e37595eadbb7a039"),new ne(s,e,n,t)}};M.RCCallClient=ne,M.RCCallEndReason=u,M.RCCallErrorCode=h,M.RCCallLanguage=w,M.RCCallMediaType=N,M.RCCallSession=W,M.RCCallSessionState=S,M.RCCallUserState=p,M.installer=Me,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})});
|
|
6
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkID09PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLCBwdXNoQ29udGVudDogc3RyaW5nID0gJycsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBpbnZpdGUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlj5HpgIHpgoDor7fmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY2FsbGVySWQgPSB0aGlzLl9pbnZpdGVySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEludml0ZSh7XG4gICAgICByb29tVHlwZTogaXNDcm9zc0FwcGtleSA/IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwgOiBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVOb3JtYWxDYWxsLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhID0gb3B0aW9ucy5leHRyYSB8fCAnJztcbiAgICBjb25zdCBwdXNoVGl0bGUgPSBvcHRpb25zLnB1c2hUaXRsZSB8fCAnJztcbiAgICBjb25zdCBwdXNoQ29udGVudCA9IG9wdGlvbnMucHVzaENvbnRlbnQgfHwgJyc7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgLy8g6Zmk6Ieq5bex77yM5YW25LuW5omA5pyJ5Lq65Z2H6ZyA5pS25YiwIG1vZGlmeSDmtojmga/vvIzku6XmraTmm7TmlrDnirbmgIFcbiAgICAgIGludml0ZVVzZXJJZHM6IHVzZXJJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgICAgY2FsbGVySWQ6IHRoaXMuZ2V0Q2FsbGVySWQoKSxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogWy4uLmV4aXN0ZWRVc2VySWRzLCAuLi51c2VySWRzXS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgLy8g5L+u5pS56KKr6YKA6K+35Lq654q25oCB77yM5bm26YCa55+lXG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAvLyDlkK/liqjlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuacquaOpeaKm+WHum9uSHVuZ3VwXG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKrvvIzpgJrnn6XmiL/pl7TnirbmgIFcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5OT05FLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG5cbiAgICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIGVuZFJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9odW5ndXBIYW5kbGUocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlj5HpgIHmjILmlq3nsbvlnovmtojmga9cbiAgICBsZXQgY29kZSA9IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTO1xuXG4gICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgIHB1c2hUaXRsZTogdGhpcy5faHVuZ3VwUHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQ6IHRoaXMuX2h1bmd1cFB1c2hDb250ZW50LFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLy8g6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSwg5bex5pa55Li6IGNhbGxlZSDljp/lm6DkuLrlt7Hmlrnmi5Lnu53pgJror51cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlclRpbWVycykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIgPyByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMIDogcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLlJFSkVDVDtcbiAgICB9XG5cbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5L+u5pS56YCa6K+d5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBjaGFuZ2VNZWRpYVR5cGUgLT4gbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZWRpYU1vZGlmeSh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog55So5oi35Yqg5YWl6YCa6K+d6KGl5YG/5py65Yi277yIcnRjIHVzZXJKb2luIOS6i+S7tuinpuWPke+8iVxuICAgKiDkuLvlj6vlkbzlj6vlkI7vvIzmnKrmlLbliLDooqvlj6sgYWNjZXB0IOa2iOaBr++8jOS9huaUtuWIsOS6hiB1c2VySm9pbiDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIHjgIHlkbzlj6vorqHml7blmahcbiAgICovXG4gIHVzZXJKb2luKHVzZXJJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIHVzZXJKb2luIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VySmlvbiDlkowgYWNjZXB0IOa2iOaBr+mDveacieeahOaDheWGteS4i++8jCB1c2VySm9pbiDmr5QgYWNjZXB0IOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIEgKC8vIOe+pOe7hOmAmuivneaXtu+8miBB5ZCRQuOAgUPlj5HotbfpgJror50gQuWFiOaOpeWQrO+8jEPlkI7mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahF91c2VySW5mb++8jOaJgOS7pei/memHjOWIpOaWreS4gOS4iylcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkc7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YGc5q2i5bm25riF6Zmk5ZG85Y+r6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+emu+W8gOmAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VyTGVhdmXjgIFraWNrT2ZmIOS6i+S7tuinpuWPke+8iVxuICAgKiDpgJror53kuK3ov5znq6/nlKjmiLfmjILmlq3vvIzmjILmlq3mtojmga/mnKrliLDvvIzkvYbmmK/nm5HlkKzliLAgcnRjIHVzZXJMZWF2ZSDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIFcbiAgICovXG4gIHVzZXJMZWF2ZSh1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VyTGVhdmUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlu7bov58gMzAwbXMg6Ziy5q2iIHVzZXJMZWF2ZSDlkowgaHVuZ3VwIOa2iOaBr+mDveacieeahOaDheWGteS4i++8jHVzZXJMZWF2ZSDmr5QgaHVuZ3VwIOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIFcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSkge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkU7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodXNlckluZm8sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgfVxuICAgICAgICAvLyDkuLvlj6vmlrnnvqTogYrpgoDor7fooqvlj6vmlrnlkI7nprvnur/vvIzkuLvlj6vmlrnmraTml7bkuLrnrYnlvoXnirbmgIHlkI7kuI3lho3kuIrnur/vvIzooqvlj6vmlrnmjqXlkKzlkI7mjILmlq3oh7PliankvZnkuIDkurrml7bnrYnlvoXkuIDliIbpkp/lkI7mjILmlq1cbiAgICAgICAgY29uc3QgcmVtb3RlVXNlcnNUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlVXNlcnMgPSB0aGlzLmdldFJlbW90ZVVzZXJzKCk7XG4gICAgICAgICAgLy8g6L+c56uv5Y+q5pyJ5LiA5Liq55So5oi35LiU5piv562J5b6F54q25oCB77yM562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgICAgaWYgKHJlbW90ZVVzZXJzLmxlbmd0aCA9PT0gMSAmJiByZW1vdGVVc2Vyc1swXS5zdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTkVUV09SS19FUlJPUik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICAgIC8vIOabtOaWsOaIv+mXtOeKtuaAgVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIgJiYgdGhpcy5fc2Vzc2lvblN0YXRlICE9PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCDlsYLlt7HmlrnlvILluLjlpLHotKXlkI7osIPnlKjnmoTmlrnms5VcbiAgICog6Kem5Y+R5pe25py677ya6Z+z6KeG6aKR5pyN5Yqh5byC5bi444CB6I635Y+W6LWE5rqQ5aSx6LSl44CB5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKXjgIHlj5HluIN86K6i6ZiF5aSx6LSlXG4gICAqL1xuICBjbG9zZShyZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgc2V0SHVuZ3VwUHVzaENvbmZpZyhwdXNoQ29uZmlnOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKSB7XG4gICAgdGhpcy5faHVuZ3VwUHVzaFRpdGxlID0gcHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29udGVudCA9IHB1c2hDb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpJrnu4Tnu4cgSURcbiAgICovXG4gIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGFubmVsSWQ7XG4gIH1cblxuICAvKipcbiAgICog55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIGdldFRhcmdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY29udmVyc2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZggSUQg5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VySWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhbGxVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IHJlbW90ZVVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgIT09IGlkKTtcbiAgICByZXR1cm4gcmVtb3RlVXNlcklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZjkv6Hmga/liJfooahcbiAgICovXG4gIGdldFJlbW90ZVVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICBjb25zdCByZW1vdGVVc2VyOiBJVXNlckRhdGFbXSA9IFtdO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGZvciAoY29uc3QgdWlkIGluIHRoaXMuX3VzZXJJbmZvKSB7XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gdGhpcy5fdXNlckluZm9bdWlkXTtcbiAgICAgIGlmICh1c2VySWQgIT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmVtb3RlVXNlci5wdXNoKHRoaXMuX3VzZXJJbmZvW3VpZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmiL/pl7TnirbmgIFcbiAgICovXG4gIGdldFN0YXRlKCk6IFJDQ2FsbFNlc3Npb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25TdGF0ZSA9PT0gbnVsbCA/IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQgOiB0aGlzLl9zZXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl91c2VySW5mb1t1c2VySWRdPy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53lj5HotbfogIUgSWRcbiAgICovXG4gIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPmrKHkvJror53pgoDor7fogIUgSWRcbiAgICovXG4gIGdldEludml0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVySWQhO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjemAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbE1lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53mjILmlq3lkI7lj6/osIPnlKhcbiAgICovXG4gIGdldFN1bW1hcnkoKTogSUVuZFN1bW1hcnkge1xuICAgIC8vIOmAmuivneaXtumXtOiuoeeul1xuICAgIGNvbnN0IGJlZ2luVGltZXN0YW1wID0gdGhpcy5fYmVnaW5UaW1lc3RhbXA7XG4gICAgY29uc3QgZW5kVGltZXN0YW1wID0gdGhpcy5fZW5kVGltZXN0YW1wO1xuICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgaWYgKGVuZFRpbWVzdGFtcCA+IGJlZ2luVGltZXN0YW1wICYmIGJlZ2luVGltZXN0YW1wICE9PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IGVuZFRpbWVzdGFtcCAtIGJlZ2luVGltZXN0YW1wO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIGJlZ2luVGltZXN0YW1wLFxuICAgICAgZW5kVGltZXN0YW1wLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbiEsXG4gICAgfTtcblxuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBnZXRTdW1tYXJ5IC0+IHN1bW1hcnk6ICR7SlNPTi5zdHJpbmdpZnkoc3VtbWFyeSl9YCk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbn1cbiIsIi8qKlxuICog6YCa6K+d5aqS5L2T57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbE1lZGlhVHlwZSB7XG4gIC8qKlxuICAgKiDpn7PpopHpgJror51cbiAgICovXG4gIEFVRElPID0gMSxcbiAgLyoqXG4gICAqIOinhumikemAmuivnVxuICAgKi9cbiAgQVVESU9fVklERU9cbn1cbiIsImV4cG9ydCBlbnVtIE1lbWJlck1vZGlmeVR5cGUge1xuICBBREQgPSAxLFxuICBSRU1PVkVcbn1cbiIsIi8qKlxuICog5bmz5Y+wXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgV0VCID0gJ1dlYicsXG4gIElPUyA9ICdpT1MnLFxuICBBTkRST0lEID0gJ0FuZHJvaWQnXG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBDYWxsUmVtb3RlRW5kUmVhc29uLCBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2VudW1zL1JDQ2FsbEVuZFJlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSUh1bmd1cE1zZ0NvbnRlbnQsIElJbnZpdGVNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dDb250ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9mZmxpbmVSZWNvcmQge1xuICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgY29udmVyc2F0aW9uVHlwZTogQ29udmVyc2F0aW9uVHlwZSxcbiAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgbWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsXG4gIGNhbGxJZDogc3RyaW5nLFxuICBpbnZpdGVySWQ6IHN0cmluZyxcbiAgZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24sXG4gIGJlZ2luVGltZXN0YW1wOiBudW1iZXIsXG4gIGVuZFRpbWVzdGFtcDogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyXG59XG5cbi8qKlxuICog56a757q/6YCa6K+d6K6w5b2V5ZmoXG4gKi9cbmV4cG9ydCBjbGFzcyBPZmZsaW5lUmVjb3JkZXIge1xuICBwcml2YXRlIF9tZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdIHwgW10gPSBbXVxuXG4gIHByaXZhdGUgX2NoYW5uZWxJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2NvbnZlcnNhdGlvblR5cGUhOiBDb252ZXJzYXRpb25UeXBlXG5cbiAgcHJpdmF0ZSBfdGFyZ2V0SWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9tZWRpYVR5cGUhOiBSQ0NhbGxNZWRpYVR5cGVcblxuICBwcml2YXRlIF9jYWxsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jYWxsZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2ludml0ZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2VuZFJlYXNvbiE6IFJDQ2FsbEVuZFJlYXNvblxuXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25SZWNvcmQ6IChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSA9PiB2b2lkLFxuICApIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg57uT5p2fXG4gICAqIOWOn+WboOagueaNruW3seaWueaYr+WQpuS4uuS4u+WPq++8jOS4u+WPq+S4uui/nOerr+acquaOpeWQrCDooqvlj6vooqvlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX2RvSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBzZW5kZXJVc2VySWQsIGNvbnRlbnQsXG4gICAgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyBjYWxsSWQsIG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICB0aGlzLl9jaGFubmVsSWQgPSBjaGFubmVsSWQhO1xuICAgIHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgPSBjb252ZXJzYXRpb25UeXBlO1xuICAgIHRoaXMuX3RhcmdldElkID0gdGFyZ2V0SWQ7XG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCBpc0NhbGxlciA9IHNlbmRlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZDtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNDYWxsZXIgPyBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb01lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZG9JbnZpdGUobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICog55SoIGludml0ZSB8IG1lbWJlck1vZGlmeSDorqHnrpfnmoTnprvnur/orrDlvZVcbiAgICovXG4gIHByaXZhdGUgX2RvUmluZ2luZyhtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGFjY2VwdCDor7TmmI7pgJror53lt7Llu7rnq4tcbiAgICog5Y6f5Zug6buY6K6k5bex5pa55q2j5bi45oyC5patXG4gICAqL1xuICBwcml2YXRlIF9kb0FjY2VwdChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkhBTkdVUDtcbiAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IG1lc3NhZ2Uuc2VudFRpbWU7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGh1bmd1cCDor7TmmI7kuLrmraPluLjmjILmlq1cbiAgICog5Y6f5Zug5Y+W5raI5oGv5L2T6YeM5oyC5pat5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9kb0h1bmd1cChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50LCBzZW50VGltZSwgc2VuZGVyVXNlcklkIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgcmVhc29uIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGlzU2VsZlNlbmQgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNTZWxmU2VuZCA/IHJlYXNvbiA6IENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXTtcbiAgICB0aGlzLl9lbmRUaW1lc3RhbXAgPSBzZW50VGltZTtcblxuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPquS/ruaUuemAmuivneexu+Wei1xuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBjb250ZW50IGFzIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FuR2VuUmVjb3JkKCkge1xuICAgIGlmICh0aGlzLl9tZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgICBjb25zdCBpc05lZWREdXJhdGlvblJlYXNvbiA9IFtcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkhBTkdVUCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9LSUNLRURfQllfU0VSVkVSLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uQUNDRVBUX1NZU1RFTV9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0FDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgIF0uaW5jbHVkZXModGhpcy5fZW5kUmVhc29uKTtcbiAgICAgIGlmIChpc05lZWREdXJhdGlvblJlYXNvbikge1xuICAgICAgICBkdXJhdGlvbiA9IHRoaXMuX2VuZFRpbWVzdGFtcCAtIHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25SZWNvcmQoe1xuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgaW52aXRlcklkOiB0aGlzLl9pbnZpdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbixcbiAgICAgICAgYmVnaW5UaW1lc3RhbXA6IHRoaXMuX2JlZ2luVGltZXN0YW1wLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuX2VuZFRpbWVzdGFtcCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblJlY3ZPZmZsaW5lTXNncyhtZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdKSB7XG4gICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICBkbyB7XG4gICAgICBjb25zdCBtc2cgPSB0aGlzLl9tZXNzYWdlcy5zaGlmdCgpITtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZVR5cGUsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1zZztcbiAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZTpcbiAgICAgICAgICB0aGlzLl9kb0ludml0ZShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgICB0aGlzLl9kb1JpbmdpbmcobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgICB0aGlzLl9kb0FjY2VwdChtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAgIHRoaXMuX2RvTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgICB0aGlzLl9kb01lZGlhTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgICAgdGhpcy5fZG9IdW5ndXAobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW09mZmxpbmVSZWNvcmRlcl0gb25SZWN2T2ZmbGluZU1zZ3MgLT4gdW5leHBlY3RlZCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID4gMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR5cGUsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgTWVtYmVyTW9kaWZ5VHlwZSB9IGZyb20gJy4vZW51bXMvTWVtYmVyTW9kaWZ5VHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElVc2VyUHJvZmlsZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElBY2NlcHRNc2dDb250ZW50LCBJQWNjZXB0TXNnT3B0aW9ucywgSUNhbGxNc2dPcHRpb24sIElIdW5ndXBNc2dDb250ZW50LCBJSHVuZ3VwTXNnT3B0aW9ucywgSUludml0ZU1zZ0NvbnRlbnQsIElJbnZpdGVNc2dPcHRpb25zLCBJTWVkaWFNb2RpZnlNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dPcHRpb25zLCBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMsIElNc2dMaXN0ZW5lciwgSVJpbmdpbmdNc2dDb250ZW50LCBJUmluZ2luZ01zZ09wdGlvbnMsIElTZW5kQmFzZU9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgTG9jYWwgfSBmcm9tICcuL2xvY2FsZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJy4vZW51bXMvUGxhdGZvcm0nO1xuaW1wb3J0IHsgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkLCBPZmZsaW5lUmVjb3JkZXIgfSBmcm9tICcuL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuLic7XG5cbmNvbnN0IGNhbGxNc2dUeXBlcyA9IFsnUkM6VkNBY2NlcHQnLCAnUkM6VkNSaW5naW5nJywgJ1JDOlZDU3VtbWFyeScsICdSQzpWQ0hhbmd1cCcsICdSQzpWQ0ludml0ZScsICdSQzpWQ01vZGlmeU1lZGlhJywgJ1JDOlZDTW9kaWZ5TWVtJ107XG5cbnR5cGUgTXNnTGlzdGVuZXJLZXlzID0ga2V5b2YgSU1zZ0xpc3RlbmVyXG5cbmludGVyZmFjZSBJTXNnQnVmZmVySXRlbSB7XG4gIG1hcmtUaW1lOiBudW1iZXIsXG4gIG1zZzogSVJlY2VpdmVkTWVzc2FnZVxufVxuXG5jb25zdCBFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGU6IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRXJyb3JDb2RlIH0gPSB7XG4gIFtFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUXTogUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCxcbiAgW0Vycm9yQ29kZS5OT1RfSU5fR1JPVVBdOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX0dST1VQLFxufTtcblxuLyoqXG4gKiDmtojmga/mjqXmlLblpITnkIY6IOWcqOe6v+a2iOaBr+OAgeemu+e6v+a2iOaBr1xuICog5Y+R6YCB5raI5oGv5aSE55CGOiDlj5HpgIHkuI3lkIznsbvlnovmtojmga/lsIHoo4VcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxNZXNzYWdlSGFuZGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgX3dhdGNoZXJzOiBJTXNnTGlzdGVuZXIgPSB7fVxuXG4gIHByaXZhdGUgX3VzZXJJbmZvOiBJVXNlclByb2ZpbGUgPSB7fVxuXG4gIHByaXZhdGUgX21zZ0J1ZmZlckxpc3Q6IElNc2dCdWZmZXJJdGVtW10gPSBbXVxuXG4gIHByaXZhdGUgX2hhZEhhbmRsZU1zZ1RpbWVyOiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9vZmZsaW5lUmVjb3JkZXIhOiBPZmZsaW5lUmVjb3JkZXJcblxuICBwcml2YXRlIF9kZXZpY2VJZDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICAvKipcbiAgICAgKiDnprvnur/mtojmga/lpITnkIbml7bpl7Tpl7TpmpRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vZmZsaW5lTXNnSXR2OiBudW1iZXIgPSA2MCAqIDEwMDAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ2V0U3RhdGVNYWNoaW5lOiAoY2FsbElkOiBzdHJpbmcpID0+IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gZGV2aWNlSWRcbiAgICB0aGlzLl9kZXZpY2VJZCA9IGdldENhbGxEZXZpY2VJZChfcnVudGltZSk7XG4gICAgLy8g5aSE55CG5raI5oGv5pS25Y+RXG4gICAgdGhpcy5fY29udGV4dC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAvLyDlpITnkIbnprvnur/mtojmga/orrDlvZVcbiAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIgPSBuZXcgT2ZmbGluZVJlY29yZGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX2xvZ2dlciwgKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIG9mZmxpbmVSZWNvcmRlciAtPiAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9YCk7XG4gICAgICB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fd2F0Y2hlcnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1lc3NhZ2UobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGlzQ2FsbE1zZyA9IGNhbGxNc2dUeXBlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKTtcbiAgICBpZiAoaXNDYWxsTXNnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gX29uTWVzc2FnZSAtPiBjYWxsIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAvLyDpgJrov4fpgY3ljoYgYnVmZmVyTGlzdCDmn6Xmib7opoHmj5LlhaXnmoToioLngrlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hcmtUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBzZW50VGltZTogY3VycmVudE1zZ1NlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSAwO1xuICAgICAgICAvLyDpnIDpgY3ljobmlbDnu4Tlhajpg6jpobnvvIzmlYXkvb/nlKggZm9yRWFjaCwgZmluZEluZGV4IOaJvuWIsOesrOS4gOS4quespuWQiOadoeS7tueahOWwseS8mue7iOatolxuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LmZvckVhY2goKHsgbXNnOiB7IHNlbnRUaW1lIH0gfSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudE1zZ1NlbnRUaW1lID49IHNlbnRUaW1lKSB7XG4gICAgICAgICAgICAvLyBpbnNlcnRJbmRleCDpnIDkuLrlvZPliY3nrKblkIjmnaHku7blhYPntKDnmoTlkI7kuIDkvY3vvIzmlYUgKzFcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgICAgbWFya1RpbWUsXG4gICAgICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb25NZXNzYWdlIC0+IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gc3BsaWNlIGJ1ZmZlciBtc2cgZXJyb3IgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICAvLyDlkK/liqjmtojmga/lpITnkIZcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5Zyo57q/5raI5oGv5oqb57uZ54q25oCB5py65aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZPbmxpbmVDYWxsTXNnKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBvbk1lc3NhZ2UgLT4gX29uUmVjdk9ubGluZUNhbGxNc2c6ICR7bWVzc2FnZS5tZXNzYWdlVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1lc3NhZ2U7XG4gICAgLy8g5Zyo57q/5raI5oGv55u05o6l5oqb5Ye6XG4gICAgc3dpdGNoIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSAmJiB0aGlzLl93YXRjaGVycy5vbkludml0ZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25SaW5naW5nYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25BY2NlcHRgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAvLyDmlLbliLDkurrlkZjlj5jmm7Tmipvlh7ogb25JbnZpdGUg55Sf5oiQ54q25oCB5py65a6e5L6LXG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25NZWRpYU1vZGlmeWAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uSHVuZ3VwYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb25SZWN2T25saW5lQ2FsbE1zZyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmtojmga8gYnVmZmVyIOWIl+ihqOWkhOeQhumAu+i+kVxuICAgKiAx44CB5q+PIDIwbXMg5qOA5p+l5LiA5qyhIGJ1ZmZlciBsaXN0XG4gICAqIDLjgIHlj5blh7rlt7Lnu4/lu7bov58gMjAwIOeahOa2iOaBr+WIl+ihqOi/m+ihjOa2iOi0uSB8IOaXoOW7tui/nyAyMDBtcyDlhoXmtojmga/nm7TmjqXpgJLlvZJcbiAgICogM+OAgea2iOi0ueWIhuS4uiDnprvnur/mtojmga/mtojotLnpgLvovpHjgIHlnKjnur/mtojmga/mtojotLnpgLvovpHvvIzmtojotLnlkI7pgJLlvZJcbiAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyTXNncygpIHtcbiAgICAvLyDmtojmga8gYnVmZmVyIOWIl+ihqOmVv+W6puS4uiAwIOaXtuWKoOmUgVxuICAgIGlmICh0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnX2hhbmRsZUJ1ZmZlck1zZ3MgcmV0dXJuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOmcgOimgeWKoOmUge+8jOaUtuWIsOWkmuasoea2iOaBr+WQju+8jOWPr+iDveS8mui1t+WkmuS4qiB0aW1lclxuICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIOWPluWHuuWkp+S6jiAyMDAgbXMg5raI5oGv5YiX6KGoXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGN1cnJlbnRUaW1lIC0gaXRlbS5tYXJrVGltZSA+PSAyMDApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIGhhbmRsZUJ1ZmZlck1zZ3MgLT4gbGlzdHMgb3ZlciAyMDBtcyA6ICR7SlNPTi5zdHJpbmdpZnkoYnVmZmVycy5tYXAoKHsgbXNnOiB7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSB9KSA9PiAoeyBtZXNzYWdlVUlkLCBpc09mZkxpbmVNZXNzYWdlLCBjYWxsSWQgfSkpKX1gKTtcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyDmsqHmnInlu7bov58gMjAwbXMg55qE5raI5oGv77yM5raI6LS56YC76L6R6Kej6ZSB5bm26YCS5b2S5omn6KGMXG4gICAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyc1swXS5tc2cuaXNPZmZMaW5lTWVzc2FnZSkge1xuICAgICAgICAvLyDlvZPnrKzkuIDmnaHmtojmga/kuLrnprvnur/mtojmga/ml7bvvIznm7TmjqXku44gYnVmZmVyIOS4reWPluWHuuaJgOacieemu+e6v+a2iOaBr++8jOi/m+ihjOa2iOaBr1xuICAgICAgICBsZXQgb2ZmbGluZUJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5tc2cuaXNPZmZMaW5lTWVzc2FnZSk7XG5cbiAgICAgICAgLy8g56a757q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb25UeXBlLCBtZXNzYWdlVHlwZSwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCwgY29udGVudDogeyBjYWxsSWQ6IGludml0ZUNhbGxJZCwgaW52aXRlVXNlcklkcyB9LFxuICAgICAgICAgIH0gPSBvZmZsaW5lQnVmZmVyc1swXS5tc2c7XG5cbiAgICAgICAgICBjb25zdCBpc0ludml0ZU1zZ1R5cGUgPSBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSk7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBEYXRlLm5vdygpIC0gc2VudFRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKGlzSW52aXRlTXNnVHlwZSkgeyAvLyDlj5blh7rnmoTnrKzkuIDmnaHmtojmga/kuLogaW52aXRlIHwgbWVtTW9kaWZ5XG4gICAgICAgICAgICAvLyDlj5blh7rnm7jlkIwgQ2FsbElkIOa2iOaBr+WIl+ihqFxuICAgICAgICAgICAgY29uc3QgdGFza01zZ0xpc3Q6IElSZWNlaXZlZE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZsaW5lQnVmZmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gb2ZmbGluZUJ1ZmZlcnNbaV0ubXNnO1xuICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkOiBvdGhlckNhbGxJZCB9IH0gPSBpdGVtO1xuICAgICAgICAgICAgICBpZiAoaW52aXRlQ2FsbElkID09PSBvdGhlckNhbGxJZCkge1xuICAgICAgICAgICAgICAgIHRhc2tNc2dMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYHRhc2tNc2dMaXN0IGxlbmd0aDogJHt0YXNrTXNnTGlzdC5sZW5ndGh9YCk7XG5cbiAgICAgICAgICAgIGlmICh0YXNrTXNnTGlzdC5sZW5ndGggPiAwKSB7IC8vIOmYsuatoiB0YXNrTXNnTGlzdCDkuLogMFxuICAgICAgICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsSW5kZXggPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBtc2dCdWZmZXJMaXN0IOeahOa2iOaBr1xuICAgICAgICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5zbGljZShkZWxJbmRleCArIDEpO1xuXG4gICAgICAgICAgICAgIC8vIOaJvuWHuiBvZmZsaW5lTXNncyDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsT2ZmbGluZUluZGV4ID0gb2ZmbGluZUJ1ZmZlcnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1zZy5tZXNzYWdlVUlkID09PSB0YXNrTXNnTGlzdFt0YXNrTXNnTGlzdC5sZW5ndGggLSAxXS5tZXNzYWdlVUlkKTtcbiAgICAgICAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+HIG9mZmxpbmVCdWZmZXJzIOeahOa2iOaBr1xuICAgICAgICAgICAgICBvZmZsaW5lQnVmZmVycyA9IG9mZmxpbmVCdWZmZXJzLnNsaWNlKGRlbE9mZmxpbmVJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDljZXogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOWmguaenOa2iOaBr+WcqCA2MHMg5YaF77yM5Yik5pat5piv5ZCm5pyq5oiQ5a+577yI5Y+q5pyJIGludml0ZSDmiJblj6rmnIkgaW52aXRlIOaIliByaW5naW5nIOaIkOWvueaKm+e7mSDnprvnur/orrDlvZXlmajvvIzmnKrmiJDlr7nmipvnu5nnirbmgIHmnLpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGlzT25seUludml0ZSA9IHRhc2tNc2dMaXN0Lmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgICAgY29uc3QgaGFzSW52aXRlQW5kUmluZ2luZyA9IHRhc2tNc2dMaXN0LmV2ZXJ5KChpdGVtKSA9PiBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZ10uaW5jbHVkZXMoaXRlbS5tZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSkpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNPbmx5SW52aXRlIHx8IGhhc0ludml0ZUFuZFJpbmdpbmc7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDnvqTogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOmAmui/hyBsaXN0IOS4rSBpbnZpdGUg5ZKMIG1lbWJlck1vZGlmeSDmtojmga/kuK3lj5blh7rmiYDmnInlj4LkuI7pgJror53nmoQgdXNlcklkXG4gICAgICAgICAgICAgKiDpgY3ljoYgbGlzdCDmib7lh7rmiYDmnIkgaGFuZ3VwIOeahCBzZW5kVXNlcklkXG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwID4gMSAg5LiU5Ymp5L2Z5Lq65pWw5YyF5ZCr6Ieq5bex77yM6K6k5Li66YCa6K+d5pyq5oyC5pat6L+b54q25oCB5py6XG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwIDw9IDEg6YCa6K+d5oyC5pat77yM6L+b56a757q/5raI5oGv5aSE55CG5ZmoXG4gICAgICAgICAgICAgKiAgICAg5Li75Y+r55u05o6l5oyC5pat5LiU5YW25LuW5Lq65pyq5o6l5ZCs55u05o6l6L+b56a757q/5aSE55CG5ZmoXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZEdycENhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgaXNVbmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGxldCBub09uZUFjY2VwdCA9IHRydWU7XG4gICAgICAgICAgICAgIGxldCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG4gICAgICAgICAgICAgIGxldCBpc0NhbGxlckh1bmd1cCA9IGZhbHNlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tNc2dMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZW5kZXJVc2VySWQ6IHRhc2tNc2dTZW5kZXJVc2VySWQsIG1lc3NhZ2VUeXBlIH0gPSB0YXNrTXNnTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAvLyDlj6ropoHoh6rlt7HmjILmlq3nm7TmjqXot7Plh7rlvqrnjq/vvIzov5vnprvnur/mtojmga9cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwICYmIHRhc2tNc2dTZW5kZXJVc2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmib7lh7rmiYDmnInmjILmlq3nmoTkurrlkZjvvIzku6Xlj4rpgJror53lj5HotbfogIXmmK/lkKbmjILmlq1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwKSB7XG4gICAgICAgICAgICAgICAgICBpc0NhbGxlckh1bmd1cCA9IHNlbmRlclVzZXJJZCA9PT0gdGFza01zZ1NlbmRlclVzZXJJZDtcbiAgICAgICAgICAgICAgICAgIGFsbFVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRhc2tNc2dTZW5kZXJVc2VySWQgIT09IGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm5peg5Lq65o6l5ZCsXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCkge1xuICAgICAgICAgICAgICAgICAgbm9PbmVBY2NlcHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8g5LiN5piv5Li75Y+r5oyC5pat5LiU5peg5Lq65o6l5ZCs77yM5LiU5Ymp5L2Z5Lq65pWw5aSn5LqOIDFcbiAgICAgICAgICAgICAgaWYgKCEobm9PbmVBY2NlcHQgJiYgaXNDYWxsZXJIdW5ndXApICYmIGFsbFVzZXJJZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGlzVW5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGlzVW5maW5pc2hlZDtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiAoaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwgfHwgaXNVbmZpbmlzaGVkR3JwQ2FsbCkpIHtcbiAgICAgICAgICAgICAgdGFza01zZ0xpc3QuZm9yRWFjaCh0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlci5vblJlY3ZPZmZsaW5lTXNncyh0YXNrTXNnTGlzdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUoaW52aXRlQ2FsbElkKSkge1xuICAgICAgICAgICAgICB0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnKG9mZmxpbmVCdWZmZXJzWzBdLm1zZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gdW5leGNlcHRlZCBvZmZsaW5lIG1zZyAtPiAke0pTT04uc3RyaW5naWZ5KG9mZmxpbmVCdWZmZXJzWzBdLm1zZyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZsaW5lQnVmZmVycy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAob2ZmbGluZUJ1ZmZlcnMubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlnKjnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgYnVmZmVycy5mb3JFYWNoKCh7IG1zZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhtc2chKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOaJvuWHuiBtc2dCdWZmZXJMaXN0IOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICBjb25zdCBkZWxDb3VudCA9IGJ1ZmZlcnMubGVuZ3RoO1xuICAgICAgICAvLyDliKDpmaTmtojotLnov4fnmoTmtojmga9cbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoMCwgZGVsQ291bnQpO1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgdGltZXIgb25saW5lIG1zZyBoYW5kbGUgLT4gZGVsQ291bnQ6ICR7ZGVsQ291bnR9IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lciA9IGZhbHNlO1xuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgIH0sIDIwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcjogSU1zZ0xpc3RlbmVyKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl93YXRjaGVycywgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZywgZnVuY05hbWU6IE1zZ0xpc3RlbmVyS2V5cywgZXZlbnQ6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNhbGxJZCArIGZ1bmNOYW1lO1xuICAgIHN1cGVyLm9uKGV2ZW50VHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgdW5yZWdpc3RlclN0YXRlTWFjaGluZUV2ZW50KGNhbGxJZDogc3RyaW5nKSB7XG4gICAgWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25NZWRpYU1vZGlmeSddLmZvckVhY2goKGZ1bmNOYW1lKSA9PiB7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICAgIHN1cGVyLnJlbW92ZUFsbChldmVudFR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fdXNlckluZm8gPSB1c2VySW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kQ2FsbE1lc3NhZ2Uob3B0aW9uczogSUNhbGxNc2dPcHRpb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBtZXNzYWdlPzogSVJlY2VpdmVkTWVzc2FnZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgLT4gbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgZGlyZWN0aW9uYWxVc2VySWRMaXN0LCBwdXNoVGl0bGUsIHB1c2hEYXRhLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZW5kT3B0cyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuICAgIGxldCBwdXNoQ29uZmlnID0ge307XG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIHB1c2hDb25maWcgPSB7XG4gICAgICAgIHB1c2hUaXRsZTogcHVzaFRpdGxlIHx8ICcnLFxuICAgICAgICBwdXNoQ29udGVudDogcHVzaENvbnRlbnQgfHwgJycsXG4gICAgICAgIHB1c2hEYXRhLFxuICAgICAgICBhbmRyb2lkQ29uZmlnOiB7XG4gICAgICAgICAgY2F0ZWdvcnlIVzogJ1ZPSVAnLFxuICAgICAgICAgIGNhdGVnb3J5Vml2bzogJ0lNJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBPYmplY3QuYXNzaWduKHNlbmRPcHRzLCB7IHB1c2hDb25maWcgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZON6ZOD5raI5oGvXG4gICAqL1xuICBzZW5kUmluZ2luZyhvcHRpb25zOiBJUmluZ2luZ01zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSVJpbmdpbmdNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlkIzmhI/mjqXlkKzmtojmga9cbiAgICovXG4gIHNlbmRBY2NlcHQob3B0aW9uczogSUFjY2VwdE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJQWNjZXB0TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHmjILmlq3mtojmga9cbiAgICovXG4gIHNlbmRIdW5ndXAob3B0aW9uczogSUh1bmd1cE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHJlYXNvbiwgdXNlcklkcywgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJSHVuZ3VwTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlqpLkvZPlj5jmm7Tmtojmga9cbiAgICovXG4gIHNlbmRNZWRpYU1vZGlmeShvcHRpb25zOiBJTWVkaWFNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lZGlhTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxMYW5ndWFnZSB7XG4gIFpIID0gJ3poJyxcbiAgRU4gPSAnZW4nXG59XG4iLCJleHBvcnQgY29uc3QgRU4gPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAnWW91IGhhdmUgYSB2b2ljZSBjYWxsJyxcbiAgICBWSURFTzogJ1lvdSBoYXZlIGEgdmlkZW8gY2FsbCcsXG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IFpIID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ+aCqOacieS4gOadoemfs+mikemAmuivnScsXG4gICAgVklERU86ICfmgqjmnInkuIDmnaHop4bpopHpgJror50nLFxuICB9LFxufTtcbiIsImltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nO1xuaW1wb3J0IHsgWkggfSBmcm9tICcuL3poJztcblxuLyoqXG4gKiBDYWxsRW5naW5lIOWFqOWxgOivreiogOiuvue9ru+8jOW9k+WJjeS7heaUr+aMgeS4reOAgeiLseaWh1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWwge1xuICBzdGF0aWMgX2xhbmc6IFJDQ2FsbExhbmd1YWdlID0gUkNDYWxsTGFuZ3VhZ2UuWkhcblxuICBzdGF0aWMgc2V0KGxhbmc6IFJDQ2FsbExhbmd1YWdlKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gIH1cblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIGlmICh0aGlzLl9sYW5nID09PSBSQ0NhbGxMYW5ndWFnZS5FTikge1xuICAgICAgcmV0dXJuIEVOO1xuICAgIH1cbiAgICByZXR1cm4gWkg7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi9jb3JlL1N0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSU1lZGlhTW9kaWZ5SW5mbywgSU1lbWJlck1vZGlmeUluZm8sIElTZW5kZXJJbmZvLCBJU3RhdGVDaGFuZ2VJbmZvLCBJVXNlclByb2ZpbGUsIElVc2VyU3RhdGVDaGFuZ2VJbmZvLCBJVXNlckRhdGEsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxVc2VyU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvblN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgQ2FsbE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi9jb3JlL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IGV2ZW50RW1pdHRlciwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBJQ2FsbEVuZ2luZU9wdGlvbnMsIElDYWxsRW5naW5lV2F0Y2hlcnMgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJQWNjZXB0TXNnQ29udGVudCwgSUludml0ZU1zZ0NvbnRlbnQgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgTG9jYWwgfSBmcm9tICcuL2NvcmUvbG9jYWxlJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkIH0gZnJvbSAnLi9jb3JlL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0Nyb3NzQ2FsbFR5cGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbi8vIGNhbGwtZW5naW5lIOeJiOacrOS4iuaKpVxuVmVyc2lvbk1hbmFnZS5hZGQoJ2NhbGwtZW5naW5lJywgX19WRVJTSU9OX18pO1xuXG4vLyDmoKHpqozlvZPliY3lronoo4XnmoQgZW5naW5lIOeJiOacrOaYr+WQpuWPr+eUqFxuaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgY29uc29sZS5lcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3LvvIxjYWxsLWVuZ2luZSByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbn1cbmNsYXNzIFJDQ2FsbEVuZ2luZSB7XG4gIHByaXZhdGUgX3N0YXRlTWFjaGluZTogeyBbY2FsbElkOiBzdHJpbmddOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbE1zZ0hhbmRsZXI6IENhbGxNZXNzYWdlSGFuZGxlclxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJZcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSBQbGd1aW5Db250ZXh0IOWunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgLyoqXG4gICAgICog6L+Q6KGM5pe255u45YWzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgLyoqXG4gICAgICogZW5naW5lIOaXpeW/l+aooeWdl+WunuS+i++8jOeUsSBDYWxsTGliIOWxguWIneWni+WMllxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgLyoqXG4gICAgICog55uR5ZCs5pa55rOVXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2F0Y2hlcnM6IElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gICAgLyoqXG4gICAgICog5YW25LuW6YWN572u6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogSUNhbGxFbmdpbmVPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBSQ0NhbGxFbmdpbmUgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30gQ29tbWl0SWQ6ICR7X19DT01NSVRfSURfX31gKTtcbiAgICAvLyDorr7nva4gRGV2aWNlSWRcbiAgICBnZXRDYWxsRGV2aWNlSWQoX3J1bnRpbWUpO1xuICAgIC8vIOebkeWQrCBJTSDmtojmga9cbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlciA9IG5ldyBDYWxsTWVzc2FnZUhhbmRsZXIodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB0aGlzLl9vcHRpb25zLm9mZmxpbmVNc2dJdHYsIHRoaXMuX2dldFN0YXRlTWFjaGluZS5iaW5kKHRoaXMpKTtcbiAgICAvLyDms6jlhozmtojmga/mqKHlnZfnm5HlkKxcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBzZW5kQWNjZXB0OiB0aGlzLl9oYW5kbGVTZW5kQWNjZXB0LmJpbmQodGhpcyksXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCxcbiAgICB9KTtcbiAgICAvLyDnm5HlkKznirbmgIHmnLrlhbPpl61cbiAgICBldmVudEVtaXR0ZXIub24oJ29uU3RhdGVNYWNoaW5lQ2xvc2UnLCAoY2FsbElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgICB9KTtcbiAgICAvLyDorr7nva7or63oqIBcbiAgICBMb2NhbC5zZXQoX29wdGlvbnMubGFuZyk7XG4gIH1cblxuICBwcml2YXRlIF9vbkludml0ZShtc2c6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgc2VuZGVyVXNlcklkOiBzdWlkLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBtc2c7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIF9vbkludml0ZTp0YXJnZXRJZCAke3RhcmdldElkfSBzZW5kZXJVc2VySWQ6ICR7c3VpZH1gKTtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYVR5cGUsIGNhbGxJZCwgZXh0cmEsIHJvb21UeXBlLFxuICAgIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIGxldCBzZW5kZXJVc2VySWQ6IHN0cmluZztcbiAgICBpZiAocm9vbVR5cGUgIT09IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwpIHtcbiAgICAgIHNlbmRlclVzZXJJZCA9IHN1aWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFssIHNlbmRlclVzZXJJZF0gPSBzdWlkLnNwbGl0KCdfJyk7XG4gICAgfVxuICAgIGNvbnN0IGNydFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgPT09IHNlbmRlclVzZXJJZCkgeyAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnvqTogYrpgJror53mnInlhbbku5bnq6/lpITnkIbml7bvvIzkuI3lho3lpITnkIbmraTpgJror53kuK3nmoTpgoDor7fmtojmga9cbiAgICAgKiDmnaHku7YxOiDmraTkurrlt7LooqvpgoDor7fpgJror51cbiAgICAgKiDmnaHku7YyOiDmnKznq6/ml6DmraTpgJror53nmoTnirbmgIHmnLpcbiAgICAgKi9cbiAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICBjb25zdCBpc0tlZXBpbmcgPSBjb250ZW50LmV4aXN0ZWRVc2VyUG9maWxlcy5zb21lKChpdGVtOiB7IHVzZXJJZDogc3RyaW5nIH0pID0+IChpdGVtLnVzZXJJZCA9PT0gY3J0VXNlcklkKSk7XG4gICAgICBpZiAoaXNLZWVwaW5nICYmICF0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgaWYgKCFzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgICAgY2hhbm5lbElkISxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgY2FsbElkLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxFbmdpbmVdIFJDQ2FsbFN0YXRlTWFjaGluZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCAtPiBjYWxsSWQ6ICR7Y2FsbElkfWApO1xuXG4gICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlKSB7XG4gICAgICAgIC8vIOeKtuaAgeacuuWGhemDqOWkhOeQhiBpbnZpdGUg5raI5oGvXG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25JbnZpdGUobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLCBleHRyYSk7XG5cbiAgICAgIGNvbnN0IGhhc090aGVyU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5maWx0ZXIoKG90aGVyQ2FsbElkKSA9PiBjYWxsSWQgIT09IG90aGVyQ2FsbElkKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGhhc090aGVyU3RhdGVNYWNoaW5lICYmICEodGhpcy5fb3B0aW9ucy5pc0FsbG93QWNjZXB0TmV3Q2FsbCB8fCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19vbk1lbWJlck1vZGlmeShtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlhYHorrjmjqXlkKzmlrDnmoTpgJror53ml7bvvIzmjqXlkKzlrozmlrDnmoTpgJror53lkI7vvIzmjILmlq3lhbbku5bpgJror51cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNlbmRBY2NlcHQoaW5mbzogeyBjYWxsSWQ6IHN0cmluZyB9KSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwpIHtcbiAgICAgIGNvbnN0IHsgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdGF0ZU1hY2hpbmUpIHtcbiAgICAgICAgaWYgKGNhbGxJZCAhPT0gaWQpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdLmh1bmd1cCgpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6I635Y+W54q25oCB5py6XG4gICovXG4gIHByaXZhdGUgX2dldFN0YXRlTWFjaGluZShjYWxsSWQ6IHN0cmluZyk6IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga8sIOWPkemAgSBjYWxsIOa2iOaBr+aXtueUqOaIt+S/oeaBr+aQuuW4plxuICAgKi9cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIHJlZ2lzdGVyVXNlckluZm8gLT4gdXNlckluZm86ICR7SlNPTi5zdHJpbmdpZnkodXNlckluZm8pfWApO1xuXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbyk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg5a+55pa5IElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJyxcbiAgICBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGwgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LFxuICAgIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbChbdGFyZ2V0SWRdLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICogQHBhcmFtIGNoYW5uZWxJZCDnu4Tnu4cgSURcbiAgICogQHBhcmFtIHRhcmdldElkICDnvqTnu4QgSURcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65ZGY5YiX6KGoXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbEluR3JvdXAoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICB1c2VySWRzOiBzdHJpbmdbXSxcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGxJbkdyb3VwIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUgfSl9YCk7XG4gICAgY29uc3QgY2FsbElkID0gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIGNvbnN0IGhhc1N0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzU3RhdGVNYWNoaW5lKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1RBVEVfTUFDSElORV9FWElUIH07XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICB0aGlzLl9ydW50aW1lLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICBjaGFubmVsSWQsXG4gICAgICBDb252ZXJzYXRpb25UeXBlLkdST1VQLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbCh1c2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HlvZPliY3nmoTnirbmgIHmnLpcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxFbmdpbmVdIGRlc3Ryb3knKTtcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBSQ0NhbGxFbmdpbmUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbExhbmd1YWdlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSxcbiAgSUNhbGxFbmdpbmVXYXRjaGVycyxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElTZW5kZXJJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSU1lZGlhTW9kaWZ5SW5mbyxcbiAgSUludml0ZWRVc2VycyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclByb2ZpbGUsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJSW52aXRlT3B0aW9ucyxcbn07XG4iLCIvKipcbiAqIOS6p+eUn3Nlc3Npb27nmoTlnLrmma9cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjZVR5cGVzIHtcbiAgLyoqXG4gICAqIOS4u+WPq1xuICAgKi9cbiAgQ0FMTEVSID0gMSxcblxuICAvKipcbiAgICog6KKr5Y+rXG4gICAqL1xuICBDQUxMRUUgPSAyXG59XG4iLCJjbGFzcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxpc3Q6IHtbcHJvcE5hbWU6IHN0cmluZ106IGFueVtdfSA9IHt9XG5cbiAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bjooZGF0YT86YW55KT0+dm9pZCkge1xuICAgICh0aGlzLmxpc3RbZXZlbnRdIHx8ICh0aGlzLmxpc3RbZXZlbnRdID0gW10pKS5wdXNoKGZ1bik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBvbiA9IChkYXRhPzphbnkpID0+IHtcbiAgICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9O1xuICAgIG9uLmZ1biA9IGZ1bjtcbiAgICB0aGlzLm9uKGV2ZW50LCBvbik7XG4gIH1cblxuICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bj86KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBmdW5zID0gdGhpcy5saXN0W2V2ZW50XTtcbiAgICBpZiAoIWZ1bnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFmdW4pIHtcbiAgICAgIC8vIOWmguaenOayoeacieS8oCBmbiDnmoTor53vvIzlsLHkvJrlsIYgZXZlbnQg5YC85a+55bqU57yT5a2Y5YiX6KGo5Lit55qEIGZ1biDpg73muIXnqbpcbiAgICAgIGZ1bnMgJiYgKGZ1bnMubGVuZ3RoID0gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOiLpeaciSBmdW7vvIzpgY3ljobnvJPlrZjliJfooajvvIznnIvnnIvkvKDlhaXnmoQgZm4g5LiO5ZOq5Liq5Ye95pWw55u45ZCM77yM5aaC5p6c55u45ZCM5bCx55u05o6l5LuO57yT5a2Y5YiX6KGo5Lit5Yig5o6J5Y2z5Y+vXG4gICAgICBsZXQgY2I7XG4gICAgICBmb3IgKGxldCBpID0gMCwgeyBsZW5ndGggfSA9IGZ1bnM7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjYiA9IGZ1bnNbaV07XG4gICAgICAgIGlmIChjYiA9PT0gZnVuIHx8IGNiLmZ1biA9PT0gZnVuKSB7XG4gICAgICAgICAgZnVucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzphbnkpIHtcbiAgICAvLyDnrKzkuIDkuKrlj4LmlbDmmK/lr7nlupTnmoQgZXZlbnQg5YC877yM55u05o6l55So5pWw57uE55qEIHNoaWZ0IOaWueazleWPluWHulxuICAgIGNvbnN0IGZ1bnMgPSBbLi4udGhpcy5saXN0W2V2ZW50XV07XG5cbiAgICAvLyDlpoLmnpznvJPlrZjliJfooajph4zmsqHmnIkgZnVuIOWwsei/lOWbniBmYWxzZVxuICAgIGlmICghZnVucyB8fCBmdW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyDpgY3ljoYgZXZlbnQg5YC85a+55bqU55qE57yT5a2Y5YiX6KGo77yM5L6d5qyh5omn6KGMIGZuXG4gICAgZnVucy5mb3JFYWNoKChmdW4pID0+IHtcbiAgICAgIGZ1bi5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBFdmVudEVtaXR0ZXIsXG59O1xuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiIsImltcG9ydCB7IFJUQ0pvaW5UeXBlLCBMb2dMZXZlbCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKExvZ0xldmVsKSBhcyBudW1iZXJbXTtcbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9Mb2dMZXZlbOeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nTGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nTGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ0xldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Z1bmN0aW9u57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2dTdGRvdXQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmxvZ1N0ZG91dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ1N0ZG91dFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFtdO1xuICBjb25jbHVzaW9uLnB1c2godmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSk7XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KSk7XG4gIHJldHVybiBjb25jbHVzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlcklkcyA9ICh1c2VySWRzOiBzdHJpbmdbXSk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMuZXZlcnkoKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBpc1JDRnJhbWVSYXRlKHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFycnMgPSBbJ0ZQU18xMCcsICdGUFNfMTUnLCAnRlBTXzI0JywgJ0ZQU18zMCddO1xuICByZXR1cm4gYXJycy5pbmNsdWRlcyh2YWwpO1xufVxuXG5jb25zdCBpc1ZhbGlkUmVzb2x1dGlvbiA9IChyZXNvbHV0aW9uPzogUkNSZXNvbHV0aW9uKTogYm9vbGVhbiA9PiAhIVJDUmVzb2x1dGlvbltyZXNvbHV0aW9uIV07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSAoY29uc3RyYWludHM6IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ251bWJlclxcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICAvLyBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VzZXInICYmIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gIC8vICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSAgXFwndXNlclxcJyBvciBcXCdlbnZpcm9ubWVudFxcJycgfVxuICAvLyB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzUkNGcmFtZVJhdGUoY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2ZyYW1lUmF0ZVxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiAhaXNWYWxpZFJlc29sdXRpb24oY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgKCFjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgfHwgIWNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyBhbmQgXFwncmVzb2x1dGlvblxcJyBpcyByZXF1aXJlZCcgfTtcbiAgfVxuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbWVyIHtcbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgc3RvcCgpOiB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgZW5kVGltZTogbnVtYmVyLFxuICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICB9IHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElJbnZpdGVPcHRpb25zLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIFJDS2lja1JlYXNvbixcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNSVENQaW5nUmVzdWx0LFxuICBSQ1JUQ1Jvb20sXG4gIElNaWNwaG9uZUF1ZGlvUHJvZmlsZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmltcG9ydCB7XG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJTXV0ZVVzZXIsXG4gIElSQ0NhbGxTZXNzaW9uT3B0aW9ucyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICBjb25zdCB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSA9IHRoaXMuX29wdGlvbnMuaHVuZ3VwUHVzaENvbmZpZyE7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcocHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog6ZKI5a+556eB5pyJ5LqRIEByb25nY2xvdWQvcGx1Z2luLXJ0Y0A1LjEuMTAtZW50ZXJwcmlzZS43IOWinuWKoOihpeS4ge+8jFxuICAgICAgICog56eB5pyJ5LqR5Y2H5a6MIFJUQyBzZGsg54mI5pys5ZCO5Yig5o6J5q2k6KGl5LiBXG4gICAgICAgKiDliqDlrozmiL/pl7TlkI7vvIzlr7nmlrnmjILmlq3kuobvvIzpnIDpgIDlh7rmiL/pl7RcbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdGF0ZSgpID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20ocm9vbSEpO1xuICAgICAgICB0aGlzLl9yb29tID0gbnVsbCBhcyB1bmtub3duIGFzIFJDUlRDUm9vbTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgICAgIH1cblxuICAgICAgLy8g6KKr5Y+r5pa55Yqg5YWl5oi/6Ze05oiQ5Yqf77yM5L2G5Li75Y+r5pa55Zyo5Yqg5YWl5oi/6Ze05YmN56a757q/XG4gICAgICBpZiAodXNlcklkcyEubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTkVUV09SS19FUlJPUik7XG4gICAgICAgIH0sIDYwMDAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvb20gPSByb29tIGFzIFJDUlRDUm9vbTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3J0Y0NsaWVudC5qb2luUlRDUm9vbSB0aHJvdyBleGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5oi/6Ze05LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgdGhpcy5fcmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcigpO1xuXG4gICAgLy8g5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAgdGhpcy5fcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOiuoumYhei/nOeoi+eahOa1ge+8jOaKiui/nOeoi+eahOa1geaKm+e7meeUqOaIt1xuICAgICAgYXdhaXQgdGhpcy5fc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2soKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8g57uT5p2f6YCa6K+dc2Vzc2lvblxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNVQlNDUklCRV9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2sgRXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyDlvoDmiL/pl7Tph4zlj5HluIPmnKzlnLDotYTmupBcbiAgICAgIGF3YWl0IHRoaXMuX3B1Ymxpc2goKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8g57uT5p2f6YCa6K+dc2Vzc2lvblxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3B1Ymxpc2ggRXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqICjliJ3lp4vljJbmiL/pl7TnmoTml7blgJkpIOiuoumYhei/nOeoi+eahOa1ge+8jOaKiui/nOeoi+eahOa1geaKm+e7meeUqOaIt1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2soKSB7XG4gICAgLy8g6I635Y+W5omA5pyJ6L+c56iL5bey5Y+R5biD55qE6Z+z6KeG6aKR6LWE5rqQ5YiX6KGoXG4gICAgY29uc3QgdHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSB0aGlzLl9yb29tLmdldFJlbW90ZVRyYWNrcygpO1xuICAgIGlmICh0cmFja3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrXSBSZXNvdXJjZSBzdWJzY3JpcHRpb24gZmFpbGVkIHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUlRDIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj6/ku6Xph43or5XnmoTorqLpmIVcbiAgICogQHBhcmFtIHBhcmFtcy50cmFja3MgdHJhY2tzXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNBbGxvd1N1YnNjcmliZVJldHJ5IOaYr+WQpuWFgeiuuOmHjeivlVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvdW50IOWFgeiuuOmHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc3Vic2NyaWJlUmV0cnkodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrU3Vic2NyaWJlRmFpbCAmJiB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrU3Vic2NyaWJlRmFpbCBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOS4jeWFgeiuuOmHjeivle+8jOebtOaOpei/lOWbnlxuICAgICAgaWYgKCFpc0FsbG93U3Vic2NyaWJlUmV0cnkpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlUmV0cnkodHJhY2tzLCBpc0FsbG93U3Vic2NyaWJlUmV0cnksIGNvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkeW4g+acrOWcsOi1hOa6kOeahOmAu+i+kVxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVibGlzaCgpIHtcbiAgICBjb25zdCB0cmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzITtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3B1Ymxpc2hSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSwgdGhpcy5fUkVUUllDT1VOVCk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9wdWJsaXN0XSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogcm9vbUlkIC0+ICR7dGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOWmguaenOaYr+S4u+WKqOWPkei1t+eahOWRvOWPq++8jOW3suaPkOWJjeaKm+WHuuS6hui1hOa6kCwg6KKr5Yqo5ZG85Y+r77yM6L+Z6YeM5omN6ZyA6KaB5oqb5Ye6XG4gICAgaWYgKHRoaXMuX29wdGlvbnMucHJvZHVjZVR5cGUgPT09IFByb2R1Y2VUeXBlcy5DQUxMRUUpIHtcbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gSwg6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeSh0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj6/ku6Xph43or5XnmoTlj5HluINcbiAgICogQHBhcmFtIHBhcmFtcy50cmFja3MgdHJhY2tzXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNBbGxvd1B1Ymxpc2hSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2hSZXRyeSh0cmFja3M6IFJDTG9jYWxUcmFja1tdLCBpc0FsbG93UHVibGlzaFJldHJ5OiBib29sZWFuID0gZmFsc2UsIGNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTx7IGNvZGU6IFJDUlRDQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tQdWJsaXNoRmFpbChjb2RlLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbl0gX2xpc3RlbmVyLm9uVHJhY2tQdWJsaXNoRmFpbCBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOS4jeWFgeiuuOmHjeivle+8jOebtOaOpei/lOWbnlxuICAgICAgaWYgKCFpc0FsbG93UHVibGlzaFJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2hSZXRyeSh0cmFja3MsIGlzQWxsb3dQdWJsaXNoUmV0cnksIGNvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAgOWHuuaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfbGVhdmVSb29tKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IGNhbGxCYWNrID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOaIkOWKn+mAgOWHuuaIv+mXtO+8jOinpuWPkVJDQ2FsbENsaWVudOWunuS+i+S4iueahG9uU2Vzc2lvbkNsb3Nl55uR5ZCs77yM5oqb57uZ55So5oi35L+h5oGvXG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBTdWNjZXNzZnVsbHkgZXhpdGVkIHRoZSByb29tIGNvZGU6ICR7Y2FsbEJhY2suY29kZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9sZWF2ZVJvb21dIGxlYXZlUm9vbSB0aHJvdyBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Ye6546w5byC5bi45ZCO6KaB5aSE55CG55qE6YC76L6RLFxuICAgKiBAcGFyYW0gZW5kUmVhc29uIOWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZXhjZXB0aW9uQ2xvc2UoZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICAvLyDplIDmr4HmnKzlnLDmtYFcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG5cbiAgICAvLyDnu5PmnZ/nirbmgIHmnLpcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUuY2xvc2UoZW5kUmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfosIPnlKjnmoTvvIzms6jlhoxzZXNzaW9u5LiK55qE55uR5ZCsXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIpOiB2b2lkIHtcbiAgICAvLyDlhYjmoKHpqoxsaXN0ZW5lciwg5aaC5p6c5LiN6YCa6L+H77yM5LyadHJvdyBlcnJvclxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsU2Vzc2lvbiByZWdpc3RlclNlc3Npb25MaXN0ZW5lcl0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG4gICAgdGhpcy5fbGlzdGVuZXIgPSB7IC4uLmxpc3RlbmVyIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBzdWNjZXNzZnVsbHkgZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcycpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrczogW3RyYWNrIV0gfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQW5kQ2FtZXJhVHJhY2tzKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiB7IC4uLmNvbnN0cmFpbnRzIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBhdWRpbyBhbmQgdmlkZW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDlubbkuJTmmK/ojrflvpfpn7Pop4bpopEsIOW5tuS4lCDvvIjlpoLmnpzojrflvpfpn7Pop4bpopHkuI3miJDlip/vvIzlhYHorrjpmY3nuqfojrflvpfpn7PpopHvvIlcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8sIGNvbnN0cmFpbnRzKTtcblxuICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5LiN6IO96I635b6X77yM5bCx6ZmN57qn6I635b6X6Z+z6aKRXG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgY29uc3RyYWludHMpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLkdFVF9NRURJQV9SRVNPVVJDRVNfRVJST1IpO1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIC8vIOiOt+WPlui1hOa6kOWksei0pe+8jOmcgOimgeiwg+eKtuaAgeacunN0YXRlIOS4uiBlbmRcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcblxuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogX2NvZGUsIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reabtOaNoumfs+mikeiuvuWkh1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZUF1ZGlvRGV2aWNlKGF1ZGlvQ29uc3RyYWludHM/OiBJTWljcGhvbmVBdWRpb1Byb2ZpbGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoR0cmFja1xuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIC8vIOaVtOeQhuWQjueahOacrOWcsHRyYWNrXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBhdWRpb0NvbnN0cmFpbnRzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBjaGFuZ2VEZXZpY2VdIGdldCBsb2NhbCBBdWRpbyB0cmFja3MgZmFpbGVkIFJDVExpYiBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOS5i+WJjeeahOmfs+mikemDvemUgOavge+8jO+8iFJUQ0xpYiBTREvlhoXpg6jkvJrlnKggYWRkTG9jYWxUcmFjayDmuIXnkIblkIznsbvlnovovajpgZPmlbDmja7vvIzmiYDku6Xov5nph4zms6jph4rmjonvvIlcbiAgICAgICAgLy8gdHJhY2suZGVzdHJveSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlj6rmiorkuYvliY3nmoTop4bpopHnlZnkuItcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6Z+z6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShyZWNlbnRUcmFja3MpO1xuXG4gICAgLy8g5aaC5p6c5b2T5YmN5bey5Yqg5YWl5oi/6Ze077yM5Y+R5biD5paw5rWBXG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+aWsOa1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuQVVESU9fUFVCTElTSF9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dHJhIOa2iOaBr+eahOaJqeWxleS/oeaBr1xuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOW6n+W8gyBvcHRpb25zLnB1c2hDb250ZW50IOmAmuefpeWGheWuuVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGludml0ZSh1c2VySWRzOiBzdHJpbmdbXSwgb3B0aW9uczogSUludml0ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgZXh0cmEgPSAnJyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnIH0gPSAodGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZz8ucHVzaFRpdGxlIHx8IHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWc/LnB1c2hDb250ZW50KSA/IHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWcgOiBvcHRpb25zO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudCldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGludml0ZV0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5pbnZpdGUodXNlcklkcywgeyBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9KTtcbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCM5oSP5o6l5ZCsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNjZXB0KGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyhjb25zdHJhaW50cyEpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOaOpeWQrOS5i+WJje+8jOWFiOaMguaWreW9k+WJjeS5i+WklueahHNlc3Npb27vvIznjrDpmLbmrrXkuI3lhYHorrjnlKjmiLflhYjmi6nmjqXlkKxzZXNzaW9u77yM5LqL5YWI5Lya5Zyo54q25oCB5py65YaF6YOo5oyC5pat77yM6L+Z6YeM5oqb5Ye65Y6777yM5Lya5riF55CG5YW25a6D55qEc2Vlc2lvblxuICAgIGV2ZW50RW1pdHRlci5lbWl0KCdodW5ndXBPdGhlclNlc3Npb24nLCB7IHNlc3Npb246IHRoaXMgfSk7XG4gICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gdHJhY2tzO1xuXG4gICAgLy8g5Y+R6YCB5o6l5ZCs55qE5raI5oGvXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuYWNjZXB0KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XVNlbmQgYWNjZXB0IG1lc3NhZ2UgZmFpbGVkIC0+IGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGh1bmd1cCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlOyB9PiB7XG4gICAgLy8gY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpXG4gICAgLy8gZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSlcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmh1bmd1cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtFxuICAgKiAgQHBhcmFtIG1lZGlhVHlwZSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8g5pS55Li66Z+z6aKR6YCa6K+dIHwgUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPIOaUueS4uumfs+inhumikemAmuivnVxuICAgKi9cbiAgcHVibGljIGFzeW5jIF9jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfY2hhbmdlTWVkaWFUeXBlXSBjaGFuZ2UgbWVkaWEgdHlwZSBmYWlsIGNvZGUtPiAke2NvZGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDop4bpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsVmlkZW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbFZpZGVvVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbFZpZGVvVHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOmfs+mikVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TG9jYWxBdWRpb1RyYWNrcygpOiBSQ0xvY2FsVHJhY2tbXSB7XG4gICAgbGV0IGxvY2FsQXVkaW90cmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gbG9jYWxBdWRpb3RyYWNrcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpIHtcbiAgICAgIGxvY2FsQXVkaW90cmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gIH1cblxuICAvKipcbiAgICog5oqK6YCa6K+d55qETWVkaWFUeXBl5Y2H57qn5Yiw6Z+z6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvQW5kVmlkZW8oKSB7XG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5Y+R5biD5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKFt0cmFjayFdKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChfY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZW5hYmxlVmlkZW9dIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcblxuICAgIC8vIOWPkea2iOaBr1xuICAgIHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZemZjee6p+WIsOmfs+mikVxuICAgKiBAcGFyYW0gaXNTZW5kTWVzc3NhZ2Ug5piv5ZCm6ZyA6KaB5Y+R5raI5oGvLCDpu5jorqTlj5Hmtojmga9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NldE1lZGlhVHlwZVRvQXVkaW8oKSB7XG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5wdWJsaXNoKHRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdGhpcy5fZGVzdHJveVRyYWNrcyh0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53pmY3nuqfvvIznm67liY3pnIDmsYLlj6rlgZrpgJror53pmY3nuqfvvIzpn7Pop4bpopHlj6/ku6XpmY3nuqfkuLrpn7PpopHvvIzpn7PpopHkuI3og73ljYfliLDpn7Pop4bpopEsIOWPkea2iOaBr+aIkOWKn+aJjeeul+mZjee6p+aIkOWKn1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc2NlbmRBYmlsaXR5KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2hhbmdlTWVkaWFUeXBlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9zZXRNZWRpYVR5cGVUb0F1ZGlvKCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxWaWRlb1RyYWNrcygpO1xuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb1RyYWNrXSBSb29tIG1pc3NpbmcgdmlkZW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5VTlBVQkxJU0hfVklERU9fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5LiN6ZyA5YWz6Zet5pGE5YOP5aS0XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSkge1xuICAgICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOWQr+eUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBFbmFibGVWaWRlb1RyYWNrXSBHZXQgUmVzb3VyY2UgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOS5i+WJjeeahOinhumikemDvemUgOavgVxuICAgICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlj6rnlZnkuIvkuYvliY3nmoTpn7PpopFcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g5Li65LqG6Kem5Y+R5a+55pa555qEb25WaWRlb011dGVDaGFuZ2Ug5YWI56aB55SoXG4gICAgdHJhY2shLm11dGUoKTtcblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVklERU9fUFVCTElTSF9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqFxuICAgIHRyYWNrIS51bm11dGUoKTtcblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2subXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlQXVkaW9UcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsQXVkaW9UcmFja3MoKTtcblxuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5ZCv55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgeacrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBfZGVzdHJveVRyYWNrcyh0cmFja3M6IFJDTG9jYWxUcmFja1tdKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSB8IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrIHwgUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tSZWFkeSh0cmFjaywgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX25vdGlmeVRyYWNrUmVhZHldIF9saXN0ZW5lciBvblRyYWNrUmVhZHkgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaIv+mXtOS4iuazqOWGjOS6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcigpIHtcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoXG4gICAgICB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIOiiq+i4ouWHuuaIv+mXtOWPr+iDveaYr+eUseS6juacjeWKoeerr+i2heWHuuS4gOWumuaXtumXtOacquiDveaUtuWIsCBydGNQaW5nIOa2iOaBr++8jOaJgOS7peiupOS4uuW3seaWueemu+e6v+OAglxuICAgICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgICAqIOW9k+WAvOS4uiBmYWxzZSDml7bvvIzor7TmmI7mnKznq68gcnRjUGluZyDotoXml7ZcbiAgICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgICAqL1xuICAgICAgICBvbktpY2tPZmY6IChieVNlcnZlcjogYm9vbGVhbiwgc3RhdGU/OiBSQ0tpY2tSZWFzb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VXNlcklkOiBzdHJpbmcgPSB0aGlzLl9ydGNDbGllbnQuZ2V0Q3VycmVudElkKCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZShbY3VycmVudFVzZXJJZF0pO1xuXG4gICAgICAgICAgaWYgKCFieVNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5PVEhFUl9LSUNLKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaOpeaUtuWIsOaIv+mXtOS/oeS7pOaXtuWbnuiwg++8jOeUqOaIt+WPr+mAmui/h+aIv+mXtOWunuS+i+eahCBgc2VuZE1lc3NhZ2UobmFtZSwgY29udGVudClgIOaOpeWPo+WPkemAgeS/oeS7pFxuICAgICAgICAgKiBAcGFyYW0gbmFtZSDkv6Hku6TlkI1cbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnQg5L+h5Luk5YaF5a65XG4gICAgICAgICAqIEBwYXJhbSBzZW5kZXJVc2VySWQg5Y+R6YCB6ICFIElkXG4gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlVUlkIOa2iOaBr+WUr+S4gOagh+ivhlxuICAgICAgICAgKi9cbiAgICAgICAgb25NZXNzYWdlUmVjZWl2ZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSwgc2VuZGVyVXNlcklkOiBzdHJpbmcsIG1lc3NhZ2VVSWQ6IHN0cmluZykge1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog55uR5ZCs5oi/6Ze05bGe5oCn5Y+Y5pu06YCa55+lXG4gICAgICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50XG4gICAgICAgICAqL1xuICAgICAgICBvblJvb21BdHRyaWJ1dGVDaGFuZ2UobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjpn7PpopFcbiAgICAgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgUkNSZW1vdGVBdWRpb1RyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbkF1ZGlvTXV0ZUNoYW5nZV0gdXNlcklkLT4ke2F1ZGlvVHJhY2suZ2V0VXNlcklkKCl9IG11dGVkIC0+ICR7YXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKX1gKTtcbiAgICAgICAgICBjb25zdCBtdXRlVXNlcjogSU11dGVVc2VyID0ge1xuICAgICAgICAgICAgdXNlcklkOiBhdWRpb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgICBraW5kOiAnYXVkaW8nLFxuICAgICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BdWRpb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblRyYWNrTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R5biD6ICF56aB55SoL+WQr+eUqOinhumikVxuICAgICAgICAgKiBAcGFyYW0gdmlkZW9UcmFjayBSQ1JlbW90ZVZpZGVvVHJhY2sg57G75a6e5L6L5a+56LGhXG4gICAgICAgICAqL1xuICAgICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXXVzZXJJZC0+JHt2aWRlb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke3ZpZGVvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiB2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ3ZpZGVvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IHZpZGVvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25WaWRlb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25WaWRlb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblZpZGVvTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze05YaF5YW25LuW55So5oi35paw5Y+R5biD6LWE5rqQ5pe26Kem5Y+RXG4gICAgICAgICAqIOWmgumcgOiOt+WPluWKoOWFpeaIv+mXtOS5i+WJjeaIv+mXtOWGheafkOS4queUqOaIt+WPkeW4g+eahOi1hOa6kOWIl+ihqO+8jOWPr+S9v+eUqCByb29tLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKCd1c2VySWQnKSDojrflj5ZcbiAgICAgICAgICogQHBhcmFtIHRyYWNrcyDmlrDlj5HluIPnmoTpn7PovajkuI7op4bovajmlbDmja7liJfooajvvIzljIXlkKvmlrDlj5HluIPnmoQgUkNSZW1vdGVBdWRpb1RyYWNrIOS4jiBSQ1JlbW90ZVZpZGVvVHJhY2sg5a6e5L6LXG4gICAgICAgICAqL1xuICAgICAgICBvblRyYWNrUHVibGlzaDogYXN5bmMgKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG4gICAgICAgICAgLy8g6YCA5Ye65oi/6Ze05ZCO77yM6L+Y5Lya6LWw5Yiw6L+Z77yf77yf77yM5omA5Lul5Yik5pat5LiA5LiL77yM5rKh5pyJcm9vbeS4jeaJp+ihjOiuoumYhVxuICAgICAgICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAgICAgICAvLyDmjInkuJrliqHpnIDmsYLpgInmi6npnIDopoHorqLpmIXotYTmupDvvIzpgJrov4cgcm9vbS5zdWJzY3JpYmUg5o6l5Y+j6L+b6KGM6K6i6ZiFXG4gICAgICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVHJhY2tQdWJsaXNoXSBzdWJzY3JpYmUgZmFpbGVkIFJUQ0NvZGUgLT4ke2NvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze055So5oi35Y+W5raI5Y+R5biD6LWE5rqQXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg6KKr5Y+W5raI5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGoXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDlvZPotYTmupDooqvlj5bmtojlj5HluIPml7bvvIxTREsg5YaF6YOo5Lya5Y+W5raI5a+555u45YWz6LWE5rqQ55qE6K6i6ZiF77yM5Lia5Yqh5bGC5LuF6ZyA5aSE55CGIFVJIOS4muWKoVxuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1VucHVibGlzaDogKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG5cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOiuoumYheeahOmfs+inhumikea1gemAmumBk+W3suW7uueriywgdHJhY2sg5bey5Y+v5Lul6L+b6KGM5pKt5pS+XG4gICAgICAgICAqIEBwYXJhbSB0cmFjayBSQ1JlbW90ZVRyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICAgICAgICAvLyDmnInml7blr7nmlrnmsqHmnInpmY3nuqfmiJDlip/vvIzmiZTmipvov4fmnaXop4bpopHvvIzov5nml7bnmoTop4bpopHkuI3lr7nlpJbmipvlh7pcbiAgICAgICAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gJiYgdHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDmiafooYznlKjmiLfnmoRvblRyYWNrUmVhZHnnm5HlkKxcbiAgICAgICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Lq65ZGY5Yqg5YWlXG4gICAgICAgICAqIEBwYXJhbSB1c2VySWRzIOWKoOWFpeeahOS6uuWRmCBpZCDliJfooahcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckpvaW46ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIC8vIOacieS6uuWKoOWFpea4hemZpOWumuaXtuWZqFxuICAgICAgICAgIGlmICh0aGlzLmpvaW5Sb29tVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuam9pblJvb21UaW1lci5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VySm9pbih1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOmAgOWHulxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkc1xuICAgICAgICAgKi9cbiAgICAgICAgb25Vc2VyTGVhdmU6ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVXNlckxlYXZlXSBsaXN0ZW5pbmcgb25Vc2VyTGVhdmUgdXNlcklkcyAtPiAke3VzZXJJZHM/LmpvaW4oJywnKX1gKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckxlYXZlKHVzZXJJZHMpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOavj+asoSBQaW5nIOe7k+aenFxuICAgICAgICAgKi9cbiAgICAgICAgb25QaW5nOiAocmVzdWx0OiBSQ1JUQ1BpbmdSZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblBpbmddJHtyZXN1bHR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyAmJiB0aGlzLl9saXN0ZW5lciEub25QaW5nKHJlc3VsdCwgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblBpbmddIGxpc3RlbmluZyBvblBpbmcgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3Jvb20ucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOS6juaOpeaUtueKtuaAgeaVsOaNruaKpeWRilxuICAgICAgICogQHBhcmFtIHJlcG9ydFxuICAgICAgICovXG4gICAgICBvblN0YXRlUmVwb3J0OiAocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0ICYmIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydCwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uU3RhdGVSZXBvcnRdIGxpc3RlbmVyIG9uU3RhdGVSZXBvcnQgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogfklDRSDov57mjqXnirbmgIHlj5jmm7TpgJrnn6V+XG4gICAgICAgKiBAc2luY2UgdmVyc2lvbiA1LjEuNVxuICAgICAgICovXG4gICAgICBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTogKHN0YXRlOiBSVENJY2VDb25uZWN0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgJiYgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2VdIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluaIv+mXtOW9k+WJjeS8muivnSBJZO+8jOW9k+aIv+mXtOWGheW3suaXoOaIkOWRmOaXtuaIv+mXtOS8muWbnuaUtu+8jOmHjeaWsOWKoOWFpeaXtiBzZXNzaW9uSWQg5bCG5pu05paw77yMKOeUqOaIt+W9leWItui1hOa6kOeUqOeahClcbiAgICovXG4gIHB1YmxpYyBnZXRSVENTZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20gPyB0aGlzLl9yb29tLmdldFNlc3Npb25JZCgpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAg55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIHB1YmxpYyBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0VGFyZ2V0SWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg6I635Y+W5Lya6K+d57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENvbnZlcnNhdGlvblR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg57uE57uHIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hhbm5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDaGFubmVsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAgICovXG4gIHB1YmxpYyBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRSZW1vdGVVc2VycygpO1xuICB9XG5cbiAgLyoqXG4gKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAqL1xuICBwdWJsaWMgZ2V0VXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkurrlkZjnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIGlmICghdXNlcklkIHx8IHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJJZCBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFVzZXJTdGF0ZSh1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlnNlc3Npb27nirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfkvJror53lj5HotbfogIVpZFxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l21lZGlhVHlwZVxuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFJUQ1BsdWdpbkNvbnRleHQsIElSdW50aW1lLCBJUlRDSm9pbmVkSW5mbywgRXJyb3JDb2RlLCBSVENKb2luVHlwZSwgSUxvZ2dlciwgQmFzaWNMb2dnZXIsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVuZ2luZSwgUkNDYWxsU3RhdGVNYWNoaW5lLCBSQ0NhbGxFcnJvckNvZGUsIFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUsIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSVENDbGllbnQsIFJDUlRDQ29kZSwgUkNMb2NhbFRyYWNrIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLCBJUkNDYWxsSW5pdE9wdGlvbnMsIElSQ0NhbGxQYXJhbXMsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJVmFsaWRhdGlvblJlc3VsdCwgSVB1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb2R1Y2VUeXBlcyB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlTGlzdGVuZXIsIHZhbGlkYXRlVGFyZ2V0SWQsIHZhbGlkYXRlTWVkaWFUeXBlLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LCB2YWxpZGF0ZVB1c2hDb25maWcsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJDQ2FsbENsaWVudCB7XG4gIC8qKlxuICAgKiBydGPlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICogY2FsbEVuZ2luZeWxguWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lXG5cbiAgLyoqXG4gICAqIOWFtuWug+WPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zXG5cbiAgLyoqXG4gICAqIHNlc3Npb27liJfooahcbiAgICovXG4gIHByaXZhdGUgX3Nlc3Npb25MaXN0OiBSQ0NhbGxTZXNzaW9uW10gPSBbXVxuXG4gIHByaXZhdGUgX2NhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9XG5cbiAgcHJpdmF0ZSBfaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcgPXt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIF9vcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuX3J0Y0NsaWVudCA9IF9vcHRpb25zLnJ0Y0NsaWVudDtcblxuICAgIHRoaXMuX29wdGlvbnMgPSB7IC8qKlxuICAgICAgICog5piv5ZCm5YWB6K645Y+R5biD6YeN6K+V77yMIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmmK/lkKblhYHorrjorqLpmIXph43or5XvvIzpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0LCDpu5jorqTlhbPpl61cbiAgICAgICAqL1xuICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6L77yM6buY6K6kICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuS0lDSyA9IDAs6Lii5YmN5LiA5Liq6K6+5aSHXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuUkVGVVNFID0gMSzlvZPliY3liqDlhaXmi5Lnu51cbiAgICAgICAqICAgICBSVENKb2luVHlwZS5DT0VYSVNUID0gMiDkuKTkuKrorr7lpIflhbHlrZhcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IFJUQ0pvaW5UeXBlLkNPRVhJU1QsXG5cbiAgICAgIC8qKlxuICAgICAgICog5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogUkNDYWxsTGFuZ3VhZ2UuWkgsXG4gICAgICAuLi5fb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8g5Yid5aeL5YyWY2FsbEVuZ2luZSwg5bm255uR5ZCsb25JbnZpdGVcbiAgICB0aGlzLl9jYWxsRW5naW5lID0gbmV3IFJDQ2FsbEVuZ2luZSh0aGlzLl9jb250ZXh0LCBfcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog55uR5ZCs5pS25YiwaW52aXRlXG4gICAgICAgKi9cbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOemu+e6v+a2iOaBr+aKpeWRilxuICAgICAgICovXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX29uT2ZmbGluZVJlY29yZC5iaW5kKHRoaXMpLFxuICAgIH0sIHtcblxuICAgICAgLyoqXG4gICAgICAgKiDor63oqIDorr7nva4gKOaOqOmAgSksIOS4jeS8oOm7mOiupOS4uuS4reaWh1xuICAgICAgICovXG4gICAgICBsYW5nOiB0aGlzLl9vcHRpb25zLmxhbmcgfHwgUkNDYWxsTGFuZ3VhZ2UuWkgsXG5cbiAgICB9KTtcblxuICAgIGV2ZW50RW1pdHRlci5vbignc2Vzc2lvbkNsb3NlJywgKHsgc2Vzc2lvbiwgc3VtbWFyeUluZm8gfSkgPT4ge1xuICAgICAgLy8g5LuOc2Vzc2lvbkxpc3Tljrvmjonov5nkuKrlhbPpl63nmoRzZXNzaW9uXG4gICAgICB0aGlzLl9yZW1vdmVTZXNzaW9uKHNlc3Npb24pO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLm9uU2Vzc2lvbkNsb3NlKHNlc3Npb24sIHN1bW1hcnlJbmZvKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDQ2FsbENsaWVudF0gb3B0aW9ucy5vblNlc3Npb25DbG9zZSBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5o6l5ZCs5LmL5YmN5oyC5pat5YW25a6D55qEc2Vzc2lvblxuICAgIGV2ZW50RW1pdHRlci5vbignaHVuZ3VwT3RoZXJTZXNzaW9uJywgKHsgc2Vzc2lvbiB9KSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gc2Vzc2lvbklkIHJlYWR5IHRvIGFjY2VwdCAtPiAke2lkfWApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25MaXN0IC0+JHt0aGlzLl9zZXNzaW9uTGlzdC5tYXAoKHNlcykgPT4gc2VzLmdldFNlc3Npb25JZCgpKS5qb2luKCcsJyl9YCk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICB3aGlsZSAodGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyDlpoLmnpzkuI7opoHmjqXlkKznmoRzZXNzaW9u5LiN5LiA6Ie0XG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uTGlzdFtpXS5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpIHtcbiAgICAgICAgICAvLyDmjILmlq1cbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdFtpXS5odW5ndXAoKTtcblxuICAgICAgICAgIC8vIOaMguaWreWQjuWIoOmZpFxuICAgICAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDlpoLmnpzmmK/opoHmjqXlkKznmoRzZXNzaW9u77yM6Lez6L+H6L+Z5Liq57Si5byV77yM5omA5Lul5YqgMVxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIGN1cnJlbnQgc2Vzc2lvbkxpc3QgbGVuZ3RoIC0+JHt0aGlzLl9zZXNzaW9uTGlzdC5sZW5ndGh9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCsb25JbnZpdGVcbiAgICovXG4gIHByaXZhdGUgX29uSW52aXRlKHN0YXRlTWFjaGluZTogUkNDYWxsU3RhdGVNYWNoaW5lLCBleHRyYT86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29uSW52aXRlXSBSZWNlaXZlZCBpbnZpdGUgbWVzc2FnZScpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgIC8qKlxuICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICovXG4gICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAvLyDmoIfmmI7mmK/ooqvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFRSxcblxuICAgICAgY2FsbFB1c2hDb25maWc6IHRoaXMuX2NhbGxQdXNoQ29uZmlnLFxuXG4gICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgIH0pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29uSW52aXRlXSBSZWNlaXZlZCBpbnZpdGUgbWVzc2FnZSwgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbicpO1xuXG4gICAgLyoqXG4gICAgICog5aaC5p6c6YCa6K+d55qE5pe25YCZ5LiN5YWB6K645o6l5ZCs5paw55qE6YCa6K+d77yM55u05o6l5oyC5pat77yMIOi/meS6m+W3peS9nOWcqGNhbGxFbmdpbmXph4zlrozmiJBcbiAgICAgKi9cbiAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOaJp+ihjOeUqOaIt0FQSeeahOebkeWQrFxuICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb24oc2Vzc2lvbiwgZXh0cmEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vblNlc3Npb25dIG9uU2Vzc2lvbiBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyDlv4XpobvlnKhvblNlc3Npb27ph4zms6jlhoxzZXNzaW9u55uR5ZCs5LqL5Lu277yM6L+Z6YeM5qOA5rWL5LiA5LiL5pyJ5rKh5pyJ5rOo5YaMXG4gICAgaWYgKHNlc3Npb24uX2xpc3RlbmVyKSB7XG4gICAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIoc2Vzc2lvbi5fbGlzdGVuZXIpO1xuICAgICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29uY2x1c2lvbi5tc2cpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vblNlc3Npb25dIHNlc3Npb24gTXVzdCBIYXZlIExpc3RlbmVyJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSQ0NhbGxTZXNzaW9uICBfb3B0aW9ucy5vblNlc3Npb25dIHNlc3Npb24gTXVzdCBIYXZlIExpc3RlbmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrOemu+e6v+a2iOaBr+aKpeWRilxuICAgKiBAcGFyYW0gcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgX29uT2ZmbGluZVJlY29yZChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOaJp+ihjOeUqOaIt0FQSeeahOebkeWQrFxuICAgICAgdGhpcy5fb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25PZmZsaW5lUmVjb3JkXSBvbk9mZmxpbmVSZWNvcmQgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOeUqOaIt+S/oeaBr+OAguazqOWGjOWQju+8jOWcqOWPkei1t+mCgOivt+aIluaMguaWreetieaTjeS9nOaXtu+8jOS8muWwhuivpeS/oeaBr+S4gOW5tuWPkemAgee7meWvueerr1xuICAgKiBAcGFyYW0gaW5mby5uYW1lICAgICAgICDnlKjmiLflkI3np7BcbiAgICogQHBhcmFtIGluZm8ucG9ydHJhaXRVcmkg55So5oi35aS05YOP5L+h5oGvXG4gICAqIEBwYXJhbSBpbmZvLmV4dHJhICAgICAgIOmihOeVmeaLk+WxleWtl+autVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVXNlckluZm8oaW5mbzogeyBuYW1lPzogc3RyaW5nOyBwb3J0cmFpdFVyaT86IHN0cmluZzsgZXh0cmE/OiBzdHJpbmc7IH0gPSB7fSkge1xuICAgIHRoaXMuX2NhbGxFbmdpbmUucmVnaXN0ZXJVc2VySW5mbyhpbmZvKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IHJlZ2lzdGVyVXNlckluZm9dIHN1Y2Nlc3NmdWxseSByZWdpc3RlciB1c2VyIGluZm8gZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICog6LeoQXBw5Y2V5ZG877yMXGLlj5HpgIFpbnZpdGXmtojmga/vvIzlm57osIPlm57mnaXmjqXmlLZzdGF0ZU1hY2hpbmUsIOW7unNlc3Npb25cbiAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOiiq+WRvOWPq+S4gOaWueeahOeUqOaItyBpZCDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLmxpc3RlbmVyIChzZXNzaW9u5LiK55qE55uR5ZCsKSDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5leHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgKlxuICAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnRDcm9zc0NhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIHJldHVybiB0aGlzLl9fY2FsbCh7XG4gICAgICB0YXJnZXRJZCwgbWVkaWFUeXBlLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGJpdHJhdGUsIGlzQ3Jvc3NBcHBrZXk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG877yMXGLlj5HpgIFpbnZpdGXmtojmga/vvIzlm57osIPlm57mnaXmjqXmlLZzdGF0ZU1hY2hpbmUsIOW7unNlc3Npb25cbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sgIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpc3RlbmVyIChzZXNzaW9u5LiK55qE55uR5ZCsKSDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5leHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2NhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgY29uc3QgeyBwdXNoVGl0bGU6IHB1c2hUaXRsZVZhbHVlID0gJycsIHB1c2hDb250ZW50OiBwdXNoQ29udGVudFZhbHVlID0gJycgfSA9ICh0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoVGl0bGUgfHwgdGhpcy5fY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQpID8gdGhpcy5fY2FsbFB1c2hDb25maWcgOiB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIGV4dHJhLT4ke2V4dHJhfSBwdXNoVGl0bGUtPiR7cHVzaFRpdGxlVmFsdWV9IHB1c2hDb250ZW50LT4ke3B1c2hDb250ZW50VmFsdWV9YCk7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVNZWRpYVR5cGUobWVkaWFUeXBlKSwgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIHZhbGlkYXRlRXh0cmEoZXh0cmEpLCB2YWxpZGF0ZVB1c2hUaXRsZShwdXNoVGl0bGVWYWx1ZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnRWYWx1ZSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGxldCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICBsb2NhbFRyYWNrcyA9IHRyYWNrcyE7XG5cbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g6K6+572u56CB546HXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgYml0cmF0ZT8uYXVkaW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkgJiYgYml0cmF0ZT8udmlkZW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy52aWRlbz8ubWF4LCBiaXRyYXRlPy52aWRlbz8ubWluLCBiaXRyYXRlPy52aWRlbz8uc3RhcnQpO1xuICAgICAgfVxuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAgICBsaXN0ZW5lci5vblRyYWNrUmVhZHkodHJhY2spO1xuICAgIH0pO1xuXG4gICAgLy8g6LCD55SoY2FsbEVuZ2luZeeahGNhbGzov5Tlm57kuIDkuKrnirbmgIHmnLrnmoTlrp7kvotcbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlTWFjaGluZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYWxsKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgZXh0cmEsIHB1c2hUaXRsZVZhbHVlLCBwdXNoQ29udGVudFZhbHVlLCBpc0Nyb3NzQXBwa2V5KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgJiYgc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IGNhbGxdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBpc0Nyb3NzQXBwa2V5LFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIGNhbGwgZmFpbGVkIGNvZGUgLT46ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+e+pOe7hOWRvOWPq1xuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOe+pOe7hCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy51c2VySWRzIOiiq+WRvOWPq+eahOe+pOWGheaIkOWRmCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvIOWPr+mAiVxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGxJbkdyb3VwKHtcbiAgICB0YXJnZXRJZCwgdXNlcklkcywgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbEluR3JvdXBQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgY29uc3QgeyBwdXNoVGl0bGU6IHB1c2hUaXRsZVZhbHVlID0gJycsIHB1c2hDb250ZW50OiBwdXNoQ29udGVudFZhbHVlID0gJycgfSA9ICh0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoVGl0bGUgfHwgdGhpcy5fY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQpID8gdGhpcy5fY2FsbFB1c2hDb25maWcgOiB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfTtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVGFyZ2V0SWQodGFyZ2V0SWQpLCB2YWxpZGF0ZVVzZXJJZHModXNlcklkcyksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlVmFsdWUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50VmFsdWUpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOW+gOe7hOmHjOWPkea2iOaBr1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGxJbkdyb3VwKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgdXNlcklkcywgZXh0cmEsIHB1c2hUaXRsZVZhbHVlLCBwdXNoQ29udGVudFZhbHVlKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgJiYgc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjlj5HluIPph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgY2FsbFB1c2hDb25maWc6IHRoaXMuX2NhbGxQdXNoQ29uZmlnLFxuXG4gICAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgICB9KTtcblxuICAgICAgLy8gc2Vzc2lvbuS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgICAgc2Vzc2lvbi5yZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBjYWxsSW5Hcm91cCBmYWlsZWQgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDosINSVEMgQVBJIOiOt+W+l+acrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5qOA5rWL5piv5ZCm6IO95aSf6I635b6X5pys5Zyw5rWBXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHsgLi4uY29uc3RyYWludHMuYXVkaW8gfSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcycpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrczogW3RyYWNrIV0gfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQW5kQ2FtZXJhVHJhY2tzKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiB7IC4uLmNvbnN0cmFpbnRzIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBnZXQgQXVkaW8gYW5kIFZpZGVvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5aaC5p6c5piv5YWB6K646ZmN57qn6I635b6X5rWB77yM5bm25LiU5piv6I635b6X6Z+z6KeG6aKRXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee7hOiOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogX2NvZGUsIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS7jnNlc3Npb25MaXN05Yig6Zmk5p+Q5Liqc2Vzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlU2Vzc2lvbihzZXNzaW9uOiBSQ0NhbGxTZXNzaW9uKSB7XG4gICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgIHRoaXMuX3Nlc3Npb25MaXN0ID0gdGhpcy5fc2Vzc2lvbkxpc3QuZmlsdGVyKChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldFNlc3Npb25JZCgpICE9PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5bex5pa55YW25LuW56uv5Yqg5YWl6YCa6K+d77yI5bey5Yqg5YWlIFJUQyDmiL/pl7TvvInnmoTnlKjmiLfkv6Hmga9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRKb2luZWRSb29tSW5mbygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBkYXRhPzogSVJUQ0pvaW5lZEluZm9bXSB9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jb250ZXh0LmdldFJUQ0pvaW5lZFVzZXJJbmZvKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYGdldEpvaW5lZFVzZXJJbmZvIGVycm9yIGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5RVUVSWV9KT0lORURfVVNFUl9JTkZPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lkbzlj6vjgIHmjILmlq3mjqjpgIHmlbDmja5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnIOWRvOWPq+aOqOmAgemFjee9rlxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIOWRvOWPq+aOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQg5ZG85Y+r5o6o6YCB5YaF5a65XG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnIOaMguaWreaOqOmAgemFjee9rlxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoVGl0bGUg5oyC5pat5o6o6YCB5qCH6aKYXG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnLnB1c2hDb250ZW50IOaMguaWreaOqOmAgeWGheWuuVxuICAgKi9cbiAgcHVibGljIHNldFB1c2hDb25maWcoY2FsbFB1c2hDb25maWc6IElQdXNoQ29uZmlnID0ge30sIGh1bmd1cFB1c2hDb25maWc6IElQdXNoQ29uZmlnID0ge30pIHtcbiAgICBjb25zdCBjb25jbHVzaW9uID0gW2NhbGxQdXNoQ29uZmlnLCBodW5ndXBQdXNoQ29uZmlnXS5tYXAoKHB1c2hDb25maWc6IElQdXNoQ29uZmlnKSA9PiB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZykpWzBdO1xuXG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXAgY2FsbFB1c2hDb25maWcgb3IgaHVuZ3VwUHVzaENvbmZpZ10gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsUHVzaENvbmZpZyA9IGNhbGxQdXNoQ29uZmlnO1xuICAgIHRoaXMuX2h1bmd1cFB1c2hDb25maWcgPSBodW5ndXBQdXNoQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsRW5kUmVhc29uLCBSQ0NhbGxNZWRpYVR5cGUsIFJDQ2FsbFVzZXJTdGF0ZSwgUkNDYWxsU2Vzc2lvblN0YXRlLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVNlbmRlckluZm8sIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgSVJDUlRDU3RhdGVSZXBvcnQgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVNlc3Npb25MaXN0ZW5lciwgSU11dGVVc2VyLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSURldmljZUNoYW5nZVBhcmFtcywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNDYWxsQ2xpZW50IGZyb20gJy4vUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBwbHVnaW4tY2FsbCDniYjmnKzkuIrmiqVcblZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbCcsIF9fVkVSU0lPTl9fKTtcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbENsaWVudCwgSVJDQ2FsbEluaXRPcHRpb25zPiA9IHtcbiAgdGFnOiAnUkNDYWxsJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUudGFnID09PSAnYnJvd3Nlcic7XG4gIH0sXG4gIHNldHVwKGNvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsIHJ1bnRpbWU6IElSdW50aW1lLCBvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBSQ0NhbGxDbGllbnQge1xuICAgIC8vIOWFiOagoemqjOWPguaVsFxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsTGliIGluc3RhbGxlciBzdGV1cF0ke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOagoemqjOW9k+WJjeWuieijheeahCBlbmdpbmUg54mI5pys5piv5ZCm5Y+v55SoXG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3IsIHBsdWdpbi1jYWxsIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGNvbnRleHQuY3JlYXRlTG9nZ2VyKCdSQ0NhbGwnLCAnUlRDJyk7XG4gICAgbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsQ2xpZW50KGNvbnRleHQsIHJ1bnRpbWUsIGxvZ2dlciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIFJDQ2FsbENsaWVudCxcbiAgUkNDYWxsU2Vzc2lvbixcbiAgUkNDYWxsTGFuZ3VhZ2UsXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJRW5kU3VtbWFyeSxcbiAgSVJDQ2FsbEluaXRPcHRpb25zLFxuICBJUkNDYWxsUGFyYW1zLFxuICBJUkNDYWxsSW5Hcm91cFBhcmFtcyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVNlbmRlckluZm8sXG4gIElNdXRlVXNlcixcbiAgSUludml0ZWRVc2VycyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgSVB1c2hDb25maWcsXG59O1xuIl0sIm5hbWVzIjpbInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwiZ2V0VVVJRDIyIiwidXVpZCIsImdlbmVyYXRlUmFuZG9tSWQiLCJyYW5kb20iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsImdldENhbGxEZXZpY2VJZCIsInJ1bnRpbWUiLCJrZXkiLCJNc2dDYWxsU3RhdHVzIiwiTXNnQ2FsbFN0YXR1czIiLCJSQ0NhbGxFcnJvckNvZGUiLCJSQ0NhbGxFbmRSZWFzb24iLCJDYWxsUmVtb3RlRW5kUmVhc29uIiwiUkNDYWxsTWVzc2FnZVR5cGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUyIiwiUkNDYWxsVXNlclN0YXRlIiwiUkNDYWxsVXNlclN0YXRlMiIsIlJDQ3Jvc3NDYWxsVHlwZSIsIlRpbWVyJDEiLCJjYWxsYmFjayIsIl9fcHVibGljRmllbGQiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJSQ0NhbGxTdGF0ZU1hY2hpbmUiLCJfY29udGV4dCIsIl9ydW50aW1lIiwiX2xvZ2dlciIsIl9jYWxsTXNnSGFuZGxlciIsIl9jaGFubmVsSWQiLCJfY29udmVyc2F0aW9uVHlwZSIsIl90YXJnZXRJZCIsIl9tZWRpYVR5cGUiLCJfY2FsbElkIiwic2VudFRpbWUiLCJkZWxheVRpbWUiLCJ1c2VySWQiLCJzdGF0ZSIsInJlYXNvbiIsIl9hIiwidXNlciIsIm1lc3NhZ2UiLCJzZW5kZXJVc2VySWQiLCJ1c2VyUHJvZmlsZSIsImh1bmd1cFJlYXNvbiIsIm1lc3NhZ2VUeXBlIiwiZW5kUmVhc29uIiwicmVtb3RlVXNlcklkIiwibXNnRGV2aWNlSWQiLCJzdWlkIiwiZGV2aWNlSWQiLCJzZW5kZXJEZXZpY2VJZCIsImN1cnJlbnRVc2VySWQiLCJDb252ZXJzYXRpb25UeXBlIiwiaXNDdXJyZW50VXNlcklkIiwibWVkaWFUeXBlIiwiY29udGVudCIsImlzTGVzc1RoYW5Ud28iLCJpc0ludml0ZVVzZXIiLCJpc05vT25lQW5zd2VyZWQiLCJ3YXRjaGVycyIsImluaWRzIiwicm9vbVR5cGUiLCJ1c2VySWRMaXN0IiwiaWQiLCJpbnZpdGVVc2VySWRzIiwiVGltZXIiLCJleGlzdGVkVXNlclBvZmlsZXMiLCJjYWxsZXIiLCJuZWVkUmluZ2luZ1VzZXJJZHMiLCJ1c2VySW5mbyIsImNhbGxTdGF0dXMiLCJlcnJvciIsInVzZXJJZHMiLCJleHRyYSIsInB1c2hUaXRsZSIsInB1c2hDb250ZW50IiwiaXNDcm9zc0FwcGtleSIsImNvZGUiLCJpc0NhbGxlciIsImVuZENvZGUiLCJvcHRpb25zIiwiZXhpc3RlZFVzZXJJZHMiLCJoYW5ndXBQYXJhbXMiLCJtc2dDb2RlIiwicmVtb3RlVXNlcnMiLCJwdXNoQ29uZmlnIiwicmVtb3RlVXNlciIsInVpZCIsImJlZ2luVGltZXN0YW1wIiwiZW5kVGltZXN0YW1wIiwic3VtbWFyeSIsIlJDQ2FsbE1lZGlhVHlwZSIsIlJDQ2FsbE1lZGlhVHlwZTIiLCJNZW1iZXJNb2RpZnlUeXBlIiwiTWVtYmVyTW9kaWZ5VHlwZTIiLCJQbGF0Zm9ybSIsIk9mZmxpbmVSZWNvcmRlciIsIl9vblJlY29yZCIsImNoYW5uZWxJZCIsImNvbnZlcnNhdGlvblR5cGUiLCJ0YXJnZXRJZCIsImNhbGxJZCIsImlzU2VsZlNlbmQiLCJtZXNzYWdlcyIsIm1zZyIsImNhbGxNc2dUeXBlcyIsIkVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZSIsIkVycm9yQ29kZSIsIkNhbGxNZXNzYWdlSGFuZGxlciIsIl9vZmZsaW5lTXNnSXR2IiwiX2dldFN0YXRlTWFjaGluZSIsInJlY29yZCIsIm1hcmtUaW1lIiwiY3VycmVudE1zZ1NlbnRUaW1lIiwiaW5zZXJ0SW5kZXgiLCJpbmRleCIsImN1cnJlbnRUaW1lIiwiYnVmZmVycyIsIml0ZW0iLCJtZXNzYWdlVUlkIiwiaXNPZmZMaW5lTWVzc2FnZSIsIm9mZmxpbmVCdWZmZXJzIiwiaW52aXRlQ2FsbElkIiwiaXNJbnZpdGVNc2dUeXBlIiwiaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYiLCJ0YXNrTXNnTGlzdCIsImkiLCJvdGhlckNhbGxJZCIsImRlbEluZGV4IiwiZGVsT2ZmbGluZUluZGV4IiwiaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwiLCJpc09ubHlJbnZpdGUiLCJoYXNJbnZpdGVBbmRSaW5naW5nIiwiaXNVbmZpbmlzaGVkR3JwQ2FsbCIsImlzVW5maW5pc2hlZCIsIm5vT25lQWNjZXB0IiwiYWxsVXNlcklkcyIsImlzQ2FsbGVySHVuZ3VwIiwidGFza01zZ1NlbmRlclVzZXJJZCIsImRlbENvdW50IiwibGlzdGVuZXIiLCJmdW5jTmFtZSIsImV2ZW50IiwiZXZlbnRUeXBlIiwiZGlyZWN0aW9uYWxVc2VySWRMaXN0IiwicHVzaERhdGEiLCJzZW5kT3B0cyIsImNhbGxlcklkIiwiUkNDYWxsTGFuZ3VhZ2UiLCJFTiIsIlpIIiwiTG9jYWwiLCJsYW5nIiwiVmVyc2lvbk1hbmFnZSIsIlJDQ2FsbEVuZ2luZSIsIl93YXRjaGVycyIsIl9vcHRpb25zIiwiY3J0VXNlcklkIiwiaW5mbyIsIlByb2R1Y2VUeXBlcyIsImZ1biIsIm9uIiwiZGF0YSIsImZ1bnMiLCJjYiIsImxlbmd0aCIsImlzTGFuZ3VhZ2UiLCJ2YWwiLCJpc0pvaW5UeXBlIiwiUlRDSm9pblR5cGUiLCJpc0xvZ0xldmVsIiwiTG9nTGV2ZWwiLCJ2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyIsImtleU5hbWVzIiwia2V5cyIsIm1pc3NpbmdLZXlzIiwidmFsaWRhdGVMaXN0ZW5lciIsInZhbGlkYXRlVGFyZ2V0SWQiLCJ2YWxpZGF0ZU1lZGlhVHlwZSIsInZhbGlkYXRlRXh0cmEiLCJ2YWxpZGF0ZVB1c2hUaXRsZSIsInZhbGlkYXRlUHVzaENvbnRlbnQiLCJ2YWxpZGF0ZVB1c2hDb25maWciLCJjb25jbHVzaW9uIiwidmFsaWRhdGVVc2VySWRzIiwic3RyIiwiaXNSQ0ZyYW1lUmF0ZSIsImlzVmFsaWRSZXNvbHV0aW9uIiwicmVzb2x1dGlvbiIsIlJDUmVzb2x1dGlvbiIsInZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiUkNDYWxsU2Vzc2lvbiIsIl9zdGF0ZU1hY2hpbmUiLCJfcnRjQ2xpZW50Iiwicm9vbUlkIiwic3VtbWFyeUluZm8iLCJzZW5kZXIiLCJpbnZpdGVkVXNlcnMiLCJjYWxsQmFjayIsInJvb20iLCJSQ1JUQ0NvZGUiLCJ0cmFja3MiLCJpc0FsbG93U3Vic2NyaWJlUmV0cnkiLCJjb3VudCIsImlzQWxsb3dQdWJsaXNoUmV0cnkiLCJ0cmFjayIsIl9jb2RlIiwiYXVkaW9Db25zdHJhaW50cyIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwiX2IiLCJvYmoiLCJsb2NhbFZpZGVvVHJhY2tzIiwibG9jYWxBdWRpb3RyYWNrcyIsImJ5U2VydmVyIiwiUkNLaWNrUmVhc29uIiwibmFtZSIsImF1ZGlvVHJhY2siLCJtdXRlVXNlciIsInZpZGVvVHJhY2siLCJyZXN1bHQiLCJyZXBvcnQiLCJSQ0NhbGxDbGllbnQiLCJzZXNzaW9uIiwic2VzIiwic3RhdGVNYWNoaW5lIiwiYml0cmF0ZSIsInB1c2hUaXRsZVZhbHVlIiwicHVzaENvbnRlbnRWYWx1ZSIsIl9jIiwiY2FsbFB1c2hDb25maWciLCJodW5ndXBQdXNoQ29uZmlnIiwiaW5zdGFsbGVyIiwiY29udGV4dCIsImxvZ2dlciJdLCJtYXBwaW5ncyI6IjBnQkFFQSxNQUFNQSxHQUFnQkMsR0FBbUIsQ0FDakMsTUFBQUMsRUFBUSxtRUFBbUUsTUFBTSxFQUFFLEVBQ25GQyxFQUFRRCxFQUFNLE9BQVMsRUFDN0IsSUFBSUUsRUFBVSxDQUFDSCxFQUNmLE1BQU1JLEVBQU0sQ0FBQSxFQUNULEVBQUEsQ0FDRCxNQUFNQyxFQUFNRixFQUFVRCxFQUN0QkMsR0FBV0EsRUFBVUUsR0FBT0gsRUFDeEJFLEVBQUEsUUFBUUgsRUFBTUksQ0FBRyxDQUFDLFFBQ2ZGLEdBQ0YsT0FBQUMsRUFBSSxLQUFLLEVBQUUsQ0FDcEIsRUFFTUUsR0FBVSxJQUFNLHVDQUF1QyxRQUFRLFFBQVVDLEdBQU0sQ0FDbkYsTUFBTUMsRUFBSSxLQUFLLE9BQU8sRUFBSSxHQUFLLEVBRXhCLE9BREdELElBQU0sSUFBTUMsRUFBS0EsRUFBSSxFQUFNLEdBQzVCLFNBQVMsRUFBRSxDQUN0QixDQUFDLEVBR1lDLEVBQVksSUFBTSxDQUM3QixJQUFJQyxFQUF3QkosS0FDNUIsT0FBQUksRUFBTyxHQUFHQSxFQUFLLFFBQVEsS0FBTSxFQUFFLEtBQ3hCQSxFQUFBLFNBQVNBLEVBQU0sRUFBRSxFQUN4QkEsRUFBT1gsR0FBYVcsQ0FBSSxFQUNwQkEsRUFBSyxPQUFTLEtBQ1RBLEVBQUFBLEVBQUssTUFBTSxFQUFHLEVBQUUsR0FFbEJBLENBQ1QsRUFLYUMsRUFBbUIsSUFBYyxDQUM1QyxNQUFNQyxFQUFTLEtBQUssTUFBTSxLQUFLLE9BQUEsRUFBVyxHQUFJLEVBQzlDLElBQUlGLEVBQU9ELElBQ0osT0FBQUMsRUFBQUEsRUFBSyxRQUFRLE1B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
|