@rongcloud/plugin-call-plus 1.1.0 → 2.0.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/dist/index.d.ts +279 -7
- package/dist/index.esm.js +2011 -1693
- package/dist/index.umd.js +2 -2
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(g,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],l):(g=typeof globalThis<"u"?globalThis:g||self,l(g.CallPlus={},g.RCEngine,g.RCRTC))})(this,function(g,l,N){"use strict";var He=Object.defineProperty;var ke=(g,l,N)=>l in g?He(g,l,{enumerable:!0,configurable:!0,writable:!0,value:N}):g[l]=N;var I=(g,l,N)=>(ke(g,typeof l!="symbol"?l+"":l,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(t=>(t.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",t.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",t.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",t.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",t.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",t.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",t.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",t.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",t.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",t.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",t.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",t.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",t.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",t.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",t.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",t.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",t.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",t.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",t.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",t.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",t.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",t.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",t.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",t.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",t.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",t.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",t.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",t.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",t.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",t.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",t.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",t.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",t.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",t.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",t.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",t.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",t.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",t.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",t.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",t.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",t.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",t.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",t.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",t.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",t.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",t.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",t.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",t.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",t.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",t.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",t.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",t.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",t.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",t.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",t.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",t.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",t.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",t.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",t.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",t.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",t.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",t.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",t.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",t.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",t.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",t.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",t.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",t.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",t.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",t.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",t.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",t.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",t.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",t.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",t.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",t.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",t.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",t.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",t.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",t.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",t.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",t.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",t.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",t.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",t.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",t.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",t.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",t.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",t.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",t.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",t.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",t.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",t.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",t.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",t.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",t.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",t.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",t.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",t.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",t.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",t.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",t.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",t.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",t.L_TIME_CORRECT_START_O="L-time_correct_start-O",t.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",t.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",t.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",t.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",t.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",t.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",t.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",t.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T="L-call_plus_session_get_create_time-T",t.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R="L-call_plus_session_get_create_time-R",t.L_CALL_PLUS_SESSION_GET_DURATION_T="L-call_plus_session_get_duration-T",t.L_CALL_PLUS_SESSION_GET_DURATION_R="L-call_plus_session_get_duration-R",t))(n||{});class K{constructor(s,e,_){I(this,"_startTime",0);I(this,"_duration",0);I(this,"_callId","");this._session=s,this._callEngine=e,this._logger=_,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(s=>{const{userId:e,userState:_,cameraEnable:i,microphoneEnable:r}=s;return{userId:e,state:_,cameraEnable:i,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_T,"",s),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:_}=await this._callEngine.getCallStaringTime({callId:this._callId},s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_CREATE_TIME_R,"success",s),this._startTime=_,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_T,"",s),this._duration)return this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,s),{code:a.SUCCESS,duration:this._duration};const{code:e,data:_}=await this._callEngine.getCallTimeInfo(this._callId,s);return e!==a.SUCCESS?(this._logger.error(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALL_PLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${_.duration}`,s),this._duration=_.duration,{code:a.SUCCESS,duration:this._duration})}}var D=(t=>(t[t.SINGLE=0]="SINGLE",t[t.MULTI=1]="MULTI",t))(D||{}),d=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ONPHONE=301]="ONPHONE",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(d||{}),u=(t=>(t[t.AUDIO=0]="AUDIO",t[t.AUDIO_VIDEO=1]="AUDIO_VIDEO",t[t.VIDEO=2]="VIDEO",t))(u||{}),p=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ENDED=1e3]="ENDED",t[t.NOANSWER=1001]="NOANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELED=1003]="CANCELED",t[t.DECLINED=1004]="DECLINED",t[t.ERROR=2e3]="ERROR",t))(p||{}),k=(t=>(t[t.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",t[t.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",t[t.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",t[t.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",t))(k||{}),A=(t=>(t[t.IDLE=0]="IDLE",t[t.CALLING=100]="CALLING",t[t.INVITED=101]="INVITED",t[t.RINGING=102]="RINGING",t[t.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",t[t.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",t[t.CONNECTING=200]="CONNECTING",t[t.ONCALL=300]="ONCALL",t[t.ON_PHONE=301]="ON_PHONE",t[t.ON_PHONE_END=302]="ON_PHONE_END",t[t.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",t[t.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",t[t.ABNORMAL_END=999]="ABNORMAL_END",t[t.ENDED=1e3]="ENDED",t[t.NO_ANSWER=1001]="NO_ANSWER",t[t.MISSED=1002]="MISSED",t[t.CANCELLED=1003]="CANCELLED",t[t.DECLINED=1004]="DECLINED",t[t.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",t[t.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",t[t.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",t[t.PUBLISH_ERR=1106]="PUBLISH_ERR",t[t.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",t[t.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",t[t.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",t[t.CONNECTION_ERR=1110]="CONNECTION_ERR",t[t.LOGOUT=1111]="LOGOUT",t[t.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",t[t.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",t[t.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",t[t.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",t[t.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",t[t.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",t[t.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",t[t.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",t[t.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",t[t.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",t[t.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",t[t.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",t[t.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",t))(A||{});class Ee{constructor(s){I(this,"_audioConfig",{});this._logger=s}setDefaultMicrophoneId(s){return this._audioConfig.microphoneId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=s,this._audioConfig.maxBitrate=e,this)}setSampleRate(s){return l.isNumber(s)?(this._audioConfig.sampleRate=s,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${s}`),this)}build(){return this._audioConfig}}class Le{constructor(s){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=s}setFrameRate(s){return N.RCFrameRate[s]?(this._videoConfig.frameRate=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${s}`),this)}setVideoResolution(s){return N.RCResolution[s]?(this._videoConfig.resolution=s,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${s}`),this)}setDefaultCameraId(s){return this._videoConfig.cameraId=s,this}setBitrate(s,e){return!l.isNumber(s)||!l.isNumber(e)||e<=0||s<=0||e<s?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${s}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=s,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const ce=t=>{const{callId:s,callType:e,callDir:_,mediaType:i,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:T,duration:S,secretChat:C,syncTime:h,sysStatus:f,crtTime:U}=t;return{callId:s,callType:e,callDirection:_,mediaType:i,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:T,duration:S,syncTimestamp:h,systemState:f,createTimestamp:U}},Ce=t=>{const{callId:s,callStatus:e}=t,_=[],i=[],r=[],o=[];return t.callSessionUsers.forEach(E=>{const{userId:L,sessionStatus:c,sysStatus:T}=E;switch(c){case d.INVITED:o.push({callId:s,userId:L,userState:c});break;case d.RINGING:_.push({callId:s,fromUserId:L});break;case d.CONNECTING:r.push({fromUserId:L});break;case d.CANCELLED:case d.DECLINED:case d.ENDED:case d.IDLE:i.push({callId:s,fromUserId:L,userState:c,systemState:T});break}}),{ringingData:_,hangupData:i,acceptData:r,otherInvitedData:o}},de=t=>t&&t.nodeName&&t.nodeName.toUpperCase()==="VIDEO",he=(t,s)=>{let e=!1;const _=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];switch(t){case A.ONCALL:_.includes(s)&&(e=!0);break}return e},Ne=(t,s)=>{let e=!1;const _=[d.INVITED,d.RINGING,d.BUSYLINE_RINGING,d.BUSYLINE_WAIT,d.CONNECTING,d.ONCALL];switch(t){case d.ONCALL:_.includes(s)&&(e=!0);break}return e},Ae=(t,s)=>{let e;switch(t){case d.CALLING:e=A.CANCELLED;break;case d.RINGING:case d.INVITED:e=A.DECLINED;break;case d.CONNECTING:e=s?A.DECLINED:A.CANCELLED;break;case d.ONCALL:e=A.ENDED;break}return e},ee=t=>{const{voipCallInfo:s}=t;if(!s)return!1;const{strategy:e}=JSON.parse(s);return e===1},Te=(t,s)=>(t||t===0)&&(!l.isNumber(t)||t<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${t}`}:(s||s===0)&&(!l.isNumber(s)||s<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${s}`}:t&&s&&s<t?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${s}, minBitrate: ${t}, maxBitrate should > minBitrate`}:{code:a.SUCCESS};var F=(t=>(t.L_QS_START_CALL_S="Call-start-S",t.L_QS_ACCEPT_CALL_S="Call-accept-S",t.L_QS_HANGUP_CALL_S="Call-hangup-S",t.L_QS_RECEIVE_CALL_S="Call-recv-S",t.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",t))(F||{});class Re{constructor(s,e){this._logger=s,this._context=e}reportStatisticsData(s,e,_,i,r,o,E){const L=+new Date,{mediaType:c,callType:T,callId:S}=i?{mediaType:i.getMediaType(),callType:i.getCallType(),callId:i.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:T,cid:S,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let h=null;switch(s){case F.L_QS_RECEIVE_CALL_S:h={...C,rf:o};break;case F.L_QS_ABNORMAL_HANGUP_S:h={...C};break;default:h={...C,dur:L-_}}this._logger.info("L-call-plus-statistic",JSON.stringify(h),s),this._logger.__statistics(s,JSON.stringify(h))}}var v=(t=>(t.REQUEST="request",t.ACCEPT="accept",t.REFUSE="refuse",t.CANCEL="cancel",t.NOTICE="notice",t.TIMEOUT="timeout",t))(v||{}),W=(t=>(t[t.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",t))(W||{}),_e=(t=>(t[t.NORMAL=0]="NORMAL",t[t.SECRET=1]="SECRET",t))(_e||{}),te=(t=>(t.INVITER="inviter",t.INVITEE="invitee",t))(te||{});class ie extends l.EventEmitter{constructor(e,_,i,r,o,E,L,c){super();I(this,"_reqMediaType");I(this,"_inviterTimerId");I(this,"_inviteeTimerId");I(this,"_oldDialogData");I(this,"isLocalClientHangup",!1);this._callId=e,this._state=_,this._callType=i,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,_,i,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${_}, enable: ${i}`,r);const o=this._callUsers.find(E=>e===E.userId);_===u.AUDIO?o.microphoneEnable=i:o.cameraEnable=i}updateUserList(e,_){const i=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([d.CALLING,d.INVITED,d.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r);else{let T=!1;for(let S=0;S<this._callUsers.length;S++){const{userId:C,stateTime:h,systemState:f,userState:U}=this._callUsers[S];if(C===r.userId){T=!0;const m=he(f,L),y=Ne(U,o),R=L===A.ON_PHONE_END&&f!==A.ON_PHONE&&o!==d.IDLE;if(E&&h&&E<h||m&&y){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:h,oldSystemState:f,oldUserState:U})}; new:${JSON.stringify(r)}`,_)}catch(M){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${M.message}`,_)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,_),this._callUsers[S]=r,!R&&i.push(r);break}}}T||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> nouser push ${JSON.stringify(r)}`,_),this._callUsers.push(r),i.push(r))}}),i}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,_){e==="inviter"?this._inviterTimerId=_:this._inviteeTimerId=_}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var O=(t=>(t.START_SINGLE_CALL="startSingleCall",t.START_GROUP_CALL="startGroupCall",t.INVITE_CALL="inviteCall",t.PUB_INVITE_CALL="pubInviteCall",t.RINGING_CALL="ringCall",t.ACCEPT_CALL="acceptCall",t.JOIN_CALL="joinCall",t.HANGUP_CALL="hangupCall",t.STATUS_UP_CALL="statusUpCall",t.STATUS_DOWN_CALL="statusDownCall",t.EVENT_UP_CALL="eventUpCall",t.EVENT_DOWN_CALL="eventDownCall",t.DIALOG_UP_CALL="dialogUpCall",t.DIALOG_DOWN_CALL="dialogDownCall",t.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",t.SYNC_CALL_LOG="syncCallLog",t.PUB_CALL_LOG="pubCallLog",t.DEL_CALL_LOG="deleteCallLog",t.QRY_CALL_STATE="queryUserHasCall",t.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",t.GET_CALL_STATE_LIST="getUserCallStateList",t.CLEAR_CALL_LOG="cleanCallLog",t.GET_CALL_SESSION="getCallSession",t.GET_CALL_TIME_INFO="getCallTimeInfo",t.END_ABNORMAL_CALL="endUserAbnormalCalls",t.SYS_STATUS_UP="sysStatusUp",t.UP_CALL_LOG_READED="upCallLogReaded",t.PUB_CALL_LOG_READED="pubCallLogReaded",t.PUB_NACK_SEQ_ID="pubNACKSeqId",t.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",t))(O||{});const se=(t,s)=>setTimeout(t,s),Oe=t=>new Promise(s=>{setTimeout(s,t)}),ue=[l.ErrorCode.RC_NET_CHANNEL_INVALID,l.ErrorCode.RC_NET_UNAVAILABLE,l.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],j=async({asyncFn:t,fnArgs:s,currentRetryTime:e=Date.now(),maxDuration:_=60*1e3,intervals:i=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await t(...s),L=2*1e3;return E.code===a.SUCCESS||!ue.includes(E.code)||Date.now()+L-e>_?E:(o&&o(E.code),await Oe(L),j({asyncFn:t,fnArgs:s,currentRetryTime:e,maxDuration:_,intervals:i,index:r,onError:o}))};var x=(t=>(t.onBeforePublish="onBeforePublish",t.onPublishRes="onPublishRes",t.onPubInviteCall="onPubInviteCall",t.onPubInviteCallPullKv="onPubInviteCallPullKv",t.onPubInviteCallMiss="onPubInviteCallMiss",t))(x||{}),X=(t=>(t.NOT_CURRENT_DEVICEID="not current device id",t.SECRET_CALL="secret call",t.NOT_INVITEE="not an invitee",t))(X||{}),Y=(t=>(t.PUB_INVITE="pubinvitecall",t.PULL_KV_INVITE="pullkv_invitecall",t.PUSH="system_pubsh",t))(Y||{});class ge extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_listener");I(this,"_needRetryActions",[O.START_SINGLE_CALL,O.START_GROUP_CALL,O.ACCEPT_CALL,O.JOIN_CALL,O.EVENT_UP_CALL]);I(this,"_sessionId","");this._context=e,this._runtime=_,this._initOpts=i,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=l.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,_){const{clientCallId:i,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:T,nickName:S,oldRoomId:C}=e;return r===D.SINGLE?this.startSingleCall({clientCallId:i,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:T,oldRoomId:C,toOrgId:o[0].orgId||""},_):this.startGroupCall({clientCallId:i,toUsers:o,mediaType:E,targetType:c,targetId:T,nickName:S,oldRoomId:C},_)}async startSingleCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_SINGLE_CALL,e)}async startGroupCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(this._context.getCurrentId(),O.START_GROUP_CALL,e)}async inviteCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.INVITE_CALL,e)}async ringingCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.RINGING_CALL,e)}async acceptCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.ACCEPT_CALL,e)}async joinCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.JOIN_CALL,e)}async hangupCall(e,_){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,_);const{code:i}=await this._sendCallSignal(e.callId,O.HANGUP_CALL,e);return i===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:i}}async statusUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.STATUS_UP_CALL,e)}async eventUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.EVENT_UP_CALL,e)}async dialogUpCall(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.DIALOG_UP_CALL,e)}async deleteCallRecord(e,_,i){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(_)}`,i),this._sendCallSignal(e,O.DEL_CALL_LOG,{callIds:_})}async syncCallLog(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.userId,O.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,O.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${_}`,e),this._sendCallSignal(_,O.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,_),this._sendCallSignal(e,O.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${_}`,e),this._sendCallSignal(_,O.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const _=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${_}`,e),this._sendCallSignal(_,O.CLEAR_CALL_LOG,null)}async getCallSession(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,_),this._sendCallSignal(e.callId,O.GET_CALL_SESSION,e)}async sysStatusUp(e,_){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,_),this._sendCallSignal(e.callId,O.SYS_STATUS_UP,e)}async upCallLogReaded(e){const _=this._context.getCurrentId();return this._sendCallSignal(_,O.UP_CALL_LOG_READED,e)}_onIMConnectionStateChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,_),this._listener.onIMStateChange(e),e===l.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(_):this._timeCorrectioner.stop(_)}async _sendCallSignal(e,_,i){const r=i?JSON.stringify({...i,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(_)?o=await j({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,_,r]}):o=await this._context.setCallInfo(e,_,r);const{code:E,data:L}=o;if(E!==l.ErrorCode.SUCCESS)return{code:E};const{key:c,value:T}=L,S=JSON.parse(T).data;return{code:a.SUCCESS,data:S}}_onRecvCallSignal(e){const _=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,_),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case O.PUB_INVITE_CALL:this._onPubInviteCall(E,!0,_);break;case O.STATUS_DOWN_CALL:this._onStatusDownCall(E,_);break;case O.EVENT_DOWN_CALL:this._onEventDownCall(E,_);break;case O.DIALOG_DOWN_CALL:this._onDialogDownCall(E,_);break;case O.PUB_CALL_LOG:this._onPubCallLog(E,_);break;case O.PUB_CALL_LOG_READED:break;case O.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,_);break}})}_isValidData(e){return!!(l.isNull(e)||l.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,_=!0,i){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,i)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,i)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,i);const r={extra:JSON.stringify(e),reason:X.NOT_CURRENT_DEVICEID,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE};_?this.emit(x.onPubInviteCallMiss,Object.assign(e,r)):this.emit(x.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,_,i),_?this.emit(x.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(x.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,_){if(e.callSessionUsers=e.callSessionUsers.filter(i=>!!i.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",_),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,_),this._listener.onOtherClientStatusDown(e,_);return}this._listener.onStatusDown(e,_,this._sessionId)}_onEventDownCall(e,_){this._listener.onEventDown(e,_)}_onDialogDownCall(e,_){const{dialogType:i,action:r,extraKeyVal:o}=e;switch(i){case W.SWITCH_MEDIA_TYPE:this._listener.onSwitchMediaType(e,_);break}}_onPubCallLog(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,_),this._listener.onRecvCallEndLog(e,_)}_onConpensationData(e,_){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",_);const{callId:i,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:T,callSessionUsers:S,toDeviceId:C,callDialogEntitys:h}=e;S.some(U=>U.sessionStatus===d.INVITED&&U.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:i,toDeviceId:C,callType:r,mediaType:o,inviteUserId:T,callingUserId:T,callSessionUsers:S,secretChat:E},!0,_):this._onStatusDownCall({callId:i,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:S},_),h.length>0&&h.forEach(U=>this._onDialogDownCall(U,_),this)}}const Ue=t=>{const s="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=s.length+1;let _=+t;const i=[];do{const r=_%e;_=(_-r)/e,i.unshift(s[r])}while(_);return i.join("")},me=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const s=Math.random()*16|0;return(t==="x"?s:s&3|8).toString(16)}),fe=()=>{let t=me();return t=`${t.replace(/-/g,"")}0`,t=parseInt(t,16),t=Ue(t),t.length>22&&(t=t.slice(0,22)),t},pe="RC_CALLPLUS",Me=1;let B;const V=class V{constructor(){}static init(s,e){B=s,this.isSupport()||B.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const _=window.indexedDB.open(pe,Me);_.onerror=i=>{B.warn("[RCCallIndexDB]",`open indexDB req failed -> ${i.target.error}`)},_.onsuccess=i=>{this._db=i.target.result,this._db&&(this._db.onclose=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},_.onupgradeneeded=i=>{this._db=i.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(s,e){var _;(_=V._db)!=null&&_.objectStoreNames.contains(s)?B.debug("[RCCallIndexDB]",`createObjStore ${s} already exists`):V._db.createObjectStore(s,e)}addValue(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).add(e);o.onsuccess=()=>{_(!0)},o.onerror=()=>{B.debug("[RCCallIndexDB]","addValue failed"),_(!1)}})}readByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(null);return}const o=V._db.transaction([s]).objectStore(s).get(e);o.onsuccess=()=>{_(o.result)},o.onerror=E=>{B.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),_(null)}})}updateByKey(s,e,_){return new Promise((i,r)=>{if(!V._db){i(!1);return}const E=V._db.transaction([s],"readwrite").objectStore(s).put(_);E.onsuccess=()=>{i(!0)},E.onerror=L=>{i(!1),B.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(s,e){return new Promise((_,i)=>{if(!V._db){_(!1);return}const o=V._db.transaction([s],"readwrite").objectStore(s).delete(e);o.onsuccess=()=>{_(!0)},o.onerror=E=>{_(!1),B.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(V,"_db",null),I(V,"_instance",null);let q=V;class De{constructor(s,e){I(this,"_localStore");I(this,"_indexDBStore");I(this,"_storeKey","CallBW_AbnormalCall");I(this,"_isSupportIndexDB");if(this._runtime=s,this._logger=e,this._isSupportIndexDB=q.isSupport(),this._isSupportIndexDB){q.init(this._logger,{onSuccess:()=>{this._indexDBStore=q.getInstance()}});return}this._localStore=s.localStorage}addAbnormallCallId(s,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,s,e)}removeAbnormalCallIds(s,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,s,e)}getAbnormalCallIds(s){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,s)}_addByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i?i.push(e):i=[e],_[s]=i,this._localStore.setItem(this._storeKey,JSON.stringify(_))}catch(_){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${_.message}`)}}_removeByLocalStore(s,e){try{const _=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let i=_[s];i&&(i=i.filter(r=>!e.includes(r)),i.length>0?_[s]=i:delete _[s],this._localStore.setItem(this._storeKey,JSON.stringify(_)))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${_.message}`)}}_getByLocalStore(s){let e=null;try{const i=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[s];i&&(e=i)}catch(_){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${_.message}`)}return Promise.resolve(e)}async _addByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_?(_.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:s,callIds:[e]})}catch(_){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${_.message}`)}}async _removeByIndexDB(s,e){try{const _=await this._indexDBStore.readByKey(this._storeKey,s);_&&(_.callIds=_.callIds.filter(i=>!e.includes(i)),_.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,s,{userId:s,callIds:_.callIds}):this._indexDBStore.removeByKey(this._storeKey,s))}catch(_){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${_.message}`)}}async _getByIndexDB(s){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,s)}catch(_){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${_.message}`)}return e?e.callIds:null}}var re=(t=>(t[t.PROMPT=0]="PROMPT",t[t.CALL_DURATION=10]="CALL_DURATION",t[t.FIRST_FRAME=20]="FIRST_FRAME",t))(re||{}),b=(t=>(t[t.SUCCESS=0]="SUCCESS",t[t.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",t[t.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",t))(b||{});class ye{constructor(s,e,_){I(this,"_RTT",0);I(this,"_validMinRTT",200);I(this,"_validMaxRTT",1e3);I(this,"_deltaTime",0);I(this,"_timerId",null);I(this,"_interval",2*1e3);I(this,"_maxRetryTimes",8);I(this,"_startTimes",0);I(this,"_retryTimesInCall",0);I(this,"_maxRetryTimesInCall",3);this._callEngine=s,this._logger=e,this._singleCallDurationEv=_}async getCallClientTimeByServer(s,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${s}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.INVALID_RESPONSE_TIME}`,e);const{code:_,data:i}=await this._callEngine.getCallTimeInfo(s,e);if(_!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${_}`,e),{code:_};const{startTime:r}=i,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:_,duration:L,clientStartTime:o}}calcClientStartTime(s,e,_){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${s}, startTime: ${e}`,_),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,_),this._loopCorrectClientTime(s,_),{code:b.INVALID_RESPONSE_TIME};const i=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:i}),_),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(s,_)),{code:b.SUCCESS,clientStartTime:i}}start(s){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(s),this._timerId=se(()=>{this._timerId=null,this.start(s)},this._interval))}stop(s){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,s),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(s){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,s),!(this._RTT<this._validMinRTT)&&(this.stop(s),this.start(s))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(s){const e=Date.now(),{code:_,data:i}=await this._callEngine.getCallServerTimestamp(s),r=Date.now();if(_!==a.SUCCESS)return{code:_};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(s),this._deltaTime=i-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),s),{code:_,delayTime:this._deltaTime}}async _getDeltaTimeInCall(s,e){const _=Date.now(),{code:i,data:r}=await this._callEngine.getCallTimeInfo(s,e),o=Date.now();if(i!==a.SUCCESS)return{code:i};const E=o-_;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-_-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:s,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:b.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:b.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(s,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${s}`,e);const{code:_,clientStartTime:i,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(s,e);if(_===b.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(s,i,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&_===b.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(s,i,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(s,e)},this._interval))}}var Q=(t=>(t[t.SOON_AFETER=0]="SOON_AFETER",t[t.CURRENT=1]="CURRENT",t))(Q||{}),ne=(t=>(t[t.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",t[t.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",t[t.SYSTEM_PUSH=2]="SYSTEM_PUSH",t))(ne||{}),oe=(t=>(t[t.OUT=-1]="OUT",t[t.GROUP=0]="GROUP",t[t.IN=1]="IN",t))(oe||{});const Se=60*1e3,w=class w extends l.EventEmitter{constructor(e,_,i,r,o){super();I(this,"_mainSession",null);I(this,"_holdSessions",[]);I(this,"_signalModule");I(this,"_abnormalModule");I(this,"_isUpFirstFrameTime",!1);I(this,"_callStartMap",{});I(this,"_timeCorrectioner");this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new ye(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new ge(e,_,i,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new De(_,r)}async startCall(e,_){const i=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:T}=e,{code:S,data:C}=await this._signalModule.startCall({clientCallId:e.callId,callType:r,mediaType:o,toUsers:E,secretChat:_e.NORMAL,targetType:c,targetId:L,oldRoomId:T},_);if(S!==a.SUCCESS)return{code:S};const{callId:h,busylineUsers:f}=C;if(this._abnormalModule.addAbnormallCallId(i,h),this._mainSession=new ie(h,p.INVITED,r,o,i,i,[],this._logger),r===D.SINGLE){const R=this._startTimer(C.callId,d.NO_ANSWER,_);this._mainSession.updateTimerId(te.INVITER,R)}const U={userId:i,userState:d.CALLING,systemState:A.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let m=E.map(({userId:R,targetType:M,targetId:P})=>({userId:R,userState:d.INVITED,systemState:A.INVITED,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(R=>{const{targetType:M,targetId:P}=m.find(H=>H.userId===R.userId);return{userId:R.userId,userState:R.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:M,targetId:P,cameraEnable:!1,microphoneEnable:!1}}),m=m.filter(({userId:R})=>y.every(({userId:M})=>M!==R))),setTimeout(()=>{this.updateUsersState(h,[U,...m,...y],_)}),{code:S,data:C}}async invite(e,_){var L;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:i}=e,r=this._mainSession.getCallId(),{code:o,data:E}=await this._signalModule.inviteCall({callId:r,toUsers:i},_);if(o===a.SUCCESS){this._mainSession.getCallType()===D.SINGLE&&(this._mainSession.updateCallType(D.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,_));let c=i.map(({userId:S,targetType:C,targetId:h})=>({userId:S,userState:d.INVITED,systemState:A.INVITED,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1})),T=[];E.busylineUsers&&(T=(L=E.busylineUsers)==null?void 0:L.map(S=>{const{targetType:C,targetId:h}=c.find(f=>f.userId===S.userId);return{userId:S.userId,userState:S.sessionStatus,systemState:A.BUSYLINE_RINGING,targetType:C,targetId:h,cameraEnable:!1,microphoneEnable:!1}}),c=c.filter(({userId:S})=>T.every(({userId:C})=>C!==S))),this.updateUsersState(r,[...c,...T],_)}return{code:o,data:E}}clearAllTimer(e,_){[this._mainSession,...this._holdSessions].forEach(i=>{i&&i.getCallId()===e&&i.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,_))})}async hangup(e,_){return this._signalModule.hangupCall({callId:e.callId,sysStatus:e.systemState},_)}async accept(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{code:i}=await this._signalModule.acceptCall({callId:e.callId},_);return this._stopTimer(this._mainSession.getInviteeTimerId(),_),i!==a.SUCCESS?{code:i}:(this._clearMobileOnPhone(e.callId,_),this._mainSession.updateSessionState(p.CONNECTING),{code:i})}async joinCall(e,_){const i=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),_);const{code:r}=await this._signalModule.joinCall({callId:e.callId},_);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(i,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,_):await this._createSessionByServer(e.callId,!0,_),{code:r})}async requestChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:W.SWITCH_MEDIA_TYPE,action:v.REQUEST,extraKeyVal:i},_);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,_){if(!this._mainSession)return{code:a.NOT_IN_CALL};const i=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(i),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:e.agree?v.ACCEPT:v.REFUSE},_)}async cancelChangeMediaType(e,_){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:W.SWITCH_MEDIA_TYPE,action:v.CANCEL},_):{code:a.NOT_IN_CALL}}async getCallLogList(e,_){const i=this._context.getCurrentId(),{code:r,data:o}=await this._signalModule.syncCallLog({userId:i,syncTime:e.timestamp,count:e.count},_);if(r!==a.SUCCESS)return{code:r};const E=o.callLogList.map(L=>ce(L));return{code:a.SUCCESS,data:{hasMore:!!(o!=null&&o.hasMore),maxTime:o.maxTime,list:E}}}async deleteCallLog(e,_){const i=this._context.getCurrentId();return this._signalModule.deleteCallRecord(i,e,_)}async getCallServerTimestamp(e){const{code:_,data:i}=await this._signalModule.getCallServerTimestamp(e);return _!==a.SUCCESS?{code:_}:{code:_,data:i.syncTime}}async getCallTimeInfo(e,_){return this._signalModule.getCallTimeInfo(e,_)}async getOpenCallList(e){const _=this._context.getCurrentId(),{code:i,data:r}=await this._signalModule.getUserCallStateList(e);if(i!==a.SUCCESS)return{code:i};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:T,callingUserId:S,callUserIds:C,callStatus:h,crtTime:f,userSessionStatus:U,targetType:m,targetId:y,startTime:R,syncTime:M}=E,P=S===_?oe.OUT:oe.IN,{clientStartTime:H=R}=this._timeCorrectioner.calcClientStartTime(L,R,e);return{callId:L,callType:c,callDirection:P,mediaType:T,callerUserId:S,callUserIds:C,sessionState:h,userState:U,startTimestamp:R,endTimestamp:0,duration:Math.floor((+new Date-H)/1e3),syncTimestamp:M,systemState:0,createTimestamp:f}});return{code:i,data:o}}async removeAllCallLog(e){const{code:_}=await this._signalModule.clearCallRecord(e);return _!==a.SUCCESS?{code:_}:{code:_}}async getCallSession(e,_){const{code:i,data:r}=await this._signalModule.getCallSession(e,_);if(i!==a.SUCCESS)return{code:i};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:T,callSessionUsers:S,startTime:C,duration:h,syncTime:f}=r,U=S.map(m=>{const{userId:y,sessionStatus:R,sysStatus:M,targetType:P,targetId:H}=m;return{userId:y,userState:R,systemState:M,targetType:P,targetId:H,cameraEnable:!1,microphoneEnable:!1}});return{code:i,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:T,callSessionUsers:U,startTime:C,duration:h,syncTime:f}}}getHoldSession(e){const _=this._holdSessions.find(i=>i&&i.getCallId()===e);return _?new K(_,this,this._logger):null}getLocalMainSession(){return this._mainSession?new K(this._mainSession,this,this._logger):null}updateMainSessionState(e){var _;(_=this._mainSession)==null||_.updateSessionState(e)}setIsLocalClientHangup(e){var _;(_=this._mainSession)==null||_.setIsLocalClientHangup(e)}updateUsersState(e,_,i){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(_)}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=_.map(L=>{const c=r.getUserList().filter(({userId:h})=>h===L.userId)[0]||{},T=L.userState===d.IDLE,{cameraEnable:S=!1,microphoneEnable:C=!1}=T?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:S,microphoneEnable:C}});o.push(...r.updateUserList(E,i))}else o.push(..._);o.length>0&&this._onUserStateChange(e,o,i)}setUserDeviceEnable(e,_,i,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,_,i,r)}async getCallStaringTime(e,_){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,_)}async systemStatusUp(e,_){return this._signalModule.sysStatusUp(e,_)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==D.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const i=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(i+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${i}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:re.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,_,i){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===_){const o=this._mainSession.getUserList().map(L=>{let{userId:c,userState:T,systemState:S,targetType:C,targetId:h}=L;return c===r&&(S=e),{userId:c,sessionStatus:d.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:S,targetType:C,targetId:h}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,i)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var i;const _=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(i=this._holdSessions.splice(_,1))==null?void 0:i[0]}_onIMStateChange(e){const _=this._logger.createTraceId();let i=0;e===l.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(i=se(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",_),this.endCurrentSession(A.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),_)},Se)),e===l.RCConnectionStatus.CONNECTED&&i&&clearTimeout(i)}_handleCallTimeout(e,_,i){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${_}`,i);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,i);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:T,stateTime:S}=E;let C,h;return L===o?(C=_===d.MISSED?A.MISSED:A.NO_ANSWER,h=_===d.MISSED?d.MISSED:d.NO_ANSWER):(C=_===d.MISSED?A.NO_ANSWER:A.MISSED,h=_===d.MISSED?d.NO_ANSWER:d.MISSED),{userId:L,sessionStatus:h,statusTime:S?S+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:T}})},i)}_startTimer(e,_,i){const r=se(()=>{this._handleCallTimeout(e,_,i),this._signalModule.statusUpCall({callId:e,sessionStatus:_},i)},Se);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,i),r}_stopTimer(e,_){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,_)}_onInvite(e,_,i){var U,m,y;const r=this._context.getCurrentId(),{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:T,secretChat:S,callingUserId:C}=e;if(S===_e.SECRET){this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.SECRET_CALL,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));return}if(T.some(R=>R.userId===r)){this._abnormalModule.addAbnormallCallId(r,o);const R=new ie(o,p.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},i);const M=this._startTimer(o,d.MISSED,i);R.updateTimerId(te.INVITEE,M),this._mainSession?(this._holdSessions.push(R),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=R;const P=new K(R,this,this._logger);this._reportAppEventModule.onReceivedCall(P,i);const H=_?ne.PUB_INVITE_CALL:ne.PULL_KV_INVITE_CALL;this.emit(w.__INNER_INVITE__,P,H);const Z=T.map(({userId:ae,sessionStatus:be,sysStatus:ve,targetType:Be,targetId:we,statusTime:$e})=>({userId:ae,userState:be,systemState:ve,targetType:Be,targetId:we,stateTime:$e,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,Z,i)}else this.emit(x.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:X.NOT_INVITEE,refer:_?Y.PUB_INVITE:Y.PULL_KV_INVITE}));const f=T.filter(R=>R.userId!==r&&R.userId!==E&&R.sessionStatus===d.INVITED);if(f.length>0){((U=this._mainSession)==null?void 0:U.getCallType())===D.SINGLE&&((m=this._mainSession)==null?void 0:m.getCallId())===o&&(this._onCallTypeChange(this._mainSession.getCallId(),D.MULTI,i),(y=this._mainSession)==null||y.updateCallType(D.MULTI));const R=[],M=[];f.forEach(P=>{const{userId:H,sessionStatus:Z,sysStatus:ae}=P;R.push({callId:o,userId:H,userState:Z}),M.push({userId:H,userState:Z,systemState:ae,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(R),this.updateUsersState(o,M,i)}}_onHangup(e,_,i){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===d.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),i):this._stopTimer(this._mainSession.getInviterTimerId(),i))})}_onAccept(e,_){var L,c,T,S;const i=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===D.SINGLE&&i&&r.includes(i))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((T=this._mainSession)==null?void 0:T.getCallType())===D.SINGLE&&o===E&&e.filter(h=>h.fromUserId!==E)&&this.emit(w.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),_),(S=this._mainSession)==null||S.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),_)}async _onStatusDown(e,_){var f,U;const{callStatus:i,startTime:r,syncTime:o,callId:E}=e;if(E!==((f=this._mainSession)==null?void 0:f.getCallId()))return;if(this._callStartMap[E]=this._callStartMap[E]||{},!this._callStartMap[E].isReceiveCallStartTime&&i===p.ONCALL){this._callStartMap[E].isReceiveCallStartTime=!0;const{code:m,clientStartTime:y}=await this._timeCorrectioner.calcClientStartTime(E,r,_);m===b.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:E,callStartTime:y},_)}let L=!1;const c=this._context.getCurrentId(),T=e.callSessionUsers.map(m=>([d.IDLE,d.DECLINED,d.MISSED,d.NO_ANSWER,d.CANCELLED].includes(m.sessionStatus)&&m.userId===c&&(L=!0),{userId:m.userId,userState:m.sessionStatus,systemState:m.sysStatus,stateTime:m.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(T.length>0&&this.updateUsersState(E,T,_),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:S,acceptData:C,otherInvitedData:h}=Ce(e);S.length>0&&this._onHangup(S,e.callStatus,_),C.length>0&&this._onAccept(C,_),h.length>0&&((U=this._mainSession)==null?void 0:U.getCallType())===D.MULTI&&this._onOtherMemberInvite(h),(e.callStatus===p.ENDED||L)&&this.sessionClose(e,_,!0)}_onOtherClientStatusDown(e,_){var c,T,S;const i=this._context.getCurrentId(),{callId:r,callSessionUsers:o,callStatus:E}=e,L=o.find(({userId:C})=>C===i);if(L&&(this._mainSession||this._holdSessions.length)){const{userId:C,sessionStatus:h,statusTime:f}=L;if(h===d.CONNECTING){const U=[d.ONCALL,d.CONNECTING],m=((c=this._mainSession)==null?void 0:c.getCallId())===r,y=(S=(T=this._mainSession)==null?void 0:T.getUserList().find(M=>M.userId===i))==null?void 0:S.userState;m&&y&&U.includes(y)||(this.updateUsersState(r,[{userId:C,userState:h,systemState:A.OTHER_CLIENT_ACCEPT,stateTime:f,cameraEnable:!1,microphoneEnable:!1}],_),this.sessionClose(e,_,!1))}}}async _onEventDown(e,_){var c;const{callId:i,eventTime:r,eventArgs:o,eventType:E,fromUserId:L}=e;if(E===re.CALL_DURATION&&i===((c=this._mainSession)==null?void 0:c.getCallId())){const{firstFrameTime:T}=o,{code:S,clientStartTime:C}=await this._timeCorrectioner.calcClientStartTime(i,T,_);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${C}`,_),S===b.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(i,C,_)}}_onRecvSinCallDuration(e,_,i,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:_},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,i,r))}_onSwitchMediaType(e,_){var U,m,y,R,M;const{callId:i,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:T}=o,S=(U=this._mainSession)==null?void 0:U.getCallId();if(i!==S){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${S}, recvCallId: ${i}`,_);return}const{transactionId:C,action:h,mediaType:f}=((m=this._mainSession)==null?void 0:m.getOldDialogData())||{};if(C===E&&h===r&&f===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",_);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${T}`,_),(y=this._mainSession)==null||y.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===v.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},_);else{let P=null;switch(T){case v.CANCEL:P=k.CANCEL_CHANGE_MEDIA_TYPE;break;case v.ACCEPT:P=k.SERVER_ALLOW_MEDIA_TYPE,(R=this._mainSession)==null||R.updateMediaType(this._mainSession.getReqMediaType()),(M=this._mainSession)==null||M.updateReqMediaType(null);break;case v.REFUSE:P=k.REFUSE_CHANGE_MEDIA_TYPE;break;case v.TIMEOUT:P=k.CHANGE_MEDIA_TYPE_TIMEOUT;break}k[P]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},P,_)}r===v.NOTICE&&c===u.AUDIO&&!T&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},k.SERVER_ALLOW_MEDIA_TYPE,_)}_onRecvCallEndLog(e,_){const i=ce(e);this._reportAppEventModule.onReceivedCallRecord(i,_)}sessionClose(e,_,i){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(T=>T&&T.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,_);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,_),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(T=>this._stopTimer.bind(this)(T,_)),E.getCallType()===D.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(w.__INNER_SESSION_CLOSE__,r,_);const L=E.getUserList().find(T=>T.userId===o);let c;i&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:A.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new K(E,this,this._logger),c||L.systemState,_),this._removeSession(r)}_removeSession(e){var _;if(e===((_=this._mainSession)==null?void 0:_.getCallId()))this._mainSession=null;else{const i=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(i,1)}}async _createSessionByServer(e,_=!1,i){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,i);const{code:r,data:o}=await this.getCallSession({callId:e},i);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,i);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,i);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:T}=o;this._mainSession=new ie(e,p.CONNECTING,E,L,T,T,[],this._logger),_&&this._clearMobileOnPhone(e,i),this.updateUsersState(e,c,i)}async _clearMobileOnPhone(e,_){const i=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(i&&i.getCallType()===D.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,_);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:A.ON_PHONE_END,forward:Q.CURRENT},_);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,_):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,_)}}_onUserStateChange(e,_,i){const r=this._context.getCurrentId();_.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},i)}),_.forEach(({userId:o,systemState:E})=>{o===r&&E===A.ABNORMAL_END&&this.emit(w.__INNER_SESSION_CLOSE__,e,i)})}_onOtherMemberInvite(e){e.forEach(_=>{var E;const{userId:i,callId:r}=_,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([i],o,r)})}_onRequestChangeMediaType(e,_){const{userId:i,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(i,r,o,_)}_receiveMediaTypeChangeResult(e,_,i){_===k.SERVER_ALLOW_MEDIA_TYPE&&this.emit(w.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,i),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:_},i)}_onCallTypeChange(e,_,i){this._reportAppEventModule.onCallTypeChanged(_,e,i)}};I(w,"__INNER_SESSION_CLOSE__","inner-session-close"),I(w,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(w,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(w,"__INNER_INVITE__","inner-invite");let J=w;var z=(t=>(t.NORMAL="RongCloudRTC",t.SCREEN="ScreenShare",t))(z||{});const G=class G extends l.EventEmitter{constructor(e,_,i,r,o,E){super();I(this,"_rtcClient");I(this,"_localTracks",[]);I(this,"_room",null);I(this,"_callId","");I(this,"_callMediaType");I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_isPubTiny",!1);I(this,"_videoConfigIsChange",!1);I(this,"_audioConfigIsChange",!1);I(this,"_userViewMap",{});I(this,"_callPlusStatusReportListener",null);I(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=_,this._initOpts=i,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=i==null?void 0:i.rtcClient,this._isPubTiny=i.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const _=this.getLocalVideoTrack(),{code:i,track:r}=_&&!this._videoConfigIsChange?{track:_,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const _=this.getLocalAudioTrack(),{code:i,track:r}=_&&!this._audioConfigIsChange?{track:_,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,i!==a.SUCCESS?{code:i}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,_){this._callMediaType=e;const{code:i}=await this.getMicrophoneAudioTrack(_);if(i!==a.SUCCESS)return{code:i};if(e===u.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(_);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(_=>{_.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,_){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,_),l.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",_),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const _=this._localTracks.findIndex(i=>i.getTrackId()===e.getTrackId());this._localTracks.splice(_,1)}async sessionConnected(e,_){var i;this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,_);try{if(!this._room){const{code:r,room:o}=await this.joinRTCRoom(e,_);if(r!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`errCode -> ${r}`,_);return}this._callId=e,this._regRTCListeners(),this._room=o;const E=((i=this._room)==null?void 0:i.getRemoteUserIds())||[];E.length>0&&this._onOtherMemJoined(E.map(L=>({callId:e,userId:L})),_)}}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`callId -> ${e}, err msg -> ${r.message}`,_);return}try{if(this._localTracks.length>0){this.emit(x.onBeforePublish);const r=this._isPubTiny?this._localTracks.map(E=>E.isVideoTrack()?{track:E,isPubTiny:!0}:E):this._localTracks,{code:o}=await this.publish(r,_);this.emit(x.onPublishRes,o)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",_)}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`publish Exception callId -> ${e}, err msg -> ${r.message}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,_)}async sessionClose(e,_){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,_),this.destroyAllTracks(_);const i=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===i){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,_);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",_)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",_)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const _=this.getLocalVideoTrack();return _?_.isOwnerMuted()?{code:await _.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const _=[],i=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(T=>{T.isVideoTrack()?(T.destroy(),c=T):i.push(T)}),this._localTracks=this._localTracks.filter(T=>c&&T.getTrackId()!==c.getTrackId()),_.push(o),i.push(o),this._localTracks=i,this._onLocalTrackReady(_,e),this._room){const{code:T}=await this._room.publish(_);if(T!==N.RCRTCCode.SUCCESS)return{code:T}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,_){if(this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,_),e===u.AUDIO_VIDEO){let i=this.getLocalVideoTrack();if(!i){const{code:E,track:L}=await this._createVideoTrack(_);if(E!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${E}`,_);return}i=L;const{minBitrate:c,maxBitrate:T}=this._videoConfig;(c||T)&&i.setBitrate(T,c)}const r=this._isPubTiny?{track:i,isPubTiny:!0}:i,{code:o}=await this.publish([r],_);if(o!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${o}`,_);return}}if(e===u.AUDIO){const i=this.getLocalVideoTrack();if(i){const{code:r}=await this._room.unpublish([i]);r!==N.RCRTCCode.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${r}`,_),this.destroyTrack(i)}}this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",_)}async joinRTCRoom(e,_){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,_);const{code:i,room:r,tracks:o}=await j({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,l.RTCMode.CALL]});return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${i}`,_),this._onRTCMethodFail(A.JOIN_ROOM_ERR,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",_),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},_),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await j({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,i),this._onRTCMethodFail(A.SUBSCRIBE_ERR,_),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",_),{code:a.SUCCESS})}async unsubscribeTracks(e,_){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),_),!this._room)return{code:a.SUCCESS};const{code:i}=await this._room.unsubscribe(e);return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",_),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(i=>{e[i]=this._room.getRemoteTracksByUserId(i)}),e}getRemoteTrack(e,_){var i;return(i=this._room)==null?void 0:i.getRemoteTracksByUserId(e).find(r=>_===u.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,_)=>{this._onKickOff(e,this._room.getRoomId(),_),this._releaseStoredData()},onUserJoin:e=>{const _=e.map(r=>({callId:this._callId,userId:r})),i=this._logger.createTraceId();this._onOtherMemJoined(_,i)},onUserLeave:e=>{e.forEach(_=>{delete this._userViewMap[_]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,_){this._reportAppEventModule.onUserMediaAvailable(e,_)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,_,i,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${_}, byServer: ${e}, state: ${i}, kickExtra: ${JSON.stringify(r)}`);let o=A.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(i){case N.RCKickReason.SERVER_KICK:o=A.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=A.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=A.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=A.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=A.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,_)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,_){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,_)}_onRemoteTrackPublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),_);const i=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())i.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];i.push({track:r,subTiny:L})}}),i.length&&this.subscribeTracks(i,_)}async _onTrackUnpublish(e){const _=this._logger.createTraceId();this._onDeviceEnableChange(e,_),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(i=>i.getTrackId())}),_),await this.unsubscribeTracks(e,_)}_onAudioMuteChange(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,i)}_onVideoMuteChagne(e){const _=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),_);const i=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([i],_),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,i)}_onRTCStateReport(e){const{senders:_,receivers:i}=e;_.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===u.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),i.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===u.AUDIO_VIDEO&&E==="audio")return;const{userId:T}=N.helper.parseTrackId(o),S={};S[T]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(S)})}_onRTCMethodFail(e,_){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,_)}_onOtherMemJoined(e,_){this.emit(G.__INNER_ON_OTHER_JOINED__,e,_)}_onDeviceEnableChange(e,_){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,_)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createMicrophoneAudioTrack(z.NORMAL,this._audioConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:_,track:i}=await this._rtcClient.createCameraVideoTrack(z.NORMAL,this._videoConfig);if(_!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${_}`,e),{code:_};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&i.setBitrate(o,r),this._localTracks.push(i),this._onLocalTrackReady([i],e),{code:a.SUCCESS,track:i}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(_=>_.isAudioTrack())),e}async publish(e,_){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,_);const{code:i}=await j({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return i!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(A.PUBLISH_ERR,_),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${i}`,_),{code:i}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,_),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),_=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([_])}setVideoView(e,_){const i=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const T=(this.getRemoteTracks()[o]||[]).map(S=>({track:S,subTiny:L})).filter(({track:S})=>!S.isSubscribed());i.push(...T)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,needSubTrackIds:i.map(({track:r})=>r.getTrackId())}),_),i.length&&this.subscribeTracks(i,_)}removeVideoView(e,_){const i=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&i.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:this._userViewMap,unsubTracks:i.map(r=>r.getTrackId())}),_),i.length&&this.unsubscribeTracks(i,_)}getUserViewMap(){return this._userViewMap}async playMedia(e,_,i,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${_}, videoView: ${i==null?void 0:i.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=_===u.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>_===u.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(i);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};I(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),I(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),I(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),I(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),I(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),I(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),I(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let $=G;class Pe{constructor(s){I(this,"_listener");this._logger=s}registerEventListener(s){this._listener=s}_callAppListener(s,...e){var i;const _=(i=this._listener)==null?void 0:i[s];if(_)try{_(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:s.getCallId()}),e),this._callAppListener("onReceivedCall",s)}onRemoteUserInvited(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:s,inviterUserId:e,callId:_})),this._callAppListener("onRemoteUserInvited",s,e,_)}onCallConnected(s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:s.getCallId()})),this._callAppListener("onCallConnected",s)}onCallTypeChanged(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:s}),_),this._callAppListener("onCallTypeChanged",s,e)}onRemoteUserStateChanged(s,e){const{callId:_,userId:i,userState:r,reason:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:_,userId:i,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",_,i,r,o)}onCallEnded(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:s.getCallId(),closeReason:e}),_),this._callAppListener("onCallEnded",s,e)}onRemoteCameraStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:s,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const _=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",s,_,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:s}),e),this._callAppListener("onReceivedCallRecord",s)}onReceivedChangeMediaTypeRequest(s,e,_,i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:s,transactionId:e}),i),this._callAppListener("onReceivedChangeMediaTypeRequest",s,e,_)}onReceivedChangeMediaTypeResult(s,e){const{userId:_,transactionId:i,mediaType:r,code:o}=s;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:_,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:_,transactionId:i,mediaType:r,code:o})}onReceivedCallStartTime(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:s}),e),this._callAppListener("onReceivedCallStartTime",s)}onReceivedCallFirstFrameTime(s,e,_){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:s,callFirstFrameTime:e}),_),this._callAppListener("onReceivedCallFirstFrameTime",s,e)}onUserMediaAvailable(s,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:s.map(_=>_.getTrackId())}),e),s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callAppListener("onUserMediaAvailable",i,r)})}onFetchRemoteMediaError(s,e){s.forEach(({track:_})=>{const i=_.getUserId();this._callAppListener("onFetchRemoteMediaError",i,e)})}onUserAudioLevelChanged(s){s.forEach(({track:e,audioLevel:_})=>{const i=e.getUserId();this._callAppListener("onUserAudioLevelChanged",i,_)})}}var le=(t=>(t[t.UNKNOW_ERR=41e3]="UNKNOW_ERR",t[t.DB_ERR=41001]="DB_ERR",t[t.JSON_ERR=41002]="JSON_ERR",t[t.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",t[t.MISSING_PARAMS=41004]="MISSING_PARAMS",t[t.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",t[t.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",t[t.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",t[t.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",t[t.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",t[t.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",t[t.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",t[t.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",t[t.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",t[t.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",t[t.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",t[t.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",t[t.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",t[t.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",t[t.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",t[t.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",t[t.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",t[t.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",t))(le||{});class Ie{constructor(s,e,_,i){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_callPlusStatistics");I(this,"_clientCallId","");I(this,"_isLaunchHangup",!1);I(this,"_needHangupCallId",null);I(this,"_callEngine");I(this,"_rtcModule");I(this,"_reportAppEventModule");this._context=s,this._logger=e,this._runtime=_,this._initOpts=i,this._reportAppEventModule=new Pe(e),this._callPlusStatistics=new Re(this._logger,this._context),this._callEngine=new J(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new $(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on($.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on($.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on($.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on($.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on($.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on($.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(J.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(J.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(J.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(J.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(F.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(s,e){const _=this._callEngine.getLocalMainSession();if(_){const i=_.getCallId();this._callEngine.systemStatusUp({callId:i,sysStatus:s,forward:Q.CURRENT},e),this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,_),this.__innerHangup({callId:i,systemState:s},e)}}_peerConnectionAbnormalClose(s){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:A.CONNECTION_ERR,forward:Q.CURRENT},s),this._callEngine.endCurrentSession(A.CONNECTION_ERR,e.getCallId(),s))}async _selfJoinedHandle(s,e){const _=this._context.getCurrentId(),i=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(i);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(_,u.VIDEO,E,e),this._callEngine.setUserDeviceEnable(_,u.AUDIO,L,e);const c=[{userId:_,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(s,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(s,e){var r;let _="";const i=s.map(o=>(_=o.callId,{userId:o.userId,userState:d.ONCALL,systemState:A.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(_,i,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(s){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(s)}_kickoffHandle(s,e,_){if(s===A.CONNECTION_ERR){this._callEngine.endCurrentSession(s,e,_);return}const i=this._callEngine.getLocalMainSession();if(i){const r=i.getCallId();this._callPlusStatistics.reportStatisticsData(F.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,i,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:s,forward:Q.CURRENT},_),this._callEngine.endCurrentSession(s,e,_)}}_receiveDeviceEnableChangeHandle(s,e){s.forEach(_=>{const i=_.getUserId(),r=_.isAudioTrack()?u.AUDIO:u.VIDEO;this._callEngine.setUserDeviceEnable(i,r,!_.isOwnerMuted(),e)})}_sessionCloseHandle(s,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(s,e)}setCallPlusEventListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,s?Object.keys(s).join(","):null),this._reportAppEventModule.registerEventListener(s)}setStatusReportListener(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,s?Object.keys(s).join(","):null),this._rtcModule.setCallPlusStatusReportListener(s)}setVideoView(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:s.map(_=>{const{userId:i,videoElement:r,isTiny:o}=_;return{userId:i,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!l.notEmptyArray(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};for(let _=0;_<s.length;_++){const i=s[_],{userId:r,videoElement:o}=i;if(!l.notEmptyString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${r}`,e),{code:a.PARAM_ERROR};if(!de(o))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${o instanceof HTMLElement?o.nodeName:o}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(s,e),{code:a.SUCCESS}}removeVideoView(s){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:s}),e),l.notEmptyArray(s)&&s.every(_=>l.notEmptyString(_))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(s,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR})}async playMedia(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:s,mediaType:e}),_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(l.isUndefined(u[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,_),{code:a.PARAM_ERROR};const{videoView:i}=this._rtcModule.getUserViewMap()[s]||{};return e!==u.AUDIO&&!i?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,_),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(s,e,i,_)}createVideoConfigBuilder(){return new Le(this._logger)}setVideoConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(s));const{frameRate:e,resolution:_,maxBitrate:i,minBitrate:r}=s;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[_])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${_}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=Te(r,i);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...s},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ee(this._logger)}setAudioConfig(s){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(s));const{sampleRate:e,minBitrate:_,maxBitrate:i}=s;if(e&&!l.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=Te(_,i);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...s},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(s,e=D.SINGLE,_=u.AUDIO_VIDEO){this._clientCallId=l.getUUID();const i=+new Date,r=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${s.join(",")}, callType: ${e}, mediaType: ${_}`,r),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,r),{code:a.SIGNAL_DISCONNECTED};const o=this._context.getNaviInfo();if(!o||!ee(o))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,r),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(l.notEmptyArray(s)&&s.every(C=>l.notEmptyString(C))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(D[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,r),{code:a.PARAM_ERROR};if(l.isUndefined(u[_]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${_}`,r),{code:a.PARAM_ERROR};if(s.length>1&&e===D.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${s.join(",")}`,r),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,r),{code:a.SESSION_EXIST};const{code:E}=await this._rtcModule.createCallMediaTracks(_,r);if(E!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${E}`,r),{code:E};const{code:L,data:c}=await this._callEngine.startCall({toUsers:s.map(C=>({userId:C})),callType:e,mediaType:_,callId:this._clientCallId},r);if(this._callPlusStatistics.reportStatisticsData(F.L_QS_START_CALL_S,L,i,null,this._clientCallId,null,{mediaType:_,callType:e,callId:(c==null?void 0:c.callId)||""}),L!==a.SUCCESS)return this._rtcModule.destroyAllTracks(r),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${L}`,r),{code:L};const{callId:T,clientCallId:S}=c;return this._needHangupCallId===S?(this._callEngine.clearAllTimer(T,r),this._callEngine.hangup({callId:T},r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${T} call has been hangup`,r),{code:a.SUCCESS}):(e===D.MULTI&&await this._rtcModule.sessionConnected(T,r),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:c,code:L}),r),{code:a.SUCCESS,callId:T})}async joinMultiCall(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${s}`,e),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const _=this._context.getNaviInfo();if(!_||!ee(_))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallSession({callId:s},e);if(i!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${i}`,e),{code:i};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==s)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:s,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(s,e),{code:a.SUCCESS})}async invite(s){var o;const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(E=>l.notEmptyString(E))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_,data:i}=await this._callEngine.invite({toUsers:s.map(E=>({userId:E}))},e);if(_!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${_}`,e),{code:_};const r=[];return(o=i.busylineUsers)!=null&&o.length&&r.push(...i.busylineUsers.map(E=>({userId:E.userId,state:E.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(r)}`,e),{code:a.SUCCESS,busyUsers:r}}async accept(s){const e=+new Date,_=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${s}`,_),this._context.getConnectionStatus()!==l.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,_),{code:a.SIGNAL_DISCONNECTED};const i=this._context.getNaviInfo();if(!i||!ee(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,_),{code:a.RTC_SERVICE_UNAVAILABLE};if(!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(s);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};if(s===(o==null?void 0:o.getCallId())){const{code:S}=await this.hangup(r.getCallId());if(S!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${S}`,_),{code:S};this._callEngine.upgradeMainSession(s)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,_);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,_),{code:c};const{code:T}=await this._callEngine.accept({callId:s},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_ACCEPT_CALL_S,T,e,r),T!==a.SUCCESS?(this._rtcModule.destroyAllTracks(_),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${T}`,_),{code:T}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",_),this._rtcModule.sessionConnected(s,_),{code:a.SUCCESS})}async __innerHangup(s,e){var r;const{callId:_}=s;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(_,e);const{code:i}=await this._callEngine.hangup(s,e);return i===le.CALL_NOT_EXIST?{code:a.SUCCESS}:(i===a.SUCCESS&&_===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(_,e),{code:i})}async hangup(s){const e=+new Date,_=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${s}`,_);const i=this._callEngine.getLocalMainSession();if(!i)return{code:a.NOT_IN_CALL};if(s&&!l.isString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${s}`,_),{code:a.PARAM_ERROR};const r=i.getCallId();if(s&&s!==r&&!this._callEngine.getHoldSession(s))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${s}`,_),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=s||r;const E=this._callEngine.getHoldSession(this._needHangupCallId)||i,L=this._context.getCurrentId(),c=i.getUserList().filter(h=>h.userId===L)[0].state,T=[i.getCreatorUserId(),i.getInviterUserId()].includes(L),S=Ae(c,T),{code:C}=await this.__innerHangup({callId:this._needHangupCallId,systemState:S},_);return this._callPlusStatistics.reportStatisticsData(F.L_QS_HANGUP_CALL_S,C,e,E,this._clientCallId),C!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${C}`,_),{code:C}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",_),{code:a.SUCCESS})}async requestChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${s}`,e),l.isUndefined(u[s]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this.getCurrentCallSession(),i=_==null?void 0:_.getMediaType();if(s===i)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=_==null?void 0:_.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:s,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:_}=await this._callEngine.cancelChangeMediaType({transactionId:s},e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${s}`,_),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${s}`,_),{code:a.PARAM_ERROR};if(!l.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,_),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,_),{code:a.NOT_IN_CALL};const{code:i}=await this._callEngine.responseChangeMediaType({transactionId:s,agree:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",_),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e,data:_}=await this._callEngine.getOpenCallList(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(_)}`,s),{code:a.SUCCESS,records:_})}async getCallRecords(s,e){const _=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${s}, count: ${e}`,_),!(l.isNumber(s)&&s>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${s}`,_),{code:a.PARAM_ERROR};if(!(l.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,_),{code:a.PARAM_ERROR};const{code:i,data:r}=await this._callEngine.getCallLogList({timestamp:s,count:e},_);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${i}`,_),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",_),{code:a.SUCCESS,result:r})}async deleteCallRecordsFromServer(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${s.join(",")}`,e),!(l.notEmptyArray(s)&&s.every(i=>l.notEmptyString(i))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(s)}`,e),{code:a.PARAM_ERROR};const{code:_}=await this._callEngine.deleteCallLog(s,e);return _!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${_}`,e),{code:_}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",s);const{code:e}=await this._callEngine.removeAllCallLog(s);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,s),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",s),{code:a.SUCCESS})}async startCamera(){var r;const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.getCameraVideoTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!0,s),!(_!=null&&_.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,s),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}const{code:i}=await this._rtcModule.enableVideoTrack(s);return i!==N.RCRTCCode.SUCCESS&&i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${i}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",s),{code:a.SUCCESS})}async stopCamera(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",s);const{code:e,track:_}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,s),{code:e}):(this._rtcModule.destroyTrack(_),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.VIDEO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",s),{code:a.SUCCESS})}async switchCamera(s){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${s}`,e),!l.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};const _=this._callEngine.getLocalMainSession();if(!_)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(_.getMediaType()===u.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=s,this._rtcModule.setVideoConfig(this._videoConfig);const{code:i}=await this._rtcModule.changeVideoDevice(e);return i!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${i}`,e),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.getMicrophoneAudioTrack(s);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,s),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!0,s),!_.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS};const i=await _.unmute();return i!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,s),{code:i}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",s),{code:a.SUCCESS})}async stopMicrophone(){const s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",s);const{code:e,track:_}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,s),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),u.AUDIO,!1,s),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",s),{code:a.SUCCESS})}isMicrophoneEnabled(){const s=this._rtcModule.getLocalAudioTrack();return!!s&&!s.isOwnerMuted()}async setAllRemoteAudioEnable(s){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(s,e)}getVersion(){return"1.1.0"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const Ve=t=>t?l.isObject(t)?Object.keys(t).includes("rtcClient")?l.isObject(t.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},Ge={tag:"RCCallPlus",verify(t){return l.VersionManage.add("plugin-call-plus","1.1.0"),l.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${l.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(t,s,e){const _=Ve(e);if(!_.isLegal)throw new Error(`[CallPlusLib installer steup]${_.msg}`);const i=t.createLogger("CallPlusLib","RTC"),r=l.isUndefined(e.logOutputLevel)?l.LogL.WARN:e.logOutputLevel;return i.setOutputLevel(r),i.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 1.1.0, Commit: 568b4853a74c41e90cb77a27e29264189c682d32"),new Ie(t,i,s,e)}};Object.defineProperty(g,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(g,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),g.RCAudioConfigBuilder=Ee,g.RCCallPlusCallState=p,g.RCCallPlusClient=Ie,g.RCCallPlusCode=a,g.RCCallPlusMediaType=u,g.RCCallPlusMediaTypeChangeResult=k,g.RCCallPlusReason=A,g.RCCallPlusSession=K,g.RCCallPlusSessionUserState=d,g.RCCallPlusType=D,g.RCVideoConfigBuilder=Le,g.installer=Ge,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICovXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1QgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTF9QTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IgPSAnTC1jYWxsX3BsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tUicsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNUeXBlLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbm5lclNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuLyoqXG4gKiDlr7nlpJYgc2Vzc2lvbiDlrp7kvovvvIzku4XmnInojrflj5bmlrnms5XvvIzml6Dms5Xkv67mlLlcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNTZXNzaW9uIHtcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZHVyYXRpb246IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9jYWxsSWQgPSB0aGlzLl9zZXNzaW9uLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBDYWxsSWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53kurrlkZjliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiB7IHVzZXJJZDogc3RyaW5nLCBzdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgY2FtZXJhRW5hYmxlLCBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyU3RhdGUsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Y+R6LW36ICFIHVzZXJJZFxuICAgKi9cbiAgZ2V0Q3JlYXRvclVzZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53pgoDor7fogIUgdXNlcklkXG4gICAqIOWRvOWFpeacieWAvO+8jOWRvOWHuuaXtu+8jOWAvOS4uuacrOWcsOeUqOaItyBVc2VySWRcbiAgICovXG4gIGdldEludml0ZXJVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivnei1t+Wni+aXtumXtFxuICAgKi9cbiAgYXN5bmMgZ2V0Q3JlYXRlVGltZXN0YW1wKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgc3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICog6YCa6K+d5pyq57uT5p2f5YmN77yM5YC85Li6IDBcbiAgICovXG4gIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke3RoaXMuX2R1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgZHVyYXRpb246IHRoaXMuX2R1cmF0aW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyh0aGlzLl9jYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX1BMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmF2aUluZm8sIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0SW5mbywgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCBJSGFuZ3VwSW5mbywgSU90aGVyTWVtSW5mbywgSVJpbmdpbmdJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgSVN0YXR1c0Rvd25Db250LCBJU3luY0NhbGxMb2dSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbi8qKlxuICogY2FsbCBzZXJ2ZXIgbG9nIOi9rOaNolxuICovXG5leHBvcnQgY29uc3QgdHJhbjJDYWxsTG9nID0gKGNhbGxMb2dMaXN0OiBJU3luY0NhbGxMb2dSZXMpOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgY2FsbFN0YXR1cyxcbiAgICBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHNlY3JldENoYXQsXG4gICAgc3luY1RpbWUsXG4gICAgc3lzU3RhdHVzLFxuICAgIGNydFRpbWUsXG4gIH0gPSBjYWxsTG9nTGlzdDtcbiAgcmV0dXJuIHtcbiAgICBjYWxsSWQsXG4gICAgY2FsbFR5cGUsXG4gICAgY2FsbERpcmVjdGlvbjogY2FsbERpcixcbiAgICBtZWRpYVR5cGUsXG4gICAgLy8gaXNTZWNyZXRDaGF0OiBCb29sZWFuKHNlY3JldENoYXQpLFxuICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICBjYWxsVXNlcklkcyxcbiAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgZW5kVGltZXN0YW1wOiBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTdGF0dXMge1xuICByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW107XG4gIGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW107XG4gIGFjY2VwdERhdGE6IElBY2NlcHRJbmZvW107XG4gIG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXTtcbn1cblxuLyoqXG4gKiBwYXJzZVN0YXR1c1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VTdGF0dXNEYXRhID0gKGRhdGE6IElTdGF0dXNEb3duQ29udCk6IElQYXJzZVN0YXR1cyA9PiB7XG4gIGNvbnN0IHsgY2FsbElkLCBjYWxsU3RhdHVzIH0gPSBkYXRhO1xuICBjb25zdCByaW5naW5nRGF0YTogSVJpbmdpbmdJbmZvW10gPSBbXTtcbiAgY29uc3QgaGFuZ3VwRGF0YTogSUhhbmd1cEluZm9bXSA9IFtdO1xuICBjb25zdCBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdID0gW107XG4gIGNvbnN0IG90aGVySW52aXRlZERhdGE6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgc3dpdGNoIChzZXNzaW9uU3RhdHVzKSB7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQ6XG4gICAgICAgIG90aGVySW52aXRlZERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORzpcbiAgICAgICAgLy8g6YCa55+l5ZON6ZODXG4gICAgICAgIHJpbmdpbmdEYXRhLnB1c2goeyBjYWxsSWQsIGZyb21Vc2VySWQ6IHVzZXJJZCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkc6XG4gICAgICAgIC8vIOmAmuefpeWvueaWueW3suaOpeWQrFxuICAgICAgICBhY2NlcHREYXRhLnB1c2goeyBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTpcbiAgICAgICAgaGFuZ3VwRGF0YS5wdXNoKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgZnJvbVVzZXJJZDogdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcmluZ2luZ0RhdGEsXG4gICAgaGFuZ3VwRGF0YSxcbiAgICBhY2NlcHREYXRhLFxuICAgIG90aGVySW52aXRlZERhdGEsXG4gIH07XG59O1xuXG4vKipcbiAqIOWug+ajgOafpeWFg+e0oOaYr+WQpuaYr+inhumikeiKgueCuVxuICogQHBhcmFtIHthbnl9IGVsZW1lbnQgLSDmgqjopoHmo4Dmn6XnmoTlhYPntKDmmK/lkKbkuLrop4bpopHlhYPntKDjgIJcbiAqIEByZXR1cm5zIOS4gOS4quW4g+WwlOWAvOOAglxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVWaWRlb05vZGVOYW1lID0gKGVsZW1lbnQ6IGFueSkgPT4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVOYW1lICYmIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1ZJREVPJztcblxuLyoqXG4gKiDmoLnmja7nlKjmiLflvZPliY3nmoQgc3lzdGVtU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHN5c3RlbVN0YXRlLOadpeWIpOaWreaWsCBzeXN0ZW1TdGF0ZSDmmK/lkKbml6DmlYhcbiAqIOS+i++8muW9k+WJjeeUqOaIt+W3suWcqCBjYWxsIOS4re+8jOWPiOaUtuWIsOatpOeUqOaIt+eahCDlk43pk4PjgIHov57mjqXkuK0g562JXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN5c1N0YXRlID0gKGNydFN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbikgPT4ge1xuICBsZXQgaXNJblZhbGlkID0gZmFsc2U7XG4gIGNvbnN0IGludmFsaWRTdGF0ZXMgPSBbXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9XQUlULFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgXTtcbiAgc3dpdGNoIChjcnRTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEw6XG4gICAgICBpZiAoaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICAgICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gICAqIOagueaNrueUqOaIt+W9k+WJjeeahCB1c2VyU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHVzZXJTdGF0ZSzmnaXliKTmlq3mlrAgdXNlclN0YXRlIOaYr+WQpuaXoOaViFxuICAgKiDml6DmlYjnmoTnlKjmiLfnirbmgIFcbiAgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VyU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUpID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gIF07XG4gIHN3aXRjaCAoY3J0U3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIGlmIChpbnZhbGlkU3RhdGVzLmluY2x1ZGVzKG5ld1N0YXRlKSkge1xuICAgICAgICBpc0luVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICogQHBhcmFtIHVzZXJTdGF0ZSDkurrlkZjnirbmgIFcbiAqIEBwYXJhbSBpc0NhbGxlZSDmmK/lkKbmmK/ooqvlj6tcbiAqIEByZXR1cm5zIOS6uuWRmOezu+e7n+eKtuaAgVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUgPSAodXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgaXNDYWxsZWU6IGJvb2xlYW4pID0+IHtcbiAgbGV0IHN5c3RlbVN0YXRlO1xuICBzd2l0Y2ggKHVzZXJTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgc3lzdGVtU3RhdGUgPSBpc0NhbGxlZSA/IFJDQ2FsbFBsdXNSZWFzb24uREVDTElORUQgOiBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkVOREVEO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHN5c3RlbVN0YXRlO1xufTtcblxuLyoqXG4gKiDliKTmlq3mmK/lkKblvIDlp4vpn7Pop4bpopHmnI3liqFcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydE1lZGlhU2VydmVyID0gKG5hdmlJbmZvOiBJTmF2aUluZm8pID0+IHtcbiAgY29uc3QgeyB2b2lwQ2FsbEluZm8gfSA9IG5hdmlJbmZvO1xuICBpZiAoIXZvaXBDYWxsSW5mbykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RyYXRlZ3kgfSA9IEpTT04ucGFyc2Uodm9pcENhbGxJbmZvKTtcbiAgaWYgKHN0cmF0ZWd5ICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVCaXRyYXRlID0gKG1pbkJpdHJhdGU/OiBudW1iZXIsIG1heEJpdHJhdGU/OiBudW1iZXIpID0+IHtcbiAgaWYgKG1pbkJpdHJhdGUgfHwgbWluQml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWluQml0cmF0ZSkgfHwgbWluQml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWluQml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttaW5CaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWF4Qml0cmF0ZSB8fCBtYXhCaXRyYXRlID09PSAwKSB7XG4gICAgaWYgKCFpc051bWJlcihtYXhCaXRyYXRlKSB8fCBtYXhCaXRyYXRlIDw9IDApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLCBlcnJvck1zZzogYHBhcmFtcyBlcnJvciAtPiBtYXhCaXRyYXRlOiBhIG51bWJlciBvZiA+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm91c2VyIHB1c2ggJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICB0aGlzLl9jYWxsVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkVXNlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0T2xkRGlhbG9nRGF0YShkYXRhOiBJT2xkRGlhbG9nRGF0YSkge1xuICAgIHRoaXMuX29sZERpYWxvZ0RhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICog5pu05pawIHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgJror53nsbvlnovvvIjljYfpmY3nuqforr7nva7vvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDYWxsVHlwZShjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUpIHtcbiAgICB0aGlzLl9jYWxsVHlwZSA9IGNhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6K+35rGC55qE5aqS5L2T57G75Z6L77yI5Y2H6ZmN57qn77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUmVxTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXFNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05pawIGludnRlciB0aW1lciBpZFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVRpbWVySWQodHlwZTogQ2FsbFRpbWVyRXZlbnRUeXBlLCB0aW1lcklkOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZSA9PT0gQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURVIpIHtcbiAgICAgIHRoaXMuX2ludml0ZXJUaW1lcklkID0gdGltZXJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW52aXRlZVRpbWVySWQgPSB0aW1lcklkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZcbiAgICovXG4gIHB1YmxpYyBnZXRPbGREaWFsb2dEYXRhKCk6IElPbGREaWFsb2dEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fb2xkRGlhbG9nRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mmK/lkKbmmK/lt7Hnq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXAgPSBpc0xvY2FsQ2xpZW50SGFuZ3VwO1xuICB9XG5cbiAgcHVibGljIGdldElzTG9jYWxDbGllbnRIYW5ndXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckFjdGlvbiB7XG4gIC8qKlxuICAgKiDlvIDlp4vljZXkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX1NJTkdMRV9DQUxMID0gJ3N0YXJ0U2luZ2xlQ2FsbCcsXG4gIC8qKlxuICAgKiDlvIDlp4vlpJrkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX0dST1VQX0NBTEwgPSAnc3RhcnRHcm91cENhbGwnLFxuICAvKipcbiAgICog6YKA6K+35aW95Y+L5Yqg5YWl6YCa6K+dXG4gICAqL1xuICBJTlZJVEVfQ0FMTCA9ICdpbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOS4i+WPkemCgOivt+mAmuivneaVsOaNrlxuICAgKi9cbiAgUFVCX0lOVklURV9DQUxMID0gJ3B1Ykludml0ZUNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HX0NBTEwgPSAncmluZ0NhbGwnLFxuICAvKipcbiAgICog5o6l5Y+X6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FMTCA9ICdhY2NlcHRDYWxsJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnVxuICAgKi9cbiAgSk9JTl9DQUxMID0gJ2pvaW5DYWxsJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgSEFOR1VQX0NBTEwgPSAnaGFuZ3VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIrmiqVcbiAgICovXG4gIFNUQVRVU19VUF9DQUxMID0gJ3N0YXR1c1VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIvlj5FcbiAgICovXG4gIFNUQVRVU19ET1dOX0NBTEwgPSAnc3RhdHVzRG93bkNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBFVkVOVF9VUF9DQUxMID0gJ2V2ZW50VXBDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4i+WPkVxuICAgKi9cbiAgRVZFTlRfRE9XTl9DQUxMID0gJ2V2ZW50RG93bkNhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiK6KGMXG4gICAqL1xuICBESUFMT0dfVVBfQ0FMTCA9ICdkaWFsb2dVcENhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiL6KGMXG4gICAqL1xuICBESUFMT0dfRE9XTl9DQUxMID0gJ2RpYWxvZ0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOiOt+WPlueUqOaIt+S8muivneaVsOaNruWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfVVNFUl9TRVNTSU9OX0xJU1QgPSAnZ2V0Q2FsbFVTZXJTZXNzaW9uTGlzdCcsXG4gIC8qKlxuICAgKiDml6Xlv5forrDlvZXlkIzmraVcbiAgICovXG4gIFNZTkNfQ0FMTF9MT0cgPSAnc3luY0NhbGxMb2cnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5LiL5Y+RXG4gICAqL1xuICBQVUJfQ0FMTF9MT0cgPSAncHViQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53orrDlvZVcbiAgICovXG4gIERFTF9DQUxMX0xPRyA9ICdkZWxldGVDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+W3suacieeahCBjYWxsIOeKtuaAgVxuICAgKi9cbiAgUVJZX0NBTExfU1RBVEUgPSAncXVlcnlVc2VySGFzQ2FsbCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbFNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIFFSWV9TUlZfVElNRVNUQU1QID0gJ2dldENhbGxTcnZUaW1lU3RhbXAnLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55So5oi36L+b6KGM55qEIGNhbGwg5YiX6KGoXG4gICAqL1xuICBHRVRfQ0FMTF9TVEFURV9MSVNUID0gJ2dldFVzZXJDYWxsU3RhdGVMaXN0JyxcbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+mAmuivneiusOW9lVxuICAgKi9cbiAgQ0xFQVJfQ0FMTF9MT0cgPSAnY2xlYW5DYWxsTG9nJyxcbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOS8muivneS/oeaBr1xuICAgKi9cbiAgR0VUX0NBTExfU0VTU0lPTiA9ICdnZXRDYWxsU2Vzc2lvbicsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDml7bpl7Tkv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1RJTUVfSU5GTyA9ICdnZXRDYWxsVGltZUluZm8nLFxuICAvKipcbiAgICog57uT5p2f5b2T5YmN55So5oi35byC5bi455qEY2FsbFNlc3Npb24o5YyF5ZCr5ZCE5Liq6Zi25q61Ke+8jOS4u+imgeeUqOS6juW6lOeUqOW8guW4uOmAgOWHuuWGjeWQr+WKqOOAgeWQhOenjemAmuivneW8guW4uOW9k+S4reOAgumFjOaDheiwg+eUqFxuICAgKi9cbiAgRU5EX0FCTk9STUFMX0NBTEwgPSAnZW5kVXNlckFibm9ybWFsQ2FsbHMnLFxuICAvKipcbiAgICog55So5oi357O757uf54q25oCB5LiK5oqlXG4gICAqL1xuICBTWVNfU1RBVFVTX1VQID0gJ3N5c1N0YXR1c1VwJyxcbiAgLyoqXG4gICAqIOS4iuaKpemAmuivneiusOW9leW3suivu+eKtuaAgVxuICAgKi9cbiAgVVBfQ0FMTF9MT0dfUkVBREVEID0gJ3VwQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFBVQl9DQUxMX0xPR19SRUFERUQgPSAncHViQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HkuIvooYzkv6Hku6TmlbDmja7luo/lj7dJZCDvvIjlvLHnvZHooaXlgb/mlrnms5XvvIznp7vliqjnq6/lt7Llrp7njrDvvIxQQyDmnKrlrp7njrDvvIlcbiAgICovXG4gIFBVQl9OQUNLX1NFUV9JRCA9ICdwdWJOQUNLU2VxSWQnLFxuICAvKipcbiAgICog5p+l6K+i5b2T5YmN55So5oi35Y+C5LiO55qE5pyq57uT5p2f55qEY2FsbFNlc3Npb27nmoRDYWxsSWTliJfooajvvIxncm91cOS4k+eUqO+8jOWPr+WcqGdyb3VwY2FsbOe7k+adn+aXtu+8jOihpeWBv+WQhOerr+eahOW/q+aNt+WFpeWPo+aYr+WQpua2iOWkseeahOWIpOaWrVxuICAgKi9cbiAgR0VUX1VTRVJfQ0FMTF9TRVNTSU9OX0lEX0xJU1QgPSAnZ2V0VXNlckNhbGxTZXNzaW9uSWRMaXN0J1xufVxuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgdGltZXJJbnRlcnZhbCA9IChmdW46IEZ1bmN0aW9uLCBpdHY6IG51bWJlcik6IG51bWJlciA9PiBzZXRJbnRlcnZhbChmdW4sIGl0dikgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobWlsbGlzZWNvbmQ6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZCk7XG59KTtcbiIsImltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBDYWxsU2VydmVyRXJyb3JDb2RlIH0gZnJvbSAnLi4vZW51bXMvQ2FsbFNlcnZlckVycm9yQ29kZSc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcblxuZXhwb3J0IHR5cGUgVFJldHJ5RXJyb3JDb2RlID0gQ2FsbFNlcnZlckVycm9yQ29kZSB8IFJDUlRDQ29kZSB8IG51bWJlciB8IEVycm9yQ29kZVxuZXhwb3J0IGludGVyZmFjZSByZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICog6KaB6YeN6K+V55qE5byC5q2l5Ye95pWwXG4gICAqL1xuICBhc3luY0ZuOiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIOWHveaVsOeahOWPguaVsFxuICAgKi9cbiAgZm5BcmdzOiBhbnlbXTtcbiAgLyoqXG4gICAqIOW9k+WJjemHjeivleaXtumXtOaIs1xuICAgKi9cbiAgY3VycmVudFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleaXtumVv1xuICAgKi9cbiAgbWF4RHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmoq/luqbph43or5Xpl7TpmpRcbiAgICovXG4gIGludGVydmFscz86IG51bWJlcltdO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqU5pWw57uE5LiL5qCHXG4gICAqL1xuICBpbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuY29uc3QgbmVlZFJldHJ5Q29kZTogVFJldHJ5RXJyb3JDb2RlW10gPSBbXG4gIC8qKlxuICAgKiBJTSDlupXlsYLov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIEVycm9yQ29kZS5SQ19ORVRfQ0hBTk5FTF9JTlZBTElELFxuICBFcnJvckNvZGUuUkNfTkVUX1VOQVZBSUxBQkxFLFxuICBFcnJvckNvZGUuUkNfTVNHX1JFU1BfVElNRU9VVCxcbiAgLyoqXG4gICAqIFJUQyDov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIFJDUlRDQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVELFxuICBSQ1JUQ0NvZGUuUkVRVUVTVF9GQUlMRUQsXG5cbl07XG5cbi8qKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5hc3luY0ZuIOimgemHjeivleeahOW8guatpeWHveaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5mbkFyZ3Mg5Ye95pWw55qE5Y+C5pWwXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmN1cnJlbnRSZXRyeVRpbWUg5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLm1heER1cmF0aW9uIOacgOWkp+mHjeivleaXtumVv1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbnRlcnZhbHMg5qKv5bqm6YeN6K+V6Ze06ZqUXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmluZGV4IOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICovXG5leHBvcnQgY29uc3QgcmV0cnlBc3luY0ZuID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gRGF0ZS5ub3coKSxcbiAgbWF4RHVyYXRpb24gPSA2MCAqIDEwMDAsXG4gIGludGVydmFscyA9IFsyICogMTAwMCwgNCAqIDEwMDAsIDggKiAxMDAwLCAxNiAqIDEwMDAsIDMyICogMTAwMCwgNjQgKiAxMDAwXSxcbiAgaW5kZXggPSAwLFxuICBvbkVycm9yLFxufTogcmV0cnlPcHRpb25zKTogUHJvbWlzZTxSPiA9PiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGFzeW5jRm4oLi4uZm5BcmdzKTtcbiAgLy8gY29uc3QgaXR2ID0gaW50ZXJ2YWxzW2luZGV4XSB8fCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdXG4gIC8vIGluZGV4KytcbiAgLy8gaXR2IOWGmeatuyAyMDAwIG1zICzlkI7nu63pnIDopoHlho3mlL7lvIDmoq/luqbph43or5VcbiAgY29uc3QgaXR2ID0gMiAqIDEwMDA7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSlcbiAgICB8fCAoKERhdGUubm93KCkgKyBpdHYgLSBjdXJyZW50UmV0cnlUaW1lKSA+IG1heER1cmF0aW9uKTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc3luY0ZuKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgICBpbnRlcnZhbHMsXG4gICAgICBpbmRleCxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlCeVRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5XmrKHmlbAsIOm7mOiupCAyIOasoVxuICAgKi9cbiAgbWF4UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog6YeN6K+V5aSx6LSl55qE5Zue6LCDXG4gICAqL1xuICBvbkVycm9yPzogKGNvZGU6IFRSZXRyeUVycm9yQ29kZSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcmV0cnlBc255Y0ZuQnlUaW1lID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gMCxcbiAgbWF4UmV0cnlUaW1lID0gMixcbiAgb25FcnJvcixcbn06IHJldHJ5QnlUaW1lT3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjdXJyZW50UmV0cnlUaW1lKys7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSkgfHwgY3VycmVudFJldHJ5VGltZSA+IG1heFJldHJ5VGltZTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc255Y0ZuQnlUaW1lKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4UmV0cnlUaW1lLFxuICAgICAgb25FcnJvcixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7IElQdWJJbnZpdGVDb24gfSBmcm9tICcuL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbmV4cG9ydCBlbnVtIENhbGxIb29rc1R5cGUge1xuICBvbkJlZm9yZVB1Ymxpc2ggPSAnb25CZWZvcmVQdWJsaXNoJyxcbiAgb25QdWJsaXNoUmVzID0gJ29uUHVibGlzaFJlcycsXG4gIG9uUHViSW52aXRlQ2FsbCA9ICdvblB1Ykludml0ZUNhbGwnLFxuICBvblB1Ykludml0ZUNhbGxQdWxsS3YgPSAnb25QdWJJbnZpdGVDYWxsUHVsbEt2JyxcbiAgb25QdWJJbnZpdGVDYWxsTWlzcyA9ICdvblB1Ykludml0ZUNhbGxNaXNzJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiB7XG4gIE5PVF9DVVJSRU5UX0RFVklDRUlEID0gJ25vdCBjdXJyZW50IGRldmljZSBpZCcsXG4gIFNFQ1JFVF9DQUxMID0gJ3NlY3JldCBjYWxsJyxcbiAgTk9UX0lOVklURUUgPSAnbm90IGFuIGludml0ZWUnXG59XG5cbmV4cG9ydCBlbnVtIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIge1xuICBQVUJfSU5WSVRFID0gJ3B1Ymludml0ZWNhbGwnLFxuICBQVUxMX0tWX0lOVklURSA9ICdwdWxsa3ZfaW52aXRlY2FsbCcsXG4gIFBVU0ggPSAnc3lzdGVtX3B1YnNoJ1xufVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbEluZm8gPSBJUHViSW52aXRlQ29uICYgeyBleHRyYTogc3RyaW5nfVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbE1pc3NJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHJlZmVyOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyfVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBnZXRVVUlEMjIsIElSdW50aW1lLCBpc051bGwsIGlzU3RyaW5nLCBsb2dnZXIsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckFjdGlvbiB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24nO1xuaW1wb3J0IHtcbiAgSUFjY2VwdENhbGxDb24sXG4gIElCYXNlU2luZ2FsQ29uLFxuICBJQ2xlYXJDYWxsTG9nUmVzLFxuICBJQ29ucGVuc2F0aW9uRGF0YSxcbiAgSURpYWxvZ0Rvd25DYWxsQ29uLFxuICBJRGlhbG9nVXBDYWxsQ29uLFxuICBJRXZlbnREb3duQ2FsbENvbixcbiAgSUV2ZW50VXBDYWxsQ29uLFxuICBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXMsXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcyxcbiAgSUhhbmd1cENhbGxDb24sXG4gIElJbnZpdGVDYWxsQ29uLFxuICBJSW52aXRlQ2FsbFJlcyxcbiAgSUpvaW5DYWxsQ29uLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVFyeVVzZXJIYXNDYWxsUmVzLFxuICBJUmluZ2luZ0NhbGxDb24sXG4gIElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyLFxuICBJU3RhcnRDYWxsQ29uLFxuICBJU3RhcnRDYWxsUmVzLFxuICBJU3RhcnRHcm91cENvbixcbiAgSVN0YXJ0U2luZ2xlQ29uLFxuICBJU3RhdHVzRG93bkNvbnQsXG4gIElTdGF0dXNVcENvbixcbiAgSVN5bmNDYWxsTG9nQ29uLFxuICBJU3luY0NhbGxMb2dSZXNMaXN0LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vVGltZUNvcnJlY3Rpb25lcic7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHtcbiAgQ2FsbEhvb2tzVHlwZSwgUHViSW52aXRlQ2FsbE1pc3NSZWFzb24sIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHJhbnNwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog55uR5ZCs5a+56LGhXG4gICAqL1xuICBfbGlzdGVuZXIhOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lclxuXG4gIC8qKlxuICAgKiDpnIDopoHph43or5XnmoQgYWN0aW9uXG4gICAqL1xuICBfbmVlZFJldHJ5QWN0aW9uczogQ2FsbFNlcnZlckFjdGlvbltdID0gW1xuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLFxuICBdXG5cbiAgX3Nlc3Npb25JZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29udGV4dC5vbkNhbGxJbmZvID0gdGhpcy5fb25SZWN2Q2FsbFNpZ25hbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRleHQub25jb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLl9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gZ2V0VVVJRDIyKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRDYWxsKG1zZzogSVN0YXJ0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICBjb25zdCB7XG4gICAgICBjbGllbnRDYWxsSWQsIGNhbGxUeXBlLCB0b1VzZXJzLCBtZWRpYVR5cGUsIHNlY3JldENoYXQsIHRhcmdldFR5cGUsIHRhcmdldElkLCBuaWNrTmFtZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBtc2c7XG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2luZ2xlQ2FsbCh7XG4gICAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgICAgdG9Vc2VySWQ6IHRvVXNlcnNbMF0udXNlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHNlY3JldENoYXQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBvbGRSb29tSWQsXG4gICAgICAgIHRvT3JnSWQ6IHRvVXNlcnNbMF0ub3JnSWQgfHwgJycsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRHcm91cENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG5pY2tOYW1lLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0U2luZ2xlQ2FsbChtc2c6IElTdGFydFNpbmdsZUNvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1NJTkdMRV9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0U2luZ2xlQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0R3JvdXBDYWxsKG1zZzogSVN0YXJ0R3JvdXBDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0R3JvdXBDb24sIElTdGFydENhbGxSZXM+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZpdGVDYWxsKG1zZzogSUludml0ZUNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUludml0ZUNhbGxDb24sIElJbnZpdGVDYWxsUmVzPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLklOVklURV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJpbmdpbmdDYWxsKG1zZzogSVJpbmdpbmdDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVJpbmdpbmdDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uUklOR0lOR19DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdENhbGwobXNnOiBJQWNjZXB0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUFjY2VwdENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5BQ0NFUFRfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChtc2c6IElKb2luQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSk9JTl9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUpvaW5DYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmd1cENhbGwobXNnOiBJSGFuZ3VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NlbmRDYWxsU2lnbmFsPElIYW5ndXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSEFOR1VQX0NBTEwsIG1zZyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMKSB7XG4gICAgICAvLyDlrZjlnKjljZXlkbwgQSDmjILmlq3lkI7nm7TmjqXouKLlh7ogQu+8jENhbGxTZXJ2ZXIg5bey56e76ZmkIGNhbGwsIEIg5ZCO5YiwIENhbGxTZXJ2ZXIg55qEIGhhbmd1cCDkvJrovazkuLogQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVO+8jOaVheW/veeVpVxuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhdHVzVXBDYWxsKG1zZzogSVN0YXR1c1VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9ULCBgY2FsbCBzdGF0dXMgdXAgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGF0dXNVcENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2ZW50VXBDYWxsKG1zZzogSUV2ZW50VXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUV2ZW50VXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaWFsb2dVcENhbGwobXNnOiBJRGlhbG9nVXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0RJQUxPR19VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElEaWFsb2dVcENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsUmVjb3JkKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0RFTEVURV9DQUxMX1JFQ09SRF9ULCBgY2FsbElkczogJHtKU09OLnN0cmluZ2lmeShjYWxsSWRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8e2NhbGxJZHM6IHN0cmluZ1tdfSwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uREVMX0NBTExfTE9HLCB7XG4gICAgICBjYWxsSWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5bmNDYWxsTG9nKG1zZzogSVN5bmNDYWxsTG9nQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3luY0NhbGxMb2dSZXNMaXN0fT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfUkVDT1JEX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5bmNDYWxsTG9nQ29uLCBJU3luY0NhbGxMb2dSZXNMaXN0Pihtc2cudXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlNZTkNfQ0FMTF9MT0csIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcXVlcnlVc2VySGFzQ2FsbCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUXJ5VXNlckhhc0NhbGxSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSVFyeVVzZXJIYXNDYWxsUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX0NBTExfU1RBVEUsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogeyBzeW5jVGltZTogbnVtYmVyfX0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfU0VSVkVSX1RJTUVfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIHsgc3luY1RpbWU6IG51bWJlcn0+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5RUllfU1JWX1RJTUVTVEFNUCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfVElNRV9JTkZPX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7IGNhbGxJZDogc3RyaW5nfSwgSUdldENhbGxUaW1lSW5mb1Jlcz4oY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1RJTUVfSU5GTywgeyBjYWxsSWQgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQVZBSUxBQkxFX0NBTExfTElTVF9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfU1RBVEVfTElTVCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQ6IHN0cmluZyk6UHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUNsZWFyQ2FsbExvZ1Jlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0xFQVJfQ0FMTF9SRUNPUkRfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElDbGVhckNhbGxMb2dSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5DTEVBUl9DQUxMX0xPRywgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUJhc2VTaW5nYWxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblNlcnZlclJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX0lORk9fQllfQ0FMTElEX1QsIGBjYWxsSWQ6ICR7b3B0cy5jYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElCYXNlU2luZ2FsQ29uLCBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXM+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NFU1NJT04sIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5c1N0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1VTRVJfU1lTVEVNX1NUQVRFX1VQX1QsIGBvcHRzOiAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3lzU3RhdHVzVXBPcHRzLCB1bmRlZmluZWQ+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNZU19TVEFUVVNfVVAsIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwQ2FsbExvZ1JlYWRlZChvcHRzOiBJQmFzZVNpbmdhbENvbik6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uVVBfQ0FMTF9MT0dfUkVBREVELCBvcHRzKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgcHJpdmF0ZSBfb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZTogUkNDb25uZWN0aW9uU3RhdHVzKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9JTV9TVEFURV9DSEFOR0VfTywgYHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JTVN0YXRlQ2hhbmdlKHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiDov57mjqXmiJDlip/lkI7lkK/liqjml7bpl7TmoKHmraPlmahcbiAgICAgKi9cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RhcnQodHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6Tlj5HpgIFcbiAgICogQHBhcmFtIHRhcmdldElkIOiOt+WPliBjYWxsIGxvZyAoc3luY0NhbGxMb2cpIOaXtuS8oCB1c2VySWQsIOWFtuS7liBhY3Rpb24g5LygIGNhbGxJZFxuICAgKiBAcGFyYW0ga2V5IGNhbGwgc2VydmVyIOWumuS5iSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgYWN0aW9uIOaQuuW4puWPguaVsO+8jOaXoOWPguaVsOS8oOepuuWtl+espuS4slxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxTaWduYWwgPFQsIFI+KHRhcmdldElkOiBzdHJpbmcsIGtleTogQ2FsbFNlcnZlckFjdGlvbiwgb3B0aW9uczogVCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IFJ9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zID8gSlNPTi5zdHJpbmdpZnkoeyAuLi5vcHRpb25zLCAuLi57IHNlc3Npb25JZDogdGhpcy5fc2Vzc2lvbklkIH0gfSkgOiAnJztcblxuICAgIGxldCByZXN1bHQ6IHtkYXRhPzogeyBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGNvZGU6IEVycm9yQ29kZX07XG4gICAgaWYgKHRoaXMuX25lZWRSZXRyeUFjdGlvbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDx7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9Pih7XG4gICAgICAgIGFzeW5jRm46IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8uYmluZCh0aGlzLl9jb250ZXh0KSxcbiAgICAgICAgZm5BcmdzOiBbdGFyZ2V0SWQsIGtleSwgdmFsdWVdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2NvbnRleHQuc2V0Q2FsbEluZm8odGFyZ2V0SWQsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IHJlc3VsdDtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgeyBrZXk6IHNlcnZlcktleSwgdmFsdWU6IHNlcnZlclZhbCB9ID0gZGF0YSE7XG4gICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2Uoc2VydmVyVmFsKS5kYXRhIGFzIFI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiBwYXJzZWREYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6TmjqXmlLZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxTaWduYWwoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU0lHTkFMX0RBVEFfTywgYGRhdGE6ICR7ZGF0YX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGRhdGFMaXN0ID0gSlNPTi5wYXJzZShkYXRhKS5saXN0IGFzIHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdO1xuICAgIGRhdGFMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBpdGVtO1xuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0lOVklURV9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbChpbmZvIGFzIElQdWJJbnZpdGVDb24sIHRydWUsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uU1RBVFVTX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKGluZm8gYXMgSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkV2ZW50RG93bkNhbGwoaW5mbyBhcyBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uRGlhbG9nRG93bkNhbGwoaW5mbyBhcyBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0NBTExfTE9HOlxuICAgICAgICAgIHRoaXMuX29uUHViQ2FsbExvZyhpbmZvIGFzIElQdWJDYWxsTG9nLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPR19SRUFERUQ6XG4gICAgICAgICAgLy8gcGFzcyDmmoLmnKrnlKjliLBcbiAgICAgICAgICAvLyB0aGlzLl9vblB1YkNhbGxMb2dSZWFkZWQoaW5mbyBhcyBJUHViQ2FsbExvZ1JlYWRlZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfTkFDS19TRVFfSUQ6XG4gICAgICAgICAgLy8gVE9ETyBjYWxsIOW8see9keihpeWBv+aWueahiOa2ieWPiuaWueazle+8jFBDIOacquWBmu+8jOatpOWkhOmYsuatoui1sOWIsCBkZWZhdWx0XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fb25Db25wZW5zYXRpb25EYXRhKGluZm8gYXMgSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBkZXZpY2VJZCDliKTmlq3mlbDmja7mmK/lkKblupTor6XkuIvlj5FcbiAgICogZGV2aWNlSWQg5Li656m65a2X56ym5Liy5oiWIG51bGwg55u05o6l5LiL5Y+RXG4gICAqIGRldmljZUlkIOacieWFt+S9k+eahOWAvO+8jOagueaNriBkZXZpY2VJZCDliKTmlq3mmK/lkKbmmK/lt7Hnq6/nmoQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgX2lzVmFsaWREYXRhKGRldmljZUlkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTnVsbChkZXZpY2VJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoZGV2aWNlSWQpICYmIChkZXZpY2VJZD8ubGVuZ3RoID09PSAwIHx8IGRldmljZUlkID09PSB0aGlzLl9zZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmCgOivt1xuICAgKiBAcGFyYW0gaXNEaXJlY3RseSDmmK/lkKbkuLrnm7Tlj5Hkv6Hku6RcbiAgICovXG4gIHByaXZhdGUgX29uUHViSW52aXRlQ2FsbChkYXRhOiBJUHViSW52aXRlQ29uLCBpc0RpcmVjdGx5ID0gdHJ1ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVSWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVSWQpO1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGN1cnJlbnRVc2VyOiAke0pTT04uc3RyaW5naWZ5KGN1cnJlbnRVc2VyKX0sIGN1cnJlbnRVc2VySWQ6ICR7Y3VycmVudFVJZH0sIHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgbm90IGN1cnJlbnQgZGV2aWNlSWQgLT4gZGV2aWNlSW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRvRGV2aWNlSWQ6IGRhdGEudG9EZXZpY2VJZCxcbiAgICAgICAgY2xpZW50RGV2aWNlSWQ6IHRoaXMuX3Nlc3Npb25JZCxcbiAgICAgIH0pfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gQSDlkowgQiDnvqTpgJror53kuK3vvIxBIOWGjemCgOivtyBD77yMQiDlkowgQicg6YO95Lya5Lya5pS25YiwIHB1Ykludml0ZUNhbGwsIEInIOaUtuWIsOeahCBwdWJJbnZpdGVDYWxsIOeahCB0b0RldmljZUlkIOS4jeS4uuiHquW3se+8jOaXoOmcgOWkhOeQhlxuXG4gICAgICAvLyBob29rcyDlm57osIPlpITnkIZcbiAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfQ1VSUkVOVF9ERVZJQ0VJRCxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfTtcbiAgICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCBpbmZvKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JbnZpdGUoZGF0YSwgaXNEaXJlY3RseSwgdHJhY2VJZCk7XG4gICAgaWYgKGlzRGlyZWN0bHkpIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbCwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbFB1bGxLdiwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeWPmOabtO+8muWTjemTg+OAgeW/meeijOOAgemAmuivneetieW+heOAgeWvueaWueacquaOpeWQrOOAgeW3seaWueacquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TdGF0dXNEb3duQ2FsbChkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOaVsOaNruS4rei/h+a7pOaOieacquWPmOabtOeahCB1c2VyU2Vzc2lvblxuICAgIGRhdGEuY2FsbFNlc3Npb25Vc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IEJvb2xlYW4oaXRlbS5jaGFuZ2VkKSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkRGF0YShkYXRhLnRvRGV2aWNlSWQgfHwgJycpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOS4jeaYr+e7meW9k+WJjeiuvuWkh+S4i+WPkeeahOeKtuaAgeWkhOeQhlxuICAgICAgdGhpcy5fbGlzdGVuZXIub25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyLm9uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkLCB0aGlzLl9zZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneS6i+S7tuWPmOabtO+8muaJk+W8gHzlhbPpl60g5pGE5YOP5aS0XG4gICAqL1xuICBwcml2YXRlIF9vbkV2ZW50RG93bkNhbGwoZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xpc3RlbmVyLm9uRXZlbnREb3duKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneiwg+aVtOS6i+S7tuWPiue7k+aenFxuICAgKiDkuovku7bvvJrlqpLkvZPnsbvlnovliIfmjaJcbiAgICog5Yqo5L2c77ya6K+35rGC44CB5o6l5Y+X44CB5ouS57ud44CB5Y+W5raIXG4gICAqL1xuICBwcml2YXRlIF9vbkRpYWxvZ0Rvd25DYWxsKGRhdGE6IElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBkaWFsb2dUeXBlLCBhY3Rpb24sIGV4dHJhS2V5VmFsIH0gPSBkYXRhO1xuICAgIHN3aXRjaCAoZGlhbG9nVHlwZSkge1xuICAgICAgY2FzZSBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFOlxuICAgICAgICB0aGlzLl9saXN0ZW5lci5vblN3aXRjaE1lZGlhVHlwZShkYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2f5ZCO77yM5pel5b+X5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIF9vblB1YkNhbGxMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NBTExfUkVDT1JEX08sIGBjYWxsIHJlY29yZDogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uUmVjdkNhbGxFbmRMb2coZGF0YSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KGl5YG/5pWw5o2u5aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbkNvbnBlbnNhdGlvbkRhdGEoZGF0YTogSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PLCAnJywgdHJhY2VJZCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCBkdXJhdGlvbiwgY2FsbFN0YXR1cywgY2FsbGluZ1VzZXJJZCwgY2FsbFNlc3Npb25Vc2VycywgdG9EZXZpY2VJZCwgY2FsbERpYWxvZ0VudGl0eXMsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBpc1B1Ykludml0ZUNhbGxEYXRhID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQgJiYgaXRlbS51c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuXG4gICAgaWYgKGlzUHViSW52aXRlQ2FsbERhdGEpIHtcbiAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdG9EZXZpY2VJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgaW52aXRlVXNlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgfSwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bkNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxEaWFsb2dFbnRpdHlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhbGxEaWFsb2dFbnRpdHlzLmZvckVhY2goKGRhdGEpID0+IHRoaXMuX29uRGlhbG9nRG93bkNhbGwoZGF0YSwgdHJhY2VJZCksIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIiwiY29uc3Qgc3RyaW5nMTB0bzY0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlna2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUdLTE1OT1BRUlNUVVZXWFlaKy8nLnNwbGl0KCcnKTtcbiAgY29uc3QgcmFkaXggPSBjaGFycy5sZW5ndGggKyAxO1xuICBsZXQgcXV0aWVudCA9ICtudW1iZXI7XG4gIGNvbnN0IGFyciA9IFtdO1xuICBkbyB7XG4gICAgY29uc3QgbW9kID0gcXV0aWVudCAlIHJhZGl4O1xuICAgIHF1dGllbnQgPSAocXV0aWVudCAtIG1vZCkgLyByYWRpeDtcbiAgICBhcnIudW5zaGlmdChjaGFyc1ttb2RdKTtcbiAgfSB3aGlsZSAocXV0aWVudCk7XG4gIHJldHVybiBhcnIuam9pbignJyk7XG59O1xuXG5jb25zdCBnZXRVVUlEID0gKCkgPT4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcbiAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbn0pO1xuXG4vKiDojrflj5YgMjIg5L2N55qEIFVVSUQgKi9cbmV4cG9ydCBjb25zdCBnZXRVVUlEMjIgPSAoKSA9PiB7XG4gIGxldCB1dWlkOiBzdHJpbmcgfCBudW1iZXIgPSBnZXRVVUlEKCk7XG4gIHV1aWQgPSBgJHt1dWlkLnJlcGxhY2UoLy0vZywgJycpfTBgO1xuICB1dWlkID0gcGFyc2VJbnQodXVpZCwgMTYpO1xuICB1dWlkID0gc3RyaW5nMTB0bzY0KHV1aWQpO1xuICBpZiAodXVpZC5sZW5ndGggPiAyMikge1xuICAgIHV1aWQgPSB1dWlkLnNsaWNlKDAsIDIyKTtcbiAgfVxuICByZXR1cm4gdXVpZDtcbn07XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcblxuY29uc3QgQ0FMTF9EQl9OQU1FID0gJ1JDX0NBTExQTFVTJztcblxuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmludGVyZmFjZSBJT2JqU3RvcmVQYXJhbXMge1xuICAvKipcbiAgICog5Li76ZSuXG4gICAqL1xuICBrZXlQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICog5aaC5p6c5rKh5pyJ5ZCI6YCC55qE5Li76ZSu77yM5Y+v5Lul6K6+572u5Li6IHRydWUg6Ieq5Yqo55Sf5oiQXG4gICAqL1xuICBhdXRvSW5jcmVtZW50PzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSUluZGV4REJPcHRzIHtcbiAgb25TdWNjZXNzOiAoKSA9PiB2b2lkO1xuICBvbkVycm9yPzogKCkgPT4gdm9pZDtcbn1cblxubGV0IGxvZ2dlcjogQmFzaWNMb2dnZXI7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbmRleERCIHtcbiAgLyoqXG4gICAqIGNhbGwgaW5kZXhEQiDlupNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9kYjogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSQ0NhbGxJbmRleERCIOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSQ0NhbGxJbmRleERCIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGluaXQoX2xvZ2dlcjogQmFzaWNMb2dnZXIsIG9wdHM6IElJbmRleERCT3B0cykge1xuICAgIGxvZ2dlciA9IF9sb2dnZXI7XG4gICAgaWYgKCF0aGlzLmlzU3VwcG9ydCgpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW1JDQ2FsbEluZGV4REJdJywgJ0luZGV4REIgaXMgbm90IHN1cHBvcnQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXEgPSB3aW5kb3cuaW5kZXhlZERCLm9wZW4oQ0FMTF9EQl9OQU1FLCBEQl9WRVJTSU9OKTtcblxuICAgIHJlcS5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgb3BlbiBpbmRleERCIHJlcSBmYWlsZWQgLT4gJHtldi50YXJnZXQuZXJyb3J9YCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnN1Y2Nlc3MgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuICAgICAgaWYgKHRoaXMuX2RiKSB7XG4gICAgICAgIHRoaXMuX2RiLm9uY2xvc2UgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyB1bmV4cGVjdGVkbHkgY2xvc2VkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uZXJyb3IgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGVycm9yLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RiLm9uYWJvcnQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgVGhlIGRiICR7dGhpcy5fZGIhLm5hbWV9IGhhcyBvcGVuaW5nIGFib3J0ZWQuICR7ZXZ9YCk7XG4gICAgICAgICAgdGhpcy51bkluaXQoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFJDQ2FsbEluZGV4REIuX2luc3RhbmNlID0gbmV3IFJDQ2FsbEluZGV4REIoKTtcbiAgICAgIG9wdHMub25TdWNjZXNzKCk7XG4gICAgfTtcblxuICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fZGIgPSBldi50YXJnZXQucmVzdWx0O1xuXG4gICAgICBSQ0NhbGxJbmRleERCLmNyZWF0ZU9ialN0b3JlKCdDYWxsQldfQWJub3JtYWxDYWxsJywgeyBrZXlQYXRoOiAndXNlcklkJyB9KTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHVuSW5pdCgpIHtcbiAgICB0aGlzLl9kYiA9IG51bGw7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFJDQ2FsbEluZGV4REIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgaXNTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cgfHwgIXdpbmRvdy5pbmRleGVkREIpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU9ialN0b3JlKG9iak5hbWU6IHN0cmluZywgb3B0czogSU9ialN0b3JlUGFyYW1zKSB7XG4gICAgbGV0IG9ialN0b3JlOiBJREJPYmplY3RTdG9yZTtcbiAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiPy5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG9iak5hbWUpKSB7XG4gICAgICBvYmpTdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiIS5jcmVhdGVPYmplY3RTdG9yZShvYmpOYW1lLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCBgY3JlYXRlT2JqU3RvcmUgJHtvYmpOYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqTmFtZSDooajmmI5cbiAgICogQHBhcmFtIHZhbCDopoHmt7vliqDnmoTmlbDmja5cbiAgICovXG4gIHB1YmxpYyBhZGRWYWx1ZSA8VD4ob2JqTmFtZTogc3RyaW5nLCB2YWw6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuICAgICAgY29uc3QgcmVxID0gc3RvcmUuYWRkKHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCAnYWRkVmFsdWUgZmFpbGVkJyk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7or7vlj5bmlbDmja5cbiAgICogQHBhcmFtIGtleSDkuLvplK5cbiAgICovXG4gIHB1YmxpYyByZWFkQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSkub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZWFkQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7mm7TmlrDmlbDmja5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVCeUtleSA8VD4ob2JqTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUucHV0KHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGB1cGRhdGVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUJ5S2V5KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5kZWxldGUoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYHJlbW92ZUJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBJUnVudGltZSwgSVN0b3JhZ2UgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbmRleERCIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXhEQic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ialN0b3JlIHtbdXNlcklkOiBzdHJpbmddOiBzdHJpbmdbXX1cblxuaW50ZXJmYWNlIElTdG9yZVZhbCB7dXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdfVxuXG4vKipcbiAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWtmOWCqOexu1xuICog5Zyo5ZG85Ye65oiW5ZG85YWl6Zi25q6155qEIGNhbGwg6L+b6KGM5pys5Zyw5a2Y5YKo77yM5q2j5bi457uT5p2f5ZCO5riF6ZmkXG4gKiDlvILluLjnu5PmnZ/lkI7vvIzmnKzlnLDlj5bmnKrmuIXpmaTnmoQgY2FsbElkLCDpgJrov4fmnI3liqHmjqXlj6PmuIXpmaTlvILluLjnu5PmnZ/nmoQgY2FsbCAs6Ziy5q2i5peg5rOV5ZG85Ye65oiW5ZG85YWlXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm5vcm1hbENhbGwge1xuICBwcml2YXRlIF9sb2NhbFN0b3JlITogSVN0b3JhZ2VcblxuICBwcml2YXRlIF9pbmRleERCU3RvcmUhOiBSQ0NhbGxJbmRleERCXG5cbiAgcHJpdmF0ZSBfc3RvcmVLZXk6IHN0cmluZyA9ICdDYWxsQldfQWJub3JtYWxDYWxsJ1xuXG4gIHByaXZhdGUgX2lzU3VwcG9ydEluZGV4REI6IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9pc1N1cHBvcnRJbmRleERCID0gUkNDYWxsSW5kZXhEQi5pc1N1cHBvcnQoKTtcbiAgICBpZiAodGhpcy5faXNTdXBwb3J0SW5kZXhEQikge1xuICAgICAgUkNDYWxsSW5kZXhEQi5pbml0KHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUgPSBSQ0NhbGxJbmRleERCLmdldEluc3RhbmNlKCkhO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvY2FsU3RvcmUgPSBfcnVudGltZS5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg5byC5bi4IGNhbGxJZFxuICAgKi9cbiAgcHVibGljIGFkZEFibm9ybWFsbENhbGxJZCh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2FkZEJ5SW5kZXhEQiA6IHRoaXMuX2FkZEJ5TG9jYWxTdG9yZTtcbiAgICBhZGRGdW5jLmNhbGwodGhpcywgdXNlcklkLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVtb3ZlRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9yZW1vdmVCeUluZGV4REIgOiB0aGlzLl9yZW1vdmVCeUxvY2FsU3RvcmU7XG4gICAgcmVtb3ZlRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkcyk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5byC5bi457uT5p2f55qEIGNhbGxJZCDliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fZ2V0QnlJbmRleERCIDogdGhpcy5fZ2V0QnlMb2NhbFN0b3JlO1xuICAgIHJldHVybiBnZXRGdW5jLmNhbGwodGhpcywgdXNlcklkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyQWJub3JtYWxDYWxsSWRzID0gW2NhbGxJZF07XG4gICAgICB9XG4gICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHMuZmlsdGVyKChpZCkgPT4gIWNhbGxJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9ialN0b3JlW3VzZXJJZF0gPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yZS5zZXRJdGVtKHRoaXMuX3N0b3JlS2V5LCBKU09OLnN0cmluZ2lmeShvYmpTdG9yZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlMb2NhbFN0b3JlKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgY2FsbElkcyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGNvbnN0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgY2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWxsSWRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2FkZEJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IGRhdGEuY2FsbElkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUuYWRkVmFsdWUodGhpcy5fc3RvcmVLZXksIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgY2FsbElkczogW2NhbGxJZF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9hZGRCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlQnlJbmRleERCKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5faW5kZXhEQlN0b3JlLnJlYWRCeUtleTxJU3RvcmVWYWw+KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jYWxsSWRzID0gZGF0YS5jYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmIChkYXRhLmNhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLnJlbW92ZUJ5S2V5KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX3JlbW92ZUJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRCeUluZGV4REIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfZ2V0QnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEuY2FsbElkcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIi8qKlxuICog5LqL5Lu257G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJFdmVudFR5cGUge1xuICAvKipcbiAgICog5o+Q56S656qX5Y+jXG4gICAqL1xuICBQUk9NUFQgPSAwLFxuICAvKipcbiAgICogQ2FsbFNlcnZlciDkuIvlj5HpgJror53ml7bplb/lj5jmm7TnsbvlnotcbiAgICovXG4gIENBTExfRFVSQVRJT04gPSAxMCxcbiAgLyoqXG4gICAqIOaUtuWIsOi/nOerr+esrOS4gOW4p+aXtumXtFxuICAgKi9cbiAgRklSU1RfRlJBTUUgPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbm5lckNvZGUge1xuICBTVUNDRVNTID0gMCxcbiAgLyoqXG4gICAqIOaXoOaViOeahOWTjeW6lOaXtumXtO+8iOaOpeWPo+WTjeW6lOaXtumXtOi/h+mVv++8iVxuICAgKi9cbiAgSU5WQUxJRF9SRVNQT05TRV9USU1FID0gODAxNzAsXG4gIC8qKlxuICAgKiDpnZ7mnIDkvJjlk43lupTml7bpl7RcbiAgICovXG4gIE5PTk9QVElNQUxfUkVTX1RJTUUgPSA4MDE3MSxcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG4vKipcbiAqIOagoeaXtuaooeWdl1xuICovXG5leHBvcnQgY2xhc3MgVGltZUNvcnJlY3Rpb25lciB7XG4gIC8qKlxuICAgKiDmjqXlj6Plk43lupTml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX1JUVDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIvpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1pblJUVDogbnVtYmVyID0gMjAwXG5cbiAgLyoqXG4gICAqIOWPr+eUqOeahOaOpeWPo+WTjeW6lOaXtumXtOS4iumZkO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkTWF4UlRUOiBudW1iZXIgPSAxMDAwXG5cbiAgLyoqXG4gICAqIOS4jiBjYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruaXtumXtO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX2RlbHRhVGltZTogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiB0aW1lcklkXG4gICAqL1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDova7orq3ml7bpl7Tpl7TpmpTvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbDogbnVtYmVyID0gMiAqIDEwMDBcblxuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhSZXRyeVRpbWVzOiBudW1iZXIgPSA4XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2luZ2xlQ2FsbER1cmF0aW9uRXY6IChjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHnq6/ojrflj5bpgJror53ml7bplb/jgIHpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBpZiAoIXRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhcnRUaW1lOiBzZXJ2ZXJTdGFydFRpbWUgfSA9IGRhdGEhO1xuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc2VydmVyU3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gKGN1cnJlbnRUaW1lICsgdGhpcy5fZGVsdGFUaW1lIC0gc2VydmVyU3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBpZiAoZHVyYXRpb24gPCAwKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9QLCBgaW52YWxpZCBkdXJhdGlvbjogJHtkdXJhdGlvbn1gLCB0cmFjZUlkKTtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyDlkJHkuIvlj5bmlbRcbiAgICBkdXJhdGlvbiA9IE1hdGguZmxvb3IoZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUICYmIHRoaXMuX1JUVCA8PSB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgICBzZXJ2ZXJTdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgcHVibGljIGNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpOiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfVCwgYGNhbGxJZDogJHtjYWxsSWR9LCBzdGFydFRpbWU6ICR7c3RhcnRUaW1lfWAsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50U3RhcnRUaW1lID0gTWF0aC5mbG9vcihzdGFydFRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc3RhcnRUOiBzdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDph43nva4gY2FsbCDkuK3ph43or5XmrKHmlbBcbiAgICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPSAwO1xuICAgICAgLy8g5YaN5qyh6YeN5paw6I635Y+WIFJUVCDlubbph43mlrDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRpbWVzID0gMDtcblxuICAvKipcbiAgICog5byA5aeL5a6a5pe26YCS5b2S6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC8XG4gICAqL1xuICBwdWJsaWMgc3RhcnQodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVySWQgfHwgdGhpcy5fc3RhcnRUaW1lcyA+PSB0aGlzLl9tYXhSZXRyeVRpbWVzKSB7XG4gICAgICAvLyDpmLLmraLph43lpI3lkK/liqhcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUQVJUX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCk7XG5cbiAgICB0aGlzLl9zdGFydFRpbWVzKys7XG5cbiAgICAvLyDojrflj5ZcbiAgICB0aGlzLl9nZXREZWx0YVRpbWUodHJhY2VJZCk7XG5cbiAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydCh0cmFjZUlkKTtcbiAgICB9LCB0aGlzLl9pbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgc3RvcCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUT1BfTywgYHRpbWVySWQ6ICR7dGhpcy5fdGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICB0aGlzLl90aW1lcklkICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcbiAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAvLyDph43nva7mrKHmlbBcbiAgICB0aGlzLl9zdGFydFRpbWVzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDlrprml7bova7orq1cbiAgICovXG4gIHB1YmxpYyByZXN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfUkVTVEFSVF9PLCBgbGVnYWwgcnR0IHRpbWUsIFJUVDogJHt0aGlzLl9SVFR9LCB2YWxpZE1pblJUVDogJHt0aGlzLl92YWxpZE1pblJUVH1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5riF6Zmk5b2T5YmN5q2j5Zyo6L+b6KGM55qEXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIC8vIOmHjeaWsOWQr+WKqFxuICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxEZWxheVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsdGFUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldFJUVCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9SVFQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC877yM6Z2e6YCa6K+d5Lit55qE6K6h566XXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWUodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZGVsYXlUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiBzeW5jVGltZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmICgoY3VycmVudFJUVCA8IHRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPT09IDApICYmIGN1cnJlbnRSVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX1JUVCA9IGN1cnJlbnRSVFQ7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOWwj+S6juacgOWwj+WPr+eUqCBydHTvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoc3luY1RpbWUhIC0gc3RhcnRUaW1lKSAtIHRoaXMuX1JUVCAvIDI7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NFVF9ERUxUQV9USU1FX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgZGVsYXlUaW1lOiB0aGlzLl9kZWx0YVRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3ojrflj5blvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fUlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbHRhVGltZSA9IChkYXRhIS5zeW5jVGltZSAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQsXG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3IoZGF0YSEuc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjbGllbnRGaXJzdEZyYW1lVGltZSA9IE1hdGguZmxvb3IoZGF0YSEuZmlyc3RGcmFtZXRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOacgOS8mOe7k+aenO+8jOWBnOatoui9ruiureiuoeeul1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gICAgfVxuICAgIC8vIOmdnuacgOS8mOe7k+aenFxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9yZXRyeVRpbWVzSW5DYWxsOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gM1xuXG4gIC8qKlxuICAgKiDlpJrmrKHmoKHmraPmipvnu5nkuJrliqHlsYLnmoTpgJror53lvIDlp4vml7bpl7TjgIHpppbluKfml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5YWI5YGc5q2i5pyq57uT5p2f55qE6K6h566XXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lSW5DYWxsKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g57uT5p6c5pyA5LyY77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCAmJiBjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDpnZ7mnIDkvJjnu5PmnpzvvIzmipvnu5nlupTnlKjlsYLlvIDlp4vml7bpl7TvvIzmoLnmja7ph43or5XmrKHmlbDov5vooYzph43or5U7IOmHjeivlSAzIOasoeWQjuWGjeaKm+WHuuS4u+imgeaYr+S4uuS6huiOt+WPluacgOWwjyBSVFRcbiAgICAgIHRoaXMuX3NpbmdsZUNhbGxEdXJhdGlvbkV2KGNhbGxJZCwgY2xpZW50U3RhcnRUaW1lISwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPiB0aGlzLl9tYXhSZXRyeVRpbWVzSW5DYWxsKSB7XG4gICAgICAvLyDml6DmnIDkvJjnu5PmnpzvvIzlupTnlKjlsYLmoLnmja7oh6rlt7HnmoTml7bpl7TotbDooagsIOebuOW9k+S6jiBSVFQg5oyJIDAg5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmV0cnlUaW1lc0luQ2FsbCsrO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBGb3J3YXJkVHlwZSB7XG4gIC8qKlxuICAgKiDpgJrov4fkuIvkuIDmrKHkurrlkZjnirbmgIEgdXNlclN0YXRlIOeahOS4i+WPkeWQjOatpeW4puS4i+WOu1xuICAgKi9cbiAgU09PTl9BRkVURVIgPSAwLFxuICAvKipcbiAgICog56uL5Y2z6L2s5Y+RXG4gICAqL1xuICBDVVJSRU5UID0gMSxcbn1cbiIsImltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2Uge1xuICBQVUJfSU5WSVRFX0NBTEwgPSAwLFxuICBQVUxMX0tWX0lOVklURV9DQUxMID0gMSxcbiAgU1lTVEVNX1BVU0ggPSAyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0aXN0aWNzRGF0YSB7XG4gIC8qKlxuICAgKiDkuIrmiqXml7bpl7RcbiAgICovXG4gIHRpbWU6IG51bWJlcixcbiAgLyoqXG4gICAqIOi/kOiQpeWVhu+8jOS+i+WmgiDkuK3lm73ogZTpgJpcbiAgICovXG4gIGNyOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDnvZHnu5znsbvlnovvvIzkvovlpoIgNEdcbiAgICovXG4gIG5ldDogc3RyaW5nLFxuICAvKipcbiAgICogdXNlcklkXG4gICAqL1xuICB1aWQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIOmUmeivr+eggVxuICAgKi9cbiAgY29kOiBudW1iZXIsXG4gIC8qKlxuICAgKiDosIPnlKjmiafooYzml7bplb9cbiAgICovXG4gIGR1cjogbnVtYmVyXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnotcbiAgICovXG4gIG10cDogUkNDYWxsUGx1c01lZGlhVHlwZVxuICAvKipcbiAgICog6YCa6K+d57G75Z6L77yM56eB6IGK5oiW576k6IGKXG4gICAqL1xuICBjdHA6IFJDQ2FsbFBsdXNUeXBlXG4gIC8qKlxuICAgKiBjYWxsSWRcbiAgICovXG4gIGNpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBjY2lkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDpgoDor7fmjqXmlLbmnaXmupBcbiAgICovXG4gIHJmOiBSQ0NhbGxQbHVzSW52aXRlU291cmNlXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxEaXJlY3Rpb24ge1xuICAvKipcbiAgICog5ZG85Ye6XG4gICAqL1xuICBPVVQgPSAtMSxcbiAgLyoqXG4gICAqIOe+pOWRvFxuICAgKi9cbiAgR1JPVVAgPSAwLFxuICAvKipcbiAgICog5ZG85YWlXG4gICAqL1xuICBJTiA9IDFcbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIsIElSdW50aW1lLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IERpYWxvZ0FjdGlvbiB9IGZyb20gJy4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IERpYWxvZ1R5cGUgfSBmcm9tICcuL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2FsbFN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgU2VjcmV0Q2FsbFR5cGUgfSBmcm9tICcuL2VudW1zL1NlY3JldENhbGxUeXBlJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdEluZm8sXG4gIElBY2NlcHRPcHRzLFxuICBJQ2FsbElkLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElHZXRDYWxsTG9nTGlzdE9wdHMsXG4gIElHZXRDYWxsU2Vzc2lvblJlcyxcbiAgSUhhbmd1cEluZm8sXG4gIElJbnZpdGVPcHRzLFxuICBJSW52aXRlUmVzLFxuICBJSm9pbkNhbGxPcHRzLFxuICBJT3RoZXJNZW1JbmZvLFxuICBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZVJlcyxcbiAgSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElTZXNzaW9uVXNlcixcbiAgSVN0YXJ0Q2FsbE9wdHMsXG4gIElTdGFydENhbGxSZXN1bHQsXG4gIElIYW5ndXBGb3JCdXN5T3B0cyxcbiAgSUNoYW5nZU1lZGlhVHlwZUluZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7XG4gIElDYWxsU2Vzc2lvblVzZXIsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXREZWxheVRpbWVJbmZvUmVzLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVNpZ25hbFRyYW5zcG9ydGVyJztcbmltcG9ydCB7IENhbGxUaW1lckV2ZW50VHlwZSwgUkNDYWxsSW5uZXJTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBTaWduYWxUcmFuc3BvcnRlciB9IGZyb20gJy4vbW9kdWxlcy9TaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBwYXJzZVN0YXR1c0RhdGEsIHRyYW4yQ2FsbExvZyB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsRGlyZWN0aW9uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxEaXJlY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZSc7XG5cbmNvbnN0IENBTExfVElNRV9PVVQgPSA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxFbmdpbmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1zZXNzaW9uLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jb25uZWN0J1xuXG4gIHN0YXRpYyBfX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX186IHN0cmluZyA9ICdpbm5lci1jaGFuZ2UtbWVkaWEtdHlwZSdcblxuICBzdGF0aWMgX19JTk5FUl9JTlZJVEVfXzogc3RyaW5nID0gJ2lubmVyLWludml0ZSdcblxuICAvKipcbiAgICog5Li7IHNlc3Npb25cbiAgICovXG4gIF9tYWluU2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Zyo6YCa6K+d5Lit5pS25Yiw55qEIOmCgOivtyBzZXNzaW9uXG4gICAqL1xuICBfaG9sZFNlc3Npb25zOiBSQ0NhbGxJbm5lclNlc3Npb25bXSA9IFtdXG5cbiAgLyoqXG4gICAqIOS/oeS7pOaooeWdl1xuICAgKi9cbiAgX3NpZ25hbE1vZHVsZTogU2lnbmFsVHJhbnNwb3J0ZXJcblxuICAvKipcbiAgICog5byC5bi457uT5p2fIGNhbGwg5aSE55CG5ZmoXG4gICAqL1xuICBfYWJub3JtYWxNb2R1bGU6IEFibm9ybWFsQ2FsbFxuXG4gIC8qKlxuICAgKiDorrDlvZXljZXlkbzkuK3vvIzmmK/lkKbkuIrmiqXov4fnrKzkuIDluKdcbiAgICog572uIHRydWUg5pe25py677ya5pS25Yiw6L+c56uv56ys5LiA5bin77yM5oiQ5Yqf5LiK5oqlIFNlcnZlclxuICAgKiDnva4gZmFsc2Ug5pe25py677ya6YCa6K+d57uT5p2fXG4gICAqL1xuICBwcml2YXRlIF9pc1VwRmlyc3RGcmFtZVRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpgJror53kuLogT05DQUxMIOaXtu+8jFNESyDpnIDnu5nkuJrliqHlsYLkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICog5Lya5pS25Yiw5aSa5qyhIE9OQ0FMTO+8jOaJgOS7pemcgOimgeagh+ivhuaYr+WQpuW3suaKm+i/h+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFN0YXJ0TWFwOiB7XG4gICAgW2NhbGxJZDogc3RyaW5nXToge1xuICAgICAgaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZTogYm9vbGVhbixcbiAgICB9XG4gIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDmoKHml7blmahcbiAgICovXG4gIF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSVJDQ2FsbEluaXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lciA9IG5ldyBUaW1lQ29ycmVjdGlvbmVyKHRoaXMsIF9sb2dnZXIsIHRoaXMuX29uUmVjdlNpbkNhbGxEdXJhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUgPSBuZXcgU2lnbmFsVHJhbnNwb3J0ZXIoX2NvbnRleHQsIF9ydW50aW1lLCBfaW5pdE9wdHMsIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIsIHRoaXMuX2xvZ2dlcik7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBvblN0YXR1c0Rvd246IHRoaXMuX29uU3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25PdGhlckNsaWVudFN0YXR1c0Rvd246IHRoaXMuX29uT3RoZXJDbGllbnRTdGF0dXNEb3duLmJpbmQodGhpcyksXG4gICAgICBvbkV2ZW50RG93bjogdGhpcy5fb25FdmVudERvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uU3dpdGNoTWVkaWFUeXBlOiB0aGlzLl9vblN3aXRjaE1lZGlhVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgb25SZWN2Q2FsbEVuZExvZzogdGhpcy5fb25SZWN2Q2FsbEVuZExvZy5iaW5kKHRoaXMpLFxuICAgICAgb25JTVN0YXRlQ2hhbmdlOiB0aGlzLl9vbklNU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZSA9IG5ldyBBYm5vcm1hbENhbGwoX3J1bnRpbWUsIF9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChvcHRzOiBJU3RhcnRDYWxsT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc3VsdH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsVHlwZSwgbWVkaWFUeXBlLCB0b1VzZXJzLCB0YXJnZXRJZCwgdGFyZ2V0VHlwZSwgb2xkUm9vbUlkLFxuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXJ0Q2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0b1VzZXJzLFxuICAgICAgc2VjcmV0Q2hhdDogU2VjcmV0Q2FsbFR5cGUuTk9STUFMLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgb2xkUm9vbUlkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNhbGxJZCwgYnVzeWxpbmVVc2VycyB9ID0gZGF0YSE7XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLklOVklURUQsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGN1cnJlbnRVc2VySWQsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcblxuICAgIC8vIOWNleWRvOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqCwg576k5ZG85peg6LaF5pe26YC76L6RXG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIGNvbnN0IGludml0ZXJUaW1lcklkID0gdGhpcy5fc3RhcnRUaW1lcihkYXRhIS5jYWxsSWQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUiwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSLCBpbnZpdGVyVGltZXJJZCk7XG4gICAgfVxuXG4gICAgLy8g6YCa55+l5bex5pa55Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgY29uc3Qgc2VsZlN0YXRlID0ge1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uQ0FMTElORyxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBpbnZpdGVlc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgdXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELFxuICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9KSk7XG5cbiAgICBsZXQgYnVzeVVzZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgaWYgKGJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgIGJ1c3lVc2Vyc1N0YXRlID0gYnVzeWxpbmVVc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZXNTdGF0ZS5maW5kKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCA9PT0gaXRlbS51c2VySWQpITtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogaXRlbS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICAvLyDooqvpgoDor7fogIXkuK3pnIDov4fmu6Tlh7rlv5nnooznlKjmiLdcbiAgICAgIGludml0ZWVzU3RhdGUgPSBpbnZpdGVlc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFtzZWxmU3RhdGUsIC4uLmludml0ZWVzU3RhdGUsIC4uLmJ1c3lVc2Vyc1N0YXRlIV0sIHRyYWNlSWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUob3B0czogSUludml0ZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOmCgOivt1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b1VzZXJzIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuaW52aXRlQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICB0b1VzZXJzLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIC8vIOWNleWRvOS4remCgOivt+aIkOWKn++8jOWNs+abtOaWsCBjYWxsIHNlc3Npb24g6YCa6K+d57G75Z6L5Li6576k5ZG8XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGxUeXBlIOWPmOabtOS4uue+pOWRvFxuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOmAmuefpeiiq+mCgOivt+S6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgbGV0IGludml0ZWRVc2Vyc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBsZXQgYnVzeWxpbmVVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgaWYgKGRhdGEhLmJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgICAgYnVzeWxpbmVVc2Vyc1N0YXRlID0gZGF0YSEuYnVzeWxpbmVVc2Vycz8ubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZFVzZXJzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGludml0ZWRVc2Vyc1N0YXRlID0gaW52aXRlZFVzZXJzU3RhdGUuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiBidXN5bGluZVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgWy4uLmludml0ZWRVc2Vyc1N0YXRlLCAuLi5idXN5bGluZVVzZXJzU3RhdGVdLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZUhhbmd1cFxuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsVGltZXIoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgICAgc2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICog6YCa6K+d6K+35rGC5Y+W5raI44CB6YCa6K+d5ouS57udXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuaGFuZ3VwQ2FsbCh7XG4gICAgICBjYWxsSWQ6IG9wdHMuY2FsbElkLFxuICAgICAgc3lzU3RhdHVzOiBvcHRzLnN5c3RlbVN0YXRlLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeaUtumCgOivt1xuICAgKiDpgJror53kuK3lj4jmlLbliLDmlrDmnaXnlLXlkI7vvIzmjqXlkKzmlrDmnaXnlLXml7bvvIzlv4XpobvlhYjmjILmlq3kuYvliY3nmoTpgJror53vvIhtYWluU2Vzc2lvbu+8iVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChvcHRzOiBJQWNjZXB0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqCBzZXNzaW9uIOS4jeWFgeiuuOaOpeWQrFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmFjY2VwdENhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG9wdHM6IElKb2luQ2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlhYjmlLbliLAgb25JbnZpdGXvvIzmsqHmnInmjqXpgJrov4cgam9pbkNhbGwg5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5qb2luQ2FsbCh7IGNhbGxJZDogb3B0cy5jYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBvcHRzLmNhbGxJZCk7XG5cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDlpoLmnpzkuI3lrZjlnKggbWFpblNlc3Npb24g5LuOIHNlcnZlciDojrflj5blvZPliY3liqDlhaXnmoQgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cnVlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T5Y+Y5pu06K+35rGCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdENoYW5nZU1lZGlhVHlwZShvcHRzOiBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJlcUNoYW5nZU1lZGlhVHlwZVJlc30+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYUtleVZhbCA9IHtcbiAgICAgIG1lZGlhVHlwZTogb3B0cy5tZWRpYVR5cGUsXG4gICAgfTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVSZXFNZWRpYVR5cGUob3B0cy5tZWRpYVR5cGUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICB0b1VzZXJJZHM6IG9wdHMudG9Vc2VySWRzLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLlJFUVVFU1QsXG4gICAgICBleHRyYUtleVZhbCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGRhdGE6IHsgdHJhbnNhY3Rpb25JZCB9IH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGC5ZON5bqUXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFNZWRpYVR5cGUgPSB0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKTtcbiAgICBpZiAob3B0cy5hZ3JlZSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlTWVkaWFUeXBlKHJlcU1lZGlhVHlwZSEpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogb3B0cy5hZ3JlZSA/IERpYWxvZ0FjdGlvbi5BQ0NFUFQgOiBEaWFsb2dBY3Rpb24uUkVGVVNFLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOmAmuivneWqkuS9k+exu+Wei+WIh+aNouivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbmNlbENoYW5nZU1lZGlhVHlwZShvcHRzOiBJQ2FuY2VsQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IG9wdHMudHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBEaWFsb2dBY3Rpb24uQ0FOQ0VMLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIGxvZyDliJfooahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsTG9nTGlzdChvcHRzOiBJR2V0Q2FsbExvZ0xpc3RPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXN9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuc3luY0NhbGxMb2coe1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgc3luY1RpbWU6IG9wdHMudGltZXN0YW1wLFxuICAgICAgY291bnQ6IG9wdHMuY291bnQsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgY2FsbExvZzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gPSBkYXRhIS5jYWxsTG9nTGlzdC5tYXAoKGl0ZW0pID0+IHRyYW4yQ2FsbExvZyhpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaGFzTW9yZTogQm9vbGVhbihkYXRhPy5oYXNNb3JlKSxcbiAgICAgICAgbWF4VGltZTogZGF0YSEubWF4VGltZSxcbiAgICAgICAgbGlzdDogY2FsbExvZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53ml6Xlv5dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsTG9nKGNhbGxJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kZWxldGVDYWxsUmVjb3JkKGN1cnJlbnRVc2VySWQsIGNhbGxJZHMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIHNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGE6IGRhdGEhLnN5bmNUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pyq57uT5p2f55qE6YCa6K+d5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3BlbkNhbGxMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IHJlc0RhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRVc2VyQ2FsbFN0YXRlTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QgPSByZXNEYXRhIS5jYWxsU3RhdGVMaXN0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjYWxsSWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxpbmdVc2VySWQsIGNhbGxVc2VySWRzLCBjYWxsU3RhdHVzLCBjcnRUaW1lLCB1c2VyU2Vzc2lvblN0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXJ0VGltZSwgc3luY1RpbWUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGNhbGxEaXJlY3Rpb24gPSAoY2FsbGluZ1VzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkgPyBSQ0NhbGxEaXJlY3Rpb24uT1VUIDogUkNDYWxsRGlyZWN0aW9uLklOO1xuICAgICAgY29uc3QgeyBjbGllbnRTdGFydFRpbWUgPSBzdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBjYWxsRGlyZWN0aW9uLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFVzZXJJZHMsXG4gICAgICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICAgICAgdXNlclN0YXRlOiB1c2VyU2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZXN0YW1wOiAwLFxuICAgICAgICBkdXJhdGlvbjogTWF0aC5mbG9vcigoK25ldyBEYXRlKCkgLSBjbGllbnRTdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogMCxcbiAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgZGF0YTogbGlzdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+eahCBjYWxsIGxvZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZUFsbENhbGxMb2codHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5jbGVhckNhbGxSZWNvcmQodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBjYWxsSWQg6I635Y+WIHNlc3Npb24g6K+m57uG5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uUmVzfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXNzaW9uKG9wdHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsaW5nVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU3RhdHVzLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzeW5jVGltZSxcbiAgICB9ID0gZGF0YSE7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJzID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzdGFydENhbGxlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgc3luY1RpbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0SG9sZFNlc3Npb24oY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgcmV0dXJuIGlubmVyU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihpbm5lclNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeS4uyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxNYWluU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYWluU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbih0aGlzLl9tYWluU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Li7IHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTWFpblNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiusOW9leaYr+WQpuaYr+acrOerr+aMguaWrVxuICAgKi9cbiAgcHVibGljIHNldElzTG9jYWxDbGllbnRIYW5ndXAoaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbikge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXApO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeS6uuWRmOeKtuaAgVxuICAgKiBDYWxsQ2xpZW50IOS5n+mcgOimgeabtOaWsOS6uuWRmOeKtuaAge+8jOWumuS5ieS4uuWFrOWFseWHveaVsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQREFURV9VU0VSU19TVEFURV9PLCBgdXBkYXRlVXNlcnNTdGF0ZSAtPiB1c2VyczogJHtKU09OLnN0cmluZ2lmeSh1c2Vycyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyDmm7TmlrAgc2Vzc2lvbiDkurrlkZjliJfooahcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuXG4gICAgY29uc3QgY2hhbmdlZFVzZXJzID0gW107XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGNvbnN0IG5ld1VzZXJzID0gdXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFVzZXJTdGF0ZSA9IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBpc0lkbGUgPSBpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcbiAgICAgICAgY29uc3QgeyBjYW1lcmFFbmFibGUgPSBmYWxzZSwgbWljcm9waG9uZUVuYWJsZSA9IGZhbHNlIH0gPSBpc0lkbGUgPyB7IGNhbWVyYUVuYWJsZTogZmFsc2UsIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlIH0gOiBvbGRVc2VyU3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi5zZXNzaW9uLnVwZGF0ZVVzZXJMaXN0KG5ld1VzZXJzLCB0cmFjZUlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gICAgLy8g6YCa55+l5LqL5Lu2XG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU3RhcmluZ1RpbWUob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldENhbGxDbGllbnRUaW1lQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS6uuWRmOezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5c3RlbVN0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5zeXNTdGF0dXNVcChvcHRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzkuK3mlLbliLDov5znq6/mtYHlkI7vvIznu5kgQ2FsbFNlcnZlciDkuIrmiqXvvIznlKjkuo7lpITnkIborqHml7bpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBub05lZWRVcENvbmRpdGlvbiA9ICF0aGlzLl9tYWluU2Vzc2lvblxuICAgICAgfHwgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgIT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSlcbiAgICAgIHx8IHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZTtcbiAgICBpZiAobm9OZWVkVXBDb25kaXRpb24pIHtcbiAgICAgIC8vIOS4jeWtmCBtYWluU2Vzc2lvbiDmiJYg6YCa6L+H57G75Z6L5LiN5Li65Y2V5ZG85pe277yM5LiN5LiK5oql77yM55u05o6l6L+U5Zue5oiQ5YqfXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpO1xuICAgIGNvbnN0IHN0cmVhbVJlYWR5VGltZSA9IE1hdGguZmxvb3Iobm93ICsgZGVsYXlUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9ULCBgbm93OiAke25vd307IGRlbGF5OiAke2RlbGF5VGltZX07IHN0cmVhbVJlYWR5VGltZTogJHtzdHJlYW1SZWFkeVRpbWV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSB0cnVlO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmV2ZW50VXBDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV2ZW50VHlwZTogQ2FsbFNlcnZlckV2ZW50VHlwZS5GSVJTVF9GUkFNRSxcbiAgICAgIGV2ZW50QXJnczogeyBzdHJlYW1SZWFkeVRpbWUgfSxcbiAgICAgIGV2ZW50VGltZTogRGF0ZS5ub3coKSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGC5qih5oufIHN0YXR1c0Rvd25DYWxsLCDnu5PmnZ8gc2Vzc2lvblxuICAgKiDpgJror53lu7rnq4vlkI7vvIzlj6rog73nu5PmnZ8gbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBlbmRDdXJyZW50U2Vzc2lvbihjdXJyZW50VXNlclN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25Vc2VyczogSUNhbGxTZXNzaW9uVXNlcltdID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIHN5c3RlbVN0YXRlID0gY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRCxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0U3RhcnRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YTogSVN0YXR1c0Rvd25Db250ID0ge1xuICAgICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgICB0b0RldmljZUlkOiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICB9O1xuICAgICAgdGhpcy5fb25TdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuIrlsYIgUlRDIOWKoOWFpeaIv+mXtOWQjumHjeaWsOW8gOWni+agoeaXtlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZUNvcnJlY3Rpb24odHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5yZXN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldERlbGF5VGltZUluZm8oKTogSUdldERlbGF5VGltZUluZm9SZXMge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheVRpbWU6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgIHJ0dDogdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRSVFQoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGhvbGRTZXNzaW9uIOWNh+e6p+S4uiBtYWluU2Vzc2lvblxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVNYWluU2Vzc2lvbihob2xkQ2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGhvbGRDYWxsSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uID0gdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk/LlswXTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogSU0g54q25oCB5Y+Y5pu05aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbklNU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIGxldCB0aW1lcklkOiBudW1iZXIgPSAwO1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgICAvLyDmlq3nvZHnrYnlvoUgNjBzIOWQjuinpuWPkSBvblNlc3Npb25DbG9zZVxuICAgICAgICB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08sICdlbmRDdXJyZW50U2Vzc2lvbiwgSU0gZGlzY29ubmVjdGVkIGZvciBtb3JlIHRoYW4gNjBzJywgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkhLCB0cmFjZUlkKTtcbiAgICAgICAgfSwgQ0FMTF9USU1FX09VVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWPkei1t+mCgOivt+OAgeaUtuWIsOmCgOivt+WQjuiuoeaXtui2heaXtlxuICAgKiDmj5DliY3mqKHmi58gX29uU3RhdHVzRG93biwg5LiN5YaN5L6d6LWWIENhbGxTZXJ2ZXIg5LiL5Y+R55qEIF9vblN0YXR1c0Rvd25cbiAgICog5aSE55CG572R57uc5byC5bi45oOF5Ya15LiL5LiK5oqlIENhbGxTZXJ2ZXIg5aSx6LSl77yMQ2FsbFNlcnZlciDkuI3kvJrkuIvlj5EgX29uU3RhdHVzRG93biDmg4XlhrVcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBjYWxsIHRpbWVvdXQgY2FsbElkOiAke2NhbGxJZH0sIHVzZXJTdGF0ZTogJHt1c2VyU3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBoYW5kbGVDYWxsVGltZW91dCB3aXRob3V0IHNlc3Npb24sIGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICB0aGlzLl9vblN0YXR1c0Rvd24oe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdGVUaW1lLFxuICAgICAgICB9ID0gdXNlcjtcblxuICAgICAgICBsZXQgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uO1xuICAgICAgICBsZXQgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGU7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEIDogUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVI7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRDtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RpbWU6IHN0YXRlVGltZSA/IHN0YXRlVGltZSArIDEgOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiBzZXNzaW9uLmdldENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/otoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZXIoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8g5ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgY29uc3QgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQsIHVzZXJTdGF0ZSwgdHJhY2VJZCk7XG4gICAgICAvLyDkuIrmiqUgY2FsbCBzZXJ2ZXIg6LaF5pe2XG4gICAgICB0aGlzLl9zaWduYWxNb2R1bGUuc3RhdHVzVXBDYWxsKHsgY2FsbElkLCBzZXNzaW9uU3RhdHVzOiB1c2VyU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfSwgQ0FMTF9USU1FX09VVCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PLCBgY2FsbElkOiAke2NhbGxJZH0sIHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0b3BUaW1lcih0aW1lcklkOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RPUF9DQUxMX1RJTUVSX08sIGB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOmAmuivnemCgOivt1xuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBpbnZpdGVVc2VySWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHNlY3JldENoYXQsIGNhbGxpbmdVc2VySWQsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBpZiAoc2VjcmV0Q2hhdCA9PT0gU2VjcmV0Q2FsbFR5cGUuU0VDUkVUKSB7XG4gICAgICAvLyDlpoLmnpzmmK/lr4bogYrpgJror53kuI3lpITnkIZcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uU0VDUkVUX0NBTEwsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzoh6rlt7HmmK/ooqvpgoDor7fnmoTnlKjmiLdcbiAgICBjb25zdCBpc0ludml0ZWUgPSBjYWxsU2Vzc2lvblVzZXJzLnNvbWUoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoaXNJbnZpdGVlKSB7XG4gICAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIGNhbGxJZCk7XG5cbiAgICAgIC8vIOeUn+aIkCBjYWxsU2Vzc2lvblxuICAgICAgY29uc3QgaW5uZXJTZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLlJJTkdJTkcsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgICBbXSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgKTtcbiAgICAgIC8vIGNhbGwgc2VydmVyIOWTjemTg+S4iuaKpVxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJpbmdpbmdDYWxsKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIOWQr+WKqOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICovXG4gICAgICBjb25zdCBpbnZpdGVlVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsIHRyYWNlSWQpO1xuICAgICAgaW5uZXJTZXNzaW9uLnVwZGF0ZVRpbWVySWQoQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURUUsIGludml0ZWVUaW1lcklkKTtcblxuICAgICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IGlubmVyU2Vzc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOeUn+aIkOWJryBzZXNzaW9uc1xuICAgICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMucHVzaChpbm5lclNlc3Npb24pO1xuICAgICAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIHkuLogSE9MRFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlUKTtcbiAgICAgIH1cblxuICAgICAgLy8g5oqb5Ye65bex5pa56KKr6YKA6K+3XG4gICAgICBjb25zdCBjYWxsUGx1c1Nlc3Npb24gPSBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGwoY2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkKTtcblxuICAgICAgY29uc3QgaW52aXRlU291cmNlID0gaXNEaXJlY3RseSA/IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVCX0lOVklURV9DQUxMIDogUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUxMX0tWX0lOVklURV9DQUxMO1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCBjYWxsUGx1c1Nlc3Npb24sIGludml0ZVNvdXJjZSk7XG5cbiAgICAgIGNvbnN0IG90aGVyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKCh7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdHVzVGltZSxcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIOaKm+WHuuS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgb3RoZXJzU3RhdGUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLk5PVF9JTlZJVEVFLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8g6L+H5ruk5Ye65YW25LuW55So5oi35ZKM6Ieq5bexXG4gICAgY29uc3Qgb3RoZXJJbnZpdGVkTWVtYmVyID0gY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXNlcklkICE9PSBjdXJyZW50VXNlcklkICYmIGl0ZW0udXNlcklkICE9PSBpbnZpdGVVc2VySWQgJiYgaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEKTtcbiAgICAvLyDmipvlh7rnvqTogYrkuK3ooqvpgoDor7fnmoTlhbbku5bkurpcbiAgICBpZiAob3RoZXJJbnZpdGVkTWVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDnsbvlnovlj5jmm7RcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW52aXRlZE1lbWJlcjogSU90aGVyTWVtSW5mb1tdID0gW107XG4gICAgICBjb25zdCB1c2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgb3RoZXJJbnZpdGVkTWVtYmVyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICAgICAgaW52aXRlZE1lbWJlci5wdXNoKHsgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyB9KTtcbiAgICAgICAgdXNlcnNTdGF0ZS5wdXNoKHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUoaW52aXRlZE1lbWJlcik7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaMguaWre+8iOWvueaWuemAmuivneWPlua2iOOAgemAmuivneaLkue7ne+8iVxuICAgKi9cbiAgcHJpdmF0ZSBfb25IYW5ndXAoZGF0YTogSUhhbmd1cEluZm9bXSwgY2FsbFNlc3Npb25hU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpKSB7XG4gICAgICAgICAgaWYgKGl0ZW0udXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g5ouS5o6l44CB5b+Z56KM44CB5pyq5o6l5ZCsIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVyVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9vbkFjY2VwdChkYXRhOiBJQWNjZXB0SW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0U2Vzc2lvblN0YXRlKCk7XG4gICAgY29uc3QgdW5OZWVkVXBTdGF0ZSA9IFtcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlULFxuICAgIF07XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEVcbiAgICAgICYmIHNlc3Npb25TdGF0ZSAmJiB1bk5lZWRVcFN0YXRlLmluY2x1ZGVzKHNlc3Npb25TdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydENhbGxlcklkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8qKlxuICAgICAqIOWNleWRvOaUtuWIsOWvueaWueaOpeWQrOaXtu+8jOmcgOWujOaIkOWPkeW4g+i1hOa6kOS4gOezu+WIl+WKqOS9nFxuICAgICAqL1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHN0YXJ0Q2FsbGVySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIGNvbnN0IGFjY2VwdFVzZXJJbmZvID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZnJvbVVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCk7XG4gICAgICBhY2NlcHRVc2VySW5mbyAmJiB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX18sIHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpIS5nZXRDYWxsSWQoKSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOabtOaWsOS4uyBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw54q25oCB5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9vblN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDpgJror53nirbmgIHkuLrov57mjqXnirbmgIHml7bvvIzkv53lrZjmnI3liqHkuIvlj5HnmoTpgJror53lvIDlp4vml7bpl7RcbiAgICAgKi9cbiAgICBjb25zdCB7XG4gICAgICBjYWxsU3RhdHVzLCBzdGFydFRpbWUsIHN5bmNUaW1lLCBjYWxsSWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGNhbGxJZCAhPT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gPSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXSB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqIOadoeS7tu+8mumAmuivneeKtuaAgeS4uiBPTkNBTEwg5LiU5pyq5LiK5oql6L+H6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5pc1JlY2VpdmVDYWxsU3RhcnRUaW1lXG4gICAgICAmJiBjYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZSA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgc3RhcnRUaW1lISwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lISxcbiAgICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6K6h566X5piv5ZCm6YCa6K+d57uT5p2fXG4gICAgbGV0IHNlbGZFbmQgPSBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOS4iuaKpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGlzTGVmdCA9IFtcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRSxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuREVDTElORUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSLFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQsXG4gICAgICBdLmluY2x1ZGVzKGl0ZW0uc2Vzc2lvblN0YXR1cyk7XG4gICAgICBpZiAoaXNMZWZ0ICYmIGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHNlbGZFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IGl0ZW0uc3lzU3RhdHVzLFxuICAgICAgICBzdGF0ZVRpbWU6IGl0ZW0uc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOayoeaciSBzZXNzaW9uIOS4jeWkhOeQhuS8muivneeKtuaAgeWPmOabtFxuICAgICAqL1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24gJiYgIXRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDorqHnrpflh7rlk43lupTliqjkvZzvvIzlubbmipvlh7rkv6Hmga9cbiAgICBjb25zdCB7XG4gICAgICBoYW5ndXBEYXRhLCBhY2NlcHREYXRhLCBvdGhlckludml0ZWREYXRhLFxuICAgIH0gPSBwYXJzZVN0YXR1c0RhdGEoZGF0YSk7XG5cbiAgICBoYW5ndXBEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25IYW5ndXAoaGFuZ3VwRGF0YSwgZGF0YS5jYWxsU3RhdHVzLCB0cmFjZUlkKTtcbiAgICBhY2NlcHREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25BY2NlcHQoYWNjZXB0RGF0YSwgdHJhY2VJZCk7XG5cbiAgICBpZiAob3RoZXJJbnZpdGVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShvdGhlckludml0ZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyDlj6rmnInlnKggY2FsbFNlc3Npb24g54q25oCB5Li6IEVuZGVkIOaXtumAmuefpSBvblNlc3Npb25DbG9zZVxuICAgIGlmIChkYXRhLmNhbGxTdGF0dXMgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQgfHwgc2VsZkVuZCkge1xuICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWFtuS7luerr+eahOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycywgY2FsbFN0YXR1cyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmluZCgoeyB1c2VySWQgfSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcblxuICAgIGlmIChjdXJyZW50VXNlciAmJiAodGhpcy5fbWFpblNlc3Npb24gfHwgdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkpIHtcbiAgICAgIC8vIOaYr+W3seerr+eKtuaAgeWPmOabtOS4lOWtmOWcqCBzZXNzaW9uIOWGjeWOu+mAmuefpeS6uuWRmOeKtuaAgeWPmOabtOWbnuiwg++8jOS4jeWtmOWcqCBzZXNzaW9uIOS4jemcgOimgemAmuefpVxuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN0YXR1c1RpbWUgfSA9IGN1cnJlbnRVc2VyO1xuICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElOR107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWmguaenOiHquW3seacquaOpeWQrOS4u+mAmuivne+8jOaUtuWIsOWkmuerryBDb25uZWN0aW5nIOeKtuaAge+8jOmcgOaKm+WHuiBzZXNzaW9uQ2xvc2VcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzTWFpblNlc3Npb24gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZDtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJTYXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpPy51c2VyU3RhdGU7XG4gICAgICAgIGNvbnN0IGlzQWNjZXB0TWFpblNlc3Npb24gPSBpc01haW5TZXNzaW9uICYmIGN1cnJlbnRVc2VyU2F0ZSAmJiBzdGF0ZXMuaW5jbHVkZXMoY3VycmVudFVzZXJTYXRlKTtcbiAgICAgICAgaWYgKCFpc0FjY2VwdE1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgW3tcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9BQ0NFUFQsXG4gICAgICAgICAgICBzdGF0ZVRpbWU6IHN0YXR1c1RpbWUsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfV0sIHRyYWNlSWQpO1xuXG4gICAgICAgICAgdGhpcy5zZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOS6i+S7tuS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25FdmVudERvd24oZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgZXZlbnRUaW1lLCBldmVudEFyZ3MsIGV2ZW50VHlwZSwgZnJvbVVzZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoZXZlbnRUeXBlID09PSBDYWxsU2VydmVyRXZlbnRUeXBlLkNBTExfRFVSQVRJT04gJiYgY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGNvbnN0IHsgZmlyc3RGcmFtZVRpbWUgfSA9IGV2ZW50QXJncyBhcyB7IGZpcnN0RnJhbWVUaW1lOiBudW1iZXIgfTtcbiAgICAgIC8vIOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWU6IGNsaWVudEZpcnN0RnJhbWVUaW1lIH0gPSBhd2FpdCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBmaXJzdEZyYW1lVGltZSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08sIGBjbGllbnRGaXJzdEZyYW1lVGltZTogJHtjbGllbnRGaXJzdEZyYW1lVGltZX1gLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeWNleWRvCBkdXJhdGlvbiDlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdlNpbkNhbGxEdXJhdGlvbihjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxTdGFydFRpbWUoeyBjYWxsSWQsIC4uLnsgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lIH0gfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lKGNhbGxJZCwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T5Y+Y5pu055u45YWz5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9vblN3aXRjaE1lZGlhVHlwZShkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgYWN0aW9uLCBleHRyYUtleVZhbCwgdHJhbnNhY3Rpb25JZCwgcHJvbW90ZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgcmVhc29uIH0gPSBleHRyYUtleVZhbDtcblxuICAgIGNvbnN0IGN1cnJlbnRDYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGNhbGxJZCAhPT0gY3VycmVudENhbGxJZCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgbm90IGN1cnJlbnQgc2Vzc2lvbiBjYWxsSWQ6ICR7Y3VycmVudENhbGxJZH0sIHJlY3ZDYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zYWN0aW9uSWQ6IG9sZFRyYW5zSWQsIGFjdGlvbjogb2xkQWN0aW9uLCBtZWRpYVR5cGU6IE9sZE1lZGlhVHlwZSB9ID0gdGhpcy5fbWFpblNlc3Npb24/LmdldE9sZERpYWxvZ0RhdGEoKSB8fCB7fTtcbiAgICBpZiAob2xkVHJhbnNJZCA9PT0gdHJhbnNhY3Rpb25JZCAmJiBvbGRBY3Rpb24gPT09IGFjdGlvbiAmJiBPbGRNZWRpYVR5cGUgPT09IG1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCAnZHVwbGljYXRlIGRpYWxvZyBkYXRhJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgYWN0aW9uOiAke2FjdGlvbn0sIHJlYXNvbjogJHtyZWFzb259YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0T2xkRGlhbG9nRGF0YSh7IHRyYW5zYWN0aW9uSWQsIGFjdGlvbiwgbWVkaWFUeXBlIH0pO1xuXG4gICAgLy8g5Y2H57qn5rWB56iL5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLlJFUVVFU1QpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gbnVsbDtcbiAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNBTkNFTF9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQUNDRVBUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEU7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZU1lZGlhVHlwZSh0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0UmVxTWVkaWFUeXBlKCkhKTtcbiAgICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5SRUZVU0U6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5SRUZVU0VfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlRJTUVPVVQ6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0W2NoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0XVxuICAgICAgJiYgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCBhcyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICAvLyDpmY3nuqfpgJrnn6XlpITnkIZcbiAgICBpZiAoYWN0aW9uID09PSBEaWFsb2dBY3Rpb24uTk9USUNFICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyAmJiAhcmVhc29uKSB7XG4gICAgICB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIGxvZyDml6Xlv5dcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxFbmRMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhbGxMb2cgPSB0cmFuMkNhbGxMb2coZGF0YSk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxSZWNvcmQoY2FsbExvZywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBwdWJsaWMgc2Vzc2lvbkNsb3NlKGRhdGE6IHsgY2FsbElkOiBzdHJpbmcsIHRvRGV2aWNlSWQ6IHN0cmluZ30sIHRyYWNlSWQ6IHN0cmluZywgaXNTZWxmSGFuZ3VwOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDmraPluLjnu5PmnZ/vvIzmuIXpmaTmnKzlnLDlrZjlgqjnmoQgY2FsbElkXG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUucmVtb3ZlQWJub3JtYWxDYWxsSWRzKGN1cnJlbnRVc2VySWQsIFtjYWxsSWRdKTtcblxuICAgIGxldCBjbG9zZWRTZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKHNlc3Npb24pID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICBpZiAoIWNsb3NlZFNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYHVuZXhwZWN0IHNlc3Npb24gY2FsbElkIC0+ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NMT1NFX1NFU1NJT05fTywgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyBzZXNzaW9uIGNsb3NlIOWQjue7k+adn+aJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIC8vIOe7k+adnyDkuIrmiqXnrKzkuIDluKdcbiAgICAgIGlmIChjbG9zZWRTZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmtL7lj5HpgJror53nu5PmnZ/vvIzlpITnkIbpgJror53nu5PmnZ/lkI4gUlRDIOmAgOaIv+mXtOetiemAu+i+kVxuICAgICAqL1xuICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53nu5PmnZ9cbiAgICAgKiDlpJrnq6/lhbbku5bnq6/mjILmlq3pgJror53vvIzpnIDmiormnKznq6/kurrlkZjns7vnu5/nirbmgIHovazljJbkuLogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQXG4gICAgICovXG4gICAgY29uc3QgY3J0VXNlckRhdGEgPSBjbG9zZWRTZXNzaW9uLmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpO1xuICAgIGxldCBoYW5ndXBSZWFzb247XG4gICAgaWYgKGlzU2VsZkhhbmd1cCAmJiBkYXRhLnRvRGV2aWNlSWQgIT09IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSkge1xuICAgICAgaGFuZ3VwUmVhc29uID0gY2xvc2VkU2Vzc2lvbi5nZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCkgPyBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUgOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVA7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsRW5kZWQobmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGNsb3NlZFNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlciksIGhhbmd1cFJlYXNvbiB8fCBjcnRVc2VyRGF0YSEuc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg56e76ZmkIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oY2FsbElkOiBzdHJpbmcpIHtcbiAgICBpZiAoY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICAgIHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuI3lrZjlnKggbWFpblNlc3Npb24g5pe277yM5LuO5pyN5Yqh56uv6I635Y+W5pWw5o2u55Sf5oiQIG1haW5TZXNzaW9uLCDlubbpgJrnn6XkurrlkZjnirbmgIHlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgaXNOZWVkVXA6Ym9vbGVhbiA9IGZhbHNlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiwgYGVycmNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBjb2RlOiAke2NvZGV9LCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRDYWxsZXJJZCxcbiAgICB9ID0gZGF0YSE7XG5cbiAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgIHRoaXMuX21haW5TZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgc3RhcnRDYWxsZXJJZCxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICApO1xuICAgIGlmIChpc05lZWRVcCkge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOS6uuWRmOeKtuaAgeWPmOabtOmAmuefpVxuICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFvOWuueenu+WKqOerryBvblBob25lIOaXoOazlea2iOmZpOmXrumimFxuICAgKiBBMSDnp7vliqjnq6/lkowgQiDmraPlnKggY2FsbCDkuK3vvIzkuJQgb25QaG9uZSDnirbmgIHvvIwgQTEg5p2A6L+b56iL5ZCO77yMQiDnq6/lsZXnpLrnmoQgb25QaG9uZSDnirbmgIHml6Dms5XmtojlpLFcbiAgICogQTIg5aSa56uv5Zyo5o6l5ZCs5ZKM55u05o6l5Yqg5YWlIGNhbGwg5pe277yM5LiK5oqlIG9uUGhvbmVFbmQg54q25oCB77yM5raI6ZmkIEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jbGVhck1vYmlsZU9uUGhvbmUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoaXRlbSkgPT4gaXRlbT8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDljp8gY2xpZW50IOS4reWumuS5ieeahOS6i+S7tlxuICBwcml2YXRlIF9vblVzZXJTdGF0ZUNoYW5nZShjYWxsSWQ6IHN0cmluZywgdXNlcnM6IElTZXNzaW9uVXNlcltdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgdXNlclN0YXRlLCBzeXN0ZW1TdGF0ZSB9ID0gdXNlcjtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBzeXN0ZW1TdGF0ZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog5pS25Yiw6Ieq5bexIHN5c3RlbVN0YXRlIOS4uiA5OTnvvIznm7TmjqXnprvlvIDmiL/pl7RcbiAgICAgKiDlpITnkIbooqvlj6vmjqXlkKznmoTnnqzpl7TvvIzkuLvlj6vlkIzml7bmjILmlq3nmoTmg4XlhrXvvIzkuI3mjonnprvlvIDmiL/pl7TpgJror53kuI3kvJrnu5PmnZ9cbiAgICAgKi9cbiAgICB1c2Vycy5mb3JFYWNoKCh7IHVzZXJJZCwgc3lzdGVtU3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCAmJiBzeXN0ZW1TdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5BQk5PUk1BTF9FTkQpIHtcbiAgICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1iZXJJbnZpdGUoaW5mbzogSU90aGVyTWVtSW5mb1tdKSB7XG4gICAgaW5mby5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgY29uc3QgaW52aXRlclVzZXJJZCA9IHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRJbnZpdGVyVXNlcklkKCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZVVzZXJJbnZpdGVkKFt1c2VySWRdLCBpbnZpdGVyVXNlcklkISwgY2FsbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZShpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSB9ID0gaW5mbztcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KGluZm86IElDaGFuZ2VNZWRpYVR5cGVJbmZvLCBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSkge1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX18sIGluZm8ubWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCh7XG4gICAgICAuLi5pbmZvLFxuICAgICAgY29kZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2FsbFR5cGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGUsIGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJUQ1Jlc291cmNlVGFnIHtcbiAgLyoqXG4gICAqIOaZrumAmumfs+inhumikea1gVxuICAgKi9cbiAgTk9STUFMID0gJ1JvbmdDbG91ZFJUQycsXG4gIC8qKlxuICAgKiDlsY/luZXliIbkuqvmtYFcbiAgICovXG4gIFNDUkVFTiA9ICdTY3JlZW5TaGFyZSdcbn1cbiIsImltcG9ydCB7XG4gIFBsdWdpbkNvbnRleHQsIElSdW50aW1lLCBSVENNb2RlLCBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBpc0Jvb2xlYW4sXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDUlRDUm9vbSxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ0xvY2FsQXVkaW9UcmFjayxcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ0tpY2tSZWFzb24sXG4gIFJDVHJhY2ssXG4gIFJDTG9jYWxWaWRlb1RyYWNrLFxuICBJUHVibGlzaEF0dHJzLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgaGVscGVyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSUF1ZGlvQ29uZmlnLFxuICBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgSVN0YXR1c1JlcG9ydExpc3RlbmVyLFxuICBJVmlkZW9Db25maWcsXG4gIFJDQ2FsbFBsdXNDb2RlLFxuICBSQ0NhbGxQbHVzRnJhbWVSYXRlLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzLFxuICBSQ0NhbGxQbHVzUmVzb2x1dGlvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSVENSZXNvdXJjZVRhZyB9IGZyb20gJy4uL2VudW1zL1JUQ1Jlc291cmNlVGFnJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IENhbGxIb29rc1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbEtpY2tFeHRyYSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJUQ01vZHVsZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgSU1lZGlhTXV0ZUNoYW5nZUluZm8sIElNZW1iZXJJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcblxuaW50ZXJmYWNlIElKb2luUlRDUm9vbVJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgcm9vbT86IFJDUlRDUm9vbSB8IHVuZGVmaW5lZDtcbiAgdXNlcklkcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVN1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgZmFpbGVkTGlzdD86IChJU3Vic2NyaWJlQXR0cilbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElQdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGxpdmVVcmw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn1cblxuaW50ZXJmYWNlIFJDS2lja0V4dHJhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUlRDTW9kdWxlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX186IHN0cmluZyA9ICdpbm5lci1ydGMtcHJvY2Vzcy1mYWlsZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1ydGMtcGVlcmNvbm5lY3Rpb24tYWJub3JtYWwtY2xvc2UnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fU0VMRl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLXNlbGYtam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX09USEVSX0pPSU5FRF9fOiBzdHJpbmcgPSAnaW5uZXItb24tb3RoZXItam9pbmVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXzogc3RyaW5nID0gJ2lubmVyLXJlY2VpdmUtZmlyc3QtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fS0lDS09GRl9fOiBzdHJpbmcgPSAnaW5uZXIta2lja29mZi1mcmFtZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fOiBzdHJpbmcgPSAnaW5uZXItb24tZGV2aWNlLWVuYWJsZS1jaGFuZ2UnXG5cbiAgLyoqXG4gICAqIFJDUlRDIOWunuS+i1xuICAgKi9cbiAgcHVibGljIF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIOW3seaWueeahOmfs+inhumikSB0cmFja3NcbiAgICovXG4gIHByaXZhdGUgX2xvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdXG5cbiAgLyoqXG4gICAqIFJDUlRDUm9vbSDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcm9vbTogUkNSVENSb29tIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgcHJpdmF0ZSBfY2FsbE1lZGlhVHlwZSE6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcblxuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgcHJpdmF0ZSBfaXNQdWJUaW55OiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6KeG6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6Z+z6aKR6YWN572u5piv5ZCm5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZ0lzQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog5a2Y5YKo6K6+572u55qE5Lq65ZGY5ZKM6KeG5Zu+XG4gICAqL1xuICBwcml2YXRlIF91c2VyVmlld01hcDogeyBbdXNlcklkOiBzdHJpbmddOiB7IHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55OiBib29sZWFuIH0gfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9yZW1vdGVBdWRpb0VuYWJsZTogYm9vbGVhbiA9IHRydWVcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfaW5pdE9wdHM/LnJ0Y0NsaWVudDtcbiAgICB0aGlzLl9pc1B1YlRpbnkgPSBfaW5pdE9wdHMuaXNQdWJUaW55IHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0Q2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcihsaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyKSB7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPluaRhOWDj+WktOi1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTop4bovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgZGVmYXVsdFZpZGVvVHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IChkZWZhdWx0VmlkZW9UcmFjayAmJiAhdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjaywgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9IDogYXdhaXQgdGhpcy5fY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICB0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlum6puWFi+mjjui1hOa6kFxuICAgKiDlhoXlrZjkuK3mnInml7bvvIzov5Tlm57lhoXlrZjkuK3nmoTpn7PovahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRBdWRpb1RyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdEF1ZGlvVHJhY2sgJiYgIXRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdEF1ZGlvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFjayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNrumAmuivneexu+Wei+WIm+W7uumfs+OAgeinhumikei1hOa6kFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmfs+mikeaIlumfs+inhumikVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9jYWxsTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWRlb0NvbmZpZyh2aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnKSB7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB2aWRlb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdWRpb0NvbmZpZyhhdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnKSB7XG4gICAgdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSBhdWRpb0NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0RFU1RST1lfQUxMX1RSQUNLU19PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHVibGljIHNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1QsIGBlbmFibGU6ICR7ZW5hYmxlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFpc0Jvb2xlYW4oZW5hYmxlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9SLCBgcGFyYW0gZXJyb3IsIGVuYWJsZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtlbmFibGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlID0gZW5hYmxlO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXVkaW9UcmFja3MgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3MoKS5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgYXVkaW9UcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmIChlbmFibGUpIHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVRyYWNrKHRyYWNrOiBSQ0xvY2FsVHJhY2spIHtcbiAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9sb2NhbFRyYWNrcy5maW5kSW5kZXgoKGxvY2FsVHJhY2spID0+IGxvY2FsVHJhY2suZ2V0VHJhY2tJZCgpID09PSB0cmFjay5nZXRUcmFja0lkKCkpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogc2Vzc2lvbiDov57mjqVcbiAgICovXG4gIGFzeW5jIHNlc3Npb25Db25uZWN0ZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAvLyAxLiDliqDmiL/pl7RcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgcm9vbSB9ID0gYXdhaXQgdGhpcy5qb2luUlRDUm9vbShjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGVyckNvZGUgLT4gJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDms6jlhowgUlRDIOebuOWFs+ebkeWQrFxuICAgICAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgICAgIHRoaXMuX3JlZ1JUQ0xpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICAgICAgY29uc3Qgcm9vbVVzZXJzSWQgPSB0aGlzLl9yb29tPy5nZXRSZW1vdGVVc2VySWRzKCkgfHwgW107XG4gICAgICAgIGlmIChyb29tVXNlcnNJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChyb29tVXNlcnNJZC5tYXAoKHVzZXJJZCkgPT4gKHsgY2FsbElkLCB1c2VySWQgfSkpLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vbkJlZm9yZVB1Ymxpc2gpO1xuICAgICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnlcbiAgICAgICAgICA/IHRoaXMuX2xvY2FsVHJhY2tzLm1hcCgodHJhY2spID0+ICh0cmFjay5pc1ZpZGVvVHJhY2soKSA/IHsgdHJhY2ssIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2spKVxuICAgICAgICAgIDogdGhpcy5fbG9jYWxUcmFja3M7XG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKHB1YlBhcmFtcywgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHVibGlzaFJlcywgY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCwgJ3Nlc3Npb25Db25uZWN0ZWQgbG9jYWwgdHJhY2tzIGlzIGVtcHR5JywgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYHB1Ymxpc2ggRXhjZXB0aW9uIGNhbGxJZCAtPiAke2NhbGxJZH0sIGVyciBtc2cgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gIH1cblxuICBhc3luYyBzZXNzaW9uQ2xvc2UoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDplIDmr4HmnKznq6/otYTmupBcbiAgICAgKi9cbiAgICB0aGlzLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG5cbiAgICBjb25zdCBjdXJyZW50Um9vbUlkID0gdGhpcy5fcm9vbT8uZ2V0Um9vbUlkKCk7XG4gICAgaWYgKHRoaXMuX3Jvb20gJiYgY2FsbElkID09PSBjdXJyZW50Um9vbUlkKSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOazqOmUgOWGheWtmOaVsOaNrlxuICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCBgbGVhdmVSb29tIGZhaWxlZCwgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uOiBub3QgaW4gcm9vbScsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLm11dGUoKTtcblxuICAgIHJldHVybiB7IGNvZGUsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6KeG6aKRdHJhY2tcbiAgICogMS4g5ZCv55So5YmN5bqU55So5bGC6ZyA5YWI5Yib5bu66KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBlbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGV9PiB7XG4gICAgLy8g6I635Y+W5pys56uv6KeG6aKRIHRyYWNrXG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzotYTmupDmsqHooqvnpoHnlKjvvIzov5Tlm57miJDlip9cbiAgICAgKi9cbiAgICBpZiAoIXRyYWNrIS5pc093bmVyTXV0ZWQoKSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reWIh+aNouinhumikeiuvuWkh1xuICAgKi9cbiAgYXN5bmMgY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2sgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahOi9qFxuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICAvLyDmlbTnkIblkI7nmoTovahcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fdmlkZW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIGxldCBuZWVkRGVzdHJveVRyYWNrOiBSQ0xvY2FsVHJhY2s7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MgJiYgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDotYTmupDph4rmlL5cbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgICBuZWVkRGVzdHJveVRyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOS7juacrOWcsOe8k+WtmOS4reWIoOmZpOmUgOavgeeahCB0cmFja1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKChpdGVtKSA9PiBuZWVkRGVzdHJveVRyYWNrICYmIChpdGVtLmdldFRyYWNrSWQoKSAhPT0gbmVlZERlc3Ryb3lUcmFjay5nZXRUcmFja0lkKCkpKTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDnu5nmnKzlnLDliqDkuIrmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g6YCa55+l5LiK5bGCIHRyYWNrUmVhZHlcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShyZWNlbnRUcmFja3MsIHRyYWNlSWQpO1xuXG4gICAgLy8g5bey5Yqg5YWl5oi/6Ze0XG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+a1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NSUNST1BIT05FX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WNh+OAgemZjVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgLyoqXG4gICAgICog5Y2H57qnIOmfs+mikSAtPiDpn7Pop4bpopFcbiAgICAgKiAxLiDkuJrliqHlsYLpnIDopoHlhYjpgJrov4cgY3JlYXRlTG9jYWxUcmFja3Mg5Yib5bu65pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICogMi4gU0RLIOWPquWkhOeQhuWPkeW4g+inhumikSB0cmFja1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPlue8k+WtmOS4reeahOinhumikSB0cmFja1xuICAgICAgbGV0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFjazogbmV3VHJhY2sgfSA9IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cmFjayA9IG5ld1RyYWNrO1xuICAgICAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgICAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuICAgICAgfVxuICAgICAgLy8gMi4g5Y+R5biD5rWBXG4gICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiB0cmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2shO1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2goW3B1YlBhcmFtc10sIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmZjee6pyDpn7Pop4bpopEgLT4g6Z+z6aKRXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgLy8gMS4g6I635Y+W5pys5Zyw6KeG6aKRIHRyYWNrXG4gICAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG5cbiAgICAgIGlmICh0cmFjaykge1xuICAgICAgICAvLyDlj5bmtojlj5HluIPop4bpopFcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnB1Ymxpc2goW3RyYWNrXSk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgdW5wdWJsaXNoIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOmHiuaUvuinhumikSB0cmFja1xuICAgICAgICB0aGlzLmRlc3Ryb3lUcmFjayh0cmFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luUlRDUm9vbShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcm9vbT86IFJDUlRDUm9vbSwgdHJhY2tzPzogUkNSZW1vdGVUcmFja1tdIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QsIGBjYWxsOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIHJvb20sIHRyYWNrcyB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJSm9pblJUQ1Jvb21SZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbS5iaW5kKHRoaXMuX3J0Y0NsaWVudCksXG4gICAgICBmbkFyZ3M6IFtjYWxsSWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSwgUlRDTW9kZS5DQUxMXSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uSk9JTl9ST09NX0VSUiwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3Jvb20gPSByb29tITtcbiAgICB0aGlzLl9vblNlbGZKb2luZWQoeyBjYWxsSWQsIHVzZXJJZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSB9LCB0cmFjZUlkKTtcbiAgICB0cmFja3M/Lmxlbmd0aCAmJiB0aGlzLl9vblJlbW90ZVRyYWNrUHVibGlzaCh0cmFja3MpO1xuXG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHJvb20sIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJzY3JpYmVUcmFja3ModHJhY2tzOiAoSVN1YnNjcmliZUF0dHIpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBwYXJhbXM6IHRyYWNrcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0cmFjaywgc3ViVGlueSB9ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFja0lkOiB0cmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgc3ViVGlueSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJU3ViUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9yb29tIS5zdWJzY3JpYmUuYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkZldGNoUmVtb3RlTWVkaWFFcnJvcih0cmFja3MsIGNvZGUpO1xuXG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5TVUJTQ1JJQkVfRVJSLCB0cmFjZUlkKTtcblxuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyDlj5bmtojorqLpmIVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnN1YnNjcmliZVRyYWNrcyh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWxlYXNlU3RvcmVkRGF0YSgpIHtcbiAgICB0aGlzLl9yb29tID0gbnVsbDtcbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IHRydWU7XG4gICAgdGhpcy5fdXNlclZpZXdNYXAgPSB7fTtcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrcygpOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0ge1xuICAgIGNvbnN0IHRyYWNrczogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119ID0ge307XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gdHJhY2tzO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJZHMgPSB0aGlzLl9yb29tLmdldFJlbW90ZVVzZXJJZHMoKTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFja3NbdXNlcklkXSA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNrcztcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKS5maW5kKCh0cmFjaykgPT4gKChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICogUlRDIOS6i+S7tuebkeWQrOazqOWGjFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnUlRDTGlzdGVuZXJzKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOS6i+S7tuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAqIOWPpuS4gOenjeWPr+iDveaYr+W3seaWuSBydGNQaW5nIOWksei0peasoeaVsOi2heWHuuS4iumZkO+8jOaVheiAjOS4u+WKqOaWree6v1xuICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgKiDlvZPlgLzkuLogdHJ1ZSDml7bvvIzor7TmmI7mnKznq6/mlLbliLDooqvouKLlh7rmiL/pl7TpgJrnn6VcbiAgICAgICAqL1xuICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIHRoaXMuX29uS2lja09mZihieVNlcnZlciwgdGhpcy5fcm9vbSEuZ2V0Um9vbUlkKCksIHN0YXRlKTtcbiAgICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfliqDlhaVcbiAgICAgIG9uVXNlckpvaW46ICh1c2VySWQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB1c2VySWQubWFwKChpZCkgPT4gKHsgY2FsbElkOiB0aGlzLl9jYWxsSWQsIHVzZXJJZDogaWQgfSkpO1xuICAgICAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChpbmZvLCB0cmFjZUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfnprvlvIBcbiAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+R5biDXG4gICAgICBvblRyYWNrUHVibGlzaDogdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPlua2iOWPkeW4g1xuICAgICAgb25UcmFja1VucHVibGlzaDogdGhpcy5fb25UcmFja1VucHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5YeG5aSH5bCx57uqXG4gICAgICBvblRyYWNrUmVhZHk6ICh0cmFjazogUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblJlbW90ZVRyYWNrUmVhZHkoW3RyYWNrXSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6KeG6aKRXG4gICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblZpZGVvTXV0ZUNoYWduZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6Z+z6aKRXG4gICAgICBvbkF1ZGlvTXV0ZUNoYW5nZTogKGF1ZGlvVHJhY2s6IFJDUmVtb3RlQXVkaW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vbkF1ZGlvTXV0ZUNoYW5nZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiBhdWRpb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb246IHRoaXMuX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6LSo6YeP5pWw5o2u5oql5ZGK55uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICBvblN0YXRlUmVwb3J0OiB0aGlzLl9vblJUQ1N0YXRlUmVwb3J0LmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6Z+z6YeP5LiK5oql5LqL5Lu2XG4gICAgdGhpcy5fcm9vbSEub25BdWRpb0xldmVsQ2hhbmdlKChhdWRpb0xldmVsUmVwb3J0TGlzdCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyQXVkaW9MZXZlbENoYW5nZWQoYXVkaW9MZXZlbFJlcG9ydExpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Mb2NhbFRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tSZWFkeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcyk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXyk7XG4gIH1cblxuICBwcml2YXRlIF9vbktpY2tPZmYoYnlTZXJ2ZXI6IGJvb2xlYW4sIHJvb21JZDogc3RyaW5nLCBzdGF0ZT86IFJDS2lja1JlYXNvbiwga2lja0V4dHJhPzogUkNDYWxsS2lja0V4dHJhKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9LSUNLX09GRl9PLCBgcm9vbklkOiAke3Jvb21JZH0sIGJ5U2VydmVyOiAke2J5U2VydmVyfSwgc3RhdGU6ICR7c3RhdGV9LCBraWNrRXh0cmE6ICR7SlNPTi5zdHJpbmdpZnkoa2lja0V4dHJhKX1gKTtcbiAgICBsZXQgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24gPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgIGlmIChieVNlcnZlcikge1xuICAgICAgaWYgKGtpY2tFeHRyYSkge1xuICAgICAgICBzeXN0ZW1TdGF0ZSA9IGtpY2tFeHRyYS5raWNrUmVhc29uQ29kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5LSUNLRURfQllfU0VSVkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fRElTQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fTE9HT1VUOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkxPR09VVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0NMSUVOVF9JTV9DT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0xPR0lOO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fS0lDS09GRl9fLCBzeXN0ZW1TdGF0ZSwgcm9vbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMgUGVlciDlvILluLjlhbPpl61cbiAgICog56e75Yqo56uv5pyq5aSE55CG5q2k5Zue6LCD77yM5a6a5LmJIHN5c1N0YXR1cyDkuLogQ09OTkVDVElPTl9FUlJcbiAgICovXG4gIHByaXZhdGUgX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uKCkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfUEVFUkNPTk5FQ1RJT05fRVhDRVBUX0NMT1NFX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX18sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25TZWxmSm9pbmVkKGluZm86IElNZW1iZXJJbmZvLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fU0VMRl9KT0lORURfXywgaW5mby5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBuZWVkU3ViVHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdID0gW107XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw6Z+z6aKR5pe277yM55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXT8udmlkZW9WaWV3KSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgICBjb25zdCB7IGlzVGlueSB9ID0gdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGlzVGlueSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uVHJhY2tVbnB1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGF3YWl0IHRoaXMudW5zdWJzY3JpYmVUcmFja3ModHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQXVkaW9NdXRlQ2hhbmdlKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25WaWRlb011dGVDaGFnbmUoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUlRDU3RhdGVSZXBvcnQocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkge1xuICAgIGNvbnN0IHsgc2VuZGVycywgcmVjZWl2ZXJzIH0gPSByZXBvcnQ7XG4gICAgc2VuZGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgcnR0IH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblNlbmRQYWNrZXRMb3NzKHBhY2tldHNMb3N0UmF0ZSB8fCAwLCBydHQgfHwgMCk7XG4gICAgfSk7XG4gICAgcmVjZWl2ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdHJhY2tJZCwga2luZCwgcGFja2V0c0xvc3RSYXRlLCBiaXRyYXRlLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSBoZWxwZXIucGFyc2VUcmFja0lkKHRyYWNrSWQpO1xuICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICBbdXNlcklkOiBzdHJpbmddOiBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzO1xuICAgICAgfSA9IHt9O1xuICAgICAgZGF0YVt1c2VySWRdID0ge1xuICAgICAgICBwYWNrZXRMb3N0UmF0ZTogcGFja2V0c0xvc3RSYXRlISxcbiAgICAgICAgYml0UmF0ZTogYml0cmF0ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblJlY2VpdmVQYWNrZXRMb3NzKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBSVEMg5o6l5pS25pyA57uI5aSx6LSl5ZCO6ZyA6KaB6LCD55SoIGhhbmd1cCDmjILmlq3nmoTmg4XlhrVcbiAqL1xuICBwcml2YXRlIF9vblJUQ01ldGhvZEZhaWwoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXywgc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25PdGhlck1lbUpvaW5lZChpbmZvOiBJTWVtYmVySW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX18sIGluZm8sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fLCB0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOmfs+mikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsQXVkaW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzQXVkaW9UcmFjaygpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fYXVkaW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl9hdWRpb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgLy8g5pys5qyh57yT5a2YXG4gICAgdGhpcy5fbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIC8vIOmAmuefpeS4iuWxglxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOinhumikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVmlkZW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzVmlkZW9UcmFjaygpICYmICFpdGVtLmlzRGVzdHJveWVkKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjop4bpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbFZpZGVvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxWaWRlb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjpn7PpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbEF1ZGlvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxBdWRpb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxBdWRpb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoKHRyYWNrczogKFJDTG9jYWxUcmFjayB8IElQdWJsaXNoQXR0cnMpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9ULCBgdHJhY2tzSWRzOiAke3RyYWNrcy5tYXAoKGl0ZW0pID0+ICgoaXRlbSBpbnN0YW5jZW9mIFJDTG9jYWxUcmFjaykgPyBpdGVtLmdldFRyYWNrSWQoKSA6IGl0ZW0udHJhY2suZ2V0VHJhY2tJZCgpKSl9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVB1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEucHVibGlzaC5iaW5kKHRoaXMuX3Jvb20pLFxuICAgICAgZm5BcmdzOiBbdHJhY2tzXSxcbiAgICAgIG9uRXJyb3I6IChjb2RlKSA9PiB7fSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uUFVCTElTSF9FUlIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hWaWRlb1RyYWNrKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogZGVmYXVsdFZpZGVvVHJhY2shO1xuICAgIHJldHVybiB0aGlzLl9yb29tIS5wdWJsaXNoKFtwdWJQYXJhbXNdKTtcbiAgfVxuXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55ID0gZmFsc2UgfSA9IGl0ZW07XG4gICAgICB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdID0ge1xuICAgICAgICB2aWRlb1ZpZXc6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgaXNUaW55LFxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICog6K6+572u5pys56uv6KeG5Zu+5pe277yM5Y+q5a2Y5YKo5pWw5o2u77yM5peg6ZyA6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiDorr7nva7ov5znq6/op4blm77ml7bvvIzlpoLmnpzlt7Lnu4/liqDlhaXmiL/pl7TvvIzliJnojrflj5bov5znq6/otYTmupDnm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW90ZVRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgICBjb25zdCBzdWJQYXJhbXMgPSAocmVtb3RlVHJhY2tzIVt1c2VySWRdIHx8IFtdKS5tYXAoKHRyYWNrKSA9PiAoe1xuICAgICAgICB0cmFjayxcbiAgICAgICAgc3ViVGlueTogaXNUaW55LFxuICAgICAgfSkpLmZpbHRlcigoeyB0cmFjayB9KSA9PiAhdHJhY2suaXNTdWJzY3JpYmVkKCkpO1xuICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKC4uLnN1YlBhcmFtcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PLCBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgdXNlclZpZXdNYXA6IHRoaXMuX3VzZXJWaWV3TWFwLFxuICAgICAgICBuZWVkU3ViVHJhY2tJZHM6IG5lZWRTdWJUcmFja3MubWFwKCh7IHRyYWNrIH0pID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk6KeG5Zu+5pe277yM5Y+W5raI6K6i6ZiF6LWE5rqQXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVuc3ViVHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSBbXTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF07XG4gICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9UcmFjayA9IHRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgICAgIHZpZGVvVHJhY2subGVuZ3RoICYmIHVuc3ViVHJhY2tzLnB1c2godmlkZW9UcmFja1swXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFTU9WRV9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogdGhpcy5fdXNlclZpZXdNYXAsXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5aqS5L2T6LWE5rqQXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1QsIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIHZpZGVvVmlldzogJHt2aWRlb1ZpZXc/Lm5vZGVOYW1lfWAsIHRyYWNlSWQpO1xuICAgIGxldCB0cmFjazogUkNUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIOWMuuWIhuacrOerr+WSjOi/nOerr1xuICAgICAqL1xuICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRyYWNrID0gKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykgPyB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpISA6IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCkhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgIHRyYWNrID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKVt1c2VySWRdLmZpbHRlcigodHJhY2spID0+IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gPyB0cmFjay5pc0F1ZGlvVHJhY2soKSA6IHRyYWNrLmlzVmlkZW9UcmFjaygpKSlbMF07XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQV9SRVNPVVJDRV9JTlZBTElFRCB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gYXdhaXQgdHJhY2sucGxheSgpIDogYXdhaXQgdHJhY2sucGxheSh2aWRlb1ZpZXcpO1xuICAgICAgLyoqXG4gICAgICAgKiDlpITnkIbpgJror53liY3orr7nva7kuobpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYFcbiAgICAgICAqL1xuICAgICAgdHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgIXRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlICYmIHRyYWNrLm11dGUoKTtcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRH0sIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX0sYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QTEFZX01FRElBX0ZBSUxFRCB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJU3Vic2NyaWJlQXR0cixcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIFJDUlRDQ29kZSxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ1RyYWNrLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7XG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1JlYXNvbixcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXIhOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDnirbmgIHmnLrkuovku7bms6jlhoxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICog5Zue6LCD5bqU55So5bGC5LqL5Lu2XG4gICogQHBhcmFtIGV2ZW50TmFtZVxuICAqIEBwYXJhbSBhdHRyc1xuICAqIEByZXR1cm5zXG4gICovXG4gIHByaXZhdGUgX2NhbGxBcHBMaXN0ZW5lcihldmVudE5hbWU6IGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIC4uLmF0dHJzOiBhbnlbXSkge1xuICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuX2xpc3RlbmVyPy5bZXZlbnROYW1lXSBhcyBGdW5jdGlvbjtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaGFuZGxlKC4uLmF0dHJzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGwoc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGwnLCBzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbENvbm5lY3RlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxDb25uZWN0ZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbENvbm5lY3RlZCcsIHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxUeXBlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxUeXBlQ2hhbmdlZCcsIGNhbGxUeXBlLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWinumHj+S4iuaKpei/nOerr+S6uuWRmOeKtuaAgeWPmOWMllxuICAgKi9cbiAgcHVibGljIG9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZChkYXRhOiB7XG4gICAgY2FsbElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgICByZWFzb24/OiBSQ0NhbGxQbHVzUmVhc29uLFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24sXG4gICAgfSA9IGRhdGE7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICByZWFzb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZSwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbGxFbmRlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbiwgcmVhc29uOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25DYWxsRW5kZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgY2xvc2VSZWFzb246IHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxFbmRlZCcsIHNlc3Npb24sIHJlYXNvbik7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdHJhY2s/LmlzT3duZXJNdXRlZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB0cmFja0lkOiB0cmFjaz8uZ2V0VHJhY2tJZCgpLFxuICAgICAgZW5hYmxlOiB0cmFjaz8uaXNPd25lck11dGVkKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrPy5nZXRVc2VySWQoKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUmVjb3JkKHJlY29yZDogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxSZWNvcmQnLFxuICAgICAgcmVjb3JkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsUmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQ6IHN0cmluZywgdHJhbnNhY3Rpb25JZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCcsXG4gICAgICB1c2VySWQsXG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JywgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoaW5mbzoge1xuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uSWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgY29kZSxcbiAgICB9ID0gaW5mbztcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsXG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsIHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKGluZm86IHsgY2FsbElkOiBzdHJpbmcsIGNhbGxTdGFydFRpbWU6IG51bWJlciB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxTdGFydFRpbWUnLFxuICAgICAgaW5mbyxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsIGluZm8pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkOiBzdHJpbmcsIGNhbGxGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsRmlyc3RGcmFtZVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsIGNhbGxJZCwgY2FsbEZpcnN0RnJhbWVUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3M6IFJDVHJhY2tbXSwgdHJhY2VJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblVzZXJNZWRpYUF2YWlsYWJsZScsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlck1lZGlhQXZhaWxhYmxlJywgdXNlcklkLCBtZWRpYVR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrczogSVN1YnNjcmliZUF0dHJbXSwgY29kZTogUkNSVENDb2RlKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHsgdHJhY2sgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uRmV0Y2hSZW1vdGVNZWRpYUVycm9yJywgdXNlcklkLCBjb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdDoge1xuICAgIHRyYWNrOiBSQ0xvY2FsQXVkaW9UcmFjayB8IFJDUmVtb3RlQXVkaW9UcmFjaztcbiAgICBhdWRpb0xldmVsOiBudW1iZXI7XG4gIH1bXSkge1xuICAgIGF1ZGlvTGV2ZWxSZXBvcnRMaXN0LmZvckVhY2goKHsgdHJhY2ssIGF1ZGlvTGV2ZWwgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkJywgdXNlcklkLCBhdWRpb0xldmVsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgZ2V0VVVJRCwgSVJ1bnRpbWUsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm90RW1wdHlBcnJheSwgbm90RW1wdHlTdHJpbmcsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZW1vdGVUcmFjaywgUkNSVENDb2RlLCBkZXZpY2UgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgUkNDYWxsUGx1c0NhbGxVc2VyLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNDYWxsUGx1c1R5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBJQXVkaW9Db25maWcsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7XG4gIGdldEhhbmd1cFN5c3RlbVN0YXRlLCBpc1N1cHBvcnRNZWRpYVNlcnZlciwgdmFsaWRhdGVCaXRyYXRlLCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgUkNDYWxsUEx1c1N0YXRpc3RpY3MgZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQTHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcbmltcG9ydCB7XG4gIElIYW5ndXBGb3JCdXN5T3B0cywgSU1lbWJlckluZm8sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUlRDTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SVENNb2R1bGUnO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFcnJvckNvZGUgfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNDbGllbnQge1xuICAvKipcbiAgICog5pGE5YOP5aS06YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjumHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgLyoqXG4gICAqIOe7n+iuoeWfi+eCueexu1xuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0aXN0aWNzOiBSQ0NhbGxQTHVzU3RhdGlzdGljc1xuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaYr+WQpuS4uuS4u+WKqOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMYXVuY2hIYW5ndXAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICovXG4gIHByaXZhdGUgX25lZWRIYW5ndXBDYWxsSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lO1xuXG4gIHByaXZhdGUgX3J0Y01vZHVsZTogUlRDTW9kdWxlO1xuXG4gIC8qKlxuICAgKiDkuIrmiqXlupTnlKjlsYLkuovku7bmqKHlnZdcbiAgICovXG4gIF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlID0gbmV3IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUoX2xvZ2dlcik7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzID0gbmV3IFJDQ2FsbFBMdXNTdGF0aXN0aWNzKHRoaXMuX2xvZ2dlciwgdGhpcy5fY29udGV4dCk7XG4gICAgLy8g5Yid5aeL5YyW54q25oCB5py65a6e5L6LXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlID0gbmV3IFJUQ01vZHVsZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9jYWxsRW5naW5lLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHRoaXMuX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdGhpcy5fcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCB0aGlzLl9zZWxmSm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgdGhpcy5fb3RoZXJKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXywgdGhpcy5fcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgdGhpcy5fa2lja29mZkhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdGhpcy5fcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZS5iaW5kKHRoaXMpKTtcblxuICAgIC8qKlxuICAgICAqIOmAmuivneW7uueri+WQju+8jFJUQyDmqKHlnZfpnIDlj5HluIPotYTmupBcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZC5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOmAmuivneaMguaWreWQju+8jFJUQyDmqKHlnZfpnIDpgIDlh7rmiL/pl7TjgIHlpITnkIblhoXlrZjmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgdGhpcy5fc2Vzc2lvbkNsb3NlSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIC8qKlxuICAgICAqIOWkhOeQhiBSVEMg5qih5Z2X5aqS5L2T5Y2H6ZmN57qn6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlTWVkaWFUeXBlLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog5pS25Yiw6YCa6K+d6YKA6K+35ZCO77yM6ZyA5LiK5oql5Z+L54K5XG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgKG5ld1Nlc3Npb24sIGludml0ZVNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBuZXdTZXNzaW9uLCAnJywgaW52aXRlU291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDmiL/pl7TjgIHlj5HluIPjgIHorqLpmIXlpLHotKXml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uKTtcbiAgICAgIHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJ0YyBwZWVyQ29ubmVjdGlvbiDlvILluLjmlq3lvIDml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgLy8g5LiK5oql54q25oCB6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkOiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsIG1haW5TZXNzaW9uLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pys56uv5Yqg5YWlIFJUQyDmiL/pl7TvvIzpnIDmm7TmlrDmnKzkurogT05DQUxMIOeKtuaAge+8jOmHjeaWsOagoeaXtlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VsZkpvaW5lZEhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsQ29ubmVjdGVkKHNlc3Npb24hKTtcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOiHquW3seeahOeKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCBjYW1lcmFFbmFibGUgPSB2aWRlb1RyYWNrID8gIXZpZGVvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcbiAgICBjb25zdCBtaWNyb3Bob25lRW5hYmxlID0gYXVkaW9UcmFjayA/ICFhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBjYW1lcmFFbmFibGUsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIG1pY3JvcGhvbmVFbmFibGUsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qgc2VsZlN0YXRlID0gW1xuICAgICAge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBzZWxmU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g6YeN5paw5byA5aeL5qCh5pe26YC76L6RXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+S6uuWRmOWKoOWFpeaIv+mXtO+8jOabtOaWsOi/nOerr+S6uuWRmOeKtuaAgeWSjOmAmuivneeKtuaAgeS4uiBPTkNBTExcbiAgICovXG4gIHByaXZhdGUgX290aGVySm9pbmVkSGFuZGxlKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOabtOaWsOWKoOWFpeaIv+mXtOS6uuWRmOeKtuaAgVxuICAgIGxldCBjYWxsSWQgPSAnJztcbiAgICBjb25zdCB1c2Vyc1N0YXRlID0gaW5mby5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNhbGxJZCA9IGl0ZW0uY2FsbElkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pyJ5Lq65Y+q5Yqg5oi/6Ze077yM5LiN5Y+R5rWB77yM5pWF5q2k5aSE5Lmf5pu05paw5Li6IENPTk5FQ1RFRFxuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmmluW4p+S4iuaKpee7meS4muWKoeWxglxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG5cbiAgICAvLyDnu5kgQ2FsbFNlcnZlciDkuIrmiqXmtYHliLDovr5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwRmlyc3RGcmFtZVRpbWUodHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KKr6Lii5Ye65oi/6Ze05pe277yM6ZyA57uT5p2f6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9raWNrb2ZmSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCByb29tSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5pys56uv572R57uc5pyJ6Zeu6aKY77yMcGluZyDlpLHotKXml7ZcbiAgICAgKi9cbiAgICBpZiAoc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiiq+acjeWKoeerr+i4ouWHuuaXtueahOWkhOeQhlxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24sIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICAgIC8vIOS4iuaKpeeKtuaAgeebtOaOpeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvLyDnm7TmjqXnu5PmnZ/lt7HmlrnpgJror51cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOmfs+inhumikeeKtuaAgeWPmOWMlu+8jOmcgOabtOaWsCBzZXNzaW9uIOS4reS6uuWRmOeahOiuvuWkh+eKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsICF0cmFjay5pc093bmVyTXV0ZWQoKSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5pe277yM6ZyA5riF56m65YaF5a2Y77yM56a75byA5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uQ2xvc2VIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOS7heWcqOiiq+WKqOaMguaWreaXtua4heepuuWIm+W7uueahOWuouaIt+erryBjYWxsSWTvvIxcbiAgICAgKiDkuI3lvbHlk43kuLvliqjlkbzlj6vlkI7mjILmlq3ml7bkuIrmiqUg5a6i5oi356uvIGNhbGxJZFxuICAgICAqL1xuICAgIGlmICghdGhpcy5faXNMYXVuY2hIYW5ndXApIHtcbiAgICAgIHRoaXMuX2NsaWVudENhbGxJZCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozlupTnlKjlsYLkuovku7ZcbiAgICog5YyF5ZCr4oCc5pS25Yiw5ZG85Y+r44CB6YCa6K+d57uT5p2f44CB6YCa6K+d5Lq65ZGY54q25oCB5Y+Y5pu044CB6YCa6K+d57G75Z6L5Y+Y5pu04oCd562J5LqL5Lu2XG4gICAqIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIg5a+56LGh6K+35Y+C6ICDIGFwaURvY1xuICAgKi9cbiAgc2V0Q2FsbFBsdXNFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfRVZFTlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozpn7Pop4bpopHkuIrkuIvooYzkuKLljIXmlbDmja7nm5HlkKxcbiAgICog5q+P56eS5LiK5oql5LiA5qyhXG4gICAqIEBwYXJhbSBsaXN0ZW5lciDnsbvlnovkuLogSVN0YXR1c1JlcG9ydExpc3RlbmVy77yM6K+m57uG5a6a5LmJ5Y+v5Y+C6ICDIGFwaURvY1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25TZW5kUGFja2V0TG9zcyAg5Y+R6YCB5Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblJlY2VpdmVQYWNrZXRMb3NzIOaOpeaUtuS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKi9cbiAgc2V0U3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1NUQVRVU19SRVBPUlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruimgeingueci+S6uuWRmCjljIXmi6zoh6rlt7Hlkozlr7nmlrkp55qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBsaXN0IOS4uuS4gOS4quWIl+ihqO+8jOWPr+S8oOWFpeWkmuS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gaXRlbS51c2VySWQg55So5oi3IGlkXG4gICAqIEBwYXJhbSBpdGVtLnZpZGVvRWxlbWVudCDkuIDkuKogdmlkZW8g5YWD57Sg77yM55So5LqO5pKt5pS+6KeG6aKR77yM6ZyA6KaB5oyC6L295Zyo5Lia5Yqh5bGC6aG16Z2i5LiKXG4gICAqIEBwYXJhbSBpdGVtLmlzVGlueSDmmK/lkKbop4LnnIvliKvkurrnmoTlsI/mtYHvvIzlsI/nqpflj6Pml7blj6/ku6XphY3nva7kuLogdHJ1Ze+8jOWPr+iKguecgeW4puWuve+8jHVzZXJJZCDkuLrov5znq6/nlKjmiLfml7bmnInmlYhcbiAgICogQHJldHVybnMgY29kZSDov5Tlm57mmK/lkKborr7nva7miJDlip9cbiAgICovXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbGlzdDogbGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBlbGVtZW50TmFtZTogdmlkZW9FbGVtZW50Py5ub2RlTmFtZSxcbiAgICAgICAgICBpc1RpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmo4DmtYtcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5QXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCBsaXN0OiBub3QgZW1wdHkgYXJyYXksIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGxpc3QpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQgfSA9IGl0ZW07XG4gICAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRlVmlkZW9Ob2RlTmFtZSh2aWRlb0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB2aWRlb0VsZW1lbnQ6IG5lZWQgYSB2aWRlbyBlbGVtZW50LCB2YWx1ZTogJHt2aWRlb0VsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZpZGVvRWxlbWVudC5ub2RlTmFtZSA6IHZpZGVvRWxlbWVudH1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsICdzdWNjZXMnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9WaWV3KGxpc3QsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTmn5DkuKrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICog5LiN6KeC55yL5p+Q5Liq5Lq655qE6KeG6aKR5pe277yM5Lia5Yqh5bGC5Y+v5Lul55u05o6l56e76Zmk5a+55bqU55qEIHZpZGVvIOagh+etvu+8jFxuICAgKiDosIMgcmVtb3ZlVmlkZW9WaWV3IOaWueazle+8jFNESyDlhoXpg6jkvJrlgZzmraLmjqXmlLblr7nmlrnnmoTlqpLkvZPkvKDovpNcbiAgICogQHBhcmFtIHVzZXJJZHMg55So5oi3IGlkIOWIl+ihqFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuWIoOmZpOaIkOWKn1xuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWRzLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLnJlbW92ZVZpZGVvVmlldyh1c2VySWRzLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5oyH5a6a5Lq65ZGY55qE6Z+z6KeG6aKR5aqS5L2TXG4gICAqIOaSreaUvuafkOS4quS6uueahOinhumikeWJje+8jOivt+ehruS/neW3sue7j+iwg+eUqCBgc2V0VmlkZW9WaWV3YCDmlrnms5XkuLrlhbborr7nva7op4bpopHop4blm75cbiAgICogQHBhcmFtIHVzZXJJZCDmjIflrpropoHmn6XnnIvmn5DkuKrkurrnmoTlqpLkvZPotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDmjIflrprmkq3mlL7pn7PpopHov5jmmK/op4bpopFcbiAgICogQHJldHVybnMg6L+U5Zue5piv5ZCm5pKt5pS+5oiQ5YqfXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreS4muWKoeWxguaYr+WQpuiuvue9rui/h+W9k+WJjeS6uuWRmOeahOinhumikeinhuWbvlxuICAgICAqL1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3IH0gPSB0aGlzLl9ydGNNb2R1bGUuZ2V0VXNlclZpZXdNYXAoKVt1c2VySWRdIHx8IHt9O1xuICAgIGlmIChtZWRpYVR5cGUgIT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXZpZGVvVmlldykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVR9LCB2aWRlbyB2aWV3IG5vdCBzZXRgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlZJREVPX1ZJRVdfTk9UX1NFVCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUucGxheU1lZGlhKHVzZXJJZCwgbWVkaWFUeXBlLCB2aWRlb1ZpZXcsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuinhumikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDop4bpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7mkYTlg4/lpLTorr7lpIcgaWTjgIHluKfnjofjgIHliIbovqjnjofnrYnvvIxcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRWaWRlb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZVZpZGVvQ29uZmlnQnVpbGRlcigpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ1ZpZGVvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruinhumikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLliIfmjaLmkYTlg4/lpLTjgIHph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldFZpZGVvQ29uZmlnKGNmZzogSVZpZGVvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZnJhbWVSYXRlLCByZXNvbHV0aW9uLCBtYXhCaXRyYXRlLCBtaW5CaXRyYXRlLFxuICAgIH0gPSBjZmc7XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNGcmFtZVJhdGVbZnJhbWVSYXRlXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIGZyYW1lUmF0ZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtmcmFtZVJhdGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghUkNDYWxsUGx1c1Jlc29sdXRpb25bcmVzb2x1dGlvbl0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCByZXNvbHV0aW9uIGlzIGlsbGVnYWwsIHZhbHVlOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlQml0cmF0ZShtaW5CaXRyYXRlLCBtYXhCaXRyYXRlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsICdzdWNjZXNzJyk7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDpn7PpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7puqblhYvpo47orr7lpIcgaWRcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRBdWRpb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZUF1ZGlvQ29uZmlnQnVpbGRlcigpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ0F1ZGlvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rumfs+mikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldEF1ZGlvQ29uZmlnKGNmZzogSUF1ZGlvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuICAgIGNvbnN0IHsgc2FtcGxlUmF0ZSwgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gY2ZnO1xuICAgIGlmIChzYW1wbGVSYXRlICYmICFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIHNhbXBsZVJhdGU6IHR5cGUgaXMgbnVtYmVyLCB2YWx1ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuXG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvlj6vkurrlkZggdXNlcklkIOWIl+ihqO+8jOWNleS6uuWRvOWPq+S7hemcgOWcqOaVsOe7hOS4reaUvue9ruWvueaWueS4gOS6uueahCB1c2VySWRcbiAgICogQHBhcmFtIHR5cGUg5Y2V5Lq65ZG85Y+rIG9yIOWkmuS6uuWRvOWPq1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmAmuivneWqkuS9k+exu+Weizog6Z+z6aKRIG9yIOmfs+inhumikVxuICAgKiBAcmV0dXJucyBjYWxsSWQg5ZG85Y+r5oiQ5Yqf5ZCO77yM5Lqn55Sf55qE5Lya6K+dIGlkXG4gICAqL1xuICBhc3luYyBzdGFydENhbGwodXNlcklkczogc3RyaW5nW10sIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSA9IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSwgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlID0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGNhbGxJZD86IHN0cmluZyB9PiB7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gZ2V0VVVJRCgpO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9ULCBgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX0sIGNhbGxUeXBlOiAke2NhbGxUeXBlfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c1R5cGVbY2FsbFR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbFR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7Y2FsbFR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljZXogYogdXNlcklkcyDplb/luqbkuI3og73otoXov4cgMVxuICAgICAqL1xuICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDEgJiYgY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgWW91IGNhbiBvbmx5IGNhbGwgb25lIHBlcnNvbiBpbiBhIHNpbmdsZSBjYWxsLCB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlt7LlrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjlho3lj5Hotbflkbzlj6tcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVH0sIHNlc3Npb24gZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRDYWxsKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7IHVzZXJJZCB9KSksXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2xpZW50Q2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfU1RBUlRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG51bGwsIHRoaXMuX2NsaWVudENhbGxJZCwgbnVsbCwgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQ6IGRhdGE/LmNhbGxJZCB8fCAnJyB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZG85Y+r6L+H56iL5Lit5oyC5patXG4gICAgICovXG4gICAgY29uc3QgeyBjYWxsSWQsIGNsaWVudENhbGxJZCB9ID0gZGF0YSE7XG4gICAgaWYgKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPT09IGNsaWVudENhbGxJZCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgdGhlICR7Y2FsbElkfSBjYWxsIGhhcyBiZWVuIGhhbmd1cGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIEpTT04uc3RyaW5naWZ5KHsgZGF0YSwgY29kZSB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgY2FsbElkIH07XG4gIH1cblxuICAvKipcbiAgICog55u05o6l5Yqg5YWl6L+b6KGM5Lit55qE576k57uE6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg6YCa6K+dIGlkXG4gICAqL1xuICBhc3luYyBqb2luTXVsdGlDYWxsKGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldFNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGdldCBjYWxsIGRhdGEgZXJyb3IsIGNvZGU6ICR7Z2V0U2Vzc2lvbkNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRTZXNzaW9uQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBkYXRhITtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uICYmIG1haW5TZXNzaW9uLmdldENhbGxJZCgpICE9PSBjYWxsSWQpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5qb2luQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+35LuW5Lq6XG4gICAqIOWNleS6uumAmuivneS4remCgOivt+S7luS6uuS8muW8leWPkemAmuivneexu+Wei+WPmOabtFxuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fkurrliJfooahcbiAgICogQHJldHVybnMgYnVzeVVzZXJzIOi/lOWbnuW/mee6v+S6uuWRmOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgYnVzeVVzZXJzPzogUkNDYWxsUGx1c0NhbGxVc2VyW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1QsIGBjYWxsSWQ6ICR7dXNlcklkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkodXNlcklkcylcbiAgICAgICYmIHVzZXJJZHMuZXZlcnkoKHVzZXJJZCkgPT4gbm90RW1wdHlTdHJpbmcodXNlcklkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW36YKA6K+3XG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmludml0ZSh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICB9KSksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJ1c3lVc2VycyA9IFtdO1xuICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzPy5sZW5ndGgpIHtcbiAgICAgIGJ1c3lVc2Vycy5wdXNoKC4uLmRhdGEhLmJ1c3lsaW5lVXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICB1c2VySWQ6IHVzZXIudXNlcklkLFxuICAgICAgICBzdGF0ZTogdXNlci5zZXNzaW9uU3RhdHVzLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc3VjY2VzcyBidXN5VXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYnVzeVVzZXJzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGJ1c3lVc2VycyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWtmOWcqOmAmuivnVxuICAgICAqIOmcgOS7juW9k+WJjemAmuivneiOt+WPliBtZWlkYVR5cGVcbiAgICAgKi9cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpO1xuICAgIGlmICghbWFpblNlc3Npb24gJiYgIWhvbGRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yy65YiG5o6l5ZCsIG1haW5TZXNzaW9uIOWSjCBob2xkU2Vzc2lvblxuICAgICAqIOWmguaenOaOpeWQrCBob2xkU2Vzc2lvbu+8jOmcgOWFiOaMguaWrSBtYWluU2Vzc2lvblxuICAgICAqL1xuICAgIGNvbnN0IGlzQWNjZXB0SG9sZFNlc3Npb24gPSBjYWxsSWQgPT09IGhvbGRTZXNzaW9uPy5nZXRDYWxsSWQoKTtcbiAgICBpZiAoaXNBY2NlcHRIb2xkU2Vzc2lvbikge1xuICAgICAgY29uc3QgeyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfSA9IGF3YWl0IHRoaXMuaGFuZ3VwKG1haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSk7XG4gICAgICBpZiAoaGFuZ3VwTWFpblNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgaGFuZ3VwIG1haW5TZXNzaW9uIGVycm9yIGNvZGU6ICR7aGFuZ3VwTWFpblNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBoYW5ndXBNYWluU2Vzc2lvbkNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBncmFkZU1haW5TZXNzaW9uKGNhbGxJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgbWVkaWFUeXBlID0gbWFpblNlc3Npb24hLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldE1lZGlhVHJhY2tzQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35o6l5ZCsXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmFjY2VwdCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FDQ0VQVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbWFpblNlc3Npb24hKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2lubmVySGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBjYWxsSWQgfSA9IG9wdHM7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldElzTG9jYWxDbGllbnRIYW5ndXAodHJ1ZSk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuaGFuZ3VwKG9wdHMsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1QpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjYWxsSWQgPT09IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRDYWxsSWQoKSkge1xuICAgICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25DbG9zZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDkuLrlj6/pgInlj4LmlbDvvIzkuI3kvKDml7bvvIzmjILmlq3mraPlnKjov5vooYznmoTkuLsgc2Vzc2lvbu+8jOS8oOWFpeaXtuWPr+aMh+WumuaMguaWreS4u+mAmuivneaIluaaguacquW7uueri+i/nuaOpeeahOmAmuivnVxuICAgKiDmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror53vvJrmjIflt7LlnKjpgJror53kuK3ml7bvvIzmlLbliLDlkbzlj6vkvYbmmoLmnKrmjqXlkKznmoTpgJror51cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWFpblNlc3Npb25DYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcblxuICAgIC8qKlxuICAgICAqIOagoemqjOS8oOWFpeeahCBjYWxsSWQg5piv5ZCm5q2j56GuXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiBjYWxsSWQgIT09IG1haW5TZXNzaW9uQ2FsbElkICYmICF0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgcGFyYW1zIGVyciwgY2FsbElkIGlzIGludmFsaWQsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTExfSURfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIHRoaXMuX2lzTGF1bmNoSGFuZ3VwID0gdHJ1ZTtcblxuICAgIHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPSBjYWxsSWQgfHwgbWFpblNlc3Npb25DYWxsSWQ7XG4gICAgY29uc3QgaG9sZFNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQpO1xuICAgIGNvbnN0IGhhbmd1cFNlc3Npb24gPSBob2xkU2Vzc2lvbiB8fCBtYWluU2Vzc2lvbjtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHVzZXJTdGF0ZSA9IG1haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VySW5mbykgPT4gdXNlckluZm8udXNlcklkID09PSBjdXJyZW50VXNlcklkKVswXS5zdGF0ZTtcbiAgICBjb25zdCBpc0NhbGxlZSA9IFttYWluU2Vzc2lvbi5nZXRDcmVhdG9yVXNlcklkKCksIG1haW5TZXNzaW9uLmdldEludml0ZXJVc2VySWQoKV0uaW5jbHVkZXMoY3VycmVudFVzZXJJZCk7XG4gICAgY29uc3Qgc3lzdGVtU3RhdGUgPSBnZXRIYW5ndXBTeXN0ZW1TdGF0ZSh1c2VyU3RhdGUsIGlzQ2FsbGVlKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fX2lubmVySGFuZ3VwKHsgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLCBzeXN0ZW1TdGF0ZSB9LCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpeaMguaWreWfi+eCueaVsOaNrlxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0hBTkdVUF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgaGFuZ3VwU2Vzc2lvbiEsIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBzaWduYWwgZXJyb3IgY29kZSA6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gbnVsbDtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3lj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYJcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzlnKjlj5bmtojmiJblupTnrZTlqpLkvZPnsbvlnovliIfmjaLml7bkvKDlhaVcbiAgICovXG4gIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhbnNhY3Rpb25JZD86IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5nZXRDdXJyZW50Q2FsbFNlc3Npb24oKTtcbiAgICBjb25zdCBvbGRNZWRpYVR5cGUgPSBtYWluU2Vzc2lvbj8uZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBvbGRNZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NRURJQVRZUEVfSU5WQUxJRCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgdG9Vc2VySWRzID0gbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCAhPT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkubWFwKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoeyBtZWRpYVR5cGUsIHRvVXNlcklkczogdG9Vc2VySWRzIHx8IFtdIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc3VjY2VzcyB0cmFuc2FjdGlvbklkOiAke2RhdGEhLnRyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICB0cmFuc2FjdGlvbklkOiBkYXRhIS50cmFuc2FjdGlvbklkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+W5raI5YiH5o2i5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIOWuouaIt+err+WSjOacjeWKoeerr+S6pOS6kueahOS6i+WKoSBpZO+8jOS4uuWPkei1t+WqkuS9k+exu+Wei+WPmOabtOivt+axgui/lOWbnueahCB0cmFuc2FjdGlvbklkXG4gICAqL1xuICBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfVCwgYHRyYW5zYWN0aW9uSWQ6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcodHJhbnNhY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaJcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHsgdHJhbnNhY3Rpb25JZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WPmOabtOW6lOetlFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLogb25SZWNlaXZlZENoYW5nZVRvVmlkZW8g55uR5ZCs5pS25YiwIHRyYW5zYWN0aW9uSWQg5Y+C5pWw5YC8XG4gICAqL1xuICBhc3luYyByZXBseUNoYW5nZU1lZGlhVHlwZSh0cmFuc2FjdGlvbklkOiBzdHJpbmcsIGlzQWdyZWU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIHRyYW5zYWN0aW9uSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cbiAgICBpZiAoIWlzQm9vbGVhbihpc0FncmVlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCBpc0FncmVlOiB0eXBlIGlzIGJvb2xlYW4sIHZhbHVlOiAke2lzQWdyZWV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreaYr+WQpuWcqOmAmuivneS4rVxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXNwb25zZUNoYW5nZU1lZGlhVHlwZSh7XG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgICAgYWdyZWU6IGlzQWdyZWUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzaWduYWwgZXJyb3I6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjei/m+ihjOS4reeahOmAmuivnVxuICAgKiBAcmV0dXJucyBSQ0NhbGxQbHVzU2Vzc2lvbiDlr7nosaHmiJYgbnVsbCDkuLrlvZPliY3mraPlnKjov5vooYznmoTpgJror53lr7nosaFcbiAgICovXG4gIGdldEN1cnJlbnRDYWxsU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHlmajojrflj5bmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVjb3JkcyDkuIDnu4TmnKrnu5PmnZ/nmoTpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGdldEF2YWlsYWJsZUNhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZWNvcmRzPzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldE9wZW5DYWxsTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc3VjY2VzcywgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlY29yZHM6IGRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIbpobXmn6Xmib7lvZPliY3nlKjmiLfnmoTlhajpg6jpgJror53orrDlvZVcbiAgICogQHBhcmFtIHN0YXJ0VGltZXN0YW1wIOi1t+Wni+aXtumXtOaIs++8jOi/lOWbnuWkp+S6juatpOaXtumXtOaIs+eahOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY291bnQg5q+P5qyh6I635Y+W55qE5pWw6YePXG4gICAqIEByZXR1cm5zIHJlc3VsdC5oYXNNb3JlIOaYr+WQpuacieabtOWkmumAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZXN1bHQubGlzdCDpgJror53orrDlvZXliJfooajvvIznsbvlnovkuLogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW13vvIzlj6/pgJrov4cgYXBpRG9jIOafpeeci+WFt+S9k+WMheWQq+Wtl+autVxuICAgKiBAcmV0dXJucyByZXN1bHQubWF4VGltZSDliJfooajkuK3mnIDlpKfml7bpl7TmiLPvvIzlpoLmnpwgaGFzTW9yZSDkuLogdHJ1Ze+8jOe7p+e7reiOt+WPluaXtu+8jOS8oOWFpeatpOaXtumXtOaIs1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2FsbFJlY29yZHMoc3RhcnRUaW1lc3RhbXA6IG51bWJlciwgY291bnQ6IG51bWJlcik6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJlc3VsdD86IElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1QsIGBzdGFydFRpbWVzdGFtcDogJHtzdGFydFRpbWVzdGFtcH0sIGNvdW50OiAke2NvdW50fWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoaXNOdW1iZXIoc3RhcnRUaW1lc3RhbXApICYmIHN0YXJ0VGltZXN0YW1wID49IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIHN0YXJ0VGltZXN0YW1wOiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtzdGFydFRpbWVzdGFtcH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKCEoaXNOdW1iZXIoY291bnQpICYmIGNvdW50ID4gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgY291bnQ6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke2NvdW50fWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbExvZ0xpc3Qoe1xuICAgICAgdGltZXN0YW1wOiBzdGFydFRpbWVzdGFtcCxcbiAgICAgIGNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgcmVzdWx0OiBkYXRhISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6ZuG5ZCI5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBjYWxsSWRzIGNhbGxJZCDliJfooahcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUNhbGxSZWNvcmRzRnJvbVNlcnZlcihjYWxsSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfVCwgYGNhbGxJZHM6ICR7Y2FsbElkcy5qb2luKCcsJyl9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkoY2FsbElkcylcbiAgICAgICYmIGNhbGxJZHMuZXZlcnkoKGNhbGxJZCkgPT4gbm90RW1wdHlTdHJpbmcoY2FsbElkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgcGFyYW1zIGVyciwgY2FsbElkczogbm90IGVtcHR5IGFycmF5LCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5kZWxldGVDYWxsTG9nKGNhbGxJZHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXnqbrmiYDmnInpgJror53orrDlvZVcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENhbGxSZWNvcmRzRnJvbVNlcnZlcigpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+aRhOWDj+WktFxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA5pGE5YOP5aS077yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA5pGE5YOP5aS055qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqIEByZXR1cm5zIHRyYWNrIOaRhOWDj+WktOinhumikei1hOa6kFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYW1lcmEoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5pGE5YOP5aS06LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTywgdHJ1ZSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRyYWNrPy5pc1B1Ymxpc2hlZCgpICYmIHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUucHVibGlzaFZpZGVvVHJhY2soKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHB1Ymxpc2ggZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+eUqOi1hOa6kFxuICAgICAqIOaJqeaVo+WQr+eUqOi1hOa6kOa2iOaBr++8jOWmguaenOWksei0pe+8jOWImSBzdGFydENhbWVyYSDooYzkuLrlpLHotKVcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IHVubXV0ZUNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5lbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUyAmJiB1bm11dGVDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke3VubXV0ZUNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiB1bm11dGVDb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet5pGE5YOP5aS0XG4gICAqL1xuICBhc3luYyBzdG9wQ2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVWaWRlb1RyYWNrKCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiwgYGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveVRyYWNrKHRyYWNrISk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIGZhbHNlLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKiDliIfmjaLmiJDlip/lkI4gYElDYWxsUGx1c0V2ZW50TGlzdGVuZXJgIOebkeWQrOWZqOeahCBgb25Vc2VyTWVkaWFBdmFpbGFibGVgIOS4reS8muaUtuWIsOaWsOWIh+aNoueahOaRhOWDj+WktOi1hOa6kOWPr+aSreaUvu+8jOatpOaXtuiwg+eUqCBgY2FsbFBsdXNDbGllbnQucGxheU1lZGlhKClgIOWPr+aYvuekuuaWsOaRhOWDj+WktOeahOeUu+mdolxuICAgKiBAcGFyYW0gY2FtZXJhSWQg5rWP6KeI5Zmo5Lit5Y+W5b6X55qE5pGE5YOP5aS06K6+5aSHIGlk77yM5Y+v6LCDIHBsdWdpbi1ydGMg55qEIGdldENhbWVyYXMg5pa55rOV5Y+W5b6XXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53liY3lkozpgJror53kuK3pg73lj6/osIPnlKhcbiAgICovXG4gIGFzeW5jIHN3aXRjaENhbWVyYShjYW1lcmFJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfVCwgYGNhbWVyYUlkOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYW1lcmFJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYHBhcmFtIGVycm9yLCBjYW1lcmFJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FtZXJhSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGlmIChzZXNzaW9uLmdldE1lZGlhVHlwZSgpID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX1ZJREVPX0NBTEwgfTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5jYW1lcmFJZCA9IGNhbWVyYUlkO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jaGFuZ2VWaWRlb0RldmljZSh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgY2FsbCBjbGllbnQgY2hhbmdlVmlkZW9EZXZpY2UgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3miZPlvIDpuqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/miZPlvIDpuqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0YXJ0TWljcm9waG9uZSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBjcmVhdGUgbWljcm9waG9uZSBhdWRpbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVubXV0ZUNvZGUgPSBhd2FpdCB0cmFjayEudW5tdXRlKCk7XG4gICAgaWYgKHVubXV0ZUNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogdW5tdXRlQ29kZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reWFs+mXrem6puWFi+mjju+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+WFs+mXrem6puWFi+mjjueahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKi9cbiAgYXN5bmMgc3RvcE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVBdWRpb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgZmFsc2UsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO5piv5ZCm5byA5ZCvXG4gICAqL1xuICBpc01pY3JvcGhvbmVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIHJldHVybiAhIXRyYWNrICYmICF0cmFjay5pc093bmVyTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7miYDmnInov5znq6/pn7PpopHmtYHmmK/lkKblj6/nlKhcbiAgICogQHBhcmFtIGVuYWJsZSDkuLogdHJ1ZSDml7bvvIzpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYHvvJvkuLogZmFsc2Ug5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAqL1xuICBhc3luYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIFNESyDniYjmnKzkv6Hmga9cbiAgICogQHJldHVybnMgU0RLIOeJiOacrOWPt1xuICAgKi9cbiAgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBfX1ZFUlNJT05fXztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmkYTlg4/lpLTliJfooahcbiAgICovXG4gIGFzeW5jIGdldENhbWVyYXMoKSB7XG4gICAgY29uc3QgY2FtZXJhcyA9IGF3YWl0IGRldmljZS5nZXRDYW1lcmFzKCk7XG4gICAgcmV0dXJuIGNhbWVyYXM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6bqm5YWL6aOO5YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRNaWNyb3Bob25lcygpIHtcbiAgICBjb25zdCBtaWNyb3Bob25lcyA9IGF3YWl0IGRldmljZS5nZXRNaWNyb3Bob25lcygpO1xuICAgIHJldHVybiBtaWNyb3Bob25lcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzVW5kZWZpbmVkLCBMb2dMZXZlbCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgSVZhbGlkYXRlUmVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JVmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG4vKipcbiAqIOWIneWni+WMluWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVJbml0T3B0cyA9IChvcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIW9wdHMpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gb3B0aW9ucycgfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cyk7XG4gIC8vIOW/heS8oOWPguaVsOmqjOivgVxuICBpZiAoIWtleXMuaW5jbHVkZXMoJ3J0Y0NsaWVudCcpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTlNUQUxMX1JUQ19QTFVHSU4gfTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9wdHMucnRjQ2xpZW50KSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdydGNDbGllbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdvYmplY3RcXCcnIH07XG4gIH1cblxuICByZXR1cm4geyBpc0xlZ2FsOiB0cnVlIH07XG59O1xuXG4vKipcbiAqIHJlZ2lzdGVyQ2FsbEV2ZW50TGlzdGVuZXIg5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdtaXNzaW5nIHBhcmFtZXRlciAtPiBsaXN0ZW5lcicgfTtcbiAgfVxuXG4gIC8vIOagoemqjOaYr+WQpue8uuWwkeW/heimgeebkeWQrOWbnuiwg+azqOWGjFxuICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ29uSW52aXRlJywgJ29uU2Vzc2lvbkNsb3NlJywgJ29uUmVtb3RlVHJhY2tSZWFkeSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGxpc3RlbmVyKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG4gIHJlcXVpcmVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuXG4gIGxldCByZXM6IElWYWxpZGF0ZVJlcyA9IHsgaXNMZWdhbDogdHJ1ZSB9O1xuXG4gIC8vIOagoemqjOW/heimgeebkeWQrOaYr+WQpuaYryBmdW5jdGlvbiDnsbvlnotcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZXF1aXJlZEtleXNbaV07XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyWzxrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyPmtleV0pKSB7XG4gICAgICByZXMgPSB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGAnJHtrZXl9JyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlICdmdW5jdGlvbidgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7XG4gIElQbHVnaW5HZW5lcmF0b3IsIElSdW50aW1lLCBpc1VuZGVmaW5lZCwgTG9nTCwgUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NsaWVudCB9IGZyb20gJy4vY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvbiB9IGZyb20gJy4vY29yZS9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvdXRpbHMvdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBJQ2FsbFBsdXNJbml0T3B0cyB9IGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCBSQ0F1ZGlvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQXVkaW9Db25maWdCdWlsZGVyJztcbmltcG9ydCBSQ1ZpZGVvQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDVmlkZW9Db25maWdCdWlsZGVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCEpO1xuICAgIGVuZ2luZUxvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTkRFWF9JTlNUQUxMX0NBTExfUExVU19QTFVHSU5fTywgYENhbGxQbHVzIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0NsaWVudChjb250ZXh0LCBlbmdpbmVMb2dnZXIsIHJ1bnRpbWUsIG9wdGlvbnMpO1xuICB9LFxufTtcblxuZXhwb3J0IHtcbiAgaW5zdGFsbGVyLFxuICAvKiBjbGFzcyAqL1xuICBSQ0NhbGxQbHVzQ2xpZW50LFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNBdWRpb0NvbmZpZ0J1aWxkZXIsXG4gIFJDVmlkZW9Db25maWdCdWlsZGVyLFxufTtcbi8qKlxuICog5a+85Ye65p6a5Li+5ZKM5o6l5Y+j5a6a5LmJXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbiJdLCJuYW1lcyI6WyJSQ0NhbGxQbHVzQ29kZSIsIlJDQ2FsbFBsdXNMb2dnZXJUYWciLCJSQ0NhbGxQbHVzU2Vzc2lvbiIsIl9zZXNzaW9uIiwiX2NhbGxFbmdpbmUiLCJfbG9nZ2VyIiwiX19wdWJsaWNGaWVsZCIsInVzZXIiLCJ1c2VySWQiLCJ1c2VyU3RhdGUiLCJjYW1lcmFFbmFibGUiLCJtaWNyb3Bob25lRW5hYmxlIiwidHJhY2VJZCIsImNvZGUiLCJjbGllbnRTdGFydFRpbWUiLCJkYXRhIiwiUkNDYWxsUGx1c1R5cGUiLCJSQ0NhbGxQbHVzVHlwZTIiLCJSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlMiIsIlJDQ2FsbFBsdXNDYWxsU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IiwiUkNDYWxsUGx1c1JlYXNvbiIsIlJDQXVkaW9Db25maWdCdWlsZGVyIiwibWljcm9waG9uZUlkIiwibWluIiwibWF4IiwiaXNOdW1iZXIiLCJzYW1wbGVSYXRlIiwiUkNWaWRlb0NvbmZpZ0J1aWxkZXIiLCJSQ0NhbGxQbHVzUmVzb2x1dGlvbiIsIlJDQ2FsbFBsdXNGcmFtZVJhdGUiLCJmcHMiLCJyZXNvbHV0aW9uIiwiY2FtZXJhSWQiLCJ0cmFuMkNhbGxMb2ciLCJjYWxsTG9nTGlzdCIsImNhbGxJZCIsImNhbGxUeXBlIiwiY2FsbERpciIsIm1lZGlhVHlwZSIsImNhbGxpbmdVc2VySWQiLCJjYWxsVXNlcklkcyIsImNhbGxTdGF0dXMiLCJzZXNzaW9uU3RhdHVzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwic2VjcmV0Q2hhdCIsInN5bmNUaW1lIiwic3lzU3RhdHVzIiwiY3J0VGltZSIsInBhcnNlU3RhdHVzRGF0YSIsInJpbmdpbmdEYXRhIiwiaGFuZ3VwRGF0YSIsImFjY2VwdERhdGEiLCJvdGhlckludml0ZWREYXRhIiwiaXRlbSIsInZhbGlkYXRlVmlkZW9Ob2RlTmFtZSIsImVsZW1lbnQiLCJ2YWxpZGF0ZVN5c1N0YXRlIiwiY3J0U3RhdGUiLCJuZXdTdGF0ZSIsImlzSW5WYWxpZCIsImludmFsaWRTdGF0ZXMiLCJ2YWxpZGF0ZVVzZXJTdGF0ZSIsImdldEhhbmd1cFN5c3RlbVN0YXRlIiwiaXNDYWxsZWUiLCJzeXN0ZW1TdGF0ZSIsImlzU3VwcG9ydE1lZGlhU2VydmVyIiwibmF2aUluZm8iLCJ2b2lwQ2FsbEluZm8iLCJzdHJhdGVneSIsInZhbGlkYXRlQml0cmF0ZSIsIm1pbkJpdHJhdGUiLCJtYXhCaXRyYXRlIiwiUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWciLCJSQ0NhbGxQTHVzU3RhdGlzdGljcyIsIl9jb250ZXh0IiwidGFnIiwic2Vzc2lvbiIsImNsaWVudENhbGxJZCIsImludml0ZVNvdXJjZSIsImV4dHJhIiwibm93VGltZSIsImNvbW1vbkRhdGEiLCJEaWFsb2dBY3Rpb24iLCJEaWFsb2dUeXBlIiwiU2VjcmV0Q2FsbFR5cGUiLCJTZWNyZXRDYWxsVHlwZTIiLCJDYWxsVGltZXJFdmVudFR5cGUiLCJSQ0NhbGxJbm5lclNlc3Npb24iLCJFdmVudEVtaXR0ZXIiLCJfY2FsbElkIiwiX3N0YXRlIiwiX2NhbGxUeXBlIiwiX21lZGlhVHlwZSIsIl9zdGFydENhbGxlcklkIiwiX2NhbGxlcklkIiwiX2NhbGxVc2VycyIsImVuYWJsZSIsInVzZXJzIiwiY2hhbmdlZFVzZXJzIiwibmV3VXNlclN0YXRlIiwibmV3U3RhdGVUaW1lIiwibmV3U3lzU3RhdGUiLCJoYXNVc2VyIiwiaSIsIm9sZFN0YXRlVGltZSIsIm9sZFN5c3RlbVN0YXRlIiwib2xkVXNlclN0YXRlIiwiaXNJbnZhbGlkU3lzU3RhdGUiLCJpc0ludmFsaWRVc2VyU3RhdGUiLCJpc0ludmFsaWRPbnBob25lRW5kIiwiZXJyIiwic3RhdGUiLCJ0eXBlIiwidGltZXJJZCIsImlzTG9jYWxDbGllbnRIYW5ndXAiLCJDYWxsU2VydmVyQWN0aW9uIiwidGltZXJTZXRUaW1lb3V0IiwiZnVuYyIsInRpbWVvdXQiLCJzbGVlcCIsIm1pbGxpc2Vjb25kIiwicmVzb2x2ZSIsIm5lZWRSZXRyeUNvZGUiLCJFcnJvckNvZGUiLCJSQ1JUQ0NvZGUiLCJyZXRyeUFzeW5jRm4iLCJhc3luY0ZuIiwiZm5BcmdzIiwiY3VycmVudFJldHJ5VGltZSIsIm1heER1cmF0aW9uIiwiaW50ZXJ2YWxzIiwiaW5kZXgiLCJvbkVycm9yIiwicmVzIiwiaXR2IiwiQ2FsbEhvb2tzVHlwZSIsIlB1Ykludml0ZUNhbGxNaXNzUmVhc29uIiwiUHViSW52aXRlQ2FsbE1pc3NSZWZlciIsIlNpZ25hbFRyYW5zcG9ydGVyIiwiX3J1bnRpbWUiLCJfaW5pdE9wdHMiLCJfdGltZUNvcnJlY3Rpb25lciIsImdldFVVSUQyMiIsImxpc3RlbmVyIiwibXNnIiwidG9Vc2VycyIsInRhcmdldFR5cGUiLCJ0YXJnZXRJZCIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJrZXkiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJLZXkiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJpc0RpcmVjdGx5IiwiY3VycmVudFVJZCIsImN1cnJlbnRVc2VyIiwiZGlhbG9nVHlwZSIsImFjdGlvbiIsImV4dHJhS2V5VmFsIiwiY2FsbFNlc3Npb25Vc2VycyIsInRvRGV2aWNlSWQiLCJjYWxsRGlhbG9nRW50aXR5cyIsInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwidXVpZCIsIkNBTExfREJfTkFNRSIsIkRCX1ZFUlNJT04iLCJsb2dnZXIiLCJfUkNDYWxsSW5kZXhEQiIsInJlcSIsImV2Iiwib2JqTmFtZSIsIl9hIiwidmFsIiwicmVqZWN0IiwiUkNDYWxsSW5kZXhEQiIsIkFibm9ybWFsQ2FsbCIsIm9ialN0b3JlIiwidXNlckFibm9ybWFsQ2FsbElkcyIsImlkIiwiQ2FsbFNlcnZlckV2ZW50VHlwZSIsIlJDQ2FsbFBsdXNJbm5lckNvZGUiLCJUaW1lQ29ycmVjdGlvbmVyIiwiX3NpbmdsZUNhbGxEdXJhdGlvbkV2Iiwic2VydmVyU3RhcnRUaW1lIiwiY3VycmVudFJUVCIsImNsaWVudEZpcnN0RnJhbWVUaW1lIiwiRm9yd2FyZFR5cGUiLCJSQ0NhbGxQbHVzSW52aXRlU291cmNlIiwiUkNDYWxsRGlyZWN0aW9uIiwiQ0FMTF9USU1FX09VVCIsIl9SQ0NhbGxFbmdpbmUiLCJfcmVwb3J0QXBwRXZlbnRNb2R1bGUiLCJjdXJyZW50VXNlcklkIiwiYnVzeWxpbmVVc2VycyIsImludml0ZXJUaW1lcklkIiwic2VsZlN0YXRlIiwiaW52aXRlZXNTdGF0ZSIsImJ1c3lVc2Vyc1N0YXRlIiwiYnVzeVVzZXJJZCIsImludml0ZWRVc2Vyc1N0YXRlIiwiYnVzeWxpbmVVc2Vyc1N0YXRlIiwidHJhbnNhY3Rpb25JZCIsInJlcU1lZGlhVHlwZSIsImNhbGxMb2ciLCJyZXNEYXRhIiwibGlzdCIsInVzZXJTZXNzaW9uU3RhdHVzIiwiY2FsbERpcmVjdGlvbiIsInNlc3Npb25Vc2VycyIsImlubmVyU2Vzc2lvbiIsIm5ld1VzZXJzIiwiaXNJZGxlIiwibm93IiwiZGVsYXlUaW1lIiwic3RyZWFtUmVhZHlUaW1lIiwiY3VycmVudFVzZXJTeXN0ZW1TdGF0ZSIsImhvbGRDYWxsSWQiLCJzdGF0ZVRpbWUiLCJpbnZpdGVVc2VySWQiLCJpbnZpdGVlVGltZXJJZCIsImNhbGxQbHVzU2Vzc2lvbiIsIm90aGVyc1N0YXRlIiwic3RhdHVzVGltZSIsIm90aGVySW52aXRlZE1lbWJlciIsIl9iIiwiX2MiLCJpbnZpdGVkTWVtYmVyIiwidXNlcnNTdGF0ZSIsImNhbGxTZXNzaW9uYVN0YXR1cyIsInNlc3Npb25TdGF0ZSIsInVuTmVlZFVwU3RhdGUiLCJzdGFydENhbGxlcklkIiwiX2QiLCJzZWxmRW5kIiwic3RhdGVzIiwiaXNNYWluU2Vzc2lvbiIsImN1cnJlbnRVc2VyU2F0ZSIsImV2ZW50VGltZSIsImV2ZW50QXJncyIsImV2ZW50VHlwZSIsImZyb21Vc2VySWQiLCJmaXJzdEZyYW1lVGltZSIsInByb21vdGVySWQiLCJyZWFzb24iLCJjdXJyZW50Q2FsbElkIiwib2xkVHJhbnNJZCIsIm9sZEFjdGlvbiIsIk9sZE1lZGlhVHlwZSIsImNoYW5nZU1lZGlhVHlwZVJlc3VsdCIsIl9lIiwiaXNTZWxmSGFuZ3VwIiwiY2xvc2VkU2Vzc2lvbiIsImNydFVzZXJEYXRhIiwiaGFuZ3VwUmVhc29uIiwiaXNOZWVkVXAiLCJpbnZpdGVyVXNlcklkIiwiUkNDYWxsRW5naW5lIiwiUlRDUmVzb3VyY2VUYWciLCJfUlRDTW9kdWxlIiwiZGVmYXVsdFZpZGVvVHJhY2siLCJ0cmFjayIsImRlZmF1bHRBdWRpb1RyYWNrIiwidmlkZW9Db25maWciLCJhdWRpb0NvbmZpZyIsImlzQm9vbGVhbiIsImxvY2FsVHJhY2siLCJyb29tIiwicm9vbVVzZXJzSWQiLCJlcnJvciIsInB1YlBhcmFtcyIsImN1cnJlbnRSb29tSWQiLCJyZWNlbnRUcmFja3MiLCJsb2NhbFRyYWNrcyIsIm5lZWREZXN0cm95VHJhY2siLCJuZXdUcmFjayIsInRyYWNrcyIsIlJUQ01vZGUiLCJzdWJUaW55IiwiYnlTZXJ2ZXIiLCJ1c2VySWRzIiwidmlkZW9UcmFjayIsImF1ZGlvVHJhY2siLCJhdWRpb0xldmVsUmVwb3J0TGlzdCIsInJvb21JZCIsImtpY2tFeHRyYSIsIlJDS2lja1JlYXNvbiIsIm5lZWRTdWJUcmFja3MiLCJpc1RpbnkiLCJyZXBvcnQiLCJzZW5kZXJzIiwicmVjZWl2ZXJzIiwia2luZCIsInBhY2tldHNMb3N0UmF0ZSIsInJ0dCIsInRyYWNrSWQiLCJiaXRyYXRlIiwiaGVscGVyIiwibG9jYWxWaWRlb1RyYWNrIiwibG9jYWxBdWRpb1RyYWNrIiwiUkNMb2NhbFRyYWNrIiwidmlkZW9FbGVtZW50Iiwic3ViUGFyYW1zIiwidW5zdWJUcmFja3MiLCJ2aWRlb1ZpZXciLCJSVENNb2R1bGUiLCJSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIiwiZXZlbnROYW1lIiwiYXR0cnMiLCJoYW5kbGUiLCJpbnZpdGVlVXNlckxpc3QiLCJyZWNvcmQiLCJjYWxsRmlyc3RGcmFtZVRpbWUiLCJhdWRpb0xldmVsIiwiQ2FsbFNlcnZlckVycm9yQ29kZSIsIlJDQ2FsbFBsdXNDbGllbnQiLCJuZXdTZXNzaW9uIiwibWFpblNlc3Npb24iLCJub3RFbXB0eUFycmF5Iiwibm90RW1wdHlTdHJpbmciLCJpc1VuZGVmaW5lZCIsImNmZyIsImZyYW1lUmF0ZSIsImVycm9yTXNnIiwiZ2V0TWVkaWFUcmFja3NDb2RlIiwiZ2V0U2Vzc2lvbkNvZGUiLCJidXN5VXNlcnMiLCJob2xkU2Vzc2lvbiIsImhhbmd1cE1haW5TZXNzaW9uQ29kZSIsIm1haW5TZXNzaW9uQ2FsbElkIiwiaGFuZ3VwU2Vzc2lvbiIsInVzZXJJbmZvIiwib2xkTWVkaWFUeXBlIiwidG9Vc2VySWRzIiwiaXNBZ3JlZSIsInN0YXJ0VGltZXN0YW1wIiwiY291bnQiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJYixjQUFlLE1BSWYsWUFBYSxNQUliLGtCQUFtQixNQUluQixlQUFnQixNQUloQix3QkFBeUIsTUFJekIsa0JBQW1CLE1BSW5CLGdCQUFpQixNQUlqQix1QkFBd0IsTUFJeEIsZ0JBQWlCLE1BSWpCLHFDQUFzQyxNQUl0QyxvQkFBcUIsTUFJckIsY0FBZSxNQUlmLGtCQUFtQixNQUluQix3QkFBeUIsTUFJekIsdUJBQXdCLE1BSXhCLGtCQUFtQixNQUluQixtQkFBb0IsS0FDdEIsRUNoRlksSUFBQUMsR0FBQUEsSUFDVkEsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSwrQ0FBaUQsaURBQ2pEQSxFQUFBLGdEQUFrRCxrREFJbERBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHlDQUEyQywyQ0FDM0NBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxzQ0FBd0Msd0NBQ3hDQSxFQUFBLDBDQUE0Qyw0Q0FJNUNBLEVBQUEsNEJBQThCLDhCQUM5QkEsRUFBQSw0QkFBOEIsOEJBSTlCQSxFQUFBLCtCQUFpQyxpQ0FDakNBLEVBQUEsK0JBQWlDLGlDQUlqQ0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsMkJBQTZCLDZCQUk3QkEsRUFBQSwyQkFBNkIsNkJB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
|
|
1
|
+
(function(f,T){typeof exports=="object"&&typeof module<"u"?T(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],T):(f=typeof globalThis<"u"?globalThis:f||self,T(f.CallPlus={},f.RCEngine,f.RCRTC))})(this,function(f,T,N){"use strict";var ze=Object.defineProperty;var Ze=(f,T,N)=>T in f?ze(f,T,{enumerable:!0,configurable:!0,writable:!0,value:N}):f[T]=N;var I=(f,T,N)=>(Ze(f,typeof T!="symbol"?T+"":T,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(_=>(_.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",_.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",_.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",_.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",_.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",_.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",_.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",_.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",_.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",_.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",_.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",_.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",_.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",_.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",_.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",_.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",_.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",_.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",_.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",_.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",_.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",_.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",_.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",_.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",_.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",_.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",_.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",_.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",_.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",_.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",_.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",_.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",_.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",_.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",_.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",_.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",_.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",_.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",_.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",_.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",_.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",_.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",_.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",_.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",_.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",_.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",_.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",_.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",_.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",_.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",_.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",_.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",_.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",_.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",_.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",_.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",_.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",_.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",_.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",_.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",_.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",_.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",_.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",_.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",_.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",_.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",_.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",_.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",_.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",_.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",_.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",_.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",_.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",_.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",_.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",_.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",_.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",_.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",_.L_TIME_CORRECT_START_O="L-time_correct_start-O",_.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",_.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",_.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",_.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",_.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_T="L-callplus_session_get_create_time-T",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_R="L-callplus_session_get_create_time-R",_.L_CALLPLUS_SESSION_GET_DURATION_T="L-callplus_session_get_duration-T",_.L_CALLPLUS_SESSION_GET_DURATION_R="L-callplus_session_get_duration-R",_.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O="L-callplus_set_android_push_config-O",_))(n||{});class X{constructor(i,e,t){I(this,"_startTime",0);I(this,"_duration",0);I(this,"_callId","");this._session=i,this._callEngine=e,this._logger=t,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(i=>{const{userId:e,userState:t,cameraEnable:s,microphoneEnable:r}=i;return{userId:e,state:t,cameraEnable:s,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_T,"",i),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:t}=await this._callEngine.getCallStaringTime({callId:this._callId},i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,"success",i),this._startTime=t,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_T,"",i),this._duration)return this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,i),{code:a.SUCCESS,duration:this._duration};const{code:e,data:t}=await this._callEngine.getCallTimeInfo(this._callId,i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${t.duration}`,i),this._duration=t.duration,{code:a.SUCCESS,duration:this._duration})}}var P=(_=>(_[_.SINGLE=0]="SINGLE",_[_.MULTI=1]="MULTI",_))(P||{}),h=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ONPHONE=301]="ONPHONE",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(h||{}),m=(_=>(_[_.AUDIO=0]="AUDIO",_[_.AUDIO_VIDEO=1]="AUDIO_VIDEO",_[_.VIDEO=2]="VIDEO",_))(m||{}),y=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ENDED=1e3]="ENDED",_[_.NOANSWER=1001]="NOANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELED=1003]="CANCELED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(y||{}),Y=(_=>(_[_.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",_[_.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",_[_.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",_[_.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",_))(Y||{}),R=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ON_PHONE=301]="ON_PHONE",_[_.ON_PHONE_END=302]="ON_PHONE_END",_[_.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",_[_.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",_[_.ABNORMAL_END=999]="ABNORMAL_END",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",_[_.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",_[_.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",_[_.PUBLISH_ERR=1106]="PUBLISH_ERR",_[_.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",_[_.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",_[_.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",_[_.CONNECTION_ERR=1110]="CONNECTION_ERR",_[_.LOGOUT=1111]="LOGOUT",_[_.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",_[_.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",_[_.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",_[_.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",_[_.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",_[_.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",_[_.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",_[_.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",_[_.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",_[_.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",_[_.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",_[_.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",_[_.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",_))(R||{});class Ie{constructor(i){I(this,"_audioConfig",{});this._logger=i}setDefaultMicrophoneId(i){return this._audioConfig.microphoneId=i,this}setBitrate(i,e){return!T.isNumber(i)||!T.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=i,this._audioConfig.maxBitrate=e,this)}setSampleRate(i){return T.isNumber(i)?(this._audioConfig.sampleRate=i,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${i}`),this)}build(){return this._audioConfig}}class Ce{constructor(i){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=i}setFrameRate(i){return N.RCFrameRate[i]?(this._videoConfig.frameRate=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${i}`),this)}setVideoResolution(i){return N.RCResolution[i]?(this._videoConfig.resolution=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${i}`),this)}setDefaultCameraId(i){return this._videoConfig.cameraId=i,this}setBitrate(i,e){return!T.isNumber(i)||!T.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=i,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const de=_=>{const{callId:i,callType:e,callDir:t,mediaType:s,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:l,duration:S,secretChat:C,syncTime:d,sysStatus:A,crtTime:g}=_;return{callId:i,callType:e,callDirection:t,mediaType:s,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:l,duration:S,syncTimestamp:d,systemState:A,createTimestamp:g}},me=_=>{const{callId:i,callStatus:e}=_,t=[],s=[],r=[],o=[];return _.callSessionUsers.forEach(E=>{const{userId:L,sessionStatus:c,sysStatus:l}=E;switch(c){case h.INVITED:o.push({callId:i,userId:L,userState:c});break;case h.RINGING:t.push({callId:i,fromUserId:L});break;case h.CONNECTING:r.push({fromUserId:L});break;case h.CANCELLED:case h.DECLINED:case h.ENDED:case h.IDLE:s.push({callId:i,fromUserId:L,userState:c,systemState:l});break}}),{ringingData:t,hangupData:s,acceptData:r,otherInvitedData:o}},fe=_=>_&&_.nodeName&&_.nodeName.toUpperCase()==="VIDEO",pe=(_,i)=>{let e=!1;const t=[R.INVITED,R.RINGING,R.BUSYLINE_RINGING,R.BUSYLINE_WAIT,R.CONNECTING,R.ONCALL];switch(_){case R.ONCALL:t.includes(i)&&(e=!0);break}return e},Me=(_,i)=>{let e=!1;const t=[h.INVITED,h.RINGING,h.BUSYLINE_RINGING,h.BUSYLINE_WAIT,h.CONNECTING,h.ONCALL];switch(_){case h.ONCALL:t.includes(i)&&(e=!0);break}return e},De=(_,i)=>{let e;switch(_){case h.CALLING:e=R.CANCELLED;break;case h.RINGING:case h.INVITED:e=R.DECLINED;break;case h.CONNECTING:e=i?R.DECLINED:R.CANCELLED;break;case h.ONCALL:e=R.ENDED;break}return e},re=_=>{const{voipCallInfo:i}=_;if(!i)return!1;const{strategy:e}=JSON.parse(i);return e===1},he=(_,i)=>(_||_===0)&&(!T.isNumber(_)||_<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${_}`}:(i||i===0)&&(!T.isNumber(i)||i<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${i}`}:_&&i&&i<_?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${i}, minBitrate: ${_}, maxBitrate should > minBitrate`}:{code:a.SUCCESS},Ae=_=>{const i=[];for(const e in _){const{videoView:t,isTiny:s}=_[e];i.push({userId:e,videoView:t.nodeName,isTiny:s})}return i},ye=(_={},i={},e)=>{const{threadId:t,apnsCollapseId:s,richMediaUri:r}=_,{channelIdMi:o,channelIdHW:E,channelIdOPPO:L,typeVivo:c,fcmChannelId:l,fcmCollapseKey:S,fcmImageUrl:C,miLargeIconUrl:d,importanceHW:A,categoryHW:g,imageUrlHW:O,categoryVivo:p,importanceHonor:V,imageUrlHonor:U}=i,M={};t&&(M["thread-id"]=t),M["apns-collapse-id"]=s||e,r&&(M.richMediaUri=r);const D={};E&&(D.channelId=E),O&&(D.image=O),g&&(D.category=g),D.importance=A||"NORMAL";const G=[{HW:D},{APNS:M}];let B;(S||C||l)&&(B={},S&&(B.collapse_key=S),C&&(B.imageUrl=C),l&&(B.channelId=l),G[0].FCM=B);let x;(o||d)&&(x={},o&&(x.channelId=o),d&&(x.large_icon_uri=d),G[0].MI=x);let _e;L&&(_e={},_e.channelId=L,G[0].OPPO=_e);let q;(c||p)&&(q={},c&&(q.classification=c),p&&(q.category=p),G[0].VIVO=q);let Q;return(V||U)&&(Q={},V&&(Q.importance=V),U&&(Q.image=U),G[0].HONOR=Q),JSON.stringify(G)},ne=(_,i)=>{const{pushTitle:e="",iOSConfig:t,androidConfig:s,disablePushTitle:r,templateId:o}=_,E={pushConfigs:ye(t,s,i)};return T.isBoolean(r)&&(E.disableTitle=r),e&&(E.title=e),o&&(E.templateId=o),JSON.stringify(E)},oe=_=>{const i=["pushTitle","iOSConfig","androidConfig","disablePushTitle","templateId"];if(!Object.keys(_).every(E=>i.includes(E)))return{code:a.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let E=0;E<i.length;E++){const L=i[E];if(L==="disablePushTitle"){if(!T.isUndefined(_[L])&&!T.isBoolean(_[L]))return{code:a.PARAM_ERROR,errorMsg:`${L} type is boolean`}}else if((L==="pushTitle"||L==="templateId")&&_[L]&&!T.isString(_[L]))return{code:a.PARAM_ERROR,errorMsg:`${L} type is string`}}const{iOSConfig:t,androidConfig:s}=_,r=Pe(t||{});if(r.code!==a.SUCCESS)return r;const o=Ve(s||{});return o.code!==a.SUCCESS?o:{code:a.SUCCESS}},Pe=_=>{const{threadId:i,richMediaUri:e}=_||{};return i&&!T.isString(i)?{code:a.PARAM_ERROR,errorMsg:"iOSConfig.threadId type is string"}:e&&!T.isString(e)?{code:a.PARAM_ERROR,errorMsg:"iOSConfig.richMediaUri type is string"}:{code:a.SUCCESS}},Ve=_=>{const i=["channelIdMi","miLargeIconUrl","channelIdHW","categoryHW","importanceHW","imageUrlHW","channelIdOPPO","typeVivo","categoryVivo","fcmChannelId","fcmCollapseKey","fcmImageUrl","importanceHonor","imageUrlHonor"];if(!Object.keys(_).every(t=>i.includes(t)))return{code:a.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let t=0;t<i.length;t++){const s=i[t];if(s==="importanceHW"||s==="importanceHonor"){if(_[s]&&_[s]!=="LOW"&&_[s]!=="NORMAL")return{code:a.PARAM_ERROR,errorMsg:`androidConfig.${s} value is NORMAL|LOW`}}else if(_[s]&&!T.isString(_[s]))return{code:a.PARAM_ERROR,errorMsg:`androidConfig.${s} type is string`}}return{code:a.SUCCESS}},Ne=(_,i="utf-8")=>{let e=0;return i==="utf-16"?e=ve(_):e=Ge(_),e},ve=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<=65535?i+=2:i+=4;return i},Ge=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<127?i+=1:e<=2047?i+=2:e<=65535?i+=3:i+=4;return i};var J=(_=>(_.L_QS_START_CALL_S="Call-start-S",_.L_QS_ACCEPT_CALL_S="Call-accept-S",_.L_QS_HANGUP_CALL_S="Call-hangup-S",_.L_QS_RECEIVE_CALL_S="Call-recv-S",_.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",_))(J||{});class be{constructor(i,e){this._logger=i,this._context=e}reportStatisticsData(i,e,t,s,r,o,E){const L=+new Date,{mediaType:c,callType:l,callId:S}=s?{mediaType:s.getMediaType(),callType:s.getCallType(),callId:s.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:l,cid:S,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let d=null;switch(i){case J.L_QS_RECEIVE_CALL_S:d={...C,rf:o};break;case J.L_QS_ABNORMAL_HANGUP_S:d={...C};break;default:d={...C,dur:L-t}}this._logger.info("L-call-plus-statistic",JSON.stringify(d),i),this._logger.__statistics(i,JSON.stringify(d))}}var $=(_=>(_.REQUEST="request",_.ACCEPT="accept",_.REFUSE="refuse",_.CANCEL="cancel",_.NOTICE="notice",_.TIMEOUT="timeout",_))($||{}),z=(_=>(_[_.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",_))(z||{}),ae=(_=>(_[_.NORMAL=0]="NORMAL",_[_.SECRET=1]="SECRET",_))(ae||{}),Ee=(_=>(_.INVITER="inviter",_.INVITEE="invitee",_))(Ee||{});class Le extends T.EventEmitter{constructor(e,t,s,r,o,E,L,c){super();I(this,"_reqMediaType");I(this,"_inviterTimerId");I(this,"_inviteeTimerId");I(this,"_oldDialogData");I(this,"isLocalClientHangup",!1);this._callId=e,this._state=t,this._callType=s,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,t,s,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${t}, enable: ${s}`,r);const o=this._callUsers.find(E=>e===E.userId);t===m.AUDIO?o.microphoneEnable=s:o.cameraEnable=s}updateUserList(e,t){const s=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([h.CALLING,h.INVITED,h.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r);else{let l=!1;for(let S=0;S<this._callUsers.length;S++){const{userId:C,stateTime:d,systemState:A,userState:g}=this._callUsers[S];if(C===r.userId){l=!0;const O=pe(A,L),p=Me(g,o),V=L===R.ON_PHONE_END&&A!==R.ON_PHONE&&o!==h.IDLE;if(E&&d&&E<d||O&&p){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:d,oldSystemState:A,oldUserState:g})}; new:${JSON.stringify(r)}`,t)}catch(U){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${U.message}`,t)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,t),this._callUsers[S]=r,!V&&s.push(r);break}}}l||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> nouser push ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r))}}),s}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,t){e==="inviter"?this._inviterTimerId=t:this._inviteeTimerId=t}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var u=(_=>(_.START_SINGLE_CALL="startSingleCall",_.START_GROUP_CALL="startGroupCall",_.INVITE_CALL="inviteCall",_.PUB_INVITE_CALL="pubInviteCall",_.RINGING_CALL="ringCall",_.ACCEPT_CALL="acceptCall",_.JOIN_CALL="joinCall",_.HANGUP_CALL="hangupCall",_.STATUS_UP_CALL="statusUpCall",_.STATUS_DOWN_CALL="statusDownCall",_.EVENT_UP_CALL="eventUpCall",_.EVENT_DOWN_CALL="eventDownCall",_.DIALOG_UP_CALL="dialogUpCall",_.DIALOG_DOWN_CALL="dialogDownCall",_.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",_.SYNC_CALL_LOG="syncCallLog",_.PUB_CALL_LOG="pubCallLog",_.DEL_CALL_LOG="deleteCallLog",_.QRY_CALL_STATE="queryUserHasCall",_.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",_.GET_CALL_STATE_LIST="getUserCallStateList",_.CLEAR_CALL_LOG="cleanCallLog",_.GET_CALL_SESSION="getCallSession",_.GET_CALL_TIME_INFO="getCallTimeInfo",_.END_ABNORMAL_CALL="endUserAbnormalCalls",_.SYS_STATUS_UP="sysStatusUp",_.UP_CALL_LOG_READED="upCallLogReaded",_.PUB_CALL_LOG_READED="pubCallLogReaded",_.PUB_NACK_SEQ_ID="pubNACKSeqId",_.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",_))(u||{});const ce=(_,i)=>setTimeout(_,i),Be=_=>new Promise(i=>{setTimeout(i,_)}),we=[T.ErrorCode.RC_NET_CHANNEL_INVALID,T.ErrorCode.RC_NET_UNAVAILABLE,T.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],Z=async({asyncFn:_,fnArgs:i,currentRetryTime:e=Date.now(),maxDuration:t=60*1e3,intervals:s=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await _(...i),L=2*1e3;return E.code===a.SUCCESS||!we.includes(E.code)||Date.now()+L-e>t?E:(o&&o(E.code),await Be(L),Z({asyncFn:_,fnArgs:i,currentRetryTime:e,maxDuration:t,intervals:s,index:r,onError:o}))};var K=(_=>(_.onBeforePublish="onBeforePublish",_.onPublishRes="onPublishRes",_.onPubInviteCall="onPubInviteCall",_.onPubInviteCallPullKv="onPubInviteCallPullKv",_.onPubInviteCallMiss="onPubInviteCallMiss",_))(K||{}),ie=(_=>(_.NOT_CURRENT_DEVICEID="not current device id",_.SECRET_CALL="secret call",_.NOT_INVITEE="not an invitee",_))(ie||{}),W=(_=>(_.PUB_INVITE="pubinvitecall",_.PULL_KV_INVITE="pullkv_invitecall",_.PUSH="system_pubsh",_))(W||{});class $e extends T.EventEmitter{constructor(e,t,s,r,o){super();I(this,"_listener");I(this,"_needRetryActions",[u.START_SINGLE_CALL,u.START_GROUP_CALL,u.ACCEPT_CALL,u.JOIN_CALL,u.EVENT_UP_CALL]);I(this,"_sessionId","");this._context=e,this._runtime=t,this._initOpts=s,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=T.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,t){const{clientCallId:s,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:l,nickName:S,oldRoomId:C,pushExt:d,extra:A}=e;return r===P.SINGLE?this.startSingleCall({clientCallId:s,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:l,oldRoomId:C,toOrgId:o[0].orgId||"",pushExt:d,extra:A},t):this.startGroupCall({clientCallId:s,toUsers:o,mediaType:E,targetType:c,targetId:l,nickName:S,oldRoomId:C,pushExt:d,extra:A},t)}async startSingleCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),u.START_SINGLE_CALL,e)}async startGroupCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),u.START_GROUP_CALL,e)}async inviteCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.INVITE_CALL,e)}async ringingCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.RINGING_CALL,e)}async acceptCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.ACCEPT_CALL,e)}async joinCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.JOIN_CALL,e)}async hangupCall(e,t){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,t);const{code:s}=await this._sendCallSignal(e.callId,u.HANGUP_CALL,e);return s===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:s}}async statusUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.STATUS_UP_CALL,e)}async eventUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.EVENT_UP_CALL,e)}async dialogUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.DIALOG_UP_CALL,e)}async deleteCallRecord(e,t,s){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(t)}`,s),this._sendCallSignal(e,u.DEL_CALL_LOG,{callIds:t})}async syncCallLog(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.userId,u.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,u.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${t}`,e),this._sendCallSignal(t,u.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,t),this._sendCallSignal(e,u.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${t}`,e),this._sendCallSignal(t,u.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${t}`,e),this._sendCallSignal(t,u.CLEAR_CALL_LOG,null)}async getCallSession(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,t),this._sendCallSignal(e.callId,u.GET_CALL_SESSION,e)}async sysStatusUp(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,u.SYS_STATUS_UP,e)}async upCallLogReaded(e){const t=this._context.getCurrentId();return this._sendCallSignal(t,u.UP_CALL_LOG_READED,e)}_onIMConnectionStateChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,t),this._listener.onIMStateChange(e),e===T.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(t):this._timeCorrectioner.stop(t)}async _sendCallSignal(e,t,s){const r=s?JSON.stringify({...s,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(t)?o=await Z({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,t,r]}):o=await this._context.setCallInfo(e,t,r);const{code:E,data:L}=o;if(E!==T.ErrorCode.SUCCESS)return{code:E};const{key:c,value:l}=L,S=JSON.parse(l).data;return{code:a.SUCCESS,data:S}}_onRecvCallSignal(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,t),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case u.PUB_INVITE_CALL:this._onPubInviteCall(E,!0,t);break;case u.STATUS_DOWN_CALL:this._onStatusDownCall(E,t);break;case u.EVENT_DOWN_CALL:this._onEventDownCall(E,t);break;case u.DIALOG_DOWN_CALL:this._onDialogDownCall(E,t);break;case u.PUB_CALL_LOG:this._onPubCallLog(E,t);break;case u.PUB_CALL_LOG_READED:break;case u.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,t);break}})}_isValidData(e){return!!(T.isNull(e)||T.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,t=!0,s){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,s)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,s)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,s);const r={extra:JSON.stringify(e),reason:ie.NOT_CURRENT_DEVICEID,refer:t?W.PUB_INVITE:W.PULL_KV_INVITE};t?this.emit(K.onPubInviteCallMiss,Object.assign(e,r)):this.emit(K.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,t,s),t?this.emit(K.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(K.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,t){if(e.callSessionUsers=e.callSessionUsers.filter(s=>!!s.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",t),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,t),this._listener.onOtherClientStatusDown(e,t);return}this._listener.onStatusDown(e,t,this._sessionId)}_onEventDownCall(e,t){this._listener.onEventDown(e,t)}_onDialogDownCall(e,t){const{dialogType:s,action:r,extraKeyVal:o}=e;switch(s){case z.SWITCH_MEDIA_TYPE:this._listener.onSwitchMediaType(e,t);break}}_onPubCallLog(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,t),this._listener.onRecvCallEndLog(e,t)}_onConpensationData(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",t);const{callId:s,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:l,callSessionUsers:S,toDeviceId:C,callDialogEntitys:d,extra:A}=e;S.some(O=>O.sessionStatus===h.INVITED&&O.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:s,toDeviceId:C,callType:r,mediaType:o,inviteUserId:l,callingUserId:l,callSessionUsers:S,secretChat:E,extra:A},!0,t):this._onStatusDownCall({callId:s,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:S},t),d.length>0&&d.forEach(O=>this._onDialogDownCall(O,t),this)}}const He=_=>{const i="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=i.length+1;let t=+_;const s=[];do{const r=t%e;t=(t-r)/e,s.unshift(i[r])}while(t);return s.join("")},ke=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,_=>{const i=Math.random()*16|0;return(_==="x"?i:i&3|8).toString(16)}),Fe=()=>{let _=ke();return _=`${_.replace(/-/g,"")}0`,_=parseInt(_,16),_=He(_),_.length>22&&(_=_.slice(0,22)),_},xe="RC_CALLPLUS",Ye=1;let H;const v=class v{constructor(){}static init(i,e){H=i,this.isSupport()||H.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const t=window.indexedDB.open(xe,Ye);t.onerror=s=>{H.warn("[RCCallIndexDB]",`open indexDB req failed -> ${s.target.error}`)},t.onsuccess=s=>{this._db=s.target.result,this._db&&(this._db.onclose=r=>{H.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{H.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{H.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),v._instance=new v,e.onSuccess()},t.onupgradeneeded=s=>{this._db=s.target.result,v.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(i,e){var t;(t=v._db)!=null&&t.objectStoreNames.contains(i)?H.debug("[RCCallIndexDB]",`createObjStore ${i} already exists`):v._db.createObjectStore(i,e)}addValue(i,e){return new Promise((t,s)=>{if(!v._db){t(!1);return}const o=v._db.transaction([i],"readwrite").objectStore(i).add(e);o.onsuccess=()=>{t(!0)},o.onerror=()=>{H.debug("[RCCallIndexDB]","addValue failed"),t(!1)}})}readByKey(i,e){return new Promise((t,s)=>{if(!v._db){t(null);return}const o=v._db.transaction([i]).objectStore(i).get(e);o.onsuccess=()=>{t(o.result)},o.onerror=E=>{H.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),t(null)}})}updateByKey(i,e,t){return new Promise((s,r)=>{if(!v._db){s(!1);return}const E=v._db.transaction([i],"readwrite").objectStore(i).put(t);E.onsuccess=()=>{s(!0)},E.onerror=L=>{s(!1),H.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(i,e){return new Promise((t,s)=>{if(!v._db){t(!1);return}const o=v._db.transaction([i],"readwrite").objectStore(i).delete(e);o.onsuccess=()=>{t(!0)},o.onerror=E=>{t(!1),H.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(v,"_db",null),I(v,"_instance",null);let ee=v;class Je{constructor(i,e){I(this,"_localStore");I(this,"_indexDBStore");I(this,"_storeKey","CallBW_AbnormalCall");I(this,"_isSupportIndexDB");if(this._runtime=i,this._logger=e,this._isSupportIndexDB=ee.isSupport(),this._isSupportIndexDB){ee.init(this._logger,{onSuccess:()=>{this._indexDBStore=ee.getInstance()}});return}this._localStore=i.localStorage}addAbnormallCallId(i,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,i,e)}removeAbnormalCallIds(i,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,i,e)}getAbnormalCallIds(i){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,i)}_addByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s?s.push(e):s=[e],t[i]=s,this._localStore.setItem(this._storeKey,JSON.stringify(t))}catch(t){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${t.message}`)}}_removeByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s&&(s=s.filter(r=>!e.includes(r)),s.length>0?t[i]=s:delete t[i],this._localStore.setItem(this._storeKey,JSON.stringify(t)))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${t.message}`)}}_getByLocalStore(i){let e=null;try{const s=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[i];s&&(e=s)}catch(t){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${t.message}`)}return Promise.resolve(e)}async _addByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t?(t.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:i,callIds:[e]})}catch(t){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${t.message}`)}}async _removeByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t&&(t.callIds=t.callIds.filter(s=>!e.includes(s)),t.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds}):this._indexDBStore.removeByKey(this._storeKey,i))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${t.message}`)}}async _getByIndexDB(i){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,i)}catch(t){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${t.message}`)}return e?e.callIds:null}}var le=(_=>(_[_.PROMPT=0]="PROMPT",_[_.CALL_DURATION=10]="CALL_DURATION",_[_.FIRST_FRAME=20]="FIRST_FRAME",_))(le||{}),w=(_=>(_[_.SUCCESS=0]="SUCCESS",_[_.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",_[_.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",_))(w||{});class Ke{constructor(i,e,t){I(this,"_RTT",0);I(this,"_validMinRTT",200);I(this,"_validMaxRTT",1e3);I(this,"_deltaTime",0);I(this,"_timerId",null);I(this,"_interval",2*1e3);I(this,"_maxRetryTimes",8);I(this,"_startTimes",0);I(this,"_retryTimesInCall",0);I(this,"_maxRetryTimesInCall",3);this._callEngine=i,this._logger=e,this._singleCallDurationEv=t}async getCallClientTimeByServer(i,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${i}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${w.INVALID_RESPONSE_TIME}`,e);const{code:t,data:s}=await this._callEngine.getCallTimeInfo(i,e);if(t!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${t}`,e),{code:t};const{startTime:r}=s,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${w.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:t,duration:L,clientStartTime:o}}calcClientStartTime(i,e,t){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${i}, startTime: ${e}`,t),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${w.INVALID_RESPONSE_TIME}`,t),this._loopCorrectClientTime(i,t),{code:w.INVALID_RESPONSE_TIME};const s=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:s}),t),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(i,t)),{code:w.SUCCESS,clientStartTime:s}}start(i){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(i),this._timerId=ce(()=>{this._timerId=null,this.start(i)},this._interval))}stop(i){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,i),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(i){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,i),!(this._RTT<this._validMinRTT)&&(this.stop(i),this.start(i))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(i){const e=Date.now(),{code:t,data:s}=await this._callEngine.getCallServerTimestamp(i),r=Date.now();if(t!==a.SUCCESS)return{code:t};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(i),this._deltaTime=s-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),i),{code:t,delayTime:this._deltaTime}}async _getDeltaTimeInCall(i,e){const t=Date.now(),{code:s,data:r}=await this._callEngine.getCallTimeInfo(i,e),o=Date.now();if(s!==a.SUCCESS)return{code:s};const E=o-t;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-t-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:i,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:w.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:w.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(i,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${i}`,e);const{code:t,clientStartTime:s,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(i,e);if(t===w.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(i,s,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&t===w.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${w.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(i,s,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(i,e)},this._interval))}}var te=(_=>(_[_.SOON_AFETER=0]="SOON_AFETER",_[_.CURRENT=1]="CURRENT",_))(te||{}),Te=(_=>(_[_.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",_[_.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",_[_.SYSTEM_PUSH=2]="SYSTEM_PUSH",_))(Te||{}),Se=(_=>(_[_.OUT=-1]="OUT",_[_.GROUP=0]="GROUP",_[_.IN=1]="IN",_))(Se||{});const Re=60*1e3,k=class k extends T.EventEmitter{constructor(e,t,s,r,o){super();I(this,"_mainSession",null);I(this,"_holdSessions",[]);I(this,"_signalModule");I(this,"_abnormalModule");I(this,"_isUpFirstFrameTime",!1);I(this,"_callStartMap",{});I(this,"_timeCorrectioner");I(this,"_clientCallId","");this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new Ke(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new $e(e,t,s,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new Je(t,r)}async startCall(e,t){const s=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:l,pushConfig:S,extra:C}=e;this._clientCallId=e.callId;const d=S?ne(S,this._clientCallId):"",{code:A,data:g}=await this._signalModule.startCall({clientCallId:this._clientCallId,callType:r,mediaType:o,toUsers:E,secretChat:ae.NORMAL,targetType:c,targetId:L,oldRoomId:l,pushExt:d,extra:C},t);if(A!==a.SUCCESS)return{code:A};const{callId:O,busylineUsers:p}=g;if(this._abnormalModule.addAbnormallCallId(s,O),this._mainSession=new Le(O,y.INVITED,r,o,s,s,[],this._logger),r===P.SINGLE){const D=this._startTimer(g.callId,h.NO_ANSWER,t);this._mainSession.updateTimerId(Ee.INVITER,D)}const V={userId:s,userState:h.CALLING,systemState:R.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let U=E.map(({userId:D,targetType:G,targetId:B})=>({userId:D,userState:h.INVITED,systemState:R.INVITED,targetType:G,targetId:B,cameraEnable:!1,microphoneEnable:!1})),M=[];return p&&(M=p.map(D=>{const{targetType:G,targetId:B}=U.find(x=>x.userId===D.userId);return{userId:D.userId,userState:D.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:G,targetId:B,cameraEnable:!1,microphoneEnable:!1}}),U=U.filter(({userId:D})=>M.every(({userId:G})=>G!==D))),setTimeout(()=>{this.updateUsersState(O,[V,...U,...M],t)}),{code:A,data:g}}async invite(e,t){var S;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:s,pushConfig:r,extra:o}=e,E=r?ne(r,this._clientCallId):"",L=this._mainSession.getCallId(),{code:c,data:l}=await this._signalModule.inviteCall({callId:L,toUsers:s,pushExt:E,extra:o},t);if(c===a.SUCCESS){this._mainSession.getCallType()===P.SINGLE&&(this._mainSession.updateCallType(P.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),P.MULTI,t));let C=s.map(({userId:A,targetType:g,targetId:O})=>({userId:A,userState:h.INVITED,systemState:R.INVITED,targetType:g,targetId:O,cameraEnable:!1,microphoneEnable:!1})),d=[];l.busylineUsers&&(d=(S=l.busylineUsers)==null?void 0:S.map(A=>{const{targetType:g,targetId:O}=C.find(p=>p.userId===A.userId);return{userId:A.userId,userState:A.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:g,targetId:O,cameraEnable:!1,microphoneEnable:!1}}),C=C.filter(({userId:A})=>d.every(({userId:g})=>g!==A))),this.updateUsersState(L,[...C,...d],t)}return{code:c,data:l}}clearAllTimer(e,t){[this._mainSession,...this._holdSessions].forEach(s=>{s&&s.getCallId()===e&&s.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,t))})}async hangup(e,t){const{callId:s,systemState:r,pushConfig:o}=e,E=o?ne(o,this._clientCallId):"";return this._signalModule.hangupCall({callId:s,sysStatus:r,pushExt:E},t)}async accept(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{callId:s}=e,{code:r}=await this._signalModule.acceptCall({callId:s},t);return this._stopTimer(this._mainSession.getInviteeTimerId(),t),r!==a.SUCCESS?{code:r}:(this._clearMobileOnPhone(e.callId,t),this._mainSession.updateSessionState(y.CONNECTING),{code:r})}async joinCall(e,t){const s=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),t);const{code:r}=await this._signalModule.joinCall({callId:e.callId},t);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(s,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,t):await this._createSessionByServer(e.callId,!0,t),{code:r})}async requestChangeMediaType(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const s={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=Fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:z.SWITCH_MEDIA_TYPE,action:$.REQUEST,extraKeyVal:s},t);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const s=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(s),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:z.SWITCH_MEDIA_TYPE,action:e.agree?$.ACCEPT:$.REFUSE},t)}async cancelChangeMediaType(e,t){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:z.SWITCH_MEDIA_TYPE,action:$.CANCEL},t):{code:a.NOT_IN_CALL}}async getCallLogList(e,t){const s=this._context.getCurrentId(),{code:r,data:o}=await this._signalModule.syncCallLog({userId:s,syncTime:e.timestamp,count:e.count},t);if(r!==a.SUCCESS)return{code:r};const E=o.callLogList.map(L=>de(L));return{code:a.SUCCESS,data:{hasMore:!!(o!=null&&o.hasMore),maxTime:o.maxTime,list:E}}}async deleteCallLog(e,t){const s=this._context.getCurrentId();return this._signalModule.deleteCallRecord(s,e,t)}async getCallServerTimestamp(e){const{code:t,data:s}=await this._signalModule.getCallServerTimestamp(e);return t!==a.SUCCESS?{code:t}:{code:t,data:s.syncTime}}async getCallTimeInfo(e,t){return this._signalModule.getCallTimeInfo(e,t)}async getOpenCallList(e){const t=this._context.getCurrentId(),{code:s,data:r}=await this._signalModule.getUserCallStateList(e);if(s!==a.SUCCESS)return{code:s};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:l,callingUserId:S,callUserIds:C,callStatus:d,crtTime:A,userSessionStatus:g,targetType:O,targetId:p,startTime:V,syncTime:U}=E,M=S===t?Se.OUT:Se.IN,{clientStartTime:D=V}=this._timeCorrectioner.calcClientStartTime(L,V,e);return{callId:L,callType:c,callDirection:M,mediaType:l,callerUserId:S,callUserIds:C,sessionState:d,userState:g,startTimestamp:V,endTimestamp:0,duration:Math.floor((+new Date-D)/1e3),syncTimestamp:U,systemState:0,createTimestamp:A}});return{code:s,data:o}}async removeAllCallLog(e){const{code:t}=await this._signalModule.clearCallRecord(e);return t!==a.SUCCESS?{code:t}:{code:t}}async getCallSession(e,t){const{code:s,data:r}=await this._signalModule.getCallSession(e,t);if(s!==a.SUCCESS)return{code:s};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:l,callSessionUsers:S,startTime:C,duration:d,syncTime:A}=r,g=S.map(O=>{const{userId:p,sessionStatus:V,sysStatus:U,targetType:M,targetId:D}=O;return{userId:p,userState:V,systemState:U,targetType:M,targetId:D,cameraEnable:!1,microphoneEnable:!1}});return{code:s,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:l,callSessionUsers:g,startTime:C,duration:d,syncTime:A}}}getHoldSession(e){const t=this._holdSessions.find(s=>s&&s.getCallId()===e);return t?new X(t,this,this._logger):null}getLocalMainSession(){return this._mainSession?new X(this._mainSession,this,this._logger):null}updateMainSessionState(e){var t;(t=this._mainSession)==null||t.updateSessionState(e)}setIsLocalClientHangup(e){var t;(t=this._mainSession)==null||t.setIsLocalClientHangup(e)}updateUsersState(e,t,s){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(t)}`,s);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=t.map(L=>{const c=r.getUserList().filter(({userId:d})=>d===L.userId)[0]||{},l=L.userState===h.IDLE,{cameraEnable:S=!1,microphoneEnable:C=!1}=l?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:S,microphoneEnable:C}});o.push(...r.updateUserList(E,s))}else o.push(...t);o.length>0&&this._onUserStateChange(e,o,s)}setUserDeviceEnable(e,t,s,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,t,s,r)}async getCallStaringTime(e,t){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,t)}async systemStatusUp(e,t){return this._signalModule.sysStatusUp(e,t)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==P.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const s=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(s+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${s}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:le.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,t,s){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===t){const o=this._mainSession.getUserList().map(L=>{let{userId:c,userState:l,systemState:S,targetType:C,targetId:d}=L;return c===r&&(S=e),{userId:c,sessionStatus:h.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:S,targetType:C,targetId:d}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:y.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,s)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var s;const t=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(s=this._holdSessions.splice(t,1))==null?void 0:s[0]}_onIMStateChange(e){const t=this._logger.createTraceId();let s=0;e===T.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==y.ONCALL&&(s=ce(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",t),this.endCurrentSession(R.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),t)},Re)),e===T.RCConnectionStatus.CONNECTED&&s&&clearTimeout(s)}_handleCallTimeout(e,t,s){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${t}`,s);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,s);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:y.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:l,stateTime:S}=E;let C,d;return L===o?(C=t===h.MISSED?R.MISSED:R.NO_ANSWER,d=t===h.MISSED?h.MISSED:h.NO_ANSWER):(C=t===h.MISSED?R.NO_ANSWER:R.MISSED,d=t===h.MISSED?h.NO_ANSWER:h.MISSED),{userId:L,sessionStatus:d,statusTime:S?S+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:l}})},s)}_startTimer(e,t,s){const r=ce(()=>{this._handleCallTimeout(e,t,s),this._signalModule.statusUpCall({callId:e,sessionStatus:t},s)},Re);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,s),r}_stopTimer(e,t){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,t)}_onInvite(e,t,s){var O,p,V;this._clientCallId=T.getUUID();const r=this._context.getCurrentId(),{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:l,secretChat:S,callingUserId:C,extra:d="{}"}=e;if(S===ae.SECRET){this.emit(K.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:ie.SECRET_CALL,refer:t?W.PUB_INVITE:W.PULL_KV_INVITE}));return}if(l.some(U=>U.userId===r)){this._abnormalModule.addAbnormallCallId(r,o);const U=new Le(o,y.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},s);const M=this._startTimer(o,h.MISSED,s);U.updateTimerId(Ee.INVITEE,M),this._mainSession?(this._holdSessions.push(U),this._mainSession.updateSessionState(y.BUSYLINE_WAIT)):this._mainSession=U;const D=new X(U,this,this._logger);this._reportAppEventModule.onReceivedCall(D,s,JSON.parse(d||"{}").extra);const G=t?Te.PUB_INVITE_CALL:Te.PULL_KV_INVITE_CALL;this.emit(k.__INNER_INVITE__,D,G);const B=l.map(({userId:x,sessionStatus:_e,sysStatus:q,targetType:Q,targetId:Qe,statusTime:Xe})=>({userId:x,userState:_e,systemState:q,targetType:Q,targetId:Qe,stateTime:Xe,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,B,s)}else this.emit(K.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:ie.NOT_INVITEE,refer:t?W.PUB_INVITE:W.PULL_KV_INVITE}));const g=l.filter(U=>U.userId!==r&&U.userId!==E&&U.sessionStatus===h.INVITED);if(g.length>0){((O=this._mainSession)==null?void 0:O.getCallType())===P.SINGLE&&((p=this._mainSession)==null?void 0:p.getCallId())===o&&(this._onCallTypeChange(this._mainSession.getCallId(),P.MULTI,s),(V=this._mainSession)==null||V.updateCallType(P.MULTI));const U=[],M=[];g.forEach(D=>{const{userId:G,sessionStatus:B,sysStatus:x}=D;U.push({callId:o,userId:G,userState:B}),M.push({userId:G,userState:B,systemState:x,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(U),this.updateUsersState(o,M,s)}}_onHangup(e,t,s){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===h.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),s):this._stopTimer(this._mainSession.getInviterTimerId(),s))})}_onAccept(e,t){var L,c,l,S;const s=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[y.CONNECTING,y.ONCALL,y.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===P.SINGLE&&s&&r.includes(s))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((l=this._mainSession)==null?void 0:l.getCallType())===P.SINGLE&&o===E&&e.filter(d=>d.fromUserId!==E)&&this.emit(k.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),t),(S=this._mainSession)==null||S.updateSessionState(y.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),t)}async _onStatusDown(e,t){var A,g;const{callStatus:s,startTime:r,syncTime:o,callId:E}=e;if(E!==((A=this._mainSession)==null?void 0:A.getCallId()))return;if(this._callStartMap[E]=this._callStartMap[E]||{},!this._callStartMap[E].isReceiveCallStartTime&&s===y.ONCALL){this._callStartMap[E].isReceiveCallStartTime=!0;const{code:O,clientStartTime:p}=await this._timeCorrectioner.calcClientStartTime(E,r,t);O===w.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:E,callStartTime:p},t)}let L=!1;const c=this._context.getCurrentId(),l=e.callSessionUsers.map(O=>([h.IDLE,h.DECLINED,h.MISSED,h.NO_ANSWER,h.CANCELLED].includes(O.sessionStatus)&&O.sysStatus!==R.CANCELLED&&O.userId===c&&(L=!0),{userId:O.userId,userState:O.sessionStatus,systemState:O.sysStatus,stateTime:O.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(l.length>0&&this.updateUsersState(E,l,t),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:S,acceptData:C,otherInvitedData:d}=me(e);S.length>0&&this._onHangup(S,e.callStatus,t),C.length>0&&this._onAccept(C,t),d.length>0&&((g=this._mainSession)==null?void 0:g.getCallType())===P.MULTI&&this._onOtherMemberInvite(d),(e.callStatus===y.ENDED||L)&&this.sessionClose(e,t,L)}_onOtherClientStatusDown(e,t){var c,l,S;const s=this._context.getCurrentId(),{callId:r,callSessionUsers:o,callStatus:E}=e,L=o.find(({userId:C})=>C===s);if(L&&(this._mainSession||this._holdSessions.length)){const{userId:C,sessionStatus:d,statusTime:A}=L;if(d===h.CONNECTING){const g=[h.ONCALL,h.CONNECTING],O=((c=this._mainSession)==null?void 0:c.getCallId())===r,p=(S=(l=this._mainSession)==null?void 0:l.getUserList().find(U=>U.userId===s))==null?void 0:S.userState;O&&p&&g.includes(p)||(this.updateUsersState(r,[{userId:C,userState:d,systemState:R.OTHER_CLIENT_ACCEPT,stateTime:A,cameraEnable:!1,microphoneEnable:!1}],t),this.sessionClose(e,t,!1))}}}async _onEventDown(e,t){var c;const{callId:s,eventTime:r,eventArgs:o,eventType:E,fromUserId:L}=e;if(E===le.CALL_DURATION&&s===((c=this._mainSession)==null?void 0:c.getCallId())){const{firstFrameTime:l}=o,{code:S,clientStartTime:C}=await this._timeCorrectioner.calcClientStartTime(s,l,t);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${C}`,t),S===w.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(s,C,t)}}_onRecvSinCallDuration(e,t,s,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:t},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,s,r))}_onSwitchMediaType(e,t){var g,O,p,V,U;const{callId:s,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:l}=o,S=(g=this._mainSession)==null?void 0:g.getCallId();if(s!==S){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${S}, recvCallId: ${s}`,t);return}const{transactionId:C,action:d,mediaType:A}=((O=this._mainSession)==null?void 0:O.getOldDialogData())||{};if(C===E&&d===r&&A===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",t);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${l}`,t),(p=this._mainSession)==null||p.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===$.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},t);else{let M=null;switch(l){case $.CANCEL:M=Y.CANCEL_CHANGE_MEDIA_TYPE;break;case $.ACCEPT:M=Y.SERVER_ALLOW_MEDIA_TYPE,(V=this._mainSession)==null||V.updateMediaType(this._mainSession.getReqMediaType()),(U=this._mainSession)==null||U.updateReqMediaType(null);break;case $.REFUSE:M=Y.REFUSE_CHANGE_MEDIA_TYPE;break;case $.TIMEOUT:M=Y.CHANGE_MEDIA_TYPE_TIMEOUT;break}Y[M]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},M,t)}r===$.NOTICE&&c===m.AUDIO&&!l&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},Y.SERVER_ALLOW_MEDIA_TYPE,t)}_onRecvCallEndLog(e,t){const s=de(e);this._reportAppEventModule.onReceivedCallRecord(s,t)}sessionClose(e,t,s){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(l=>l&&l.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,t);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,t),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(l=>this._stopTimer.bind(this)(l,t)),E.getCallType()===P.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(k.__INNER_SESSION_CLOSE__,r,t);const L=E.getUserList().find(l=>l.userId===o);let c;s&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:R.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new X(E,this,this._logger),c||L.systemState,t),this._removeSession(r)}_removeSession(e){var t;if(e===((t=this._mainSession)==null?void 0:t.getCallId()))this._mainSession=null;else{const s=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(s,1)}}async _createSessionByServer(e,t=!1,s){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,s);const{code:r,data:o}=await this.getCallSession({callId:e},s);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,s);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,s);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:l}=o;this._mainSession=new Le(e,y.CONNECTING,E,L,l,l,[],this._logger),t&&this._clearMobileOnPhone(e,s),this.updateUsersState(e,c,s)}async _clearMobileOnPhone(e,t){const s=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(s&&s.getCallType()===P.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,t);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:R.ON_PHONE_END,forward:te.CURRENT},t);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,t):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,t)}}_onUserStateChange(e,t,s){const r=this._context.getCurrentId();t.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},s)}),t.forEach(({userId:o,systemState:E})=>{o===r&&E===R.ABNORMAL_END&&this.emit(k.__INNER_SESSION_CLOSE__,e,s)})}_onOtherMemberInvite(e){e.forEach(t=>{var E;const{userId:s,callId:r}=t,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([s],o,r)})}_onRequestChangeMediaType(e,t){const{userId:s,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(s,r,o,t)}_receiveMediaTypeChangeResult(e,t,s){t===Y.SERVER_ALLOW_MEDIA_TYPE&&this.emit(k.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,s),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:t},s)}_onCallTypeChange(e,t,s){this._reportAppEventModule.onCallTypeChanged(t,e,s)}};I(k,"__INNER_SESSION_CLOSE__","inner-session-close"),I(k,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(k,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(k,"__INNER_INVITE__","inner-invite");let j=k;var se=(_=>(_.NORMAL="RongCloudRTC",_.SCREEN="ScreenShare",_))(se||{});const b=class b extends T.EventEmitter{constructor(e,t,s,r,o,E){super();I(this,"_rtcClient");I(this,"_localTracks",[]);I(this,"_room",null);I(this,"_callId","");I(this,"_callMediaType");I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_isPubTiny",!1);I(this,"_videoConfigIsChange",!1);I(this,"_audioConfigIsChange",!1);I(this,"_userViewMap",{});I(this,"_callPlusStatusReportListener",null);I(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=s==null?void 0:s.rtcClient,this._isPubTiny=s.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const t=this.getLocalVideoTrack(),{code:s,track:r}=t&&!this._videoConfigIsChange?{track:t,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,s!==a.SUCCESS?{code:s}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const t=this.getLocalAudioTrack(),{code:s,track:r}=t&&!this._audioConfigIsChange?{track:t,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,s!==a.SUCCESS?{code:s}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,t){this._callMediaType=e;const{code:s}=await this.getMicrophoneAudioTrack(t);if(s!==a.SUCCESS)return{code:s};if(e===m.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(t);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(t=>{t.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,t){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,t),T.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",t),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const t=this._localTracks.findIndex(s=>s.getTrackId()===e.getTrackId());this._localTracks.splice(t,1)}async sessionConnected(e,t){var s;this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,t);try{if(!this._room){const{code:r,room:o}=await this.joinRTCRoom(e,t);if(r!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`errCode -> ${r}`,t);return}this._callId=e,this._regRTCListeners(),this._room=o;const E=((s=this._room)==null?void 0:s.getRemoteUserIds())||[];E.length>0&&this._onOtherMemJoined(E.map(L=>({callId:e,userId:L})),t)}}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`callId -> ${e}, err msg -> ${r.message}`,t);return}try{if(this._localTracks.length>0){this.emit(K.onBeforePublish);const r=this._isPubTiny?this._localTracks.map(E=>E.isVideoTrack()?{track:E,isPubTiny:!0}:E):this._localTracks,{code:o}=await this.publish(r,t);this.emit(K.onPublishRes,o)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",t)}catch(r){this._logger.error(n.L_RTC_MODULE_SESSION_CONNECT_R,`publish Exception callId -> ${e}, err msg -> ${r.message}`,t);return}this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,t)}async sessionClose(e,t){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,t),this.destroyAllTracks(t);const s=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===s){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,t);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",t)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",t)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const t=this.getLocalVideoTrack();return t?t.isOwnerMuted()?{code:await t.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const t=[],s=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(se.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(l=>{l.isVideoTrack()?(l.destroy(),c=l):s.push(l)}),this._localTracks=this._localTracks.filter(l=>c&&l.getTrackId()!==c.getTrackId()),t.push(o),s.push(o),this._localTracks=s,this._onLocalTrackReady(t,e),this._room){const{code:l}=await this._room.publish(t);if(l!==N.RCRTCCode.SUCCESS)return{code:l}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,t){if(this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,t),e===m.AUDIO_VIDEO){let s=this.getLocalVideoTrack();if(!s){const{code:E,track:L}=await this._createVideoTrack(t);if(E!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${E}`,t);return}s=L;const{minBitrate:c,maxBitrate:l}=this._videoConfig;(c||l)&&s.setBitrate(l,c)}const r=this._isPubTiny?{track:s,isPubTiny:!0}:s,{code:o}=await this.publish([r],t);if(o!==a.SUCCESS){this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${o}`,t);return}}if(e===m.AUDIO){const s=this.getLocalVideoTrack();if(s){const{code:r}=await this._room.unpublish([s]);r!==N.RCRTCCode.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${r}`,t),this.destroyTrack(s)}}this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",t)}async joinRTCRoom(e,t){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,t);const{code:s,room:r,tracks:o}=await Z({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,T.RTCMode.CALL]});return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${s}`,t),this._onRTCMethodFail(R.JOIN_ROOM_ERR,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",t),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},t),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),t),!this._room)return{code:a.SUCCESS};const{code:s}=await Z({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,s),this._onRTCMethodFail(R.SUBSCRIBE_ERR,t),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",t),{code:a.SUCCESS})}async unsubscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),t),!this._room)return{code:a.SUCCESS};const{code:s}=await this._room.unsubscribe(e);return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",t),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(s=>{e[s]=this._room.getRemoteTracksByUserId(s)}),e}getRemoteTrack(e,t){var s;return(s=this._room)==null?void 0:s.getRemoteTracksByUserId(e).find(r=>t===m.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,t)=>{this._onKickOff(e,this._room.getRoomId(),t),this._releaseStoredData()},onUserJoin:e=>{const t=e.map(r=>({callId:this._callId,userId:r})),s=this._logger.createTraceId();this._onOtherMemJoined(t,s)},onUserLeave:e=>{e.forEach(t=>{delete this._userViewMap[t]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,t){this._reportAppEventModule.onUserMediaAvailable(e,t)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(b.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,t,s,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${t}, byServer: ${e}, state: ${s}, kickExtra: ${JSON.stringify(r)}`);let o=R.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(s){case N.RCKickReason.SERVER_KICK:o=R.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=R.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=R.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=R.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=R.OTHER_CLIENT_LOGIN;break}this.emit(b.__INNER_ON_KICKOFF__,o,t)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(b.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,t){this.emit(b.__INNER_ON_SELF_JOINED__,e.callId,t)}_onRemoteTrackPublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),t);const s=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())s.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];s.push({track:r,subTiny:L})}}),s.length&&this.subscribeTracks(s,t)}async _onTrackUnpublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(s=>s.getTrackId())}),t),await this.unsubscribeTracks(e,t)}_onAudioMuteChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,s)}_onVideoMuteChagne(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,s)}_onRTCStateReport(e){const{senders:t,receivers:s}=e;t.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===m.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),s.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===m.AUDIO_VIDEO&&E==="audio")return;const{userId:l}=N.helper.parseTrackId(o),S={};S[l]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(S)})}_onRTCMethodFail(e,t){this.emit(b.__INNER_RTC_PROCESS_FAILED__,e,t)}_onOtherMemJoined(e,t){this.emit(b.__INNER_ON_OTHER_JOINED__,e,t)}_onDeviceEnableChange(e,t){this.emit(b.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,t)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:t,track:s}=await this._rtcClient.createMicrophoneAudioTrack(se.NORMAL,this._audioConfig);if(t!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${t}`,e),{code:t};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&s.setBitrate(o,r),this._localTracks.push(s),this._onLocalTrackReady([s],e),{code:a.SUCCESS,track:s}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:t,track:s}=await this._rtcClient.createCameraVideoTrack(se.NORMAL,this._videoConfig);if(t!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${t}`,e),{code:t};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&s.setBitrate(o,r),this._localTracks.push(s),this._onLocalTrackReady([s],e),{code:a.SUCCESS,track:s}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isAudioTrack())),e}async publish(e,t){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,t);const{code:s}=await Z({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(R.PUBLISH_ERR,t),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,t),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),t=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([t])}setVideoView(e,t){const s=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const l=(this.getRemoteTracks()[o]||[]).map(S=>({track:S,subTiny:L})).filter(({track:S})=>!S.isSubscribed());s.push(...l)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:Ae(this._userViewMap),needSubTrackIds:s.map(({track:r})=>r.getTrackId())}),t),s.length&&this.subscribeTracks(s,t)}removeVideoView(e,t){const s=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&s.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:Ae(this._userViewMap),unsubTracks:s.map(r=>r.getTrackId())}),t),s.length&&this.unsubscribeTracks(s,t)}getUserViewMap(){return this._userViewMap}async playMedia(e,t,s,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${t}, videoView: ${s==null?void 0:s.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=t===m.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>t===m.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(s);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};I(b,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),I(b,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),I(b,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),I(b,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),I(b,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),I(b,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),I(b,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let F=b;class We{constructor(i){I(this,"_listener");this._logger=i}registerEventListener(i){this._listener=i}async _callAppListener(i,...e){var s;const t=(s=this._listener)==null?void 0:s[i];if(t)try{await t(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:i.getCallId()}),e),this._callAppListener("onReceivedCall",i,t)}onRemoteUserInvited(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:i,inviterUserId:e,callId:t})),this._callAppListener("onRemoteUserInvited",i,e,t)}onCallConnected(i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:i.getCallId()})),this._callAppListener("onCallConnected",i)}onCallTypeChanged(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:i}),t),this._callAppListener("onCallTypeChanged",i,e)}onRemoteUserStateChanged(i,e){const{callId:t,userId:s,userState:r,reason:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:t,userId:s,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",t,s,r,o)}onCallEnded(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:i.getCallId(),closeReason:e}),t),this._callAppListener("onCallEnded",i,e)}onRemoteCameraStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:i}),e),this._callAppListener("onReceivedCallRecord",i)}onReceivedChangeMediaTypeRequest(i,e,t,s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:i,transactionId:e}),s),this._callAppListener("onReceivedChangeMediaTypeRequest",i,e,t)}onReceivedChangeMediaTypeResult(i,e){const{userId:t,transactionId:s,mediaType:r,code:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:t,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:t,transactionId:s,mediaType:r,code:o})}onReceivedCallStartTime(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:i}),e),this._callAppListener("onReceivedCallStartTime",i)}onReceivedCallFirstFrameTime(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:i,callFirstFrameTime:e}),t),this._callAppListener("onReceivedCallFirstFrameTime",i,e)}onUserMediaAvailable(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:i.map(t=>t.getTrackId())}),e),i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?m.AUDIO:m.VIDEO;this._callAppListener("onUserMediaAvailable",s,r)})}onFetchRemoteMediaError(i,e){i.forEach(({track:t})=>{const s=t.getUserId();this._callAppListener("onFetchRemoteMediaError",s,e)})}onUserAudioLevelChanged(i){i.forEach(({track:e,audioLevel:t})=>{const s=e.getUserId();this._callAppListener("onUserAudioLevelChanged",s,t)})}}var Oe=(_=>(_[_.UNKNOW_ERR=41e3]="UNKNOW_ERR",_[_.DB_ERR=41001]="DB_ERR",_[_.JSON_ERR=41002]="JSON_ERR",_[_.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",_[_.MISSING_PARAMS=41004]="MISSING_PARAMS",_[_.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",_[_.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",_[_.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",_[_.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",_[_.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",_[_.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",_[_.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",_[_.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",_[_.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",_[_.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",_[_.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",_[_.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",_[_.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",_[_.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",_[_.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",_[_.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",_[_.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",_[_.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",_))(Oe||{});class ue{constructor(i){I(this,"_androidPushConfig",{});this._logger=i}setChannelIdMi(i){return T.isString(i)?(this._androidPushConfig.channelIdMi=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdMi type is string, value: ${i}`),this)}setMiLargeIconUrl(i){return T.isString(i)?(this._androidPushConfig.miLargeIconUrl=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: miLargeIconUrl type is string, value: ${i}`),this)}setChannelIdHW(i){return T.isString(i)?(this._androidPushConfig.channelIdHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdHW type is string, value: ${i}`),this)}setCategoryHW(i){return T.isString(i)?(this._androidPushConfig.categoryHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryHW type is string, value: ${i}`),this)}setImportanceHW(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHW value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHW=i,this)}setImageUrlHW(i){return T.isString(i)?(this._androidPushConfig.imageUrlHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHW type is string, value: ${i}`),this)}setChannelIdOPPO(i){return T.isString(i)?(this._androidPushConfig.channelIdOPPO=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdOPPO type is string, value: ${i}`),this)}setTypeVivo(i){return T.isString(i)?(this._androidPushConfig.typeVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: typeVivo type is string, value: ${i}`),this)}setCategoryVivo(i){return T.isString(i)?(this._androidPushConfig.categoryVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryVivo type is string, value: ${i}`),this)}setFcmChannelId(i){return T.isString(i)?(this._androidPushConfig.fcmChannelId=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmChannelId type is string, value: ${i}`),this)}setFcmCollapseKey(i){return T.isString(i)?(this._androidPushConfig.fcmCollapseKey=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmCollapseKey type is string, value: ${i}`),this)}setFcmImageUrl(i){return T.isString(i)?(this._androidPushConfig.fcmImageUrl=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmImageUrl type is string, value: ${i}`),this)}setimportanceHonor(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHonor value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHonor=i,this)}setimageUrlHonor(i){return T.isString(i)?(this._androidPushConfig.imageUrlHonor=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHonor type is string, value: ${i}`),this)}build(){return this._androidPushConfig}}const ge=128*1024;class Ue{constructor(i,e,t,s){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_callPlusStatistics");I(this,"_clientCallId","");I(this,"_isLaunchHangup",!1);I(this,"_needHangupCallId",null);I(this,"_callEngine");I(this,"_rtcModule");I(this,"_reportAppEventModule");this._context=i,this._logger=e,this._runtime=t,this._initOpts=s,this._reportAppEventModule=new We(e),this._callPlusStatistics=new be(this._logger,this._context),this._callEngine=new j(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new F(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on(F.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on(F.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on(F.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on(F.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on(F.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on(F.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on(F.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(j.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(j.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(j.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(j.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(J.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(i,e){const t=this._callEngine.getLocalMainSession();if(t){const s=t.getCallId();this._callEngine.systemStatusUp({callId:s,sysStatus:i,forward:te.CURRENT},e),this._callPlusStatistics.reportStatisticsData(J.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,t),this.__innerHangup({callId:s,systemState:i},e)}}_peerConnectionAbnormalClose(i){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:R.CONNECTION_ERR,forward:te.CURRENT},i),this._callEngine.endCurrentSession(R.CONNECTION_ERR,e.getCallId(),i))}async _selfJoinedHandle(i,e){const t=this._context.getCurrentId(),s=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(s);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(t,m.VIDEO,E,e),this._callEngine.setUserDeviceEnable(t,m.AUDIO,L,e);const c=[{userId:t,userState:h.ONCALL,systemState:R.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(i,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(i,e){var r;let t="";const s=i.map(o=>(t=o.callId,{userId:o.userId,userState:h.ONCALL,systemState:R.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(t,s,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==y.ONCALL&&this._callEngine.updateMainSessionState(y.ONCALL)}_receiveFirstFrameHandle(i){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==y.ONCALL&&this._callEngine.updateMainSessionState(y.ONCALL),this._callEngine.upFirstFrameTime(i)}_kickoffHandle(i,e,t){if(i===R.CONNECTION_ERR){this._callEngine.endCurrentSession(i,e,t);return}const s=this._callEngine.getLocalMainSession();if(s){const r=s.getCallId();this._callPlusStatistics.reportStatisticsData(J.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,s,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:i,forward:te.CURRENT},t),this._callEngine.endCurrentSession(i,e,t)}}_receiveDeviceEnableChangeHandle(i,e){i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?m.AUDIO:m.VIDEO;this._callEngine.setUserDeviceEnable(s,r,!t.isOwnerMuted(),e)})}_sessionCloseHandle(i,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(i,e)}setCallPlusEventListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,i?Object.keys(i).join(","):null),this._reportAppEventModule.registerEventListener(i)}setStatusReportListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,i?Object.keys(i).join(","):null),this._rtcModule.setCallPlusStatusReportListener(i)}setVideoView(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:i.map(t=>{const{userId:s,videoElement:r,isTiny:o}=t;return{userId:s,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!T.notEmptyArray(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR};for(let t=0;t<i.length;t++){const s=i[t],{userId:r,videoElement:o}=s;if(!T.notEmptyString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${r}`,e),{code:a.PARAM_ERROR};if(!fe(o))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${o instanceof HTMLElement?o.nodeName:o}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(i,e),{code:a.SUCCESS}}removeVideoView(i){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:i}),e),T.notEmptyArray(i)&&i.every(t=>T.notEmptyString(t))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(i,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR})}async playMedia(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:i,mediaType:e}),t),!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};if(T.isUndefined(m[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,t),{code:a.PARAM_ERROR};if(e===m.AUDIO&&i===this._context.getCurrentId())return this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,"success",t),{code:a.SUCCESS};const{videoView:s}=this._rtcModule.getUserViewMap()[i]||{};return e!==m.AUDIO&&!s?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,t),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(i,e,s,t)}createVideoConfigBuilder(){return new Ce(this._logger)}setVideoConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(i));const{frameRate:e,resolution:t,maxBitrate:s,minBitrate:r}=i;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[t])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${t}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=he(r,s);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...i},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ie(this._logger)}createAndroidPushConfigBuilder(){return new ue(this._logger)}setAudioConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(i));const{sampleRate:e,minBitrate:t,maxBitrate:s}=i;if(e&&!T.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=he(t,s);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...i},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(i,e=P.SINGLE,t=m.AUDIO_VIDEO,s,r){this._clientCallId=T.getUUID();const o=+new Date,E=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${i.join(",")}, callType: ${e}, mediaType: ${t}, pushConfig: ${s}, extra: ${r}`,E),this._context.getConnectionStatus()!==T.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,E),{code:a.SIGNAL_DISCONNECTED};const L=this._context.getNaviInfo();if(!L||!re(L))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,E),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(T.notEmptyArray(i)&&i.every(A=>T.notEmptyString(A))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,E),{code:a.PARAM_ERROR};if(T.isUndefined(P[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,E),{code:a.PARAM_ERROR};if(T.isUndefined(m[t]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${t}`,E),{code:a.PARAM_ERROR};if(s){const A=oe(s);if(A.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, pushConfig is illegal, msg: ${A.errorMsg}`,E),{code:a.PARAM_ERROR}}if(r){if(!T.isString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, extra is illegal, value: ${r}`,E),{code:a.PARAM_ERROR};if(Ne(r)>ge)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,"params err, extra max size is 128KB",E),{code:a.PARAM_ERROR}}if(i.length>1&&e===P.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${i.join(",")}`,E),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,E),{code:a.SESSION_EXIST};const{code:c}=await this._rtcModule.createCallMediaTracks(t,E);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${c}`,E),{code:c};const{code:l,data:S}=await this._callEngine.startCall({toUsers:i.map(A=>({userId:A})),callType:e,mediaType:t,callId:this._clientCallId,pushConfig:s,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:r})},E);if(this._callPlusStatistics.reportStatisticsData(J.L_QS_START_CALL_S,l,o,null,this._clientCallId,null,{mediaType:t,callType:e,callId:(S==null?void 0:S.callId)||""}),l!==a.SUCCESS)return this._rtcModule.destroyAllTracks(E),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${l}`,E),{code:l};const{callId:C,clientCallId:d}=S;return this._needHangupCallId===d?(this._callEngine.clearAllTimer(C,E),this._callEngine.hangup({callId:C},E),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${C} call has been hangup`,E),{code:a.SUCCESS}):(e===P.MULTI&&await this._rtcModule.sessionConnected(C,E),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:S,code:l}),E),{code:a.SUCCESS,callId:C})}async joinMultiCall(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${i}`,e),this._context.getConnectionStatus()!==T.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const t=this._context.getNaviInfo();if(!t||!re(t))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};const{code:s,data:r}=await this._callEngine.getCallSession({callId:i},e);if(s!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${s}`,e),{code:s};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==i)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:i,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(i,e),{code:a.SUCCESS})}async invite(i,e,t){var L;const s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${i.join(",")}, pushConfig: ${e}, extra: ${t}`,s),!(T.notEmptyArray(i)&&i.every(c=>T.notEmptyString(c))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,s),{code:a.PARAM_ERROR};if(e){const c=oe(e);if(c.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, pushConfig is illegal, msg: ${c.errorMsg}`,s),{code:a.PARAM_ERROR}}if(t){if(!T.isString(t))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, extra is illegal, value: ${t}`,s),{code:a.PARAM_ERROR};if(Ne(t)>ge)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,"params err, extra max size is 128KB",s),{code:a.PARAM_ERROR}}const{code:r,data:o}=await this._callEngine.invite({toUsers:i.map(c=>({userId:c})),pushConfig:e,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:t})},s);if(r!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${r}`,s),{code:r};const E=[];return(L=o.busylineUsers)!=null&&L.length&&E.push(...o.busylineUsers.map(c=>({userId:c.userId,state:c.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(E)}`,s),{code:a.SUCCESS,busyUsers:E}}async accept(i){const e=+new Date,t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${i}`,t),this._context.getConnectionStatus()!==T.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,t),{code:a.SIGNAL_DISCONNECTED};const s=this._context.getNaviInfo();if(!s||!re(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,t),{code:a.RTC_SERVICE_UNAVAILABLE};if(!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(i);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,t),{code:a.NOT_IN_CALL};if(i===(o==null?void 0:o.getCallId())){const{code:S}=await this.hangup(r.getCallId());if(S!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${S}`,t),{code:S};this._callEngine.upgradeMainSession(i)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,t);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,t),{code:c};const{code:l}=await this._callEngine.accept({callId:i},t);return this._callPlusStatistics.reportStatisticsData(J.L_QS_ACCEPT_CALL_S,l,e,r),l!==a.SUCCESS?(this._rtcModule.destroyAllTracks(t),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${l}`,t),{code:l}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",t),this._rtcModule.sessionConnected(i,t),{code:a.SUCCESS})}async __innerHangup(i,e){var r;const{callId:t}=i;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(t,e);const{code:s}=await this._callEngine.hangup(i,e);return s===Oe.CALL_NOT_EXIST?{code:a.SUCCESS}:(s===a.SUCCESS&&t===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(t,e),{code:s})}async hangup(i,e){const t=+new Date,s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${i}, pushConfig: ${e}`,s);const r=this._callEngine.getLocalMainSession();if(!r)return{code:a.NOT_IN_CALL};if(i&&!T.isString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${i}`,s),{code:a.PARAM_ERROR};if(e){const A=oe(e);if(A.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, pushConfig is illegal, msg: ${A.errorMsg}`,s),{code:a.PARAM_ERROR}}const o=r.getCallId();if(i&&i!==o&&!this._callEngine.getHoldSession(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${i}`,s),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=i||o;const L=this._callEngine.getHoldSession(this._needHangupCallId)||r,c=this._context.getCurrentId(),l=r.getUserList().filter(A=>A.userId===c)[0].state,S=[r.getCreatorUserId(),r.getInviterUserId()].includes(c),C=De(l,S),{code:d}=await this.__innerHangup({callId:this._needHangupCallId,systemState:C,pushConfig:e},s);return this._callPlusStatistics.reportStatisticsData(J.L_QS_HANGUP_CALL_S,d,t,L,this._clientCallId),d!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${d}`,s),{code:d}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",s),{code:a.SUCCESS})}async requestChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${i}`,e),T.isUndefined(m[i]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${i}`,e),{code:a.PARAM_ERROR};const t=this.getCurrentCallSession(),s=t==null?void 0:t.getMediaType();if(i===s)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=t==null?void 0:t.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:i,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,e),!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:t}=await this._callEngine.cancelChangeMediaType({transactionId:i},e);return t!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,t),!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};if(!T.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,t),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,t),{code:a.NOT_IN_CALL};const{code:s}=await this._callEngine.responseChangeMediaType({transactionId:i,agree:e},t);return s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${s}`,t),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",t),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e,data:t}=await this._callEngine.getOpenCallList(i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(t)}`,i),{code:a.SUCCESS,records:t})}async getCallRecords(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${i}, count: ${e}`,t),!(T.isNumber(i)&&i>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${i}`,t),{code:a.PARAM_ERROR};if(!(T.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,t),{code:a.PARAM_ERROR};const{code:s,data:r}=await this._callEngine.getCallLogList({timestamp:i,count:e},t);return s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${s}`,t),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",t),{code:a.SUCCESS,result:r})}async deleteCallRecordsFromServer(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${i.join(",")}`,e),!(T.notEmptyArray(i)&&i.every(s=>T.notEmptyString(s))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR};const{code:t}=await this._callEngine.deleteCallLog(i,e);return t!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e}=await this._callEngine.removeAllCallLog(i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",i),{code:a.SUCCESS})}async startCamera(){var r;const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.getCameraVideoTrack(i);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.VIDEO,!0,i),!(t!=null&&t.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===y.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,i),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:a.SUCCESS})}const{code:s}=await this._rtcModule.enableVideoTrack(i);return s!==N.RCRTCCode.SUCCESS&&s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${s}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:a.SUCCESS})}async stopCamera(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,i),{code:e}):(this._rtcModule.destroyTrack(t),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.VIDEO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",i),{code:a.SUCCESS})}async switchCamera(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${i}`,e),!T.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};const t=this._callEngine.getLocalMainSession();if(!t)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(t.getMediaType()===m.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=i,this._rtcModule.setVideoConfig(this._videoConfig);const{code:s}=await this._rtcModule.changeVideoDevice(e);return s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${s}`,e),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",i);const{code:e,track:t}=await this._rtcModule.getMicrophoneAudioTrack(i);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.AUDIO,!0,i),!t.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:a.SUCCESS};const s=await t.unmute();return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:a.SUCCESS})}async stopMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",i);const{code:e,track:t}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,i),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.AUDIO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",i),{code:a.SUCCESS})}isMicrophoneEnabled(){const i=this._rtcModule.getLocalAudioTrack();return!!i&&!i.isOwnerMuted()}async setAllRemoteAudioEnable(i){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(i,e)}getVersion(){return"2.0.0"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const je=_=>_?T.isObject(_)?Object.keys(_).includes("rtcClient")?T.isObject(_.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},qe={tag:"RCCallPlus",verify(_){return T.VersionManage.add("plugin-call-plus","2.0.0"),T.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${T.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(_,i,e){const t=je(e);if(!t.isLegal)throw new Error(`[CallPlusLib installer steup]${t.msg}`);const s=_.createLogger("CallPlusLib","RTC"),r=T.isUndefined(e.logOutputLevel)?T.LogL.WARN:e.logOutputLevel;return s.setOutputLevel(r),s.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 2.0.0, Commit: 0ccfc70a4dd193204dbc4ff66f64820e841ba5f2"),new Ue(_,s,i,e)}};Object.defineProperty(f,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(f,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),f.RCAudioConfigBuilder=Ie,f.RCCallPlusAndroidPushConfigBuilder=ue,f.RCCallPlusCallState=y,f.RCCallPlusClient=Ue,f.RCCallPlusCode=a,f.RCCallPlusMediaType=m,f.RCCallPlusMediaTypeChangeResult=Y,f.RCCallPlusReason=R,f.RCCallPlusSession=X,f.RCCallPlusSessionUserState=h,f.RCCallPlusType=P,f.RCVideoConfigBuilder=Ce,f.installer=qe,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2FwaS9jb25zdGFudHMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCA9ICdMLWNhbGxwbHVzX3Nlc3Npb25fZ2V0X2NyZWF0ZV90aW1lLVQnLFxuICBMX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxscGx1c19zZXNzaW9uX2dldF9jcmVhdGVfdGltZS1SJyxcbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneaXtumVv1xuICAgKi9cbiAgTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9UID0gJ0wtY2FsbHBsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiA9ICdMLWNhbGxwbHVzX3Nlc3Npb25fZ2V0X2R1cmF0aW9uLVInLFxuICAvKipcbiAgICog6K6+572u5a6J5Y2T5o6o6YCB6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08gPSAnTC1jYWxscGx1c19zZXRfYW5kcm9pZF9wdXNoX2NvbmZpZy1PJ1xufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxQbHVzVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsSW5uZXJTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5cbi8qKlxuICog5a+55aSWIHNlc3Npb24g5a6e5L6L77yM5LuF5pyJ6I635Y+W5pa55rOV77yM5peg5rOV5L+u5pS5XG4gKi9cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzU2Vzc2lvbiB7XG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2R1cmF0aW9uOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5fY2FsbElkID0gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5Ygc2Vzc2lvbiDnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsVHlwZSgpOiBSQ0NhbGxQbHVzVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0Q2FsbFR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0TWVkaWFUeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Lq65ZGY5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlckxpc3QoKTogeyB1c2VySWQ6IHN0cmluZywgc3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKHVzZXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCB1c2VyU3RhdGUsIGNhbWVyYUVuYWJsZSwgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0gPSB1c2VyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogdXNlclN0YXRlLFxuICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWPkei1t+iAhSB1c2VySWRcbiAgICovXG4gIGdldENyZWF0b3JVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRTdGFydENhbGxlcklkKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6YKA6K+36ICFIHVzZXJJZFxuICAgKiDlkbzlhaXmnInlgLzvvIzlkbzlh7rml7bvvIzlgLzkuLrmnKzlnLDnlKjmiLcgVXNlcklkXG4gICAqL1xuICBnZXRJbnZpdGVyVXNlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53otbflp4vml7bpl7RcbiAgICovXG4gIGFzeW5jIGdldENyZWF0ZVRpbWVzdGFtcCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gY2xpZW50U3RhcnRUaW1lITtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5pe26ZW/XG4gICAqIOmAmuivneacque7k+adn+WJje+8jOWAvOS4uiAwXG4gICAqL1xuICBhc3luYyBnZXREdXJhdGlvbigpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGR1cmF0aW9uPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfSwgZHVyYXRpb246ICR7dGhpcy5fZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24gfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKHRoaXMuX2NhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJTmF2aUluZm8sIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSUFuZHJvaWRQdXNoQ29uZmlnLCBJUkNDYWxsUGx1c1B1c2hDb25maWcsIElpT1NQdXNoQ29uZmlnLCBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdEluZm8sIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCwgSUhhbmd1cEluZm8sIElPdGhlck1lbUluZm8sIElSaW5naW5nSW5mbyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IElTdGF0dXNEb3duQ29udCwgSVN5bmNDYWxsTG9nUmVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG4vKipcbiAqIGNhbGwgc2VydmVyIGxvZyDovazmjaJcbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW4yQ2FsbExvZyA9IChjYWxsTG9nTGlzdDogSVN5bmNDYWxsTG9nUmVzKTogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGNhbGxJZCxcbiAgICBjYWxsVHlwZSxcbiAgICBjYWxsRGlyLFxuICAgIG1lZGlhVHlwZSxcbiAgICBjYWxsaW5nVXNlcklkLFxuICAgIGNhbGxVc2VySWRzLFxuICAgIGNhbGxTdGF0dXMsXG4gICAgc2Vzc2lvblN0YXR1cyxcbiAgICBzdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbixcbiAgICBzZWNyZXRDaGF0LFxuICAgIHN5bmNUaW1lLFxuICAgIHN5c1N0YXR1cyxcbiAgICBjcnRUaW1lLFxuICB9ID0gY2FsbExvZ0xpc3Q7XG4gIHJldHVybiB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXJlY3Rpb246IGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIC8vIGlzU2VjcmV0Q2hhdDogQm9vbGVhbihzZWNyZXRDaGF0KSxcbiAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICBzdGFydFRpbWVzdGFtcDogc3RhcnRUaW1lLFxuICAgIGVuZFRpbWVzdGFtcDogZW5kVGltZSxcbiAgICBkdXJhdGlvbixcbiAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlU3RhdHVzIHtcbiAgcmluZ2luZ0RhdGE6IElSaW5naW5nSW5mb1tdO1xuICBoYW5ndXBEYXRhOiBJSGFuZ3VwSW5mb1tdO1xuICBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdO1xuICBvdGhlckludml0ZWREYXRhOiBJT3RoZXJNZW1JbmZvW107XG59XG5cbi8qKlxuICogcGFyc2VTdGF0dXNcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlU3RhdHVzRGF0YSA9IChkYXRhOiBJU3RhdHVzRG93bkNvbnQpOiBJUGFyc2VTdGF0dXMgPT4ge1xuICBjb25zdCB7IGNhbGxJZCwgY2FsbFN0YXR1cyB9ID0gZGF0YTtcbiAgY29uc3QgcmluZ2luZ0RhdGE6IElSaW5naW5nSW5mb1tdID0gW107XG4gIGNvbnN0IGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW10gPSBbXTtcbiAgY29uc3QgYWNjZXB0RGF0YTogSUFjY2VwdEluZm9bXSA9IFtdO1xuICBjb25zdCBvdGhlckludml0ZWREYXRhOiBJT3RoZXJNZW1JbmZvW10gPSBbXTtcbiAgZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBjb25zdCB7IHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzIH0gPSBpdGVtO1xuICAgIHN3aXRjaCAoc2Vzc2lvblN0YXR1cykge1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgICBvdGhlckludml0ZWREYXRhLnB1c2goe1xuICAgICAgICAgIGNhbGxJZCxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgICAgIC8vIOmAmuefpeWTjemTg1xuICAgICAgICByaW5naW5nRGF0YS5wdXNoKHsgY2FsbElkLCBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgICAvLyDpgJrnn6Xlr7nmlrnlt7LmjqXlkKxcbiAgICAgICAgYWNjZXB0RGF0YS5wdXNoKHsgZnJvbVVzZXJJZDogdXNlcklkIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5ERUNMSU5FRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU6XG4gICAgICAgIGhhbmd1cERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGZyb21Vc2VySWQ6IHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHJpbmdpbmdEYXRhLFxuICAgIGhhbmd1cERhdGEsXG4gICAgYWNjZXB0RGF0YSxcbiAgICBvdGhlckludml0ZWREYXRhLFxuICB9O1xufTtcblxuLyoqXG4gKiDlroPmo4Dmn6XlhYPntKDmmK/lkKbmmK/op4bpopHoioLngrlcbiAqIEBwYXJhbSB7YW55fSBlbGVtZW50IC0g5oKo6KaB5qOA5p+l55qE5YWD57Sg5piv5ZCm5Li66KeG6aKR5YWD57Sg44CCXG4gKiBAcmV0dXJucyDkuIDkuKrluIPlsJTlgLzjgIJcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVmlkZW9Ob2RlTmFtZSA9IChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlTmFtZSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdWSURFTyc7XG5cbi8qKlxuICog5qC55o2u55So5oi35b2T5YmN55qEIHN5c3RlbVN0YXRlIOWSjOaWsOS4i+WPkeeahCBzeXN0ZW1TdGF0ZSzmnaXliKTmlq3mlrAgc3lzdGVtU3RhdGUg5piv5ZCm5peg5pWIXG4gKiDkvovvvJrlvZPliY3nlKjmiLflt7LlnKggY2FsbCDkuK3vvIzlj4jmlLbliLDmraTnlKjmiLfnmoQg5ZON6ZOD44CB6L+e5o6l5LitIOetiVxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTeXNTdGF0ZSA9IChjcnRTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgbmV3U3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24pID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLlJJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQlVTWUxJTkVfV0FJVCxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gIF07XG4gIHN3aXRjaCAoY3J0U3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNSZWFzb24uT05DQUxMOlxuICAgICAgaWYgKGludmFsaWRTdGF0ZXMuaW5jbHVkZXMobmV3U3RhdGUpKSB7XG4gICAgICAgIGlzSW5WYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGlzSW5WYWxpZDtcbn07XG5cbi8qKlxuICAgKiDmoLnmja7nlKjmiLflvZPliY3nmoQgdXNlclN0YXRlIOWSjOaWsOS4i+WPkeeahCB1c2VyU3RhdGUs5p2l5Yik5pat5pawIHVzZXJTdGF0ZSDmmK/lkKbml6DmlYhcbiAgICog5peg5pWI55qE55So5oi354q25oCBXG4gICAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlclN0YXRlID0gKGNydFN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgbmV3U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlKSA9PiB7XG4gIGxldCBpc0luVmFsaWQgPSBmYWxzZTtcbiAgY29uc3QgaW52YWxpZFN0YXRlcyA9IFtcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQlVTWUxJTkVfUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9XQUlULFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICBdO1xuICBzd2l0Y2ggKGNydFN0YXRlKSB7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEw6XG4gICAgICBpZiAoaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICAgICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gKiDojrflj5bmjILmlq3ml7bnmoTkurrlkZjns7vnu5/nirbmgIFcbiAqIEBwYXJhbSB1c2VyU3RhdGUg5Lq65ZGY54q25oCBXG4gKiBAcGFyYW0gaXNDYWxsZWUg5piv5ZCm5piv6KKr5Y+rXG4gKiBAcmV0dXJucyDkurrlkZjns7vnu5/nirbmgIFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhhbmd1cFN5c3RlbVN0YXRlID0gKHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIGlzQ2FsbGVlOiBib29sZWFuKSA9PiB7XG4gIGxldCBzeXN0ZW1TdGF0ZTtcbiAgc3dpdGNoICh1c2VyU3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkc6XG4gICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uQ0FOQ0VMTEVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5SSU5HSU5HOlxuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRDpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5ERUNMSU5FRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gaXNDYWxsZWUgPyBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEIDogUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5FTkRFRDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBzeXN0ZW1TdGF0ZTtcbn07XG5cbi8qKlxuICog5Yik5pat5piv5ZCm5byA5aeL6Z+z6KeG6aKR5pyN5YqhXG4gKi9cbmV4cG9ydCBjb25zdCBpc1N1cHBvcnRNZWRpYVNlcnZlciA9IChuYXZpSW5mbzogSU5hdmlJbmZvKSA9PiB7XG4gIGNvbnN0IHsgdm9pcENhbGxJbmZvIH0gPSBuYXZpSW5mbztcbiAgaWYgKCF2b2lwQ2FsbEluZm8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IHN0cmF0ZWd5IH0gPSBKU09OLnBhcnNlKHZvaXBDYWxsSW5mbyk7XG4gIGlmIChzdHJhdGVneSAhPT0gMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQml0cmF0ZSA9IChtaW5CaXRyYXRlPzogbnVtYmVyLCBtYXhCaXRyYXRlPzogbnVtYmVyKSA9PiB7XG4gIGlmIChtaW5CaXRyYXRlIHx8IG1pbkJpdHJhdGUgPT09IDApIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbkJpdHJhdGUpIHx8IG1pbkJpdHJhdGUgPD0gMCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsIGVycm9yTXNnOiBgcGFyYW1zIGVycm9yIC0+IG1pbkJpdHJhdGU6IGEgbnVtYmVyIG9mID4gMCwgdmFsdWU6ICR7bWluQml0cmF0ZX1gIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG1heEJpdHJhdGUgfHwgbWF4Qml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWF4Qml0cmF0ZSkgfHwgbWF4Qml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttYXhCaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWluQml0cmF0ZSAmJiBtYXhCaXRyYXRlICYmIG1heEJpdHJhdGUgPCBtaW5CaXRyYXRlKSB7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsIGVycm9yTXNnOiBgcGFyYW1zIGVycm9yIC0+IG1heEJpdHJhdGU6ICR7bWF4Qml0cmF0ZX0sIG1pbkJpdHJhdGU6ICR7bWluQml0cmF0ZX0sIG1heEJpdHJhdGUgc2hvdWxkID4gbWluQml0cmF0ZWAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyVmlkZW9WaWV3SW5mbyA9ICh1c2VyVmlld01hcDogeyBbdXNlcklkOiBzdHJpbmddOiB7IHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55OiBib29sZWFuIH0gfSkgPT4ge1xuICBjb25zdCB1c2VyVmlld01hcEluZm8gPSBbXTtcbiAgZm9yIChjb25zdCB1c2VySWQgaW4gdXNlclZpZXdNYXApIHtcbiAgICBjb25zdCB7IHZpZGVvVmlldywgaXNUaW55IH0gPSB1c2VyVmlld01hcFt1c2VySWRdO1xuICAgIHVzZXJWaWV3TWFwSW5mby5wdXNoKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHZpZGVvVmlldzogdmlkZW9WaWV3Lm5vZGVOYW1lLFxuICAgICAgaXNUaW55LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB1c2VyVmlld01hcEluZm87XG59O1xuXG4vKipcbiAqIOeUn+aIkCBwdXNoQ29uZmlncyBKU09OXG4gKiBAZGVzY3JpcHRpb25cbiAqIOS4jiBTZXJ2ZXIg57qm5a6a5LiA6Ie077yMIHRocmVhZElk44CBYXBuc0NvbGxhcHNlSWTjgIFjaGFubmVsSWRNaeOAgWNoYW5uZWxJZEhX44CBY2hhbm5lbElkT1BQT+OAgXR5cGVWaXZvIOaXoOWAvOaXtuWPr+S8oOepuuWtl+espuS4slxuKi9cbmNvbnN0IHB1c2hDb25maWdzVG9KU09OID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcgPSB7fSwgYW5kcm9pZENvbmZpZzogSUFuZHJvaWRQdXNoQ29uZmlnID0ge30sIGNsaWVudENhbGxJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge1xuICAgIHRocmVhZElkLCBhcG5zQ29sbGFwc2VJZCwgcmljaE1lZGlhVXJpLFxuICB9ID0gaU9TQ29uZmlnO1xuICBjb25zdCB7XG4gICAgY2hhbm5lbElkTWksIGNoYW5uZWxJZEhXLCBjaGFubmVsSWRPUFBPLCB0eXBlVml2bywgZmNtQ2hhbm5lbElkLCBmY21Db2xsYXBzZUtleSwgZmNtSW1hZ2VVcmwsXG4gICAgbWlMYXJnZUljb25VcmwsIGltcG9ydGFuY2VIVywgY2F0ZWdvcnlIVywgaW1hZ2VVcmxIVywgY2F0ZWdvcnlWaXZvLCBpbXBvcnRhbmNlSG9ub3IsIGltYWdlVXJsSG9ub3IsXG4gIH0gPSBhbmRyb2lkQ29uZmlnO1xuICBjb25zdCBBUE5TOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICB0aHJlYWRJZCAmJiAoQVBOU1sndGhyZWFkLWlkJ10gPSB0aHJlYWRJZCk7XG4gIEFQTlNbJ2FwbnMtY29sbGFwc2UtaWQnXSA9IGFwbnNDb2xsYXBzZUlkIHx8IGNsaWVudENhbGxJZDtcbiAgcmljaE1lZGlhVXJpICYmIChBUE5TLnJpY2hNZWRpYVVyaSA9IHJpY2hNZWRpYVVyaSk7XG5cbiAgY29uc3QgSFc6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gIGNoYW5uZWxJZEhXICYmIChIVy5jaGFubmVsSWQgPSBjaGFubmVsSWRIVyk7XG4gIGltYWdlVXJsSFcgJiYgKEhXLmltYWdlID0gaW1hZ2VVcmxIVyk7XG4gIGNhdGVnb3J5SFcgJiYgKEhXLmNhdGVnb3J5ID0gY2F0ZWdvcnlIVyk7XG4gIEhXLmltcG9ydGFuY2UgPSBpbXBvcnRhbmNlSFcgfHwgJ05PUk1BTCc7XG5cbiAgY29uc3QgcHVzaENvbmdmaWdzOiBhbnkgPSBbXG4gICAge1xuICAgICAgSFcsXG4gICAgfSxcbiAgICB7XG4gICAgICBBUE5TLFxuICAgIH0sXG4gIF07XG5cbiAgbGV0IEZDTToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChmY21Db2xsYXBzZUtleSB8fCBmY21JbWFnZVVybCB8fCBmY21DaGFubmVsSWQpIHtcbiAgICBGQ00gPSB7fTtcbiAgICBmY21Db2xsYXBzZUtleSAmJiAoRkNNLmNvbGxhcHNlX2tleSA9IGZjbUNvbGxhcHNlS2V5KTtcbiAgICBmY21JbWFnZVVybCAmJiAoRkNNLmltYWdlVXJsID0gZmNtSW1hZ2VVcmwpO1xuICAgIGZjbUNoYW5uZWxJZCAmJiAoRkNNLmNoYW5uZWxJZCA9IGZjbUNoYW5uZWxJZCk7XG4gICAgcHVzaENvbmdmaWdzWzBdLkZDTSA9IEZDTTtcbiAgfVxuXG4gIGxldCBNSToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChjaGFubmVsSWRNaSB8fCBtaUxhcmdlSWNvblVybCkge1xuICAgIE1JID0ge307XG4gICAgY2hhbm5lbElkTWkgJiYgKE1JLmNoYW5uZWxJZCA9IGNoYW5uZWxJZE1pKTtcbiAgICBtaUxhcmdlSWNvblVybCAmJiAoTUkubGFyZ2VfaWNvbl91cmkgPSBtaUxhcmdlSWNvblVybCk7XG4gICAgcHVzaENvbmdmaWdzWzBdLk1JID0gTUk7XG4gIH1cblxuICBsZXQgT1BQTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChjaGFubmVsSWRPUFBPKSB7XG4gICAgT1BQTyA9IHt9O1xuICAgIE9QUE8uY2hhbm5lbElkID0gY2hhbm5lbElkT1BQTztcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uT1BQTyA9IE9QUE87XG4gIH1cblxuICBsZXQgVklWTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmICh0eXBlVml2byB8fCBjYXRlZ29yeVZpdm8pIHtcbiAgICBWSVZPID0ge307XG4gICAgdHlwZVZpdm8gJiYgKFZJVk8uY2xhc3NpZmljYXRpb24gPSB0eXBlVml2byk7XG4gICAgY2F0ZWdvcnlWaXZvICYmIChWSVZPLmNhdGVnb3J5ID0gY2F0ZWdvcnlWaXZvKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uVklWTyA9IFZJVk87XG4gIH1cblxuICBsZXQgSE9OT1I6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBpZiAoaW1wb3J0YW5jZUhvbm9yIHx8IGltYWdlVXJsSG9ub3IpIHtcbiAgICBIT05PUiA9IHt9O1xuICAgIGltcG9ydGFuY2VIb25vciAmJiAoSE9OT1IuaW1wb3J0YW5jZSA9IGltcG9ydGFuY2VIb25vcik7XG4gICAgaW1hZ2VVcmxIb25vciAmJiAoSE9OT1IuaW1hZ2UgPSBpbWFnZVVybEhvbm9yKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uSE9OT1IgPSBIT05PUjtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoQ29uZ2ZpZ3MpO1xufTtcblxuLyoqXG4gKiDmioogcHVzaENvbmZpZyDovazljJbkuLrmnI3liqHnq6/pnIDopoHnmoTmlbDmja5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zU2VydmVyUHVzaEV4dCA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGNsaWVudENhbGxJZDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwdXNoVGl0bGUgPSAnJywgaU9TQ29uZmlnLCBhbmRyb2lkQ29uZmlnLCBkaXNhYmxlUHVzaFRpdGxlLCB0ZW1wbGF0ZUlkLFxuICB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgcHVzaEV4dDogYW55ID0ge1xuICAgIHB1c2hDb25maWdzOiBwdXNoQ29uZmlnc1RvSlNPTihpT1NDb25maWcsIGFuZHJvaWRDb25maWcsIGNsaWVudENhbGxJZCksXG4gIH07XG4gIGlzQm9vbGVhbihkaXNhYmxlUHVzaFRpdGxlKSAmJiAocHVzaEV4dC5kaXNhYmxlVGl0bGUgPSBkaXNhYmxlUHVzaFRpdGxlKTtcbiAgcHVzaFRpdGxlICYmIChwdXNoRXh0LnRpdGxlID0gcHVzaFRpdGxlKTtcbiAgdGVtcGxhdGVJZCAmJiAocHVzaEV4dC50ZW1wbGF0ZUlkID0gdGVtcGxhdGVJZCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoRXh0KTtcbn07XG5cbi8qKlxuICog5qCh6aqMIHB1c2hDb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbmZpZyA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgcHVzaENvbmZpZ0tleXMgPSBbJ3B1c2hUaXRsZScsICdpT1NDb25maWcnLCAnYW5kcm9pZENvbmZpZycsICdkaXNhYmxlUHVzaFRpdGxlJywgJ3RlbXBsYXRlSWQnXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKHB1c2hDb25maWcpLmV2ZXJ5KChrZXkpID0+IHB1c2hDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogYHJpZ2h0IGtleTogJHtwdXNoQ29uZmlnS2V5cy5qb2luKCcsJyl9YCxcbiAgICB9O1xuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHB1c2hDb25maWdLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGtleSA9IHB1c2hDb25maWdLZXlzW2luZGV4XTtcbiAgICAvKipcbiAgICAgKiDmoKHpqowgYm9vbGVhbiDnsbvlnotcbiAgICAgKi9cbiAgICBpZiAoa2V5ID09PSAnZGlzYWJsZVB1c2hUaXRsZScpIHtcbiAgICAgIGlmICghaXNVbmRlZmluZWQocHVzaENvbmZpZ1trZXldKSAmJiAhaXNCb29sZWFuKHB1c2hDb25maWdba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYCR7a2V5fSB0eXBlIGlzIGJvb2xlYW5gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHVzaFRpdGxlJ1xuICAgICAgfHwga2V5ID09PSAndGVtcGxhdGVJZCcpIHtcbiAgICAgIC8qKlxuICAgICAgICog5qCh6aqMIHN0cmluZyDnsbvlnotcbiAgICAgICAqL1xuICAgICAgaWYgKHB1c2hDb25maWdba2V5XSAmJiAhaXNTdHJpbmcocHVzaENvbmZpZ1trZXldKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgeyBpT1NDb25maWcsIGFuZHJvaWRDb25maWcgfSA9IHB1c2hDb25maWc7XG5cbiAgLyoqXG4gICAqIOagoemqjCBpT1NDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnUmVzID0gdmFsaWRhdGVJT1NDb25maWcoaU9TQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlSU9TQ29uZmlnUmVzLmNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJT1NDb25maWdSZXM7XG4gIH1cblxuICAvKipcbiAgICog5qCh6aqMIGFuZHJvaWRDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyA9IHZhbGlkYXRlQW5kcm9pZENvbmZpZyhhbmRyb2lkQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlQW5kcm9pZENvbmZpZ1Jlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcztcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyB0aHJlYWRJZCwgcmljaE1lZGlhVXJpIH0gPSBpT1NDb25maWcgfHwge307XG4gIGlmICh0aHJlYWRJZCAmJiAhaXNTdHJpbmcodGhyZWFkSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcudGhyZWFkSWQgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cblxuICBpZiAocmljaE1lZGlhVXJpICYmICFpc1N0cmluZyhyaWNoTWVkaWFVcmkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcucmljaE1lZGlhVXJpIHR5cGUgaXMgc3RyaW5nJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZyA9IChhbmRyb2lkQ29uZmlnOiBhbnkpID0+IHtcbiAgY29uc3QgYW5kcm9pZENvbmZpZ0tleXMgPSBbJ2NoYW5uZWxJZE1pJywgJ21pTGFyZ2VJY29uVXJsJywgJ2NoYW5uZWxJZEhXJywgJ2NhdGVnb3J5SFcnLCAnaW1wb3J0YW5jZUhXJywgJ2ltYWdlVXJsSFcnLCAnY2hhbm5lbElkT1BQTycsICd0eXBlVml2bycsICdjYXRlZ29yeVZpdm8nLCAnZmNtQ2hhbm5lbElkJywgJ2ZjbUNvbGxhcHNlS2V5JywgJ2ZjbUltYWdlVXJsJywgJ2ltcG9ydGFuY2VIb25vcicsICdpbWFnZVVybEhvbm9yJ107XG4gIGNvbnN0IGtleUlzUmlnaHQgPSBPYmplY3Qua2V5cyhhbmRyb2lkQ29uZmlnKS5ldmVyeSgoa2V5KSA9PiBhbmRyb2lkQ29uZmlnS2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgaWYgKCFrZXlJc1JpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7YW5kcm9pZENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhbmRyb2lkQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBhbmRyb2lkQ29uZmlnS2V5c1tpbmRleF07XG4gICAgaWYgKGtleSA9PT0gJ2ltcG9ydGFuY2VIVycgfHwga2V5ID09PSAnaW1wb3J0YW5jZUhvbm9yJykge1xuICAgICAgaWYgKGFuZHJvaWRDb25maWdba2V5XSAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdMT1cnICYmIGFuZHJvaWRDb25maWdba2V5XSAhPT0gJ05PUk1BTCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHZhbHVlIGlzIE5PUk1BTHxMT1dgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYW5kcm9pZENvbmZpZ1trZXldICYmICFpc1N0cmluZyhhbmRyb2lkQ29uZmlnW2tleV0pKSB7XG4gICAgICAvKipcbiAgICAgICAqIOagoemqjCBzdHJpbmcg57G75Z6LXG4gICAgICAgKi9cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCeXRlTGVuZ3RoID0gKHN0cjogc3RyaW5nLCBjaGFyc2V0OiBzdHJpbmcgPSAndXRmLTgnKSA9PiB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGlmIChjaGFyc2V0ID09PSAndXRmLTE2Jykge1xuICAgIHRvdGFsID0gY2FsY3VsYXRlVVRGMTZCeXRlTGVuZ3RoKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgdG90YWwgPSBjYWxjdWxhdGVVVEY4Qnl0ZUxlbmd0aChzdHIpO1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn07XG5cbmNvbnN0IGNhbGN1bGF0ZVVURjE2Qnl0ZUxlbmd0aCA9IChzdHI6IHN0cmluZykgPT4ge1xuICBsZXQgdG90YWwgPSAwOyBsZXQgY2hhdENvZGU6IG51bWJlcjtcbiAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHN0ci5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNoYXRDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxuY29uc3QgY2FsY3VsYXRlVVRGOEJ5dGVMZW5ndGggPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgbGV0IHRvdGFsID0gMDsgbGV0IGNoYXRDb2RlOiBudW1iZXI7XG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBzdHIubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICBjaGF0Q29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaGF0Q29kZSA8IDB4MDA3Zikge1xuICAgICAgdG90YWwgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4MDdmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm91c2VyIHB1c2ggJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICB0aGlzLl9jYWxsVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkVXNlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0T2xkRGlhbG9nRGF0YShkYXRhOiBJT2xkRGlhbG9nRGF0YSkge1xuICAgIHRoaXMuX29sZERpYWxvZ0RhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICog5pu05pawIHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgJror53nsbvlnovvvIjljYfpmY3nuqforr7nva7vvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDYWxsVHlwZShjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUpIHtcbiAgICB0aGlzLl9jYWxsVHlwZSA9IGNhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6K+35rGC55qE5aqS5L2T57G75Z6L77yI5Y2H6ZmN57qn77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUmVxTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXFNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05pawIGludnRlciB0aW1lciBpZFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVRpbWVySWQodHlwZTogQ2FsbFRpbWVyRXZlbnRUeXBlLCB0aW1lcklkOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZSA9PT0gQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURVIpIHtcbiAgICAgIHRoaXMuX2ludml0ZXJUaW1lcklkID0gdGltZXJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW52aXRlZVRpbWVySWQgPSB0aW1lcklkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZcbiAgICovXG4gIHB1YmxpYyBnZXRPbGREaWFsb2dEYXRhKCk6IElPbGREaWFsb2dEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fb2xkRGlhbG9nRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mmK/lkKbmmK/lt7Hnq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXAgPSBpc0xvY2FsQ2xpZW50SGFuZ3VwO1xuICB9XG5cbiAgcHVibGljIGdldElzTG9jYWxDbGllbnRIYW5ndXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckFjdGlvbiB7XG4gIC8qKlxuICAgKiDlvIDlp4vljZXkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX1NJTkdMRV9DQUxMID0gJ3N0YXJ0U2luZ2xlQ2FsbCcsXG4gIC8qKlxuICAgKiDlvIDlp4vlpJrkurrlkbzlj6tcbiAgICovXG4gIFNUQVJUX0dST1VQX0NBTEwgPSAnc3RhcnRHcm91cENhbGwnLFxuICAvKipcbiAgICog6YKA6K+35aW95Y+L5Yqg5YWl6YCa6K+dXG4gICAqL1xuICBJTlZJVEVfQ0FMTCA9ICdpbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOS4i+WPkemCgOivt+mAmuivneaVsOaNrlxuICAgKi9cbiAgUFVCX0lOVklURV9DQUxMID0gJ3B1Ykludml0ZUNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HX0NBTEwgPSAncmluZ0NhbGwnLFxuICAvKipcbiAgICog5o6l5Y+X6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FMTCA9ICdhY2NlcHRDYWxsJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnVxuICAgKi9cbiAgSk9JTl9DQUxMID0gJ2pvaW5DYWxsJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgSEFOR1VQX0NBTEwgPSAnaGFuZ3VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIrmiqVcbiAgICovXG4gIFNUQVRVU19VUF9DQUxMID0gJ3N0YXR1c1VwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIvlj5FcbiAgICovXG4gIFNUQVRVU19ET1dOX0NBTEwgPSAnc3RhdHVzRG93bkNhbGwnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBFVkVOVF9VUF9DQUxMID0gJ2V2ZW50VXBDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4i+WPkVxuICAgKi9cbiAgRVZFTlRfRE9XTl9DQUxMID0gJ2V2ZW50RG93bkNhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiK6KGMXG4gICAqL1xuICBESUFMT0dfVVBfQ0FMTCA9ICdkaWFsb2dVcENhbGwnLFxuICAvKipcbiAgICog5a+56K+d5pWw5o2u5LiL6KGMXG4gICAqL1xuICBESUFMT0dfRE9XTl9DQUxMID0gJ2RpYWxvZ0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOiOt+WPlueUqOaIt+S8muivneaVsOaNruWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfVVNFUl9TRVNTSU9OX0xJU1QgPSAnZ2V0Q2FsbFVTZXJTZXNzaW9uTGlzdCcsXG4gIC8qKlxuICAgKiDml6Xlv5forrDlvZXlkIzmraVcbiAgICovXG4gIFNZTkNfQ0FMTF9MT0cgPSAnc3luY0NhbGxMb2cnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5LiL5Y+RXG4gICAqL1xuICBQVUJfQ0FMTF9MT0cgPSAncHViQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53orrDlvZVcbiAgICovXG4gIERFTF9DQUxMX0xPRyA9ICdkZWxldGVDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+W3suacieeahCBjYWxsIOeKtuaAgVxuICAgKi9cbiAgUVJZX0NBTExfU1RBVEUgPSAncXVlcnlVc2VySGFzQ2FsbCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbFNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIFFSWV9TUlZfVElNRVNUQU1QID0gJ2dldENhbGxTcnZUaW1lU3RhbXAnLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55So5oi36L+b6KGM55qEIGNhbGwg5YiX6KGoXG4gICAqL1xuICBHRVRfQ0FMTF9TVEFURV9MSVNUID0gJ2dldFVzZXJDYWxsU3RhdGVMaXN0JyxcbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+mAmuivneiusOW9lVxuICAgKi9cbiAgQ0xFQVJfQ0FMTF9MT0cgPSAnY2xlYW5DYWxsTG9nJyxcbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOS8muivneS/oeaBr1xuICAgKi9cbiAgR0VUX0NBTExfU0VTU0lPTiA9ICdnZXRDYWxsU2Vzc2lvbicsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDml7bpl7Tkv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1RJTUVfSU5GTyA9ICdnZXRDYWxsVGltZUluZm8nLFxuICAvKipcbiAgICog57uT5p2f5b2T5YmN55So5oi35byC5bi455qEY2FsbFNlc3Npb24o5YyF5ZCr5ZCE5Liq6Zi25q61Ke+8jOS4u+imgeeUqOS6juW6lOeUqOW8guW4uOmAgOWHuuWGjeWQr+WKqOOAgeWQhOenjemAmuivneW8guW4uOW9k+S4reOAgumFjOaDheiwg+eUqFxuICAgKi9cbiAgRU5EX0FCTk9STUFMX0NBTEwgPSAnZW5kVXNlckFibm9ybWFsQ2FsbHMnLFxuICAvKipcbiAgICog55So5oi357O757uf54q25oCB5LiK5oqlXG4gICAqL1xuICBTWVNfU1RBVFVTX1VQID0gJ3N5c1N0YXR1c1VwJyxcbiAgLyoqXG4gICAqIOS4iuaKpemAmuivneiusOW9leW3suivu+eKtuaAgVxuICAgKi9cbiAgVVBfQ0FMTF9MT0dfUkVBREVEID0gJ3VwQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFBVQl9DQUxMX0xPR19SRUFERUQgPSAncHViQ2FsbExvZ1JlYWRlZCcsXG4gIC8qKlxuICAgKiDkuIvlj5HkuIvooYzkv6Hku6TmlbDmja7luo/lj7dJZCDvvIjlvLHnvZHooaXlgb/mlrnms5XvvIznp7vliqjnq6/lt7Llrp7njrDvvIxQQyDmnKrlrp7njrDvvIlcbiAgICovXG4gIFBVQl9OQUNLX1NFUV9JRCA9ICdwdWJOQUNLU2VxSWQnLFxuICAvKipcbiAgICog5p+l6K+i5b2T5YmN55So5oi35Y+C5LiO55qE5pyq57uT5p2f55qEY2FsbFNlc3Npb27nmoRDYWxsSWTliJfooajvvIxncm91cOS4k+eUqO+8jOWPr+WcqGdyb3VwY2FsbOe7k+adn+aXtu+8jOihpeWBv+WQhOerr+eahOW/q+aNt+WFpeWPo+aYr+WQpua2iOWkseeahOWIpOaWrVxuICAgKi9cbiAgR0VUX1VTRVJfQ0FMTF9TRVNTSU9OX0lEX0xJU1QgPSAnZ2V0VXNlckNhbGxTZXNzaW9uSWRMaXN0J1xufVxuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgdGltZXJJbnRlcnZhbCA9IChmdW46IEZ1bmN0aW9uLCBpdHY6IG51bWJlcik6IG51bWJlciA9PiBzZXRJbnRlcnZhbChmdW4sIGl0dikgYXMgbnVtYmVyO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobWlsbGlzZWNvbmQ6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZCk7XG59KTtcbiIsImltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ29kZSB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBDYWxsU2VydmVyRXJyb3JDb2RlIH0gZnJvbSAnLi4vZW51bXMvQ2FsbFNlcnZlckVycm9yQ29kZSc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcblxuZXhwb3J0IHR5cGUgVFJldHJ5RXJyb3JDb2RlID0gQ2FsbFNlcnZlckVycm9yQ29kZSB8IFJDUlRDQ29kZSB8IG51bWJlciB8IEVycm9yQ29kZVxuZXhwb3J0IGludGVyZmFjZSByZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICog6KaB6YeN6K+V55qE5byC5q2l5Ye95pWwXG4gICAqL1xuICBhc3luY0ZuOiBGdW5jdGlvbjtcbiAgLyoqXG4gICAqIOWHveaVsOeahOWPguaVsFxuICAgKi9cbiAgZm5BcmdzOiBhbnlbXTtcbiAgLyoqXG4gICAqIOW9k+WJjemHjeivleaXtumXtOaIs1xuICAgKi9cbiAgY3VycmVudFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleaXtumVv1xuICAgKi9cbiAgbWF4RHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmoq/luqbph43or5Xpl7TpmpRcbiAgICovXG4gIGludGVydmFscz86IG51bWJlcltdO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqU5pWw57uE5LiL5qCHXG4gICAqL1xuICBpbmRleD86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuY29uc3QgbmVlZFJldHJ5Q29kZTogVFJldHJ5RXJyb3JDb2RlW10gPSBbXG4gIC8qKlxuICAgKiBJTSDlupXlsYLov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIEVycm9yQ29kZS5SQ19ORVRfQ0hBTk5FTF9JTlZBTElELFxuICBFcnJvckNvZGUuUkNfTkVUX1VOQVZBSUxBQkxFLFxuICBFcnJvckNvZGUuUkNfTVNHX1JFU1BfVElNRU9VVCxcbiAgLyoqXG4gICAqIFJUQyDov5Tlm57pnIDopoHph43or5XnmoTplJnor6/noIFcbiAgICovXG4gIFJDUlRDQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVELFxuICBSQ1JUQ0NvZGUuUkVRVUVTVF9GQUlMRUQsXG5cbl07XG5cbi8qKlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5hc3luY0ZuIOimgemHjeivleeahOW8guatpeWHveaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5mbkFyZ3Mg5Ye95pWw55qE5Y+C5pWwXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmN1cnJlbnRSZXRyeVRpbWUg5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLm1heER1cmF0aW9uIOacgOWkp+mHjeivleaXtumVv1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbnRlcnZhbHMg5qKv5bqm6YeN6K+V6Ze06ZqUXG4gKiBAcGFyYW0gcmV0cnlPcHRpb25zLmluZGV4IOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICovXG5leHBvcnQgY29uc3QgcmV0cnlBc3luY0ZuID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gRGF0ZS5ub3coKSxcbiAgbWF4RHVyYXRpb24gPSA2MCAqIDEwMDAsXG4gIGludGVydmFscyA9IFsyICogMTAwMCwgNCAqIDEwMDAsIDggKiAxMDAwLCAxNiAqIDEwMDAsIDMyICogMTAwMCwgNjQgKiAxMDAwXSxcbiAgaW5kZXggPSAwLFxuICBvbkVycm9yLFxufTogcmV0cnlPcHRpb25zKTogUHJvbWlzZTxSPiA9PiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGFzeW5jRm4oLi4uZm5BcmdzKTtcbiAgLy8gY29uc3QgaXR2ID0gaW50ZXJ2YWxzW2luZGV4XSB8fCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdXG4gIC8vIGluZGV4KytcbiAgLy8gaXR2IOWGmeatuyAyMDAwIG1zICzlkI7nu63pnIDopoHlho3mlL7lvIDmoq/luqbph43or5VcbiAgY29uc3QgaXR2ID0gMiAqIDEwMDA7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSlcbiAgICB8fCAoKERhdGUubm93KCkgKyBpdHYgLSBjdXJyZW50UmV0cnlUaW1lKSA+IG1heER1cmF0aW9uKTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc3luY0ZuKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4RHVyYXRpb24sXG4gICAgICBpbnRlcnZhbHMsXG4gICAgICBpbmRleCxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlCeVRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5XmrKHmlbAsIOm7mOiupCAyIOasoVxuICAgKi9cbiAgbWF4UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog6YeN6K+V5aSx6LSl55qE5Zue6LCDXG4gICAqL1xuICBvbkVycm9yPzogKGNvZGU6IFRSZXRyeUVycm9yQ29kZSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcmV0cnlBc255Y0ZuQnlUaW1lID0gYXN5bmMgPFIgZXh0ZW5kcyB7Y29kZTogVFJldHJ5RXJyb3JDb2RlfT4gKHtcbiAgYXN5bmNGbixcbiAgZm5BcmdzLFxuICBjdXJyZW50UmV0cnlUaW1lID0gMCxcbiAgbWF4UmV0cnlUaW1lID0gMixcbiAgb25FcnJvcixcbn06IHJldHJ5QnlUaW1lT3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjdXJyZW50UmV0cnlUaW1lKys7XG4gIGNvbnN0IGlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSA9IChyZXMuY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTU1xuICAgIHx8ICFuZWVkUmV0cnlDb2RlLmluY2x1ZGVzKHJlcy5jb2RlKSkgfHwgY3VycmVudFJldHJ5VGltZSA+IG1heFJldHJ5VGltZTtcblxuICBpZiAoIWlzTmVlZFJlc29sdmVJbW1lZGlhdGVseSkge1xuICAgIG9uRXJyb3IgJiYgb25FcnJvcihyZXMuY29kZSk7XG4gICAgYXdhaXQgc2xlZXAoaXR2KTtcbiAgICByZXR1cm4gcmV0cnlBc255Y0ZuQnlUaW1lKHtcbiAgICAgIGFzeW5jRm4sXG4gICAgICBmbkFyZ3MsXG4gICAgICBjdXJyZW50UmV0cnlUaW1lLFxuICAgICAgbWF4UmV0cnlUaW1lLFxuICAgICAgb25FcnJvcixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCB7IElQdWJJbnZpdGVDb24gfSBmcm9tICcuL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbmV4cG9ydCBlbnVtIENhbGxIb29rc1R5cGUge1xuICBvbkJlZm9yZVB1Ymxpc2ggPSAnb25CZWZvcmVQdWJsaXNoJyxcbiAgb25QdWJsaXNoUmVzID0gJ29uUHVibGlzaFJlcycsXG4gIG9uUHViSW52aXRlQ2FsbCA9ICdvblB1Ykludml0ZUNhbGwnLFxuICBvblB1Ykludml0ZUNhbGxQdWxsS3YgPSAnb25QdWJJbnZpdGVDYWxsUHVsbEt2JyxcbiAgb25QdWJJbnZpdGVDYWxsTWlzcyA9ICdvblB1Ykludml0ZUNhbGxNaXNzJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiB7XG4gIE5PVF9DVVJSRU5UX0RFVklDRUlEID0gJ25vdCBjdXJyZW50IGRldmljZSBpZCcsXG4gIFNFQ1JFVF9DQUxMID0gJ3NlY3JldCBjYWxsJyxcbiAgTk9UX0lOVklURUUgPSAnbm90IGFuIGludml0ZWUnXG59XG5cbmV4cG9ydCBlbnVtIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIge1xuICBQVUJfSU5WSVRFID0gJ3B1Ymludml0ZWNhbGwnLFxuICBQVUxMX0tWX0lOVklURSA9ICdwdWxsa3ZfaW52aXRlY2FsbCcsXG4gIFBVU0ggPSAnc3lzdGVtX3B1YnNoJ1xufVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbEluZm8gPSBJUHViSW52aXRlQ29uICYgeyBleHRyYTogc3RyaW5nfVxuXG5leHBvcnQgdHlwZSBJUHViSW52aXRlQ2FsbE1pc3NJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHJlZmVyOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyfVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBnZXRVVUlEMjIsIElSdW50aW1lLCBpc051bGwsIGlzU3RyaW5nLCBsb2dnZXIsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckFjdGlvbiB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24nO1xuaW1wb3J0IHtcbiAgSUFjY2VwdENhbGxDb24sXG4gIElCYXNlU2luZ2FsQ29uLFxuICBJQ2xlYXJDYWxsTG9nUmVzLFxuICBJQ29ucGVuc2F0aW9uRGF0YSxcbiAgSURpYWxvZ0Rvd25DYWxsQ29uLFxuICBJRGlhbG9nVXBDYWxsQ29uLFxuICBJRXZlbnREb3duQ2FsbENvbixcbiAgSUV2ZW50VXBDYWxsQ29uLFxuICBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXMsXG4gIElHZXRDYWxsVGltZUluZm9SZXMsXG4gIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcyxcbiAgSUhhbmd1cENhbGxDb24sXG4gIElJbnZpdGVDYWxsQ29uLFxuICBJSW52aXRlQ2FsbFJlcyxcbiAgSUpvaW5DYWxsQ29uLFxuICBJUHViQ2FsbExvZyxcbiAgSVB1Ykludml0ZUNvbixcbiAgSVFyeVVzZXJIYXNDYWxsUmVzLFxuICBJUmluZ2luZ0NhbGxDb24sXG4gIElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyLFxuICBJU3RhcnRDYWxsQ29uLFxuICBJU3RhcnRDYWxsUmVzLFxuICBJU3RhcnRHcm91cENvbixcbiAgSVN0YXJ0U2luZ2xlQ29uLFxuICBJU3RhdHVzRG93bkNvbnQsXG4gIElTdGF0dXNVcENvbixcbiAgSVN5bmNDYWxsTG9nQ29uLFxuICBJU3luY0NhbGxMb2dSZXNMaXN0LFxuICBJU3lzU3RhdHVzVXBPcHRzLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vVGltZUNvcnJlY3Rpb25lcic7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHtcbiAgQ2FsbEhvb2tzVHlwZSwgUHViSW52aXRlQ2FsbE1pc3NSZWFzb24sIFB1Ykludml0ZUNhbGxNaXNzUmVmZXIsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHJhbnNwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog55uR5ZCs5a+56LGhXG4gICAqL1xuICBfbGlzdGVuZXIhOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lclxuXG4gIC8qKlxuICAgKiDpnIDopoHph43or5XnmoQgYWN0aW9uXG4gICAqL1xuICBfbmVlZFJldHJ5QWN0aW9uczogQ2FsbFNlcnZlckFjdGlvbltdID0gW1xuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLFxuICBdXG5cbiAgX3Nlc3Npb25JZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29udGV4dC5vbkNhbGxJbmZvID0gdGhpcy5fb25SZWN2Q2FsbFNpZ25hbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRleHQub25jb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLl9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2Vzc2lvbklkID0gZ2V0VVVJRDIyKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRDYWxsKG1zZzogSVN0YXJ0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICBjb25zdCB7XG4gICAgICBjbGllbnRDYWxsSWQsIGNhbGxUeXBlLCB0b1VzZXJzLCBtZWRpYVR5cGUsIHNlY3JldENoYXQsIHRhcmdldFR5cGUsIHRhcmdldElkLCBuaWNrTmFtZSwgb2xkUm9vbUlkLCBwdXNoRXh0LCBleHRyYSxcbiAgICB9ID0gbXNnO1xuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydFNpbmdsZUNhbGwoe1xuICAgICAgICBjbGllbnRDYWxsSWQsXG4gICAgICAgIHRvVXNlcklkOiB0b1VzZXJzWzBdLnVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgb2xkUm9vbUlkLFxuICAgICAgICB0b09yZ0lkOiB0b1VzZXJzWzBdLm9yZ0lkIHx8ICcnLFxuICAgICAgICBwdXNoRXh0LFxuICAgICAgICBleHRyYSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFydEdyb3VwQ2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQsXG4gICAgICB0b1VzZXJzLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbmlja05hbWUsXG4gICAgICBvbGRSb29tSWQsXG4gICAgICBwdXNoRXh0LFxuICAgICAgZXh0cmEsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRTaW5nbGVDYWxsKG1zZzogSVN0YXJ0U2luZ2xlQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfU0lOR0xFX0NBTExfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhcnRTaW5nbGVDb24sIElTdGFydENhbGxSZXM+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRHcm91cENhbGwobXNnOiBJU3RhcnRHcm91cENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dST1VQX0NBTExfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhcnRHcm91cENvbiwgSVN0YXJ0Q2FsbFJlcz4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGludml0ZUNhbGwobXNnOiBJSW52aXRlQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUludml0ZUNhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9JTlZJVEVfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSW52aXRlQ2FsbENvbiwgSUludml0ZUNhbGxSZXM+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSU5WSVRFX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmluZ2luZ0NhbGwobXNnOiBJUmluZ2luZ0NhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JJTkdfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJUmluZ2luZ0NhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5SSU5HSU5HX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWNjZXB0Q2FsbChtc2c6IElBY2NlcHRDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQWNjZXB0Q2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkFDQ0VQVF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG1zZzogSUpvaW5DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9KT0lOX0NBTExfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSm9pbkNhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZ3VwQ2FsbChtc2c6IElIYW5ndXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9IQU5HVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2VuZENhbGxTaWduYWw8SUhhbmd1cENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5IQU5HVVBfQ0FMTCwgbXNnKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwpIHtcbiAgICAgIC8vIOWtmOWcqOWNleWRvCBBIOaMguaWreWQjuebtOaOpei4ouWHuiBC77yMQ2FsbFNlcnZlciDlt7Lnp7vpmaQgY2FsbCwgQiDlkI7liLAgQ2FsbFNlcnZlciDnmoQgaGFuZ3VwIOS8mui9rOS4uiBDYWxsU2VydmVyRXJyb3JDb2RlLkNBTExfTk9UX0VYSVNU77yM5pWF5b+955WlXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGF0dXNVcENhbGwobXNnOiBJU3RhdHVzVXBDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NBTExfU1RBVFVTX1VQX1QsIGBjYWxsIHN0YXR1cyB1cCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXR1c1VwQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uU1RBVFVTX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXZlbnRVcENhbGwobXNnOiBJRXZlbnRVcENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NBTExfRVZFTlRfVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJRXZlbnRVcENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpYWxvZ1VwQ2FsbChtc2c6IElEaWFsb2dVcENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NBTExfRElBTE9HX1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SURpYWxvZ1VwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkRJQUxPR19VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUNhbGxSZWNvcmQodXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QsIGBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7Y2FsbElkczogc3RyaW5nW119LCB1bmRlZmluZWQ+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5ERUxfQ0FMTF9MT0csIHtcbiAgICAgIGNhbGxJZHMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3luY0NhbGxMb2cobXNnOiBJU3luY0NhbGxMb2dDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTeW5jQ2FsbExvZ1Jlc0xpc3R9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3luY0NhbGxMb2dDb24sIElTeW5jQ2FsbExvZ1Jlc0xpc3Q+KG1zZy51c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uU1lOQ19DQUxMX0xPRywgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBxdWVyeVVzZXJIYXNDYWxsKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElRcnlVc2VySGFzQ2FsbFJlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJUXJ5VXNlckhhc0NhbGxSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5RUllfQ0FMTF9TVEFURSwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiB7IHN5bmNUaW1lOiBudW1iZXJ9fT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgeyBzeW5jVGltZTogbnVtYmVyfT4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlFSWV9TUlZfVElNRVNUQU1QLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsVGltZUluZm8oY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsVGltZUluZm9SZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHsgY2FsbElkOiBzdHJpbmd9LCBJR2V0Q2FsbFRpbWVJbmZvUmVzPihjYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfVElNRV9JTkZPLCB7IGNhbGxJZCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VyQ2FsbFN0YXRlTGlzdCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0VXNlckNhbGxTdGF0ZUxpc3RSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJR2V0VXNlckNhbGxTdGF0ZUxpc3RSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9TVEFURV9MSVNULCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhckNhbGxSZWNvcmQodHJhY2VJZDogc3RyaW5nKTpQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJQ2xlYXJDYWxsTG9nUmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DTEVBUl9DQUxMX1JFQ09SRF9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSUNsZWFyQ2FsbExvZ1Jlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkNMRUFSX0NBTExfTE9HLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2Vzc2lvbihvcHRzOiBJQmFzZVNpbmdhbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uU2VydmVyUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCwgYGNhbGxJZDogJHtvcHRzLmNhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUJhc2VTaW5nYWxDb24sIElHZXRDYWxsU2Vzc2lvblNlcnZlclJlcz4ob3B0cy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfU0VTU0lPTiwgb3B0cyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3lzU3RhdHVzVXAob3B0czogSVN5c1N0YXR1c1VwT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCwgYG9wdHM6ICR7SlNPTi5zdHJpbmdpZnkob3B0cyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTeXNTdGF0dXNVcE9wdHMsIHVuZGVmaW5lZD4ob3B0cy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uU1lTX1NUQVRVU19VUCwgb3B0cyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBDYWxsTG9nUmVhZGVkKG9wdHM6IElCYXNlU2luZ2FsQ29uKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElCYXNlU2luZ2FsQ29uLCB1bmRlZmluZWQ+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5VUF9DQUxMX0xPR19SRUFERUQsIG9wdHMpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICBwcml2YXRlIF9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lNX1NUQVRFX0NIQU5HRV9PLCBgc3RhdGU6ICR7c3RhdGV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vbklNU3RhdGVDaGFuZ2Uoc3RhdGUpO1xuICAgIC8qKlxuICAgICAqIOi/nuaOpeaIkOWKn+WQjuWQr+WKqOaXtumXtOagoeato+WZqFxuICAgICAqL1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5zdGFydCh0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5zdG9wKHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIOS/oeS7pOWPkemAgVxuICAgKiBAcGFyYW0gdGFyZ2V0SWQg6I635Y+WIGNhbGwgbG9nIChzeW5jQ2FsbExvZykg5pe25LygIHVzZXJJZCwg5YW25LuWIGFjdGlvbiDkvKAgY2FsbElkXG4gICAqIEBwYXJhbSBrZXkgY2FsbCBzZXJ2ZXIg5a6a5LmJIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBhY3Rpb24g5pC65bim5Y+C5pWw77yM5peg5Y+C5pWw5Lyg56m65a2X56ym5LiyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kQ2FsbFNpZ25hbCA8VCwgUj4odGFyZ2V0SWQ6IHN0cmluZywga2V5OiBDYWxsU2VydmVyQWN0aW9uLCBvcHRpb25zOiBUKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogUn0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMgPyBKU09OLnN0cmluZ2lmeSh7IC4uLm9wdGlvbnMsIC4uLnsgc2Vzc2lvbklkOiB0aGlzLl9zZXNzaW9uSWQgfSB9KSA6ICcnO1xuXG4gICAgbGV0IHJlc3VsdDoge2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSB8IHVuZGVmaW5lZCwgY29kZTogRXJyb3JDb2RlfTtcbiAgICBpZiAodGhpcy5fbmVlZFJldHJ5QWN0aW9ucy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCByZXRyeUFzeW5jRm4gPHtkYXRhPzogeyBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGNvZGU6IEVycm9yQ29kZX0+KHtcbiAgICAgICAgYXN5bmNGbjogdGhpcy5fY29udGV4dC5zZXRDYWxsSW5mby5iaW5kKHRoaXMuX2NvbnRleHQpLFxuICAgICAgICBmbkFyZ3M6IFt0YXJnZXRJZCwga2V5LCB2YWx1ZV0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZXRDYWxsSW5mbyh0YXJnZXRJZCwga2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gcmVzdWx0O1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGtleTogc2VydmVyS2V5LCB2YWx1ZTogc2VydmVyVmFsIH0gPSBkYXRhITtcbiAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShzZXJ2ZXJWYWwpLmRhdGEgYXMgUjtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHBhcnNlZERhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIOS/oeS7pOaOpeaUtlxuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2Q2FsbFNpZ25hbChkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PLCBgZGF0YTogJHtkYXRhfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgZGF0YUxpc3QgPSBKU09OLnBhcnNlKGRhdGEpLmxpc3QgYXMge1trZXk6IHN0cmluZ106IHN0cmluZyB9W107XG4gICAgZGF0YUxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyBrZXkgfSA9IGl0ZW07XG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShpdGVtLnZhbHVlKTtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfSU5WSVRFX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25QdWJJbnZpdGVDYWxsKGluZm8gYXMgSVB1Ykludml0ZUNvbiwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5TVEFUVVNfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uU3RhdHVzRG93bkNhbGwoaW5mbyBhcyBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uRXZlbnREb3duQ2FsbChpbmZvIGFzIElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLkRJQUxPR19ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25EaWFsb2dEb3duQ2FsbChpbmZvIGFzIElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfQ0FMTF9MT0c6XG4gICAgICAgICAgdGhpcy5fb25QdWJDYWxsTG9nKGluZm8gYXMgSVB1YkNhbGxMb2csIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0NBTExfTE9HX1JFQURFRDpcbiAgICAgICAgICAvLyBwYXNzIOaaguacqueUqOWIsFxuICAgICAgICAgIC8vIHRoaXMuX29uUHViQ2FsbExvZ1JlYWRlZChpbmZvIGFzIElQdWJDYWxsTG9nUmVhZGVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9OQUNLX1NFUV9JRDpcbiAgICAgICAgICAvLyBUT0RPIGNhbGwg5byx572R6KGl5YG/5pa55qGI5raJ5Y+K5pa55rOV77yMUEMg5pyq5YGa77yM5q2k5aSE6Ziy5q2i6LWw5YiwIGRlZmF1bHRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLl9vbkNvbnBlbnNhdGlvbkRhdGEoaW5mbyBhcyBJQ29ucGVuc2F0aW9uRGF0YSwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2uIGRldmljZUlkIOWIpOaWreaVsOaNruaYr+WQpuW6lOivpeS4i+WPkVxuICAgKiBkZXZpY2VJZCDkuLrnqbrlrZfnrKbkuLLmiJYgbnVsbCDnm7TmjqXkuIvlj5FcbiAgICogZGV2aWNlSWQg5pyJ5YW35L2T55qE5YC877yM5qC55o2uIGRldmljZUlkIOWIpOaWreaYr+WQpuaYr+W3seerr+eahCBkZXZpY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBfaXNWYWxpZERhdGEoZGV2aWNlSWQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoaXNOdWxsKGRldmljZUlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhkZXZpY2VJZCkgJiYgKGRldmljZUlkPy5sZW5ndGggPT09IDAgfHwgZGV2aWNlSWQgPT09IHRoaXMuX3Nlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw6YKA6K+3XG4gICAqIEBwYXJhbSBpc0RpcmVjdGx5IOaYr+WQpuS4uuebtOWPkeS/oeS7pFxuICAgKi9cbiAgcHJpdmF0ZSBfb25QdWJJbnZpdGVDYWxsKGRhdGE6IElQdWJJbnZpdGVDb24sIGlzRGlyZWN0bHkgPSB0cnVlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFVJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgICBjb25zdCBjdXJyZW50VXNlciA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5maW5kKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVJZCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgY3VycmVudFVzZXI6ICR7SlNPTi5zdHJpbmdpZnkoY3VycmVudFVzZXIpfSwgY3VycmVudFVzZXJJZDogJHtjdXJyZW50VUlkfSwgc3RhdGU6ICR7c3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgZXJyb3I6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkRGF0YShkYXRhLnRvRGV2aWNlSWQgfHwgJycpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBub3QgY3VycmVudCBkZXZpY2VJZCAtPiBkZXZpY2VJbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdG9EZXZpY2VJZDogZGF0YS50b0RldmljZUlkLFxuICAgICAgICBjbGllbnREZXZpY2VJZDogdGhpcy5fc2Vzc2lvbklkLFxuICAgICAgfSl9YCwgdHJhY2VJZCk7XG4gICAgICAvLyBBIOWSjCBCIOe+pOmAmuivneS4re+8jEEg5YaN6YKA6K+3IEPvvIxCIOWSjCBCJyDpg73kvJrkvJrmlLbliLAgcHViSW52aXRlQ2FsbCwgQicg5pS25Yiw55qEIHB1Ykludml0ZUNhbGwg55qEIHRvRGV2aWNlSWQg5LiN5Li66Ieq5bex77yM5peg6ZyA5aSE55CGXG5cbiAgICAgIC8vIGhvb2tzIOWbnuiwg+WkhOeQhlxuICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLk5PVF9DVVJSRU5UX0RFVklDRUlELFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9O1xuICAgICAgaWYgKGlzRGlyZWN0bHkpIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCBpbmZvKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIGluZm8pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vbkludml0ZShkYXRhLCBpc0RpcmVjdGx5LCB0cmFjZUlkKTtcbiAgICBpZiAoaXNEaXJlY3RseSkge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsLCBPYmplY3QuYXNzaWduKGRhdGEsIHsgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsUHVsbEt2LCBPYmplY3QuYXNzaWduKGRhdGEsIHsgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw54q25oCB5Y+Y5pu077ya5ZON6ZOD44CB5b+Z56KM44CB6YCa6K+d562J5b6F44CB5a+55pa55pyq5o6l5ZCs44CB5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9vblN0YXR1c0Rvd25DYWxsKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5pWw5o2u5Lit6L+H5ruk5o6J5pyq5Y+Y5pu055qEIHVzZXJTZXNzaW9uXG4gICAgZGF0YS5jYWxsU2Vzc2lvblVzZXJzID0gZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZpbHRlcigoaXRlbSkgPT4gQm9vbGVhbihpdGVtLmNoYW5nZWQpKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NUQVRVU19PLCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWREYXRhKGRhdGEudG9EZXZpY2VJZCB8fCAnJykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NUQVRVU19PLCBgbm90IGN1cnJlbnQgZGV2aWNlSWQgLT4gZGV2aWNlSW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRvRGV2aWNlSWQ6IGRhdGEudG9EZXZpY2VJZCxcbiAgICAgICAgY2xpZW50RGV2aWNlSWQ6IHRoaXMuX3Nlc3Npb25JZCxcbiAgICAgIH0pfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g5LiN5piv57uZ5b2T5YmN6K6+5aSH5LiL5Y+R55qE54q25oCB5aSE55CGXG4gICAgICB0aGlzLl9saXN0ZW5lci5vbk90aGVyQ2xpZW50U3RhdHVzRG93bihkYXRhLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbGlzdGVuZXIub25TdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQsIHRoaXMuX3Nlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d5LqL5Lu25Y+Y5pu077ya5omT5byAfOWFs+mXrSDmkYTlg4/lpLRcbiAgICovXG4gIHByaXZhdGUgX29uRXZlbnREb3duQ2FsbChkYXRhOiBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGlzdGVuZXIub25FdmVudERvd24oZGF0YSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6LCD5pW05LqL5Lu25Y+K57uT5p6cXG4gICAqIOS6i+S7tu+8muWqkuS9k+exu+Wei+WIh+aNolxuICAgKiDliqjkvZzvvJror7fmsYLjgIHmjqXlj5fjgIHmi5Lnu53jgIHlj5bmtohcbiAgICovXG4gIHByaXZhdGUgX29uRGlhbG9nRG93bkNhbGwoZGF0YTogSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGRpYWxvZ1R5cGUsIGFjdGlvbiwgZXh0cmFLZXlWYWwgfSA9IGRhdGE7XG4gICAgc3dpdGNoIChkaWFsb2dUeXBlKSB7XG4gICAgICBjYXNlIERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEU6XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyLm9uU3dpdGNoTWVkaWFUeXBlKGRhdGEsIHRyYWNlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ/lkI7vvIzml6Xlv5fkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgX29uUHViQ2FsbExvZyhkYXRhOiBJUHViQ2FsbExvZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0FMTF9SRUNPUkRfTywgYGNhbGwgcmVjb3JkOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbGlzdGVuZXIub25SZWN2Q2FsbEVuZExvZyhkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDooaXlgb/mlbDmja7lpITnkIZcbiAgICovXG4gIHByaXZhdGUgX29uQ29ucGVuc2F0aW9uRGF0YShkYXRhOiBJQ29ucGVuc2F0aW9uRGF0YSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ09NUExFTUVOVEFSWV9EQVRBX08sICcnLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIHNlY3JldENoYXQsIGR1cmF0aW9uLCBjYWxsU3RhdHVzLCBjYWxsaW5nVXNlcklkLCBjYWxsU2Vzc2lvblVzZXJzLCB0b0RldmljZUlkLCBjYWxsRGlhbG9nRW50aXR5cywgZXh0cmEsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBpc1B1Ykludml0ZUNhbGxEYXRhID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQgJiYgaXRlbS51c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuXG4gICAgaWYgKGlzUHViSW52aXRlQ2FsbERhdGEpIHtcbiAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdG9EZXZpY2VJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgaW52aXRlVXNlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgICBleHRyYSxcbiAgICAgIH0sIHRydWUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB0b0RldmljZUlkLFxuICAgICAgICBjYWxsU3RhdHVzLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmIChjYWxsRGlhbG9nRW50aXR5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjYWxsRGlhbG9nRW50aXR5cy5mb3JFYWNoKChkYXRhKSA9PiB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGRhdGEsIHRyYWNlSWQpLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHN0cmluZzEwdG82NCA9IChudW1iZXI6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpZ2tsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElHS0xNTk9QUVJTVFVWV1hZWisvJy5zcGxpdCgnJyk7XG4gIGNvbnN0IHJhZGl4ID0gY2hhcnMubGVuZ3RoICsgMTtcbiAgbGV0IHF1dGllbnQgPSArbnVtYmVyO1xuICBjb25zdCBhcnIgPSBbXTtcbiAgZG8ge1xuICAgIGNvbnN0IG1vZCA9IHF1dGllbnQgJSByYWRpeDtcbiAgICBxdXRpZW50ID0gKHF1dGllbnQgLSBtb2QpIC8gcmFkaXg7XG4gICAgYXJyLnVuc2hpZnQoY2hhcnNbbW9kXSk7XG4gIH0gd2hpbGUgKHF1dGllbnQpO1xuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufTtcblxuY29uc3QgZ2V0VVVJRCA9ICgpID0+ICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgY29uc3QgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICByZXR1cm4gdi50b1N0cmluZygxNik7XG59KTtcblxuLyog6I635Y+WIDIyIOS9jeeahCBVVUlEICovXG5leHBvcnQgY29uc3QgZ2V0VVVJRDIyID0gKCkgPT4ge1xuICBsZXQgdXVpZDogc3RyaW5nIHwgbnVtYmVyID0gZ2V0VVVJRCgpO1xuICB1dWlkID0gYCR7dXVpZC5yZXBsYWNlKC8tL2csICcnKX0wYDtcbiAgdXVpZCA9IHBhcnNlSW50KHV1aWQsIDE2KTtcbiAgdXVpZCA9IHN0cmluZzEwdG82NCh1dWlkKTtcbiAgaWYgKHV1aWQubGVuZ3RoID4gMjIpIHtcbiAgICB1dWlkID0gdXVpZC5zbGljZSgwLCAyMik7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59O1xuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5cbmNvbnN0IENBTExfREJfTkFNRSA9ICdSQ19DQUxMUExVUyc7XG5cbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5pbnRlcmZhY2UgSU9ialN0b3JlUGFyYW1zIHtcbiAgLyoqXG4gICAqIOS4u+mUrlxuICAgKi9cbiAga2V5UGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIOWmguaenOayoeacieWQiOmAgueahOS4u+mUru+8jOWPr+S7peiuvue9ruS4uiB0cnVlIOiHquWKqOeUn+aIkFxuICAgKi9cbiAgYXV0b0luY3JlbWVudD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElJbmRleERCT3B0cyB7XG4gIG9uU3VjY2VzczogKCkgPT4gdm9pZDtcbiAgb25FcnJvcj86ICgpID0+IHZvaWQ7XG59XG5cbmxldCBsb2dnZXI6IEJhc2ljTG9nZ2VyO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsSW5kZXhEQiB7XG4gIC8qKlxuICAgKiBjYWxsIGluZGV4REIg5bqTXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogUkNDYWxsSW5kZXhEQiDlrp7kvotcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogUkNDYWxsSW5kZXhEQiB8IG51bGwgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBpbml0KF9sb2dnZXI6IEJhc2ljTG9nZ2VyLCBvcHRzOiBJSW5kZXhEQk9wdHMpIHtcbiAgICBsb2dnZXIgPSBfbG9nZ2VyO1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnQoKSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tSQ0NhbGxJbmRleERCXScsICdJbmRleERCIGlzIG5vdCBzdXBwb3J0IGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxID0gd2luZG93LmluZGV4ZWREQi5vcGVuKENBTExfREJfTkFNRSwgREJfVkVSU0lPTik7XG5cbiAgICByZXEub25lcnJvciA9IChldjogYW55KSA9PiB7XG4gICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYG9wZW4gaW5kZXhEQiByZXEgZmFpbGVkIC0+ICR7ZXYudGFyZ2V0LmVycm9yfWApO1xuICAgIH07XG5cbiAgICByZXEub25zdWNjZXNzID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0aGlzLl9kYikge1xuICAgICAgICB0aGlzLl9kYi5vbmNsb3NlID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgdW5leHBlY3RlZGx5IGNsb3NlZC4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBlcnJvci4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmFib3J0ID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBhYm9ydGVkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBSQ0NhbGxJbmRleERCLl9pbnN0YW5jZSA9IG5ldyBSQ0NhbGxJbmRleERCKCk7XG4gICAgICBvcHRzLm9uU3VjY2VzcygpO1xuICAgIH07XG5cbiAgICByZXEub251cGdyYWRlbmVlZGVkID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgUkNDYWxsSW5kZXhEQi5jcmVhdGVPYmpTdG9yZSgnQ2FsbEJXX0Fibm9ybWFsQ2FsbCcsIHsga2V5UGF0aDogJ3VzZXJJZCcgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB1bkluaXQoKSB7XG4gICAgdGhpcy5fZGIgPSBudWxsO1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSQ0NhbGxJbmRleERCIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGlzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhd2luZG93IHx8ICF3aW5kb3cuaW5kZXhlZERCKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVPYmpTdG9yZShvYmpOYW1lOiBzdHJpbmcsIG9wdHM6IElPYmpTdG9yZVBhcmFtcykge1xuICAgIGxldCBvYmpTdG9yZTogSURCT2JqZWN0U3RvcmU7XG4gICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYj8ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhvYmpOYW1lKSkge1xuICAgICAgb2JqU3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYiEuY3JlYXRlT2JqZWN0U3RvcmUob2JqTmFtZSwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgYGNyZWF0ZU9ialN0b3JlICR7b2JqTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9iak5hbWUg6KGo5piOXG4gICAqIEBwYXJhbSB2YWwg6KaB5re75Yqg55qE5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgYWRkVmFsdWUgPFQ+KG9iak5hbWU6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmFkZCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgJ2FkZFZhbHVlIGZhaWxlZCcpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu6K+75Y+W5pWw5o2uXG4gICAqIEBwYXJhbSBrZXkg5Li76ZSuXG4gICAqL1xuICBwdWJsaWMgcmVhZEJ5S2V5IDxUPihvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0pLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgcmVhZEJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu5pu05paw5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gUkNDYWxsSW5kZXhEQi5fZGIudHJhbnNhY3Rpb24oW29iak5hbWVdLCAncmVhZHdyaXRlJykub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLnB1dCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgdXBkYXRlQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCeUtleShvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUuZGVsZXRlKGtleSk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZW1vdmVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgSVJ1bnRpbWUsIElTdG9yYWdlIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsSW5kZXhEQiB9IGZyb20gJy4uL3V0aWxzL2luZGV4REInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmpTdG9yZSB7W3VzZXJJZDogc3RyaW5nXTogc3RyaW5nW119XG5cbmludGVyZmFjZSBJU3RvcmVWYWwge3VzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXX1cblxuLyoqXG4gKiDlvILluLjnu5PmnZ8gY2FsbCDlpITnkIblrZjlgqjnsbtcbiAqIOWcqOWRvOWHuuaIluWRvOWFpemYtuauteeahCBjYWxsIOi/m+ihjOacrOWcsOWtmOWCqO+8jOato+W4uOe7k+adn+WQjua4hemZpFxuICog5byC5bi457uT5p2f5ZCO77yM5pys5Zyw5Y+W5pyq5riF6Zmk55qEIGNhbGxJZCwg6YCa6L+H5pyN5Yqh5o6l5Y+j5riF6Zmk5byC5bi457uT5p2f55qEIGNhbGwgLOmYsuatouaXoOazleWRvOWHuuaIluWRvOWFpVxuICovXG5leHBvcnQgY2xhc3MgQWJub3JtYWxDYWxsIHtcbiAgcHJpdmF0ZSBfbG9jYWxTdG9yZSE6IElTdG9yYWdlXG5cbiAgcHJpdmF0ZSBfaW5kZXhEQlN0b3JlITogUkNDYWxsSW5kZXhEQlxuXG4gIHByaXZhdGUgX3N0b3JlS2V5OiBzdHJpbmcgPSAnQ2FsbEJXX0Fibm9ybWFsQ2FsbCdcblxuICBwcml2YXRlIF9pc1N1cHBvcnRJbmRleERCOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA9IFJDQ2FsbEluZGV4REIuaXNTdXBwb3J0KCk7XG4gICAgaWYgKHRoaXMuX2lzU3VwcG9ydEluZGV4REIpIHtcbiAgICAgIFJDQ2FsbEluZGV4REIuaW5pdCh0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlID0gUkNDYWxsSW5kZXhEQi5nZXRJbnN0YW5jZSgpITtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhbFN0b3JlID0gX3J1bnRpbWUubG9jYWxTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIOa3u+WKoOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyBhZGRBYm5vcm1hbGxDYWxsSWQodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYWRkRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9hZGRCeUluZGV4REIgOiB0aGlzLl9hZGRCeUxvY2FsU3RvcmU7XG4gICAgYWRkRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTlvILluLggY2FsbElkXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHJlbW92ZUZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fcmVtb3ZlQnlJbmRleERCIDogdGhpcy5fcmVtb3ZlQnlMb2NhbFN0b3JlO1xuICAgIHJlbW92ZUZ1bmMuY2FsbCh0aGlzLCB1c2VySWQsIGNhbGxJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW8guW4uOe7k+adn+eahCBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0QWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2dldEJ5SW5kZXhEQiA6IHRoaXMuX2dldEJ5TG9jYWxTdG9yZTtcbiAgICByZXR1cm4gZ2V0RnVuYy5jYWxsKHRoaXMsIHVzZXJJZCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IFtjYWxsSWRdO1xuICAgICAgfVxuICAgICAgb2JqU3RvcmVbdXNlcklkXSA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB0aGlzLl9sb2NhbFN0b3JlLnNldEl0ZW0odGhpcy5fc3RvcmVLZXksIEpTT04uc3RyaW5naWZ5KG9ialN0b3JlKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2FkZEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfcmVtb3ZlQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgbGV0IGNhbGxJZHMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmpTdG9yZTogSU9ialN0b3JlID0gPElPYmpTdG9yZT5KU09OLnBhcnNlKHRoaXMuX2xvY2FsU3RvcmUuZ2V0SXRlbSh0aGlzLl9zdG9yZUtleSkgfHwgJ3t9Jyk7XG4gICAgICBjb25zdCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIGNhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9nZXRCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbElkcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9hZGRCeUluZGV4REIodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLmFkZFZhbHVlKHRoaXMuX3N0b3JlS2V5LCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IFtjYWxsSWRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbW92ZUJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcyA9IGRhdGEuY2FsbElkcy5maWx0ZXIoKGlkKSA9PiAhY2FsbElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgICBpZiAoZGF0YS5jYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY2FsbElkczogZGF0YS5jYWxsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS5yZW1vdmVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0QnlJbmRleERCKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgZGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmNhbGxJZHM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIOS6i+S7tuexu+Wei1xuICovXG5leHBvcnQgZW51bSBDYWxsU2VydmVyRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIOaPkOekuueql+WPo1xuICAgKi9cbiAgUFJPTVBUID0gMCxcbiAgLyoqXG4gICAqIENhbGxTZXJ2ZXIg5LiL5Y+R6YCa6K+d5pe26ZW/5Y+Y5pu057G75Z6LXG4gICAqL1xuICBDQUxMX0RVUkFUSU9OID0gMTAsXG4gIC8qKlxuICAgKiDmlLbliLDov5znq6/nrKzkuIDluKfml7bpl7RcbiAgICovXG4gIEZJUlNUX0ZSQU1FID0gMjAsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzSW5uZXJDb2RlIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIC8qKlxuICAgKiDml6DmlYjnmoTlk43lupTml7bpl7TvvIjmjqXlj6Plk43lupTml7bpl7Tov4fplb/vvIlcbiAgICovXG4gIElOVkFMSURfUkVTUE9OU0VfVElNRSA9IDgwMTcwLFxuICAvKipcbiAgICog6Z2e5pyA5LyY5ZON5bqU5pe26Ze0XG4gICAqL1xuICBOT05PUFRJTUFMX1JFU19USU1FID0gODAxNzEsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuLi91dGlscy90aW1lcnMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzSW5uZXJDb2RlJztcblxuLyoqXG4gKiDmoKHml7bmqKHlnZdcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVDb3JyZWN0aW9uZXIge1xuICAvKipcbiAgICog5o6l5Y+j5ZON5bqU5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9SVFQ6IG51bWJlciA9IDBcblxuICAvKipcbiAgICog5Y+v55So55qE5o6l5Y+j5ZON5bqU5pe26Ze05LiL6ZmQ77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRNaW5SVFQ6IG51bWJlciA9IDIwMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIrpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1heFJUVDogbnVtYmVyID0gMTAwMFxuXG4gIC8qKlxuICAgKiDkuI4gY2FsbFNlcnZlciDnmoTml7bpl7TlgY/lt67ml7bpl7TvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF9kZWx0YVRpbWU6IG51bWJlciA9IDBcblxuICAvKipcbiAgICogdGltZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog6L2u6K6t5pe26Ze06Ze06ZqU77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJ2YWw6IG51bWJlciA9IDIgKiAxMDAwXG5cbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lczogbnVtYmVyID0gOFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpbmdsZUNhbGxEdXJhdGlvbkV2OiAoY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh56uv6I635Y+W6YCa6K+d5pe26ZW/44CB6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbENsaWVudFRpbWVCeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKCF0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2dldERlbHRhVGltZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUiwgYGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXJ0VGltZTogc2VydmVyU3RhcnRUaW1lIH0gPSBkYXRhITtcbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKHNlcnZlclN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IChjdXJyZW50VGltZSArIHRoaXMuX2RlbHRhVGltZSAtIHNlcnZlclN0YXJ0VGltZSkgLyAxMDAwO1xuXG4gICAgaWYgKGR1cmF0aW9uIDwgMCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCwgYGludmFsaWQgZHVyYXRpb246ICR7ZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgLy8g5ZCR5LiL5Y+W5pW0XG4gICAgZHVyYXRpb24gPSBNYXRoLmZsb29yKGR1cmF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCAmJiB0aGlzLl9SVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLk5PTk9QVElNQUxfUkVTX1RJTUUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc2VydmVyU3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXorqHnrpflrqLmiLfnq6/lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBjYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZDogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKTogeyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9DQUxDX0NMSUVOVF9TVEFSVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgc3RhcnRUaW1lOiAke3N0YXJ0VGltZX1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDlho3mrKHph43mlrDojrflj5YgUlRUIOW5tumHjeaWsOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICAgIHN0YXJ0VDogc3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgLy8g6YeN572uIGNhbGwg5Lit6YeN6K+V5qyh5pWwXG4gICAgICB0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID0gMDtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MsIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lcyA9IDA7XG5cbiAgLyoqXG4gICAqIOW8gOWni+WumuaXtumAkuW9kuiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90aW1lcklkIHx8IHRoaXMuX3N0YXJ0VGltZXMgPj0gdGhpcy5fbWF4UmV0cnlUaW1lcykge1xuICAgICAgLy8g6Ziy5q2i6YeN5aSN5ZCv5YqoXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVEFSVF9PLCBgdGltZXJJZDogJHt0aGlzLl90aW1lcklkfWApO1xuXG4gICAgdGhpcy5fc3RhcnRUaW1lcysrO1xuXG4gICAgLy8g6I635Y+WXG4gICAgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatouWumuaXtui9ruiurVxuICAgKi9cbiAgcHVibGljIHN0b3AodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVE9QX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG4gICAgdGhpcy5fdGltZXJJZCA9IG51bGw7XG4gICAgLy8g6YeN572u5qyh5pWwXG4gICAgdGhpcy5fc3RhcnRUaW1lcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICog6YeN5paw5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgcmVzdGFydCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1JFU1RBUlRfTywgYGxlZ2FsIHJ0dCB0aW1lLCBSVFQ6ICR7dGhpcy5fUlRUfSwgdmFsaWRNaW5SVFQ6ICR7dGhpcy5fdmFsaWRNaW5SVFR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKHRoaXMuX1JUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOa4hemZpOW9k+WJjeato+WcqOi/m+ihjOeahFxuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICAvLyDph43mlrDlkK/liqhcbiAgICB0aGlzLnN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsRGVsYXlUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbHRhVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSVFQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fUlRUO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvO+8jOmdnumAmuivneS4reeahOiuoeeul1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVsdGFUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGRlbGF5VGltZT86IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogc3luY1RpbWUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoKGN1cnJlbnRSVFQgPCB0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID09PSAwKSAmJiBjdXJyZW50UlRUIDw9IHRoaXMuX3ZhbGlkTWF4UlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDlsI/kuo7mnIDlsI/lj6/nlKggcnR077yM5YGc5q2i6L2u6K6t6K6h566XXG4gICAgICB0aGlzLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGFUaW1lID0gKHN5bmNUaW1lISAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIHJldHVybiB7IGNvZGUsIGRlbGF5VGltZTogdGhpcy5fZGVsdGFUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6I635Y+W5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWVJbkNhbGwoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX1JUVCkge1xuICAgICAgdGhpcy5fUlRUID0gY3VycmVudFJUVDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoZGF0YSEuc3luY1RpbWUgLSBzdGFydFRpbWUpIC0gdGhpcy5fUlRUIC8gMjtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfU0VUX0RFTFRBX1RJTUVfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkLFxuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLnN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY2xpZW50Rmlyc3RGcmFtZVRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLmZpcnN0RnJhbWV0aW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDmnIDkvJjnu5PmnpzvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICAgIH1cbiAgICAvLyDpnZ7mnIDkvJjnu5PmnpxcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heFJldHJ5VGltZXNJbkNhbGw6IG51bWJlciA9IDNcblxuICAvKipcbiAgICog5aSa5qyh5qCh5q2j5oqb57uZ5Lia5Yqh5bGC55qE6YCa6K+d5byA5aeL5pe26Ze044CB6aaW5bin5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOWFiOWBnOatouacque7k+adn+eahOiuoeeul1xuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSwgY2xpZW50Rmlyc3RGcmFtZVRpbWUgfSA9IGF3YWl0IHRoaXMuX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOe7k+aenOacgOS8mO+8jOaKm+e7meW6lOeUqOWxguW8gOWni+aXtumXtFxuICAgICAgdGhpcy5fc2luZ2xlQ2FsbER1cmF0aW9uRXYoY2FsbElkLCBjbGllbnRTdGFydFRpbWUhLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmV0cnlUaW1lc0luQ2FsbCA+IHRoaXMuX21heFJldHJ5VGltZXNJbkNhbGwgJiYgY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g6Z2e5pyA5LyY57uT5p6c77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze077yM5qC55o2u6YeN6K+V5qyh5pWw6L+b6KGM6YeN6K+VOyDph43or5UgMyDmrKHlkI7lho3mipvlh7rkuLvopoHmmK/kuLrkuobojrflj5bmnIDlsI8gUlRUXG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCkge1xuICAgICAgLy8g5peg5pyA5LyY57uT5p6c77yM5bqU55So5bGC5qC55o2u6Ieq5bex55qE5pe26Ze06LWw6KGoLCDnm7jlvZPkuo4gUlRUIOaMiSAwIOWkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwrKztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRm9yd2FyZFR5cGUge1xuICAvKipcbiAgICog6YCa6L+H5LiL5LiA5qyh5Lq65ZGY54q25oCBIHVzZXJTdGF0ZSDnmoTkuIvlj5HlkIzmraXluKbkuIvljrtcbiAgICovXG4gIFNPT05fQUZFVEVSID0gMCxcbiAgLyoqXG4gICAqIOeri+WNs+i9rOWPkVxuICAgKi9cbiAgQ1VSUkVOVCA9IDEsXG59XG4iLCJpbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHtcbiAgUFVCX0lOVklURV9DQUxMID0gMCxcbiAgUFVMTF9LVl9JTlZJVEVfQ0FMTCA9IDEsXG4gIFNZU1RFTV9QVVNIID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RhdGlzdGljc0RhdGEge1xuICAvKipcbiAgICog5LiK5oql5pe26Ze0XG4gICAqL1xuICB0aW1lOiBudW1iZXIsXG4gIC8qKlxuICAgKiDov5DokKXllYbvvIzkvovlpoIg5Lit5Zu96IGU6YCaXG4gICAqL1xuICBjcjogc3RyaW5nLFxuICAvKipcbiAgICog572R57uc57G75Z6L77yM5L6L5aaCIDRHXG4gICAqL1xuICBuZXQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIHVzZXJJZFxuICAgKi9cbiAgdWlkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDplJnor6/noIFcbiAgICovXG4gIGNvZDogbnVtYmVyLFxuICAvKipcbiAgICog6LCD55So5omn6KGM5pe26ZW/XG4gICAqL1xuICBkdXI6IG51bWJlclxuICAvKipcbiAgICog5aqS5L2T57G75Z6LXG4gICAqL1xuICBtdHA6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcbiAgLyoqXG4gICAqIOmAmuivneexu+Wei++8jOengeiBiuaIlue+pOiBilxuICAgKi9cbiAgY3RwOiBSQ0NhbGxQbHVzVHlwZVxuICAvKipcbiAgICogY2FsbElkXG4gICAqL1xuICBjaWQ6IHN0cmluZ1xuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgY2NpZDogc3RyaW5nLFxuICAvKipcbiAgICog6YKA6K+35o6l5pS25p2l5rqQXG4gICAqL1xuICByZjogUkNDYWxsUGx1c0ludml0ZVNvdXJjZVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWRvOWHulxuICAgKi9cbiAgT1VUID0gLTEsXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICovXG4gIEdST1VQID0gMCxcbiAgLyoqXG4gICAqIOWRvOWFpVxuICAgKi9cbiAgSU4gPSAxXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBJUnVudGltZSwgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLCBnZXRVVUlELFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2csIHRyYW5zU2VydmVyUHVzaEV4dCB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBJUkNDYWxsUGx1c1B1c2hDb25maWcsIFJDQ2FsbFBsdXNDb2RlLCBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxQbHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUgfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBSQ0NhbGxEaXJlY3Rpb24gfSBmcm9tICcuL2VudW1zL1JDQ2FsbERpcmVjdGlvbic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW5uZXJDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzSW5uZXJDb2RlJztcblxuY29uc3QgQ0FMTF9USU1FX09VVCA9IDYwICogMTAwMDtcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbEVuZ2luZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfX0lOTkVSX1NFU1NJT05fQ0xPU0VfXzogc3RyaW5nID0gJ2lubmVyLXNlc3Npb24tY2xvc2UnXG5cbiAgc3RhdGljIF9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX186IHN0cmluZyA9ICdpbm5lci1zZXNzaW9uLWNvbm5lY3QnXG5cbiAgc3RhdGljIF9fSU5ORVJfQ0hBTkdFX01FRElBX1RZUEVfXzogc3RyaW5nID0gJ2lubmVyLWNoYW5nZS1tZWRpYS10eXBlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX0lOVklURV9fOiBzdHJpbmcgPSAnaW5uZXItaW52aXRlJ1xuXG4gIC8qKlxuICAgKiDkuLsgc2Vzc2lvblxuICAgKi9cbiAgX21haW5TZXNzaW9uOiBSQ0NhbGxJbm5lclNlc3Npb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDlnKjpgJror53kuK3mlLbliLDnmoQg6YKA6K+3IHNlc3Npb25cbiAgICovXG4gIF9ob2xkU2Vzc2lvbnM6IFJDQ2FsbElubmVyU2Vzc2lvbltdID0gW11cblxuICAvKipcbiAgICog5L+h5Luk5qih5Z2XXG4gICAqL1xuICBfc2lnbmFsTW9kdWxlOiBTaWduYWxUcmFuc3BvcnRlclxuXG4gIC8qKlxuICAgKiDlvILluLjnu5PmnZ8gY2FsbCDlpITnkIblmahcbiAgICovXG4gIF9hYm5vcm1hbE1vZHVsZTogQWJub3JtYWxDYWxsXG5cbiAgLyoqXG4gICAqIOiusOW9leWNleWRvOS4re+8jOaYr+WQpuS4iuaKpei/h+esrOS4gOW4p1xuICAgKiDnva4gdHJ1ZSDml7bmnLrvvJrmlLbliLDov5znq6/nrKzkuIDluKfvvIzmiJDlip/kuIrmiqUgU2VydmVyXG4gICAqIOe9riBmYWxzZSDml7bmnLrvvJrpgJror53nu5PmnZ9cbiAgICovXG4gIHByaXZhdGUgX2lzVXBGaXJzdEZyYW1lVGltZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOmAmuivneS4uiBPTkNBTEwg5pe277yMU0RLIOmcgOe7meS4muWKoeWxguS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgKiDkvJrmlLbliLDlpJrmrKEgT05DQUxM77yM5omA5Lul6ZyA6KaB5qCH6K+G5piv5ZCm5bey5oqb6L+H5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9jYWxsU3RhcnRNYXA6IHtcbiAgICBbY2FsbElkOiBzdHJpbmddOiB7XG4gICAgICBpc1JlY2VpdmVDYWxsU3RhcnRUaW1lOiBib29sZWFuLFxuICAgIH1cbiAgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOagoeaXtuWZqFxuICAgKi9cbiAgX3RpbWVDb3JyZWN0aW9uZXI6IFRpbWVDb3JyZWN0aW9uZXJcblxuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpZW50Q2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIgPSBuZXcgVGltZUNvcnJlY3Rpb25lcih0aGlzLCBfbG9nZ2VyLCB0aGlzLl9vblJlY3ZTaW5DYWxsRHVyYXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlID0gbmV3IFNpZ25hbFRyYW5zcG9ydGVyKF9jb250ZXh0LCBfcnVudGltZSwgX2luaXRPcHRzLCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLCB0aGlzLl9sb2dnZXIpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgb25TdGF0dXNEb3duOiB0aGlzLl9vblN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uT3RoZXJDbGllbnRTdGF0dXNEb3duOiB0aGlzLl9vbk90aGVyQ2xpZW50U3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25FdmVudERvd246IHRoaXMuX29uRXZlbnREb3duLmJpbmQodGhpcyksXG4gICAgICBvblN3aXRjaE1lZGlhVHlwZTogdGhpcy5fb25Td2l0Y2hNZWRpYVR5cGUuYmluZCh0aGlzKSxcbiAgICAgIG9uUmVjdkNhbGxFbmRMb2c6IHRoaXMuX29uUmVjdkNhbGxFbmRMb2cuYmluZCh0aGlzKSxcbiAgICAgIG9uSU1TdGF0ZUNoYW5nZTogdGhpcy5fb25JTVN0YXRlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUgPSBuZXcgQWJub3JtYWxDYWxsKF9ydW50aW1lLCBfbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwob3B0czogSVN0YXJ0Q2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN1bHR9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgdG9Vc2VycywgdGFyZ2V0SWQsIHRhcmdldFR5cGUsIG9sZFJvb21JZCwgcHVzaENvbmZpZywgZXh0cmEsXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gb3B0cy5jYWxsSWQ7XG4gICAgY29uc3QgcHVzaEV4dCA9IHB1c2hDb25maWcgPyB0cmFuc1NlcnZlclB1c2hFeHQocHVzaENvbmZpZywgdGhpcy5fY2xpZW50Q2FsbElkKSA6ICcnO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXJ0Q2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHNlY3JldENoYXQ6IFNlY3JldENhbGxUeXBlLk5PUk1BTCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG9sZFJvb21JZCxcbiAgICAgIHB1c2hFeHQsXG4gICAgICBleHRyYSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWxsSWQsIGJ1c3lsaW5lVXNlcnMgfSA9IGRhdGEhO1xuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5JTlZJVEVELFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG5cbiAgICAvLyDljZXlkbzlkK/liqjlkbzlj6votoXml7borqHml7blmagsIOe+pOWRvOaXoOi2heaXtumAu+i+kVxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICBjb25zdCBpbnZpdGVyVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoZGF0YSEuY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFUiwgaW52aXRlclRpbWVySWQpO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeW3seaWueS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORyxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkNBTExJTkcsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgaW52aXRlZXNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgbGV0IGJ1c3lVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgIGlmIChidXN5bGluZVVzZXJzKSB7XG4gICAgICBidXN5VXNlcnNTdGF0ZSA9IGJ1c3lsaW5lVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWVzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8g6KKr6YKA6K+36ICF5Lit6ZyA6L+H5ruk5Ye65b+Z56KM55So5oi3XG4gICAgICBpbnZpdGVlc1N0YXRlID0gaW52aXRlZXNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbc2VsZlN0YXRlLCAuLi5pbnZpdGVlc1N0YXRlLCAuLi5idXN5VXNlcnNTdGF0ZSFdLCB0cmFjZUlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBjb2RlLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+3XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKG9wdHM6IElJbnZpdGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlUmVzfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjpgoDor7dcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9Vc2VycywgcHVzaENvbmZpZywgZXh0cmEgfSA9IG9wdHM7XG4gICAgY29uc3QgcHVzaEV4dCA9IHB1c2hDb25maWcgPyB0cmFuc1NlcnZlclB1c2hFeHQocHVzaENvbmZpZywgdGhpcy5fY2xpZW50Q2FsbElkKSA6ICcnO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuaW52aXRlQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICB0b1VzZXJzLFxuICAgICAgcHVzaEV4dCxcbiAgICAgIGV4dHJhLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIC8vIOWNleWRvOS4remCgOivt+aIkOWKn++8jOWNs+abtOaWsCBjYWxsIHNlc3Npb24g6YCa6K+d57G75Z6L5Li6576k5ZG8XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGxUeXBlIOWPmOabtOS4uue+pOWRvFxuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOmAmuefpeiiq+mCgOivt+S6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgbGV0IGludml0ZWRVc2Vyc1N0YXRlID0gdG9Vc2Vycy5tYXAoKHsgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBsZXQgYnVzeWxpbmVVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgaWYgKGRhdGEhLmJ1c3lsaW5lVXNlcnMpIHtcbiAgICAgICAgYnVzeWxpbmVVc2Vyc1N0YXRlID0gZGF0YSEuYnVzeWxpbmVVc2Vycz8ubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB0YXJnZXRUeXBlLCB0YXJnZXRJZCB9ID0gaW52aXRlZFVzZXJzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGludml0ZWRVc2Vyc1N0YXRlID0gaW52aXRlZFVzZXJzU3RhdGUuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiBidXN5bGluZVVzZXJzU3RhdGUhLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgWy4uLmludml0ZWRVc2Vyc1N0YXRlLCAuLi5idXN5bGluZVVzZXJzU3RhdGVdLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZUhhbmd1cFxuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsVGltZXIoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgICAgc2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICog6YCa6K+d6K+35rGC5Y+W5raI44CB6YCa6K+d5ouS57udXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgc3lzdGVtU3RhdGUsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgcHVzaEV4dCA9IHB1c2hDb25maWcgPyB0cmFuc1NlcnZlclB1c2hFeHQocHVzaENvbmZpZywgdGhpcy5fY2xpZW50Q2FsbElkKSA6ICcnO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuaGFuZ3VwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgcHVzaEV4dCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXmlLbpgoDor7dcbiAgICog6YCa6K+d5Lit5Y+I5pS25Yiw5paw5p2l55S15ZCO77yM5o6l5ZCs5paw5p2l55S15pe277yM5b+F6aG75YWI5oyC5pat5LmL5YmN55qE6YCa6K+d77yIbWFpblNlc3Npb27vvIlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQob3B0czogSUFjY2VwdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjmjqXlkKxcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmFjY2VwdENhbGwoe1xuICAgICAgY2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG9wdHM6IElKb2luQ2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlhYjmlLbliLAgb25JbnZpdGXvvIzmsqHmnInmjqXpgJrov4cgam9pbkNhbGwg5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5qb2luQ2FsbCh7IGNhbGxJZDogb3B0cy5jYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBvcHRzLmNhbGxJZCk7XG5cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDlpoLmnpzkuI3lrZjlnKggbWFpblNlc3Npb24g5LuOIHNlcnZlciDojrflj5blvZPliY3liqDlhaXnmoQgc2Vzc2lvblxuICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cnVlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T5Y+Y5pu06K+35rGCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdENoYW5nZU1lZGlhVHlwZShvcHRzOiBJUmVxQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJlcUNoYW5nZU1lZGlhVHlwZVJlc30+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYUtleVZhbCA9IHtcbiAgICAgIG1lZGlhVHlwZTogb3B0cy5tZWRpYVR5cGUsXG4gICAgfTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVSZXFNZWRpYVR5cGUob3B0cy5tZWRpYVR5cGUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICB0b1VzZXJJZHM6IG9wdHMudG9Vc2VySWRzLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLlJFUVVFU1QsXG4gICAgICBleHRyYUtleVZhbCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGRhdGE6IHsgdHJhbnNhY3Rpb25JZCB9IH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T57G75Z6L5Y+Y5pu06K+35rGC5ZON5bqUXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlc0NoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFNZWRpYVR5cGUgPSB0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKTtcbiAgICBpZiAob3B0cy5hZ3JlZSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlTWVkaWFUeXBlKHJlcU1lZGlhVHlwZSEpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogb3B0cy5hZ3JlZSA/IERpYWxvZ0FjdGlvbi5BQ0NFUFQgOiBEaWFsb2dBY3Rpb24uUkVGVVNFLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOmAmuivneWqkuS9k+exu+Wei+WIh+aNouivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbmNlbENoYW5nZU1lZGlhVHlwZShvcHRzOiBJQ2FuY2VsQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IG9wdHMudHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBEaWFsb2dBY3Rpb24uQ0FOQ0VMLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIGxvZyDliJfooahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsTG9nTGlzdChvcHRzOiBJR2V0Q2FsbExvZ0xpc3RPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXN9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuc3luY0NhbGxMb2coe1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgc3luY1RpbWU6IG9wdHMudGltZXN0YW1wLFxuICAgICAgY291bnQ6IG9wdHMuY291bnQsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgY2FsbExvZzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gPSBkYXRhIS5jYWxsTG9nTGlzdC5tYXAoKGl0ZW0pID0+IHRyYW4yQ2FsbExvZyhpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaGFzTW9yZTogQm9vbGVhbihkYXRhPy5oYXNNb3JlKSxcbiAgICAgICAgbWF4VGltZTogZGF0YSEubWF4VGltZSxcbiAgICAgICAgbGlzdDogY2FsbExvZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/liKDpmaTpgJror53ml6Xlv5dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsTG9nKGNhbGxJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kZWxldGVDYWxsUmVjb3JkKGN1cnJlbnRVc2VySWQsIGNhbGxJZHMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIHNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGE6IGRhdGEhLnN5bmNUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pyq57uT5p2f55qE6YCa6K+d5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3BlbkNhbGxMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IHJlc0RhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRVc2VyQ2FsbFN0YXRlTGlzdCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QgPSByZXNEYXRhIS5jYWxsU3RhdGVMaXN0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjYWxsSWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxpbmdVc2VySWQsIGNhbGxVc2VySWRzLCBjYWxsU3RhdHVzLCBjcnRUaW1lLCB1c2VyU2Vzc2lvblN0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXJ0VGltZSwgc3luY1RpbWUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGNhbGxEaXJlY3Rpb24gPSAoY2FsbGluZ1VzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkgPyBSQ0NhbGxEaXJlY3Rpb24uT1VUIDogUkNDYWxsRGlyZWN0aW9uLklOO1xuICAgICAgY29uc3QgeyBjbGllbnRTdGFydFRpbWUgPSBzdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBjYWxsRGlyZWN0aW9uLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFVzZXJJZHMsXG4gICAgICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICAgICAgdXNlclN0YXRlOiB1c2VyU2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZXN0YW1wOiAwLFxuICAgICAgICBkdXJhdGlvbjogTWF0aC5mbG9vcigoK25ldyBEYXRlKCkgLSBjbGllbnRTdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogMCxcbiAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgZGF0YTogbGlzdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+eahCBjYWxsIGxvZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZUFsbENhbGxMb2codHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5jbGVhckNhbGxSZWNvcmQodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBjYWxsSWQg6I635Y+WIHNlc3Npb24g6K+m57uG5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uUmVzfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXNzaW9uKG9wdHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsaW5nVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU3RhdHVzLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzeW5jVGltZSxcbiAgICB9ID0gZGF0YSE7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJzID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzdGFydENhbGxlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgc3luY1RpbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0SG9sZFNlc3Npb24oY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgcmV0dXJuIGlubmVyU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihpbm5lclNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeS4uyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxNYWluU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYWluU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbih0aGlzLl9tYWluU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Li7IHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTWFpblNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiusOW9leaYr+WQpuaYr+acrOerr+aMguaWrVxuICAgKi9cbiAgcHVibGljIHNldElzTG9jYWxDbGllbnRIYW5ndXAoaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbikge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXApO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeS6uuWRmOeKtuaAgVxuICAgKiBDYWxsQ2xpZW50IOS5n+mcgOimgeabtOaWsOS6uuWRmOeKtuaAge+8jOWumuS5ieS4uuWFrOWFseWHveaVsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQREFURV9VU0VSU19TVEFURV9PLCBgdXBkYXRlVXNlcnNTdGF0ZSAtPiB1c2VyczogJHtKU09OLnN0cmluZ2lmeSh1c2Vycyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyDmm7TmlrAgc2Vzc2lvbiDkurrlkZjliJfooahcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuXG4gICAgY29uc3QgY2hhbmdlZFVzZXJzID0gW107XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGNvbnN0IG5ld1VzZXJzID0gdXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFVzZXJTdGF0ZSA9IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBpc0lkbGUgPSBpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcbiAgICAgICAgY29uc3QgeyBjYW1lcmFFbmFibGUgPSBmYWxzZSwgbWljcm9waG9uZUVuYWJsZSA9IGZhbHNlIH0gPSBpc0lkbGUgPyB7IGNhbWVyYUVuYWJsZTogZmFsc2UsIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlIH0gOiBvbGRVc2VyU3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi5zZXNzaW9uLnVwZGF0ZVVzZXJMaXN0KG5ld1VzZXJzLCB0cmFjZUlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gICAgLy8g6YCa55+l5LqL5Lu2XG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU3RhcmluZ1RpbWUob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldENhbGxDbGllbnRUaW1lQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS6uuWRmOezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5c3RlbVN0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5zeXNTdGF0dXNVcChvcHRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzkuK3mlLbliLDov5znq6/mtYHlkI7vvIznu5kgQ2FsbFNlcnZlciDkuIrmiqXvvIznlKjkuo7lpITnkIborqHml7bpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBub05lZWRVcENvbmRpdGlvbiA9ICF0aGlzLl9tYWluU2Vzc2lvblxuICAgICAgfHwgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgIT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSlcbiAgICAgIHx8IHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZTtcbiAgICBpZiAobm9OZWVkVXBDb25kaXRpb24pIHtcbiAgICAgIC8vIOS4jeWtmCBtYWluU2Vzc2lvbiDmiJYg6YCa6L+H57G75Z6L5LiN5Li65Y2V5ZG85pe277yM5LiN5LiK5oql77yM55u05o6l6L+U5Zue5oiQ5YqfXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpO1xuICAgIGNvbnN0IHN0cmVhbVJlYWR5VGltZSA9IE1hdGguZmxvb3Iobm93ICsgZGVsYXlUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9ULCBgbm93OiAke25vd307IGRlbGF5OiAke2RlbGF5VGltZX07IHN0cmVhbVJlYWR5VGltZTogJHtzdHJlYW1SZWFkeVRpbWV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSB0cnVlO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmV2ZW50VXBDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV2ZW50VHlwZTogQ2FsbFNlcnZlckV2ZW50VHlwZS5GSVJTVF9GUkFNRSxcbiAgICAgIGV2ZW50QXJnczogeyBzdHJlYW1SZWFkeVRpbWUgfSxcbiAgICAgIGV2ZW50VGltZTogRGF0ZS5ub3coKSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGC5qih5oufIHN0YXR1c0Rvd25DYWxsLCDnu5PmnZ8gc2Vzc2lvblxuICAgKiDpgJror53lu7rnq4vlkI7vvIzlj6rog73nu5PmnZ8gbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBlbmRDdXJyZW50U2Vzc2lvbihjdXJyZW50VXNlclN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25Vc2VyczogSUNhbGxTZXNzaW9uVXNlcltdID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIHN5c3RlbVN0YXRlID0gY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5FTkRFRCxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0U3RhcnRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YTogSVN0YXR1c0Rvd25Db250ID0ge1xuICAgICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgICB0b0RldmljZUlkOiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICB9O1xuICAgICAgdGhpcy5fb25TdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuIrlsYIgUlRDIOWKoOWFpeaIv+mXtOWQjumHjeaWsOW8gOWni+agoeaXtlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZUNvcnJlY3Rpb24odHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5yZXN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldERlbGF5VGltZUluZm8oKTogSUdldERlbGF5VGltZUluZm9SZXMge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheVRpbWU6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgIHJ0dDogdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRSVFQoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGhvbGRTZXNzaW9uIOWNh+e6p+S4uiBtYWluU2Vzc2lvblxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVNYWluU2Vzc2lvbihob2xkQ2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGhvbGRDYWxsSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uID0gdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk/LlswXTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogSU0g54q25oCB5Y+Y5pu05aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbklNU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIGxldCB0aW1lcklkOiBudW1iZXIgPSAwO1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgICAvLyDmlq3nvZHnrYnlvoUgNjBzIOWQjuinpuWPkSBvblNlc3Npb25DbG9zZVxuICAgICAgICB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08sICdlbmRDdXJyZW50U2Vzc2lvbiwgSU0gZGlzY29ubmVjdGVkIGZvciBtb3JlIHRoYW4gNjBzJywgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkhLCB0cmFjZUlkKTtcbiAgICAgICAgfSwgQ0FMTF9USU1FX09VVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWPkei1t+mCgOivt+OAgeaUtuWIsOmCgOivt+WQjuiuoeaXtui2heaXtlxuICAgKiDmj5DliY3mqKHmi58gX29uU3RhdHVzRG93biwg5LiN5YaN5L6d6LWWIENhbGxTZXJ2ZXIg5LiL5Y+R55qEIF9vblN0YXR1c0Rvd25cbiAgICog5aSE55CG572R57uc5byC5bi45oOF5Ya15LiL5LiK5oqlIENhbGxTZXJ2ZXIg5aSx6LSl77yMQ2FsbFNlcnZlciDkuI3kvJrkuIvlj5EgX29uU3RhdHVzRG93biDmg4XlhrVcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBjYWxsIHRpbWVvdXQgY2FsbElkOiAke2NhbGxJZH0sIHVzZXJTdGF0ZTogJHt1c2VyU3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBoYW5kbGVDYWxsVGltZW91dCB3aXRob3V0IHNlc3Npb24sIGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICB0aGlzLl9vblN0YXR1c0Rvd24oe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdGVUaW1lLFxuICAgICAgICB9ID0gdXNlcjtcblxuICAgICAgICBsZXQgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uO1xuICAgICAgICBsZXQgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGU7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEIDogUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVI7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRDtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RpbWU6IHN0YXRlVGltZSA/IHN0YXRlVGltZSArIDEgOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiBzZXNzaW9uLmdldENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/otoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZXIoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8g5ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgY29uc3QgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQsIHVzZXJTdGF0ZSwgdHJhY2VJZCk7XG4gICAgICAvLyDkuIrmiqUgY2FsbCBzZXJ2ZXIg6LaF5pe2XG4gICAgICB0aGlzLl9zaWduYWxNb2R1bGUuc3RhdHVzVXBDYWxsKHsgY2FsbElkLCBzZXNzaW9uU3RhdHVzOiB1c2VyU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfSwgQ0FMTF9USU1FX09VVCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PLCBgY2FsbElkOiAke2NhbGxJZH0sIHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0b3BUaW1lcih0aW1lcklkOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RPUF9DQUxMX1RJTUVSX08sIGB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOmAmuivnemCgOivt1xuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gZ2V0VVVJRCgpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgaW52aXRlVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU2Vzc2lvblVzZXJzLCBzZWNyZXRDaGF0LCBjYWxsaW5nVXNlcklkLCBleHRyYSA9ICd7fScsXG4gICAgfSA9IGRhdGE7XG5cbiAgICBpZiAoc2VjcmV0Q2hhdCA9PT0gU2VjcmV0Q2FsbFR5cGUuU0VDUkVUKSB7XG4gICAgICAvLyDlpoLmnpzmmK/lr4bogYrpgJror53kuI3lpITnkIZcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uU0VDUkVUX0NBTEwsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzoh6rlt7HmmK/ooqvpgoDor7fnmoTnlKjmiLdcbiAgICBjb25zdCBpc0ludml0ZWUgPSBjYWxsU2Vzc2lvblVzZXJzLnNvbWUoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoaXNJbnZpdGVlKSB7XG4gICAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIGNhbGxJZCk7XG5cbiAgICAgIC8vIOeUn+aIkCBjYWxsU2Vzc2lvblxuICAgICAgY29uc3QgaW5uZXJTZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLlJJTkdJTkcsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgICBbXSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgKTtcbiAgICAgIC8vIGNhbGwgc2VydmVyIOWTjemTg+S4iuaKpVxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJpbmdpbmdDYWxsKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIOWQr+WKqOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICovXG4gICAgICBjb25zdCBpbnZpdGVlVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsIHRyYWNlSWQpO1xuICAgICAgaW5uZXJTZXNzaW9uLnVwZGF0ZVRpbWVySWQoQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURUUsIGludml0ZWVUaW1lcklkKTtcblxuICAgICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IGlubmVyU2Vzc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOeUn+aIkOWJryBzZXNzaW9uc1xuICAgICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMucHVzaChpbm5lclNlc3Npb24pO1xuICAgICAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIHkuLogSE9MRFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlUKTtcbiAgICAgIH1cblxuICAgICAgLy8g5oqb5Ye65bex5pa56KKr6YKA6K+3XG4gICAgICBjb25zdCBjYWxsUGx1c1Nlc3Npb24gPSBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGwoY2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkLCBKU09OLnBhcnNlKGV4dHJhIHx8ICd7fScpLmV4dHJhKTtcblxuICAgICAgY29uc3QgaW52aXRlU291cmNlID0gaXNEaXJlY3RseSA/IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVCX0lOVklURV9DQUxMIDogUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUxMX0tWX0lOVklURV9DQUxMO1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCBjYWxsUGx1c1Nlc3Npb24sIGludml0ZVNvdXJjZSk7XG5cbiAgICAgIGNvbnN0IG90aGVyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKCh7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdHVzVGltZSxcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIOaKm+WHuuS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgb3RoZXJzU3RhdGUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLk5PVF9JTlZJVEVFLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8g6L+H5ruk5Ye65YW25LuW55So5oi35ZKM6Ieq5bexXG4gICAgY29uc3Qgb3RoZXJJbnZpdGVkTWVtYmVyID0gY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXNlcklkICE9PSBjdXJyZW50VXNlcklkICYmIGl0ZW0udXNlcklkICE9PSBpbnZpdGVVc2VySWQgJiYgaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEKTtcbiAgICAvLyDmipvlh7rnvqTogYrkuK3ooqvpgoDor7fnmoTlhbbku5bkurpcbiAgICBpZiAob3RoZXJJbnZpdGVkTWVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDnsbvlnovlj5jmm7RcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZUNhbGxUeXBlKFJDQ2FsbFBsdXNUeXBlLk1VTFRJKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW52aXRlZE1lbWJlcjogSU90aGVyTWVtSW5mb1tdID0gW107XG4gICAgICBjb25zdCB1c2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgICAgb3RoZXJJbnZpdGVkTWVtYmVyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICAgICAgaW52aXRlZE1lbWJlci5wdXNoKHsgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyB9KTtcbiAgICAgICAgdXNlcnNTdGF0ZS5wdXNoKHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUoaW52aXRlZE1lbWJlcik7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaMguaWre+8iOWvueaWuemAmuivneWPlua2iOOAgemAmuivneaLkue7ne+8iVxuICAgKi9cbiAgcHJpdmF0ZSBfb25IYW5ndXAoZGF0YTogSUhhbmd1cEluZm9bXSwgY2FsbFNlc3Npb25hU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpKSB7XG4gICAgICAgICAgaWYgKGl0ZW0udXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g5ouS5o6l44CB5b+Z56KM44CB5pyq5o6l5ZCsIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVyVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9vbkFjY2VwdChkYXRhOiBJQWNjZXB0SW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0U2Vzc2lvblN0YXRlKCk7XG4gICAgY29uc3QgdW5OZWVkVXBTdGF0ZSA9IFtcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlULFxuICAgIF07XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEVcbiAgICAgICYmIHNlc3Npb25TdGF0ZSAmJiB1bk5lZWRVcFN0YXRlLmluY2x1ZGVzKHNlc3Npb25TdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydENhbGxlcklkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8qKlxuICAgICAqIOWNleWRvOaUtuWIsOWvueaWueaOpeWQrOaXtu+8jOmcgOWujOaIkOWPkeW4g+i1hOa6kOS4gOezu+WIl+WKqOS9nFxuICAgICAqL1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHN0YXJ0Q2FsbGVySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIGNvbnN0IGFjY2VwdFVzZXJJbmZvID0gZGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZnJvbVVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCk7XG4gICAgICBhY2NlcHRVc2VySW5mbyAmJiB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX18sIHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpIS5nZXRDYWxsSWQoKSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOabtOaWsOS4uyBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw54q25oCB5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9vblN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDpgJror53nirbmgIHkuLrov57mjqXnirbmgIHml7bvvIzkv53lrZjmnI3liqHkuIvlj5HnmoTpgJror53lvIDlp4vml7bpl7RcbiAgICAgKi9cbiAgICBjb25zdCB7XG4gICAgICBjYWxsU3RhdHVzLCBzdGFydFRpbWUsIHN5bmNUaW1lLCBjYWxsSWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGNhbGxJZCAhPT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gPSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXSB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqIOadoeS7tu+8mumAmuivneeKtuaAgeS4uiBPTkNBTEwg5LiU5pyq5LiK5oql6L+H6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5pc1JlY2VpdmVDYWxsU3RhcnRUaW1lXG4gICAgICAmJiBjYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZSA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgc3RhcnRUaW1lISwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgY2FsbFN0YXJ0VGltZTogY2xpZW50U3RhcnRUaW1lISxcbiAgICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6K6h566X5piv5ZCm6YCa6K+d57uT5p2fXG4gICAgbGV0IHNlbGZFbmQgPSBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOS4iuaKpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIC8qKlxuICAgICAgICogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIOmcgOWMuuWIhuKAnOWRvOWPq+aWueWFiOWPlua2iOmAmuivneKAneWSjOKAnOacrOerr+i2heaXtuacquaOpeWQrOKAnVxuICAgICAgICovXG4gICAgICBjb25zdCBpc0xlZnQgPSBbXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEUsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUixcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVELFxuICAgICAgXS5pbmNsdWRlcyhpdGVtLnNlc3Npb25TdGF0dXMpICYmIGl0ZW0uc3lzU3RhdHVzICE9PSBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGlmIChpc0xlZnQgJiYgaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgc2VsZkVuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogaXRlbS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogaXRlbS5zeXNTdGF0dXMsXG4gICAgICAgIHN0YXRlVGltZTogaXRlbS5zdGF0dXNUaW1lLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjaGFuZ2VkVXNlcnMubGVuZ3RoID4gMCAmJiB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5rKh5pyJIHNlc3Npb24g5LiN5aSE55CG5Lya6K+d54q25oCB5Y+Y5pu0XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbiAmJiAhdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOiuoeeul+WHuuWTjeW6lOWKqOS9nO+8jOW5tuaKm+WHuuS/oeaBr1xuICAgIGNvbnN0IHtcbiAgICAgIGhhbmd1cERhdGEsIGFjY2VwdERhdGEsIG90aGVySW52aXRlZERhdGEsXG4gICAgfSA9IHBhcnNlU3RhdHVzRGF0YShkYXRhKTtcblxuICAgIGhhbmd1cERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLl9vbkhhbmd1cChoYW5ndXBEYXRhLCBkYXRhLmNhbGxTdGF0dXMsIHRyYWNlSWQpO1xuICAgIGFjY2VwdERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLl9vbkFjY2VwdChhY2NlcHREYXRhLCB0cmFjZUlkKTtcblxuICAgIGlmIChvdGhlckludml0ZWREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLk1VTFRJKSB7XG4gICAgICB0aGlzLl9vbk90aGVyTWVtYmVySW52aXRlKG90aGVySW52aXRlZERhdGEpO1xuICAgIH1cblxuICAgIC8vIOWPquacieWcqCBjYWxsU2Vzc2lvbiDnirbmgIHkuLogRW5kZWQg5pe26YCa55+lIG9uU2Vzc2lvbkNsb3NlXG4gICAgaWYgKGRhdGEuY2FsbFN0YXR1cyA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCB8fCBzZWxmRW5kKSB7XG4gICAgICB0aGlzLnNlc3Npb25DbG9zZShkYXRhLCB0cmFjZUlkLCBzZWxmRW5kKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5YW25LuW56uv55qE54q25oCB5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIF9vbk90aGVyQ2xpZW50U3RhdHVzRG93bihkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY2FsbElkLCBjYWxsU2Vzc2lvblVzZXJzLCBjYWxsU3RhdHVzIH0gPSBkYXRhO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gY2FsbFNlc3Npb25Vc2Vycy5maW5kKCh7IHVzZXJJZCB9KSA9PiB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpO1xuXG4gICAgaWYgKGN1cnJlbnRVc2VyICYmICh0aGlzLl9tYWluU2Vzc2lvbiB8fCB0aGlzLl9ob2xkU2Vzc2lvbnMubGVuZ3RoKSkge1xuICAgICAgLy8g5piv5bex56uv54q25oCB5Y+Y5pu05LiU5a2Y5ZyoIHNlc3Npb24g5YaN5Y676YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu05Zue6LCD77yM5LiN5a2Y5ZyoIHNlc3Npb24g5LiN6ZyA6KaB6YCa55+lXG4gICAgICBjb25zdCB7IHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3RhdHVzVGltZSB9ID0gY3VycmVudFVzZXI7XG4gICAgICBpZiAoc2Vzc2lvblN0YXR1cyA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORykge1xuICAgICAgICBjb25zdCBzdGF0ZXMgPSBbUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICog5aaC5p6c6Ieq5bex5pyq5o6l5ZCs5Li76YCa6K+d77yM5pS25Yiw5aSa56uvIENvbm5lY3Rpbmcg54q25oCB77yM6ZyA5oqb5Ye6IHNlc3Npb25DbG9zZVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaXNNYWluU2Vzc2lvbiA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkO1xuICAgICAgICBjb25zdCBjdXJyZW50VXNlclNhdGUgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0VXNlckxpc3QoKS5maW5kKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk/LnVzZXJTdGF0ZTtcbiAgICAgICAgY29uc3QgaXNBY2NlcHRNYWluU2Vzc2lvbiA9IGlzTWFpblNlc3Npb24gJiYgY3VycmVudFVzZXJTYXRlICYmIHN0YXRlcy5pbmNsdWRlcyhjdXJyZW50VXNlclNhdGUpO1xuICAgICAgICBpZiAoIWlzQWNjZXB0TWFpblNlc3Npb24pIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbe1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0FDQ0VQVCxcbiAgICAgICAgICAgIHN0YXRlVGltZTogc3RhdHVzVGltZSxcbiAgICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XSwgdHJhY2VJZCk7XG5cbiAgICAgICAgICB0aGlzLnNlc3Npb25DbG9zZShkYXRhLCB0cmFjZUlkLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5LqL5Lu25LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9vbkV2ZW50RG93bihkYXRhOiBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBldmVudFRpbWUsIGV2ZW50QXJncywgZXZlbnRUeXBlLCBmcm9tVXNlcklkLFxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChldmVudFR5cGUgPT09IENhbGxTZXJ2ZXJFdmVudFR5cGUuQ0FMTF9EVVJBVElPTiAmJiBjYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgY29uc3QgeyBmaXJzdEZyYW1lVGltZSB9ID0gZXZlbnRBcmdzIGFzIHsgZmlyc3RGcmFtZVRpbWU6IG51bWJlciB9O1xuICAgICAgLy8g6K6h566X5byA5aeL5pe26Ze0XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZTogY2xpZW50Rmlyc3RGcmFtZVRpbWUgfSA9IGF3YWl0IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIGZpcnN0RnJhbWVUaW1lLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0ZJUlNUX0ZSQU1FX1RJTUVfTywgYGNsaWVudEZpcnN0RnJhbWVUaW1lOiAke2NsaWVudEZpcnN0RnJhbWVUaW1lfWAsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lKGNhbGxJZCwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+l5Y2V5ZG8IGR1cmF0aW9uIOWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2U2luQ2FsbER1cmF0aW9uKGNhbGxJZDogc3RyaW5nLCBjbGllbnRTdGFydFRpbWU6IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7IGNhbGxJZCwgLi4ueyBjYWxsU3RhcnRUaW1lOiBjbGllbnRTdGFydFRpbWUgfSB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPlj5jmm7Tnm7jlhbPkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX29uU3dpdGNoTWVkaWFUeXBlKGRhdGE6IElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBhY3Rpb24sIGV4dHJhS2V5VmFsLCB0cmFuc2FjdGlvbklkLCBwcm9tb3RlcklkLFxuICAgIH0gPSBkYXRhO1xuICAgIGNvbnN0IHsgbWVkaWFUeXBlLCByZWFzb24gfSA9IGV4dHJhS2V5VmFsO1xuXG4gICAgY29uc3QgY3VycmVudENhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKTtcbiAgICBpZiAoY2FsbElkICE9PSBjdXJyZW50Q2FsbElkKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08sIGBub3QgY3VycmVudCBzZXNzaW9uIGNhbGxJZDogJHtjdXJyZW50Q2FsbElkfSwgcmVjdkNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgdHJhbnNhY3Rpb25JZDogb2xkVHJhbnNJZCwgYWN0aW9uOiBvbGRBY3Rpb24sIG1lZGlhVHlwZTogT2xkTWVkaWFUeXBlIH0gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0T2xkRGlhbG9nRGF0YSgpIHx8IHt9O1xuICAgIGlmIChvbGRUcmFuc0lkID09PSB0cmFuc2FjdGlvbklkICYmIG9sZEFjdGlvbiA9PT0gYWN0aW9uICYmIE9sZE1lZGlhVHlwZSA9PT0gbWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08sICdkdXBsaWNhdGUgZGlhbG9nIGRhdGEnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08sIGBhY3Rpb246ICR7YWN0aW9ufSwgcmVhc29uOiAke3JlYXNvbn1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRPbGREaWFsb2dEYXRhKHsgdHJhbnNhY3Rpb25JZCwgYWN0aW9uLCBtZWRpYVR5cGUgfSk7XG5cbiAgICAvLyDljYfnuqfmtYHnqIvlpITnkIZcbiAgICBpZiAoYWN0aW9uID09PSBEaWFsb2dBY3Rpb24uUkVRVUVTVCkge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChyZWFzb24pIHtcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQ0FOQ0VMOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5BQ0NFUFQ6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRTtcbiAgICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlTWVkaWFUeXBlKHRoaXMuX21haW5TZXNzaW9uIS5nZXRSZXFNZWRpYVR5cGUoKSEpO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVSZXFNZWRpYVR5cGUobnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlJFRlVTRTpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlJFRlVTRV9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uVElNRU9VVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNIQU5HRV9NRURJQV9UWVBFX1RJTUVPVVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRbY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRdXG4gICAgICAmJiB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIC8vIOmZjee6p+mAmuefpeWkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5OT1RJQ0UgJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICFyZWFzb24pIHtcbiAgICAgIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIGNhbGwgbG9nIOaXpeW/l1xuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2Q2FsbEVuZExvZyhkYXRhOiBJUHViQ2FsbExvZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FsbExvZyA9IHRyYW4yQ2FsbExvZyhkYXRhKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFJlY29yZChjYWxsTG9nLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIHB1YmxpYyBzZXNzaW9uQ2xvc2UoZGF0YTogeyBjYWxsSWQ6IHN0cmluZywgdG9EZXZpY2VJZDogc3RyaW5nfSwgdHJhY2VJZDogc3RyaW5nLCBpc1NlbGZIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOato+W4uOe7k+adn++8jOa4hemZpOacrOWcsOWtmOWCqOeahCBjYWxsSWRcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5yZW1vdmVBYm5vcm1hbENhbGxJZHMoY3VycmVudFVzZXJJZCwgW2NhbGxJZF0pO1xuXG4gICAgbGV0IGNsb3NlZFNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghY2xvc2VkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgdW5leHBlY3Qgc2Vzc2lvbiBjYWxsSWQgLT4gJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIC8vIHNlc3Npb24gY2xvc2Ug5ZCO57uT5p2f5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLmdldEFsbFRpbWVySWRzKCkuZm9yRWFjaCgodGltZXJJZCkgPT4gdGhpcy5fc3RvcFRpbWVyLmJpbmQodGhpcykodGltZXJJZCwgdHJhY2VJZCkpO1xuICAgICAgLy8g57uT5p2fIOS4iuaKpeesrOS4gOW4p1xuICAgICAgaWYgKGNsb3NlZFNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOa0vuWPkemAmuivnee7k+adn++8jOWkhOeQhumAmuivnee7k+adn+WQjiBSVEMg6YCA5oi/6Ze0562J6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivnee7k+adn1xuICAgICAqIOWkmuerr+WFtuS7luerr+aMguaWremAmuivne+8jOmcgOaKiuacrOerr+S6uuWRmOezu+e7n+eKtuaAgei9rOWMluS4uiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVBcbiAgICAgKi9cbiAgICBjb25zdCBjcnRVc2VyRGF0YSA9IGNsb3NlZFNlc3Npb24uZ2V0VXNlckxpc3QoKS5maW5kKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgbGV0IGhhbmd1cFJlYXNvbjtcbiAgICBpZiAoaXNTZWxmSGFuZ3VwICYmIGRhdGEudG9EZXZpY2VJZCAhPT0gdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpKSB7XG4gICAgICBoYW5ndXBSZWFzb24gPSBjbG9zZWRTZXNzaW9uLmdldElzTG9jYWxDbGllbnRIYW5ndXAoKSA/IGNydFVzZXJEYXRhIS5zeXN0ZW1TdGF0ZSA6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUDtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkNhbGxFbmRlZChuZXcgUkNDYWxsUGx1c1Nlc3Npb24oY2xvc2VkU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSwgaGFuZ3VwUmVhc29uIHx8IGNydFVzZXJEYXRhIS5zeXN0ZW1TdGF0ZSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9yZW1vdmVTZXNzaW9uKGNhbGxJZCk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2uIGNhbGxJZCDnp7vpmaQgc2Vzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlU2Vzc2lvbihjYWxsSWQ6IHN0cmluZykge1xuICAgIGlmIChjYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOS4jeWtmOWcqCBtYWluU2Vzc2lvbiDml7bvvIzku47mnI3liqHnq6/ojrflj5bmlbDmja7nlJ/miJAgbWFpblNlc3Npb24sIOW5tumAmuefpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCBpc05lZWRVcDpib29sZWFuID0gZmFsc2UsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLmdldENhbGxTZXNzaW9uKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9SLCBgZXJyY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiwgYGNvZGU6ICR7Y29kZX0sIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydENhbGxlcklkLFxuICAgIH0gPSBkYXRhITtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBzdGFydENhbGxlcklkLFxuICAgICAgc3RhcnRDYWxsZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG4gICAgaWYgKGlzTmVlZFVwKSB7XG4gICAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgLy8g5Lq65ZGY54q25oCB5Y+Y5pu06YCa55+lXG4gICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5YW85a6556e75Yqo56uvIG9uUGhvbmUg5peg5rOV5raI6Zmk6Zeu6aKYXG4gICAqIEExIOenu+WKqOerr+WSjCBCIOato+WcqCBjYWxsIOS4re+8jOS4lCBvblBob25lIOeKtuaAge+8jCBBMSDmnYDov5vnqIvlkI7vvIxCIOerr+WxleekuueahCBvblBob25lIOeKtuaAgeaXoOazlea2iOWksVxuICAgKiBBMiDlpJrnq6/lnKjmjqXlkKzlkoznm7TmjqXliqDlhaUgY2FsbCDml7bvvIzkuIrmiqUgb25QaG9uZUVuZCDnirbmgIHvvIzmtojpmaQgQiDnq6/lsZXnpLrnmoQgb25QaG9uZSDnirbmgIFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NsZWFyTW9iaWxlT25QaG9uZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChpdGVtKSA9PiBpdGVtPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLk1VTFRJKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5ELFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG5cbiAgICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfUiwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOWOnyBjbGllbnQg5Lit5a6a5LmJ55qE5LqL5Lu2XG4gIHByaXZhdGUgX29uVXNlclN0YXRlQ2hhbmdlKGNhbGxJZDogc3RyaW5nLCB1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB1c2VyU3RhdGUsIHN5c3RlbVN0YXRlIH0gPSB1c2VyO1xuICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZVVzZXJTdGF0ZUNoYW5nZWQoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlLFxuICAgICAgICByZWFzb246IHN5c3RlbVN0YXRlLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDmlLbliLDoh6rlt7Egc3lzdGVtU3RhdGUg5Li6IDk5Oe+8jOebtOaOpeemu+W8gOaIv+mXtFxuICAgICAqIOWkhOeQhuiiq+WPq+aOpeWQrOeahOeerOmXtO+8jOS4u+WPq+WQjOaXtuaMguaWreeahOaDheWGte+8jOS4jeaOieemu+W8gOaIv+mXtOmAmuivneS4jeS8mue7k+adn1xuICAgICAqL1xuICAgIHVzZXJzLmZvckVhY2goKHsgdXNlcklkLCBzeXN0ZW1TdGF0ZSB9KSA9PiB7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkICYmIHN5c3RlbVN0YXRlID09PSBSQ0NhbGxQbHVzUmVhc29uLkFCTk9STUFMX0VORCkge1xuICAgICAgICB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fLCBjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25PdGhlck1lbWJlckludml0ZShpbmZvOiBJT3RoZXJNZW1JbmZvW10pIHtcbiAgICBpbmZvLmZvckVhY2goKGluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsSWQgfSA9IGluZm87XG4gICAgICBjb25zdCBpbnZpdGVyVXNlcklkID0gdGhpcy5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldEludml0ZXJVc2VySWQoKTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlVXNlckludml0ZWQoW3VzZXJJZF0sIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKGluZm86IElDaGFuZ2VNZWRpYVR5cGVJbmZvLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlIH0gPSBpbmZvO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0KHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoaW5mbzogSUNoYW5nZU1lZGlhVHlwZUluZm8sIGNvZGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFKSB7XG4gICAgICB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfQ0hBTkdFX01FRElBX1RZUEVfXywgaW5mby5tZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIH1cbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVzdWx0KHtcbiAgICAgIC4uLmluZm8sXG4gICAgICBjb2RlLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25DYWxsVHlwZUNoYW5nZShjYWxsSWQ6IHN0cmluZywgY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkNhbGxUeXBlQ2hhbmdlZChjYWxsVHlwZSwgY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gUlRDUmVzb3VyY2VUYWcge1xuICAvKipcbiAgICog5pmu6YCa6Z+z6KeG6aKR5rWBXG4gICAqL1xuICBOT1JNQUwgPSAnUm9uZ0Nsb3VkUlRDJyxcbiAgLyoqXG4gICAqIOWxj+W5leWIhuS6q+a1gVxuICAgKi9cbiAgU0NSRUVOID0gJ1NjcmVlblNoYXJlJ1xufVxuIiwiaW1wb3J0IHtcbiAgUGx1Z2luQ29udGV4dCwgSVJ1bnRpbWUsIFJUQ01vZGUsIEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIsIGlzQm9vbGVhbixcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNSVENSb29tLFxuICBSQ1JUQ0NsaWVudCxcbiAgUkNSVENDb2RlLFxuICBSQ0xvY2FsVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDTG9jYWxBdWRpb1RyYWNrLFxuICBJU3Vic2NyaWJlQXR0cixcbiAgUkNSZW1vdGVWaWRlb1RyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDS2lja1JlYXNvbixcbiAgUkNUcmFjayxcbiAgUkNMb2NhbFZpZGVvVHJhY2ssXG4gIElQdWJsaXNoQXR0cnMsXG4gIElSQ1JUQ1N0YXRlUmVwb3J0LFxuICBoZWxwZXIsXG59IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJQXVkaW9Db25maWcsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NvZGUsXG4gIFJDQ2FsbFBsdXNGcmFtZVJhdGUsXG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gIFJDQ2FsbFBsdXNQYWNrZXRMb3NzU3RhdHMsXG4gIFJDQ2FsbFBsdXNSZXNvbHV0aW9uLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJUQ1Jlc291cmNlVGFnIH0gZnJvbSAnLi4vZW51bXMvUlRDUmVzb3VyY2VUYWcnO1xuaW1wb3J0IHsgcmV0cnlBc3luY0ZuIH0gZnJvbSAnLi4vdXRpbHMvcmV0cnknO1xuaW1wb3J0IHsgQ2FsbEhvb2tzVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsS2lja0V4dHJhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUlRDTW9kdWxlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgeyBJTWVkaWFNdXRlQ2hhbmdlSW5mbywgSU1lbWJlckluZm8gfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUgfSBmcm9tICcuL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgZ2V0VXNlclZpZGVvVmlld0luZm8gfSBmcm9tICcuLi91dGlscy9oZWxwZXInO1xuXG5pbnRlcmZhY2UgSUpvaW5SVENSb29tUmVzIHtcbiAgY29kZTogUkNSVENDb2RlO1xuICByb29tPzogUkNSVENSb29tIHwgdW5kZWZpbmVkO1xuICB1c2VySWRzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja3M/OiBSQ1JlbW90ZVRyYWNrW10gfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJU3ViUmVzIHtcbiAgY29kZTogUkNSVENDb2RlO1xuICBmYWlsZWRMaXN0PzogKElTdWJzY3JpYmVBdHRyKVtdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVB1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgbGl2ZVVybD86IHN0cmluZyB8IHVuZGVmaW5lZFxufVxuXG5pbnRlcmZhY2UgUkNLaWNrRXh0cmEge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBSVENNb2R1bGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXzogc3RyaW5nID0gJ2lubmVyLXJ0Yy1wcm9jZXNzLWZhaWxlZCdcblxuICBzdGF0aWMgX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXzogc3RyaW5nID0gJ2lubmVyLXJ0Yy1wZWVyY29ubmVjdGlvbi1hYm5vcm1hbC1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fOiBzdHJpbmcgPSAnaW5uZXItb24tc2VsZi1qb2luZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1vdGhlci1qb2luZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfUkVDRUlWRV9GSVJTVF9GUkFNRV9fOiBzdHJpbmcgPSAnaW5uZXItcmVjZWl2ZS1maXJzdC1mcmFtZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9LSUNLT0ZGX186IHN0cmluZyA9ICdpbm5lci1raWNrb2ZmLWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0RFVklDRV9FTkFCTEVfQ0hBTkdFX186IHN0cmluZyA9ICdpbm5lci1vbi1kZXZpY2UtZW5hYmxlLWNoYW5nZSdcblxuICAvKipcbiAgICogUkNSVEMg5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICog5bex5pa555qE6Z+z6KeG6aKRIHRyYWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBfbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW11cblxuICAvKipcbiAgICogUkNSVENSb29tIOWunuS+i1xuICAgKi9cbiAgcHVibGljIF9yb29tOiBSQ1JUQ1Jvb20gfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgX2NhbGxJZDogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9jYWxsTWVkaWFUeXBlITogUkNDYWxsUGx1c01lZGlhVHlwZVxuXG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBwcml2YXRlIF9pc1B1YlRpbnk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDop4bpopHphY3nva7mmK/lkKblj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnSXNDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpn7PpopHphY3nva7mmK/lkKblj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnSXNDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlrZjlgqjorr7nva7nmoTkurrlkZjlkozop4blm75cbiAgICovXG4gIHByaXZhdGUgX3VzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9ID0ge31cblxuICBwcml2YXRlIF9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyOiBJU3RhdHVzUmVwb3J0TGlzdGVuZXIgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgX3JlbW90ZUF1ZGlvRW5hYmxlOiBib29sZWFuID0gdHJ1ZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElDYWxsUGx1c0luaXRPcHRzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3J0Y0NsaWVudCA9IF9pbml0T3B0cz8ucnRjQ2xpZW50O1xuICAgIHRoaXMuX2lzUHViVGlueSA9IF9pbml0T3B0cy5pc1B1YlRpbnkgfHwgZmFsc2U7XG4gIH1cblxuICBzZXRDYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyKGxpc3RlbmVyOiBJU3RhdHVzUmVwb3J0TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICAvKipcbiAgICog5Y+W5pGE5YOP5aS06LWE5rqQXG4gICAqIOWGheWtmOS4reacieaXtu+8jOi/lOWbnuWGheWtmOS4reeahOinhui9qFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRWaWRlb1RyYWNrICYmICF0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRWaWRlb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHRyYWNrLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+W6bqm5YWL6aOO6LWE5rqQXG4gICAqIOWGheWtmOS4reacieaXtu+8jOi/lOWbnuWGheWtmOS4reeahOmfs+i9qFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgZGVmYXVsdEF1ZGlvVHJhY2sgPSB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IChkZWZhdWx0QXVkaW9UcmFjayAmJiAhdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSkgPyB7IHRyYWNrOiBkZWZhdWx0QXVkaW9UcmFjaywgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9IDogYXdhaXQgdGhpcy5fY3JlYXRlQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHRyYWNrLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6YCa6K+d57G75Z6L5Yib5bu66Z+z44CB6KeG6aKR6LWE5rqQXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg6Z+z6aKR5oiW6Z+z6KeG6aKRXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2NhbGxNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLmdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLmdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHNldFZpZGVvQ29uZmlnKHZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcpIHtcbiAgICB0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlID0gdHJ1ZTtcbiAgICB0aGlzLl92aWRlb0NvbmZpZyA9IHZpZGVvQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIHNldEF1ZGlvQ29uZmlnKGF1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcpIHtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlID0gdHJ1ZTtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZyA9IGF1ZGlvQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfREVTVFJPWV9BTExfVFJBQ0tTX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfVCwgYGVuYWJsZTogJHtlbmFibGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIWlzQm9vbGVhbihlbmFibGUpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsIGBwYXJhbSBlcnJvciwgZW5hYmxlOiB0eXBlIGlzIGJvb2xlYW4sIHZhbHVlOiAke2VuYWJsZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgPSBlbmFibGU7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhdWRpb1RyYWNrcyA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrcygpLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICBhdWRpb1RyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgaWYgKGVuYWJsZSkge1xuICAgICAgICB0cmFjay51bm11dGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYWNrLm11dGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95VHJhY2sodHJhY2s6IFJDTG9jYWxUcmFjaykge1xuICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbmRJbmRleCgobG9jYWxUcmFjaykgPT4gbG9jYWxUcmFjay5nZXRUcmFja0lkKCkgPT09IHRyYWNrLmdldFRyYWNrSWQoKSk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXNzaW9uIOi/nuaOpVxuICAgKi9cbiAgYXN5bmMgc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIC8vIDEuIOWKoOaIv+mXtFxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCByb29tIH0gPSBhd2FpdCB0aGlzLmpvaW5SVENSb29tKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgZXJyQ29kZSAtPiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIOazqOWGjCBSVEMg55u45YWz55uR5ZCsXG4gICAgICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICAgICAgdGhpcy5fcmVnUlRDTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5fcm9vbSA9IHJvb20hO1xuICAgICAgICBjb25zdCByb29tVXNlcnNJZCA9IHRoaXMuX3Jvb20/LmdldFJlbW90ZVVzZXJJZHMoKSB8fCBbXTtcbiAgICAgICAgaWYgKHJvb21Vc2Vyc0lkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9vbk90aGVyTWVtSm9pbmVkKHJvb21Vc2Vyc0lkLm1hcCgodXNlcklkKSA9PiAoeyBjYWxsSWQsIHVzZXJJZCB9KSksIHRyYWNlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGNhbGxJZCAtPiAke2NhbGxJZH0sIGVyciBtc2cgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMi4g5Y+R5biD5rWBXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uQmVmb3JlUHVibGlzaCk7XG4gICAgICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueVxuICAgICAgICAgID8gdGhpcy5fbG9jYWxUcmFja3MubWFwKCh0cmFjaykgPT4gKHRyYWNrLmlzVmlkZW9UcmFjaygpID8geyB0cmFjaywgaXNQdWJUaW55OiB0cnVlIH0gOiB0cmFjaykpXG4gICAgICAgICAgOiB0aGlzLl9sb2NhbFRyYWNrcztcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2gocHViUGFyYW1zLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJsaXNoUmVzLCBjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9QLCAnc2Vzc2lvbkNvbm5lY3RlZCBsb2NhbCB0cmFja3MgaXMgZW1wdHknLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgcHVibGlzaCBFeGNlcHRpb24gY2FsbElkIC0+ICR7Y2FsbElkfSwgZXJyIG1zZyAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgfVxuXG4gIGFzeW5jIHNlc3Npb25DbG9zZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOmUgOavgeacrOerr+i1hOa6kFxuICAgICAqL1xuICAgIHRoaXMuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGN1cnJlbnRSb29tSWQgPSB0aGlzLl9yb29tPy5nZXRSb29tSWQoKTtcbiAgICBpZiAodGhpcy5fcm9vbSAmJiBjYWxsSWQgPT09IGN1cnJlbnRSb29tSWQpIHtcbiAgICAgIC8vIOmAgOWHuuaIv+mXtFxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHRoaXMuX3Jvb20pO1xuICAgICAgLy8g5rOo6ZSA5YaF5a2Y5pWw5o2uXG4gICAgICB0aGlzLl9yZWxlYXNlU3RvcmVkRGF0YSgpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsIGBsZWF2ZVJvb20gZmFpbGVkLCBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgJ2xlYXZlUm9vbSBzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgJ2xlYXZlUm9vbSB0aHJvdyBleGNlcHRpb246IG5vdCBpbiByb29tJywgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOinhumikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZGlzYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB8IFJDUlRDQ29kZSwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjop4bpopFcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2subXV0ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKiAxLiDlkK/nlKjliY3lupTnlKjlsYLpnIDlhYjliJvlu7rop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB8IFJDUlRDQ29kZX0+IHtcbiAgICAvLyDojrflj5bmnKznq6/op4bpopEgdHJhY2tcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FNRVJBX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWmguaenOi1hOa6kOayoeiiq+emgeeUqO+8jOi/lOWbnuaIkOWKn1xuICAgICAqL1xuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZCv55So6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrIS51bm11dGUoKTtcbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5YiH5o2i6KeG6aKR6K6+5aSHXG4gICAqL1xuICBhc3luYyBjaGFuZ2VWaWRlb0RldmljZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFjayB9PiB7XG4gICAgLy8g5paw6K6+5aSH55qE6L2oXG4gICAgY29uc3QgcmVjZW50VHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIC8vIOaVtOeQhuWQjueahOi9qFxuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgbGV0IG5lZWREZXN0cm95VHJhY2s6IFJDTG9jYWxUcmFjaztcbiAgICB0aGlzLl9sb2NhbFRyYWNrcyAmJiB0aGlzLl9sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOi1hOa6kOmHiuaUvlxuICAgICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgICAgIG5lZWREZXN0cm95VHJhY2sgPSB0cmFjaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5LuO5pys5Zyw57yT5a2Y5Lit5Yig6Zmk6ZSA5q+B55qEIHRyYWNrXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKGl0ZW0pID0+IG5lZWREZXN0cm95VHJhY2sgJiYgKGl0ZW0uZ2V0VHJhY2tJZCgpICE9PSBuZWVkRGVzdHJveVRyYWNrLmdldFRyYWNrSWQoKSkpO1xuXG4gICAgcmVjZW50VHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIC8vIOe7meacrOWcsOWKoOS4iuaWsOS6p+eUn+eahOinhumikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIHRoaXMuX2xvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG5cbiAgICAvLyDpgJrnn6XkuIrlsYIgdHJhY2tSZWFkeVxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KHJlY2VudFRyYWNrcywgdHJhY2VJZCk7XG5cbiAgICAvLyDlt7LliqDlhaXmiL/pl7RcbiAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgLy8g5Y+R5biD5rWBXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChyZWNlbnRUcmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOmfs+mikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZGlzYWJsZUF1ZGlvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB8IFJDUlRDQ29kZSwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk1JQ1JPUEhPTkVfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLm11dGUoKTtcblxuICAgIHJldHVybiB7IGNvZGUsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5Y2H44CB6ZmNXG4gICAqL1xuICBhc3luYyBjaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAvKipcbiAgICAgKiDljYfnuqcg6Z+z6aKRIC0+IOmfs+inhumikVxuICAgICAqIDEuIOS4muWKoeWxgumcgOimgeWFiOmAmui/hyBjcmVhdGVMb2NhbFRyYWNrcyDliJvlu7rmnKzlnLDop4bpopEgdHJhY2tcbiAgICAgKiAyLiBTREsg5Y+q5aSE55CG5Y+R5biD6KeG6aKRIHRyYWNrXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgLy8gMS4g6I635Y+W57yT5a2Y5Lit55qE6KeG6aKRIHRyYWNrXG4gICAgICBsZXQgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrOiBuZXdUcmFjayB9ID0gYXdhaXQgdGhpcy5fY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNrID0gbmV3VHJhY2s7XG4gICAgICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG4gICAgICB9XG4gICAgICAvLyAyLiDlj5HluIPmtYFcbiAgICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueSA/IHsgdHJhY2s6IHRyYWNrISwgaXNQdWJUaW55OiB0cnVlIH0gOiB0cmFjayE7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMucHVibGlzaChbcHViUGFyYW1zXSwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZmN57qnIOmfs+inhumikSAtPiDpn7PpopFcbiAgICAgKi9cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICAvLyAxLiDojrflj5bmnKzlnLDop4bpopEgdHJhY2tcbiAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcblxuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20hLnVucHVibGlzaChbdHJhY2tdKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGB1bnB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6YeK5pS+6KeG6aKRIHRyYWNrXG4gICAgICAgIHRoaXMuZGVzdHJveVRyYWNrKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDlhaUgUlRDIOaIv+mXtFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5SVENSb29tKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByb29tPzogUkNSVENSb29tLCB0cmFja3M/OiBSQ1JlbW90ZVRyYWNrW10gfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fVCwgYGNhbGw6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgcm9vbSwgdHJhY2tzIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElKb2luUlRDUm9vbVJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcnRjQ2xpZW50LmpvaW5SVENSb29tLmJpbmQodGhpcy5fcnRjQ2xpZW50KSxcbiAgICAgIGZuQXJnczogW2NhbGxJZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCBSVENNb2RlLkNBTExdLFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5KT0lOX1JPT01fRVJSLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fcm9vbSA9IHJvb20hO1xuICAgIHRoaXMuX29uU2VsZkpvaW5lZCh7IGNhbGxJZCwgdXNlcklkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpIH0sIHRyYWNlSWQpO1xuICAgIHRyYWNrcz8ubGVuZ3RoICYmIHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrcyk7XG5cbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgcm9vbSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogUlRDIOiuoumYhVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1YnNjcmliZVRyYWNrcyh0cmFja3M6IChJU3Vic2NyaWJlQXR0cilbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHBhcmFtczogdHJhY2tzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyYWNrLCBzdWJUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyYWNrSWQ6IHRyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICBzdWJUaW55LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElTdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20hLnN1YnNjcmliZS5iaW5kKHRoaXMuX3Jvb20pLFxuICAgICAgZm5BcmdzOiBbdHJhY2tzXSxcbiAgICAgIG9uRXJyb3I6IChjb2RlKSA9PiB7fSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrcywgY29kZSk7XG5cbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLlNVQlNDUklCRV9FUlIsIHRyYWNlSWQpO1xuXG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1IsIGBlcnJvckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICogUlRDIOWPlua2iOiuoumYhVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVuc3Vic2NyaWJlVHJhY2tzKHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnN1YnNjcmliZSh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IsIGBlcnJvckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbGVhc2VTdG9yZWREYXRhKCkge1xuICAgIHRoaXMuX3Jvb20gPSBudWxsO1xuICAgIHRoaXMuX3JlbW90ZUF1ZGlvRW5hYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl91c2VyVmlld01hcCA9IHt9O1xuICB9XG5cbiAgZ2V0UmVtb3RlVHJhY2tzKCk6IHsgW3VzZXJJZDogc3RyaW5nXTogUkNSZW1vdGVUcmFja1tdfSB7XG4gICAgY29uc3QgdHJhY2tzOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0gPSB7fTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB0cmFja3M7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcklkcyA9IHRoaXMuX3Jvb20uZ2V0UmVtb3RlVXNlcklkcygpO1xuICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyYWNrc1t1c2VySWRdID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhY2tzO1xuICB9XG5cbiAgZ2V0UmVtb3RlVHJhY2sodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9yb29tPy5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCh1c2VySWQpLmZpbmQoKHRyYWNrKSA9PiAoKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykgPyB0cmFjay5pc0F1ZGlvVHJhY2soKSA6IHRyYWNrLmlzVmlkZW9UcmFjaygpKSk7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIC8qKlxuICAgKiBSVEMg5LqL5Lu255uR5ZCs5rOo5YaMXG4gICAqL1xuICBwcml2YXRlIF9yZWdSVENMaXN0ZW5lcnMoKSB7XG4gICAgLy8g5rOo5YaM5oi/6Ze05LqL5Lu255uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOacrOerr+iiq+i4ouWHuuaIv+mXtOaXtuinpuWPkVxuICAgICAgICogQGRlc2NyaXB0aW9uIOiiq+i4ouWHuuaIv+mXtOWPr+iDveaYr+eUseS6juacjeWKoeerr+i2heWHuuS4gOWumuaXtumXtOacquiDveaUtuWIsCBydGNQaW5nIOa2iOaBr++8jOaJgOS7peiupOS4uuW3seaWueemu+e6v+OAglxuICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgKiBAcGFyYW0gYnlTZXJ2ZXJcbiAgICAgICAqIOW9k+WAvOS4uiBmYWxzZSDml7bvvIzor7TmmI7mnKznq68gcnRjUGluZyDotoXml7ZcbiAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICovXG4gICAgICBvbktpY2tPZmY6IChieVNlcnZlcjogYm9vbGVhbiwgc3RhdGU/OiBSQ0tpY2tSZWFzb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgdGhpcy5fb25LaWNrT2ZmKGJ5U2VydmVyLCB0aGlzLl9yb29tIS5nZXRSb29tSWQoKSwgc3RhdGUpO1xuICAgICAgICB0aGlzLl9yZWxlYXNlU3RvcmVkRGF0YSgpO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+eUqOaIt+WKoOWFpVxuICAgICAgb25Vc2VySm9pbjogKHVzZXJJZDogc3RyaW5nW10pID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IHVzZXJJZC5tYXAoKGlkKSA9PiAoeyBjYWxsSWQ6IHRoaXMuX2NhbGxJZCwgdXNlcklkOiBpZCB9KSk7XG4gICAgICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgICAgICB0aGlzLl9vbk90aGVyTWVtSm9pbmVkKGluZm8sIHRyYWNlSWQpO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+eUqOaIt+emu+W8gFxuICAgICAgb25Vc2VyTGVhdmU6ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/otYTmupDlj5HluINcbiAgICAgIG9uVHJhY2tQdWJsaXNoOiB0aGlzLl9vblJlbW90ZVRyYWNrUHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+W5raI5Y+R5biDXG4gICAgICBvblRyYWNrVW5wdWJsaXNoOiB0aGlzLl9vblRyYWNrVW5wdWJsaXNoLmJpbmQodGhpcyksXG4gICAgICAvLyDov5znq6/otYTmupDlh4blpIflsLHnu6pcbiAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uUmVtb3RlVHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgIH0sXG4gICAgICAvLyDlj5HluIPogIXnpoHnlKjjgIHlkK/nlKjop4bpopFcbiAgICAgIG9uVmlkZW9NdXRlQ2hhbmdlOiAodmlkZW9UcmFjazogUkNSZW1vdGVWaWRlb1RyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uVmlkZW9NdXRlQ2hhZ25lKHtcbiAgICAgICAgICBmcm9tVXNlcklkOiB2aWRlb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgIG11dGVkOiB2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgIHRyYWNrSWQ6IHZpZGVvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyDlj5HluIPogIXnpoHnlKjjgIHlkK/nlKjpn7PpopFcbiAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQXVkaW9NdXRlQ2hhbmdlKHtcbiAgICAgICAgICBmcm9tVXNlcklkOiBhdWRpb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBvblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbjogdGhpcy5fb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb24uYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICAvLyDms6jlhozotKjph4/mlbDmja7miqXlkYrnm5HlkKxcbiAgICB0aGlzLl9yb29tIS5yZWdpc3RlclJlcG9ydExpc3RlbmVyKHtcbiAgICAgIG9uU3RhdGVSZXBvcnQ6IHRoaXMuX29uUlRDU3RhdGVSZXBvcnQuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICAvLyDms6jlhozpn7Pph4/kuIrmiqXkuovku7ZcbiAgICB0aGlzLl9yb29tIS5vbkF1ZGlvTGV2ZWxDaGFuZ2UoKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbkxvY2FsVHJhY2tSZWFkeSh0cmFja3M6IFJDTG9jYWxUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1JlYWR5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUkVDRUlWRV9GSVJTVF9GUkFNRV9fKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2lja09mZihieVNlcnZlcjogYm9vbGVhbiwgcm9vbUlkOiBzdHJpbmcsIHN0YXRlPzogUkNLaWNrUmVhc29uLCBraWNrRXh0cmE/OiBSQ0NhbGxLaWNrRXh0cmEpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX0tJQ0tfT0ZGX08sIGByb29uSWQ6ICR7cm9vbUlkfSwgYnlTZXJ2ZXI6ICR7YnlTZXJ2ZXJ9LCBzdGF0ZTogJHtzdGF0ZX0sIGtpY2tFeHRyYTogJHtKU09OLnN0cmluZ2lmeShraWNrRXh0cmEpfWApO1xuICAgIGxldCBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiA9IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlI7XG4gICAgaWYgKGJ5U2VydmVyKSB7XG4gICAgICBpZiAoa2lja0V4dHJhKSB7XG4gICAgICAgIHN5c3RlbVN0YXRlID0ga2lja0V4dHJhLmtpY2tSZWFzb25Db2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLlNFUlZFUl9LSUNLOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLktJQ0tFRF9CWV9TRVJWRVI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5PVEhFUl9LSUNLOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9KT0lORUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5JTV9ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5JTV9MT0dPVVQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uTE9HT1VUO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfQ0xJRU5UX0lNX0NPTk5FQ1RFRDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfTE9HSU47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9LSUNLT0ZGX18sIHN5c3RlbVN0YXRlLCByb29tSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyBQZWVyIOW8guW4uOWFs+mXrVxuICAgKiDnp7vliqjnq6/mnKrlpITnkIbmraTlm57osIPvvIzlrprkuYkgc3lzU3RhdHVzIOS4uiBDT05ORUNUSU9OX0VSUlxuICAgKi9cbiAgcHJpdmF0ZSBfb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb24oKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9QRUVSQ09OTkVDVElPTl9FWENFUFRfQ0xPU0VfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9vblNlbGZKb2luZWQoaW5mbzogSU1lbWJlckluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCBpbmZvLmNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlbW90ZVRyYWNrUHVibGlzaCh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrcywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrLmdldFVzZXJJZCgpO1xuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDpn7PpopHml7bvvIznm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpKSB7XG4gICAgICAgIG5lZWRTdWJUcmFja3MucHVzaCh7IHRyYWNrLCBzdWJUaW55OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl91c2VyVmlld01hcFt1c2VySWRdPy52aWRlb1ZpZXcpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayk7XG4gICAgICAgIGNvbnN0IHsgaXNUaW55IH0gPSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogaXNUaW55IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5lZWRTdWJUcmFja3MubGVuZ3RoICYmIHRoaXMuc3Vic2NyaWJlVHJhY2tzKG5lZWRTdWJUcmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25UcmFja1VucHVibGlzaCh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrcywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19VTlBVQkxJU0hfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgYXdhaXQgdGhpcy51bnN1YnNjcmliZVRyYWNrcyh0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25BdWRpb011dGVDaGFuZ2UoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrISk7XG4gIH1cblxuICBwcml2YXRlIF9vblZpZGVvTXV0ZUNoYWduZShpbmZvOiBJTWVkaWFNdXRlQ2hhbmdlSW5mbykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfRU5BQkxFX0NIQU5HRV9PLCBKU09OLnN0cmluZ2lmeSh7IGluZm8gfSksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2soaW5mby50cmFja0lkKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SVENTdGF0ZVJlcG9ydChyZXBvcnQ6IElSQ1JUQ1N0YXRlUmVwb3J0KSB7XG4gICAgY29uc3QgeyBzZW5kZXJzLCByZWNlaXZlcnMgfSA9IHJlcG9ydDtcbiAgICBzZW5kZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2luZCwgcGFja2V0c0xvc3RSYXRlLCBydHQgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI/Lm9uU2VuZFBhY2tldExvc3MocGFja2V0c0xvc3RSYXRlIHx8IDAsIHJ0dCB8fCAwKTtcbiAgICB9KTtcbiAgICByZWNlaXZlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFja0lkLCBraW5kLCBwYWNrZXRzTG9zdFJhdGUsIGJpdHJhdGUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLl9jYWxsTWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPICYmIGtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IGhlbHBlci5wYXJzZVRyYWNrSWQodHJhY2tJZCk7XG4gICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgIFt1c2VySWQ6IHN0cmluZ106IFJDQ2FsbFBsdXNQYWNrZXRMb3NzU3RhdHM7XG4gICAgICB9ID0ge307XG4gICAgICBkYXRhW3VzZXJJZF0gPSB7XG4gICAgICAgIHBhY2tldExvc3RSYXRlOiBwYWNrZXRzTG9zdFJhdGUhLFxuICAgICAgICBiaXRSYXRlOiBiaXRyYXRlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI/Lm9uUmVjZWl2ZVBhY2tldExvc3MoZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIFJUQyDmjqXmlLbmnIDnu4jlpLHotKXlkI7pnIDopoHosIPnlKggaGFuZ3VwIOaMguaWreeahOaDheWGtVxuICovXG4gIHByaXZhdGUgX29uUlRDTWV0aG9kRmFpbChzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fLCBzeXN0ZW1TdGF0ZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtSm9pbmVkKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgaW5mbywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX0RFVklDRV9FTkFCTEVfQ0hBTkdFX18sIHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65pys5Zyw6Z+z6aKRIHRyYWNrLCDliJvlu7rmiJDlip/lkI7kv53lrZjmnKzlnLDlubblm57osIPpgJrnn6VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxBdWRpb1RyYWNrfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3M/LnNvbWUoKGl0ZW0pID0+IGl0ZW0uaXNBdWRpb1RyYWNrKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX2F1ZGlvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICAvLyDmnKzmrKHnvJPlrZhcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgLy8g6YCa55+l5LiK5bGCXG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65pys5Zyw6KeG6aKRIHRyYWNrLCDliJvlu7rmiJDlip/lkI7kv53lrZjmnKzlnLDlubblm57osIPpgJrnn6VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxWaWRlb1RyYWNrfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9WSURFT19UUkFDS19ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3M/LnNvbWUoKGl0ZW0pID0+IGl0ZW0uaXNWaWRlb1RyYWNrKCkgJiYgIWl0ZW0uaXNEZXN0cm95ZWQoKSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9WSURFT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fdmlkZW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9WSURFT19UUkFDS19SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9WSURFT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgLy8g5pys5qyh57yT5a2YXG4gICAgdGhpcy5fbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIC8vIOmAmuefpeS4iuWxglxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOe8k+WtmOinhumikSB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldExvY2FsVmlkZW9UcmFjaygpOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQge1xuICAgIGxldCBsb2NhbFZpZGVvVHJhY2s6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MpIHtcbiAgICAgIFtsb2NhbFZpZGVvVHJhY2tdID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOe8k+WtmOmfs+mikSB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldExvY2FsQXVkaW9UcmFjaygpOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQge1xuICAgIGxldCBsb2NhbEF1ZGlvVHJhY2s6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MpIHtcbiAgICAgIFtsb2NhbEF1ZGlvVHJhY2tdID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxBdWRpb1RyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkeW4g+acrOWcsOi1hOa6kOeahOmAu+i+kVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2godHJhY2tzOiAoUkNMb2NhbFRyYWNrIHwgSVB1Ymxpc2hBdHRycylbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1QsIGB0cmFja3NJZHM6ICR7dHJhY2tzLm1hcCgoaXRlbSkgPT4gKChpdGVtIGluc3RhbmNlb2YgUkNMb2NhbFRyYWNrKSA/IGl0ZW0uZ2V0VHJhY2tJZCgpIDogaXRlbS50cmFjay5nZXRUcmFja0lkKCkpKX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgcmV0cnlBc3luY0ZuIDxJUHViUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9yb29tIS5wdWJsaXNoLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5QVUJMSVNIX0VSUiwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaFZpZGVvVHJhY2soKSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZGVvVHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueSA/IHsgdHJhY2s6IGRlZmF1bHRWaWRlb1RyYWNrISwgaXNQdWJUaW55OiB0cnVlIH0gOiBkZWZhdWx0VmlkZW9UcmFjayE7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20hLnB1Ymxpc2goW3B1YlBhcmFtc10pO1xuICB9XG5cbiAgc2V0VmlkZW9WaWV3KGxpc3Q6IHt1c2VySWQ6IHN0cmluZywgdmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk/OiBib29sZWFufVtdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZWVkU3ViVHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgdmlkZW9FbGVtZW50LCBpc1RpbnkgPSBmYWxzZSB9ID0gaXRlbTtcbiAgICAgIHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF0gPSB7XG4gICAgICAgIHZpZGVvVmlldzogdmlkZW9FbGVtZW50LFxuICAgICAgICBpc1RpbnksXG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiDorr7nva7mnKznq6/op4blm77ml7bvvIzlj6rlrZjlgqjmlbDmja7vvIzml6DpnIDorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKHVzZXJJZCA9PT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIOiuvue9rui/nOerr+inhuWbvuaXtu+8jOWmguaenOW3sue7j+WKoOWFpeaIv+mXtO+8jOWImeiOt+WPlui/nOerr+i1hOa6kOebtOaOpeiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVtb3RlVHJhY2tzID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKTtcbiAgICAgIGNvbnN0IHN1YlBhcmFtcyA9IChyZW1vdGVUcmFja3MhW3VzZXJJZF0gfHwgW10pLm1hcCgodHJhY2spID0+ICh7XG4gICAgICAgIHRyYWNrLFxuICAgICAgICBzdWJUaW55OiBpc1RpbnksXG4gICAgICB9KSkuZmlsdGVyKCh7IHRyYWNrIH0pID0+ICF0cmFjay5pc1N1YnNjcmliZWQoKSk7XG4gICAgICBuZWVkU3ViVHJhY2tzLnB1c2goLi4uc3ViUGFyYW1zKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogZ2V0VXNlclZpZGVvVmlld0luZm8odGhpcy5fdXNlclZpZXdNYXApLFxuICAgICAgICBuZWVkU3ViVHJhY2tJZHM6IG5lZWRTdWJUcmFja3MubWFwKCh7IHRyYWNrIH0pID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk6KeG5Zu+5pe277yM5Y+W5raI6K6i6ZiF6LWE5rqQXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVuc3ViVHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSBbXTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF07XG4gICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9UcmFjayA9IHRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgICAgIHZpZGVvVHJhY2subGVuZ3RoICYmIHVuc3ViVHJhY2tzLnB1c2godmlkZW9UcmFja1swXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFTU9WRV9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogZ2V0VXNlclZpZGVvVmlld0luZm8odGhpcy5fdXNlclZpZXdNYXApLFxuICAgICAgICB1bnN1YlRyYWNrczogdW5zdWJUcmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICAgIH0sXG4gICAgKSwgdHJhY2VJZCk7XG5cbiAgICBpZiAodW5zdWJUcmFja3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlVHJhY2tzKHVuc3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5a2Y5YKo55qE5Lq65ZGY5ZKMIHZpZGVvIOWFg+e0oOaVsOaNrlxuICAgKi9cbiAgZ2V0VXNlclZpZXdNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJWaWV3TWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIOaSreaUvuWqkuS9k+i1hOa6kFxuICAgKi9cbiAgYXN5bmMgcGxheU1lZGlhKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9ULCBgdXNlcklkOiAke3VzZXJJZH0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9LCB2aWRlb1ZpZXc6ICR7dmlkZW9WaWV3Py5ub2RlTmFtZX1gLCB0cmFjZUlkKTtcbiAgICBsZXQgdHJhY2s6IFJDVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiDljLrliIbmnKznq6/lkozov5znq69cbiAgICAgKi9cbiAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0cmFjayA9IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKSEgOiB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpITtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICB0cmFjayA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKClbdXNlcklkXS5maWx0ZXIoKHRyYWNrKSA9PiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpWzBdO1xuICAgIH1cblxuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBX1JFU09VUkNFX0lOVkFMSUVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSB0cmFjay5pc0F1ZGlvVHJhY2soKSA/IGF3YWl0IHRyYWNrLnBsYXkoKSA6IGF3YWl0IHRyYWNrLnBsYXkodmlkZW9WaWV3KTtcbiAgICAgIC8qKlxuICAgICAgICog5aSE55CG6YCa6K+d5YmN6K6+572u5LqG6Z2Z6Z+z5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAgICAgKi9cbiAgICAgIHRyYWNrLmlzQXVkaW9UcmFjaygpICYmICF0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSAmJiB0cmFjay5tdXRlKCk7XG5cbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUExBWV9NRURJQV9GQUlMRUR9LCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9LGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUExBWV9NRURJQV9GQUlMRUQgfTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDTG9jYWxBdWRpb1RyYWNrLFxuICBSQ1JUQ0NvZGUsXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNUcmFjayxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQge1xuICBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gIFJDQ2FsbFBsdXNSZWFzb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgUkNDYWxsUGx1c1R5cGUsXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB7XG4gIHByaXZhdGUgX2xpc3RlbmVyITogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lclxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog54q25oCB5py65LqL5Lu25rOo5YaMXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAqIOWbnuiwg+W6lOeUqOWxguS6i+S7tlxuICAqIEBwYXJhbSBldmVudE5hbWVcbiAgKiBAcGFyYW0gYXR0cnNcbiAgKiBAcmV0dXJuc1xuICAqL1xuICBwcml2YXRlIGFzeW5jIF9jYWxsQXBwTGlzdGVuZXIoZXZlbnROYW1lOiBrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCAuLi5hdHRyczogYW55W10pIHtcbiAgICBjb25zdCBoYW5kbGUgPSB0aGlzLl9saXN0ZW5lcj8uW2V2ZW50TmFtZV0gYXMgRnVuY3Rpb247XG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGhhbmRsZSguLi5hdHRycyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkOiBzdHJpbmcsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVjZWl2ZWRDYWxsJyxcbiAgICAgIGNhbGxJZDogc2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbCcsIHNlc3Npb24sIGV4dHJhKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQhLCBjYWxsSWQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbENvbm5lY3RlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxDb25uZWN0ZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbENvbm5lY3RlZCcsIHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxUeXBlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxUeXBlQ2hhbmdlZCcsIGNhbGxUeXBlLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWinumHj+S4iuaKpei/nOerr+S6uuWRmOeKtuaAgeWPmOWMllxuICAgKi9cbiAgcHVibGljIG9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZChkYXRhOiB7XG4gICAgY2FsbElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgICByZWFzb24/OiBSQ0NhbGxQbHVzUmVhc29uLFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24sXG4gICAgfSA9IGRhdGE7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICByZWFzb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHVzZXJTdGF0ZSwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbGxFbmRlZChzZXNzaW9uOiBSQ0NhbGxQbHVzU2Vzc2lvbiwgcmVhc29uOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25DYWxsRW5kZWQnLFxuICAgICAgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgY2xvc2VSZWFzb246IHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvbkNhbGxFbmRlZCcsIHNlc3Npb24sIHJlYXNvbik7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdHJhY2s/LmlzT3duZXJNdXRlZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsXG4gICAgICBjYWxsSWQsXG4gICAgICB0cmFja0lkOiB0cmFjaz8uZ2V0VHJhY2tJZCgpLFxuICAgICAgZW5hYmxlOiB0cmFjaz8uaXNPd25lck11dGVkKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrPy5nZXRVc2VySWQoKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUmVjb3JkKHJlY29yZDogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxSZWNvcmQnLFxuICAgICAgcmVjb3JkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsUmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQ6IHN0cmluZywgdHJhbnNhY3Rpb25JZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCcsXG4gICAgICB1c2VySWQsXG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JywgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoaW5mbzoge1xuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uSWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFxuICB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgY29kZSxcbiAgICB9ID0gaW5mbztcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsXG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCcsIHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKGluZm86IHsgY2FsbElkOiBzdHJpbmcsIGNhbGxTdGFydFRpbWU6IG51bWJlciB9LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxTdGFydFRpbWUnLFxuICAgICAgaW5mbyxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsIGluZm8pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkOiBzdHJpbmcsIGNhbGxGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsXG4gICAgICBjYWxsSWQsXG4gICAgICBjYWxsRmlyc3RGcmFtZVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZScsIGNhbGxJZCwgY2FsbEZpcnN0RnJhbWVUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3M6IFJDVHJhY2tbXSwgdHJhY2VJZD86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblVzZXJNZWRpYUF2YWlsYWJsZScsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlck1lZGlhQXZhaWxhYmxlJywgdXNlcklkLCBtZWRpYVR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRmV0Y2hSZW1vdGVNZWRpYUVycm9yKHRyYWNrczogSVN1YnNjcmliZUF0dHJbXSwgY29kZTogUkNSVENDb2RlKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHsgdHJhY2sgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uRmV0Y2hSZW1vdGVNZWRpYUVycm9yJywgdXNlcklkLCBjb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdDoge1xuICAgIHRyYWNrOiBSQ0xvY2FsQXVkaW9UcmFjayB8IFJDUmVtb3RlQXVkaW9UcmFjaztcbiAgICBhdWRpb0xldmVsOiBudW1iZXI7XG4gIH1bXSkge1xuICAgIGF1ZGlvTGV2ZWxSZXBvcnRMaXN0LmZvckVhY2goKHsgdHJhY2ssIGF1ZGlvTGV2ZWwgfSkgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkJywgdXNlcklkLCBhdWRpb0xldmVsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNTdHJpbmcgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQW5kcm9pZFB1c2hDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX2FuZHJvaWRQdXNoQ29uZmlnOiBJQW5kcm9pZFB1c2hDb25maWcgPSB7fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge31cblxuICAvKipcbiAgICog6K6+572u5bCP57Gz55qEIGNoYW5uZWxJZFxuICAgKi9cbiAgc2V0Q2hhbm5lbElkTWkoY2hhbm5lbElkTWk6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoY2hhbm5lbElkTWkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogY2hhbm5lbElkTWkgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NoYW5uZWxJZE1pfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmNoYW5uZWxJZE1pID0gY2hhbm5lbElkTWk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5bCP57GzIExhcmdlIGljb24g6ZO+5o6lXG4gICAqL1xuICBzZXRNaUxhcmdlSWNvblVybChtaUxhcmdlSWNvblVybDogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhtaUxhcmdlSWNvblVybCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBtaUxhcmdlSWNvblVybCB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7bWlMYXJnZUljb25Vcmx9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcubWlMYXJnZUljb25VcmwgPSBtaUxhcmdlSWNvblVybDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ljY7kuLrnmoQgY2hhbm5lbElkXG4gICAqL1xuICBzZXRDaGFubmVsSWRIVyhjaGFubmVsSWRIVzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhjaGFubmVsSWRIVykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBjaGFubmVsSWRIVyB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2hhbm5lbElkSFd9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuY2hhbm5lbElkSFcgPSBjaGFubmVsSWRIVztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ljY7kuLrmjqjpgIHmtojmga/liIbnsbtcbiAgICovXG4gIHNldENhdGVnb3J5SFcoY2F0ZWdvcnlIVzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhjYXRlZ29yeUhXKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNhdGVnb3J5SFcgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhdGVnb3J5SFd9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuY2F0ZWdvcnlIVyA9IGNhdGVnb3J5SFc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Y2O5Li65o6o6YCB5raI5oGv57qn5YirXG4gICAqL1xuICBzZXRJbXBvcnRhbmNlSFcoaW1wb3J0YW5jZUhXOiAnTk9STUFMJyB8ICdMT1cnKSB7XG4gICAgaWYgKGltcG9ydGFuY2VIVyAhPT0gJ0xPVycgJiYgaW1wb3J0YW5jZUhXICE9PSAnTk9STUFMJykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGltcG9ydGFuY2VIVyB2YWx1ZSBpcyBOT1JNQUx8TE9XLCB2YWx1ZTogJHtpbXBvcnRhbmNlSFd9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuaW1wb3J0YW5jZUhXID0gaW1wb3J0YW5jZUhXO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWNjuS4uumAmuefpeexu+Wei+eahOaOqOmAgeaJgOS9v+eUqOeahOmAmuefpeWbvueJhyB1cmxcbiAgKi9cbiAgc2V0SW1hZ2VVcmxIVyhpbWFnZVVybEhXOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGltYWdlVXJsSFcpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogaW1hZ2VVcmxIVyB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7aW1hZ2VVcmxIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5pbWFnZVVybEhXID0gaW1hZ2VVcmxIVztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gT1BQTyDnmoQgY2hhbm5lbElkXG4gICAqL1xuICBzZXRDaGFubmVsSWRPUFBPKGNoYW5uZWxJZE9QUE86IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoY2hhbm5lbElkT1BQTykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBjaGFubmVsSWRPUFBPIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjaGFubmVsSWRPUFBPfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmNoYW5uZWxJZE9QUE8gPSBjaGFubmVsSWRPUFBPO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riB2aXZvIOeahOexu+Wei1xuICAgKi9cbiAgc2V0VHlwZVZpdm8odHlwZVZpdm86IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcodHlwZVZpdm8pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogdHlwZVZpdm8gdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke3R5cGVWaXZvfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLnR5cGVWaXZvID0gdHlwZVZpdm87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIFZpdm8g5YiG57G7XG4gICAqL1xuICBzZXRDYXRlZ29yeVZpdm8oY2F0ZWdvcnlWaXZvOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNhdGVnb3J5Vml2bykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBjYXRlZ29yeVZpdm8gdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhdGVnb3J5Vml2b31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5jYXRlZ29yeVZpdm8gPSBjYXRlZ29yeVZpdm87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgKiDorr7nva4gRkNNIOaOqOmAgeW5s+WPsOa4oOmBkyBJRFxuICAqL1xuICBzZXRGY21DaGFubmVsSWQoZmNtQ2hhbm5lbElkOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGZjbUNoYW5uZWxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBmY21DaGFubmVsSWQgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ZjbUNoYW5uZWxJZH1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5mY21DaGFubmVsSWQgPSBmY21DaGFubmVsSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEZDTSDpgJrnn6XnsbvlnovmjqjpgIHml7bmiYDkvb/nlKjnmoTliIbnu4QgaWRcbiAgICovXG4gIHNldEZjbUNvbGxhcHNlS2V5KGZjbUNvbGxhcHNlS2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGZjbUNvbGxhcHNlS2V5KSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGZjbUNvbGxhcHNlS2V5IHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtmY21Db2xsYXBzZUtleX1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5mY21Db2xsYXBzZUtleSA9IGZjbUNvbGxhcHNlS2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riBGQ00g6YCa55+l57G75Z6L55qE5o6o6YCB5omA5L2/55So55qE6YCa55+l5Zu+54mHIHVybFxuICAgKi9cbiAgc2V0RmNtSW1hZ2VVcmwoZmNtSW1hZ2VVcmw6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoZmNtSW1hZ2VVcmwpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogZmNtSW1hZ2VVcmwgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ZjbUltYWdlVXJsfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmZjbUltYWdlVXJsID0gZmNtSW1hZ2VVcmw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEhPTk9SIOaOqOmAgee6p+WIq1xuICAgKiBMT1c6IOi1hOiur+iQpemUgOexu+a2iOaBr++8jE5PUk1BTDog5pyN5Yqh5LiO6YCa6K6v57G75raI5oGvXG4gICAqL1xuICBzZXRpbXBvcnRhbmNlSG9ub3IoaW1wb3J0YW5jZUhvbm9yOiAnTk9STUFMJyB8ICdMT1cnKSB7XG4gICAgaWYgKGltcG9ydGFuY2VIb25vciAhPT0gJ0xPVycgJiYgaW1wb3J0YW5jZUhvbm9yICE9PSAnTk9STUFMJykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGltcG9ydGFuY2VIb25vciB2YWx1ZSBpcyBOT1JNQUx8TE9XLCB2YWx1ZTogJHtpbXBvcnRhbmNlSG9ub3J9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuaW1wb3J0YW5jZUhvbm9yID0gaW1wb3J0YW5jZUhvbm9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riBIT05PUiDmjqjpgIHmiYDkvb/nlKjnmoTpgJrnn6Xlm77niYcgdXJsXG4gICAqL1xuICBzZXRpbWFnZVVybEhvbm9yKGltYWdlVXJsSG9ub3I6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoaW1hZ2VVcmxIb25vcikpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBpbWFnZVVybEhvbm9yIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtpbWFnZVVybEhvbm9yfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmltYWdlVXJsSG9ub3IgPSBpbWFnZVVybEhvbm9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaehOW7uiBJQW5kcm9pZFB1c2hDb25maWdcbiAgICogQHJldHVybnMgSUFuZHJvaWRQdXNoQ29uZmlnIOWuieWNk+aOqOmAgemFjee9ruaVsOaNrlxuICAgKiDov5Tlm57lgLzpnIDkvKDlhaUgc3RhcnRDYWxs44CBaW52aXRl44CBaGFuZ3VwIOaWueazleeahCBwdXNoQ29uZmlnLmFuZHJvaWRDb25maWcg5LitXG4gICAqL1xuICBidWlsZCgpOiBJQW5kcm9pZFB1c2hDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZztcbiAgfVxufVxuIiwiLyoqXG4gKiBleHRyYSDlhoXlrrnlsLrlr7jpmZDliLbvvJoxMjggS0JcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9FWFRSQV9CWVRFUyA9IDEyOCAqIDEwMjQ7XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgZ2V0VVVJRCwgSVJ1bnRpbWUsIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm90RW1wdHlBcnJheSwgbm90RW1wdHlTdHJpbmcsIFBsdWdpbkNvbnRleHQsIFJDQ29ubmVjdGlvblN0YXR1cyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZW1vdGVUcmFjaywgUkNSVENDb2RlLCBkZXZpY2UgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG4gIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsXG4gIElDYWxsUGx1c0luaXRPcHRzLFxuICBJU3RhdHVzUmVwb3J0TGlzdGVuZXIsXG4gIElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlcyxcbiAgUkNDYWxsUGx1c0NhbGxVc2VyLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNDYWxsUGx1c1R5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICBJQXVkaW9Db25maWcsXG4gIElWaWRlb0NvbmZpZyxcbiAgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c1B1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBSQ0F1ZGlvQ29uZmlnQnVpbGRlciBmcm9tICcuL1JDQXVkaW9Db25maWdCdWlsZGVyJztcbmltcG9ydCBSQ1ZpZGVvQ29uZmlnQnVpbGRlciBmcm9tICcuL1JDVmlkZW9Db25maWdCdWlsZGVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24nO1xuaW1wb3J0IHtcbiAgZ2V0Qnl0ZUxlbmd0aCxcbiAgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUsIGlzU3VwcG9ydE1lZGlhU2VydmVyLCB2YWxpZGF0ZUJpdHJhdGUsIHZhbGlkYXRlUHVzaENvbmZpZywgdmFsaWRhdGVWaWRlb05vZGVOYW1lLFxufSBmcm9tICcuLi91dGlscy9oZWxwZXInO1xuaW1wb3J0IFJDQ2FsbFBMdXNTdGF0aXN0aWNzIGZyb20gJy4uL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyc7XG5pbXBvcnQge1xuICBJSGFuZ3VwRm9yQnVzeU9wdHMsIElNZW1iZXJJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJUQ01vZHVsZSB9IGZyb20gJy4uL21vZHVsZXMvUlRDTW9kdWxlJztcbmltcG9ydCB7IEZvcndhcmRUeXBlIH0gZnJvbSAnLi4vZW51bXMvRm9yd2FyZFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4uL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBDYWxsU2VydmVyRXJyb3JDb2RlIH0gZnJvbSAnLi4vZW51bXMvQ2FsbFNlcnZlckVycm9yQ29kZSc7XG5pbXBvcnQgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciBmcm9tICcuL1JDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IHsgTUFYX0VYVFJBX0JZVEVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsUGx1c0NsaWVudCB7XG4gIC8qKlxuICAgKiDmkYTlg4/lpLTph4fpm4bphY3nva5cbiAgICovXG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO6YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICAvKipcbiAgICog57uf6K6h5Z+L54K557G7XG4gICAqL1xuICBwcml2YXRlIF9jYWxsUGx1c1N0YXRpc3RpY3M6IFJDQ2FsbFBMdXNTdGF0aXN0aWNzXG5cbiAgLyoqXG4gICAqIGNsaWVudCBjYWxsSWRcbiAgICovXG4gIHByaXZhdGUgX2NsaWVudENhbGxJZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICog5piv5ZCm5Li65Li75Yqo5oyC5patXG4gICAqL1xuICBwcml2YXRlIF9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i/h+eoi+S4reaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfbmVlZEhhbmd1cENhbGxJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmU7XG5cbiAgcHJpdmF0ZSBfcnRjTW9kdWxlOiBSVENNb2R1bGU7XG5cbiAgLyoqXG4gICAqIOS4iuaKpeW6lOeUqOWxguS6i+S7tuaooeWdl1xuICAgKi9cbiAgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUgPSBuZXcgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZShfbG9nZ2VyKTtcbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MgPSBuZXcgUkNDYWxsUEx1c1N0YXRpc3RpY3ModGhpcy5fbG9nZ2VyLCB0aGlzLl9jb250ZXh0KTtcbiAgICAvLyDliJ3lp4vljJbnirbmgIHmnLrlrp7kvotcbiAgICB0aGlzLl9jYWxsRW5naW5lID0gbmV3IFJDQ2FsbEVuZ2luZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUgPSBuZXcgUlRDTW9kdWxlKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2luaXRPcHRzLCB0aGlzLl9sb2dnZXIsIHRoaXMuX2NhbGxFbmdpbmUsIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlKTtcblxuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXywgdGhpcy5fcnRjUHJvY2Vzc0ZhaWxIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fLCB0aGlzLl9wZWVyQ29ubmVjdGlvbkFibm9ybWFsQ2xvc2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX1NFTEZfSk9JTkVEX18sIHRoaXMuX3NlbGZKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX09USEVSX0pPSU5FRF9fLCB0aGlzLl9vdGhlckpvaW5lZEhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUkVDRUlWRV9GSVJTVF9GUkFNRV9fLCB0aGlzLl9yZWNlaXZlRmlyc3RGcmFtZUhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fS0lDS09GRl9fLCB0aGlzLl9raWNrb2ZmSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fLCB0aGlzLl9yZWNlaXZlRGV2aWNlRW5hYmxlQ2hhbmdlSGFuZGxlLmJpbmQodGhpcykpO1xuXG4gICAgLyoqXG4gICAgICog6YCa6K+d5bu656uL5ZCO77yMUlRDIOaooeWdl+mcgOWPkeW4g+i1hOa6kFxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxFbmdpbmUub24oUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DT05ORUNUX18sIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog6YCa6K+d5oyC5pat5ZCO77yMUlRDIOaooeWdl+mcgOmAgOWHuuaIv+mXtOOAgeWkhOeQhuWGheWtmOaVsOaNrlxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxFbmdpbmUub24oUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fLCB0aGlzLl9zZXNzaW9uQ2xvc2VIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgLyoqXG4gICAgICog5aSE55CGIFJUQyDmqKHlnZflqpLkvZPljYfpmY3nuqfpgLvovpFcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX18sIHRoaXMuX3J0Y01vZHVsZS5jaGFuZ2VNZWRpYVR5cGUuYmluZCh0aGlzLl9ydGNNb2R1bGUpKTtcbiAgICAvKipcbiAgICAgKiDmlLbliLDpgJror53pgoDor7flkI7vvIzpnIDkuIrmiqXln4vngrlcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCAobmV3U2Vzc2lvbiwgaW52aXRlU291cmNlKSA9PiB7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19SRUNFSVZFX0NBTExfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG5ld1Nlc3Npb24sICcnLCBpbnZpdGVTb3VyY2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWKoOaIv+mXtOOAgeWPkeW4g+OAgeiuoumYheWksei0peaXtumcgOe7k+adn+mAmuivne+8jOW5tuS4iuaKpeWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfcnRjUHJvY2Vzc0ZhaWxIYW5kbGUoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24pO1xuICAgICAgdGhpcy5fX2lubmVySGFuZ3VwKHsgY2FsbElkLCBzeXN0ZW1TdGF0ZSB9LCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcnRjIHBlZXJDb25uZWN0aW9uIOW8guW4uOaWreW8gOaXtumcgOe7k+adn+mAmuivne+8jOW5tuS4iuaKpeWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICAvLyDkuIrmiqXnirbmgIHorqnlr7nmlrnnn6XpgZPoh6rlt7HnprvlvIDnmoTljp/lm6BcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQ6IG1haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgICBzeXNTdGF0dXM6IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUiwgbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmnKznq6/liqDlhaUgUlRDIOaIv+mXtO+8jOmcgOabtOaWsOacrOS6uiBPTkNBTEwg54q25oCB77yM6YeN5paw5qCh5pe2XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZWxmSm9pbmVkSGFuZGxlKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkNhbGxDb25uZWN0ZWQoc2Vzc2lvbiEpO1xuXG4gICAgLyoqXG4gICAgICog5pu05paw6Ieq5bex55qE54q25oCBXG4gICAgICovXG4gICAgY29uc3QgdmlkZW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCBhdWRpb1RyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIGNvbnN0IGNhbWVyYUVuYWJsZSA9IHZpZGVvVHJhY2sgPyAhdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSA6IGZhbHNlO1xuICAgIGNvbnN0IG1pY3JvcGhvbmVFbmFibGUgPSBhdWRpb1RyYWNrID8gIWF1ZGlvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIGNhbWVyYUVuYWJsZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZCwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgbWljcm9waG9uZUVuYWJsZSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBzZWxmU3RhdGUgPSBbXG4gICAgICB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHNlbGZTdGF0ZSwgdHJhY2VJZCk7XG5cbiAgICAvLyDph43mlrDlvIDlp4vmoKHml7bpgLvovpFcbiAgICB0aGlzLl9jYWxsRW5naW5lLnN0YXJ0VGltZUNvcnJlY3Rpb24odHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6L+c56uv5Lq65ZGY5Yqg5YWl5oi/6Ze077yM5pu05paw6L+c56uv5Lq65ZGY54q25oCB5ZKM6YCa6K+d54q25oCB5Li6IE9OQ0FMTFxuICAgKi9cbiAgcHJpdmF0ZSBfb3RoZXJKb2luZWRIYW5kbGUoaW5mbzogSU1lbWJlckluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5pu05paw5Yqg5YWl5oi/6Ze05Lq65ZGY54q25oCBXG4gICAgbGV0IGNhbGxJZCA9ICcnO1xuICAgIGNvbnN0IHVzZXJzU3RhdGUgPSBpbmZvLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY2FsbElkID0gaXRlbS5jYWxsSWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uT05DQUxMLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgdXNlcnNTdGF0ZSwgdHJhY2VJZCk7XG5cbiAgICAvLyDmnInkurrlj6rliqDmiL/pl7TvvIzkuI3lj5HmtYHvvIzmlYXmraTlpITkuZ/mm7TmlrDkuLogQ09OTkVDVEVEXG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw6aaW5bin5LiK5oql57uZ5Lia5Yqh5bGCXG4gICAqL1xuICBwcml2YXRlIF9yZWNlaXZlRmlyc3RGcmFtZUhhbmRsZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldFN0YXRlKCkgIT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKSB7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpO1xuICAgIH1cblxuICAgIC8vIOe7mSBDYWxsU2VydmVyIOS4iuaKpea1geWIsOi+vlxuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBGaXJzdEZyYW1lVGltZSh0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDooqvouKLlh7rmiL/pl7Tml7bvvIzpnIDnu5PmnZ/pgJror51cbiAgICovXG4gIHByaXZhdGUgX2tpY2tvZmZIYW5kbGUoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHJvb21JZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDmnKznq6/nvZHnu5zmnInpl67popjvvIxwaW5nIOWksei0peaXtlxuICAgICAqL1xuICAgIGlmIChzeXN0ZW1TdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUikge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5lbmRDdXJyZW50U2Vzc2lvbihzeXN0ZW1TdGF0ZSwgcm9vbUlkLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6KKr5pyN5Yqh56uv6Lii5Ye65pe255qE5aSE55CGXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAobWFpblNlc3Npb24pIHtcbiAgICAgIGNvbnN0IGNhbGxJZCA9IG1haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUJOT1JNQUxfSEFOR1VQX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBtYWluU2Vzc2lvbiwgdGhpcy5fY2xpZW50Q2FsbElkKTtcblxuICAgICAgLy8g5LiK5oql54q25oCB55u05o6l6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG5cbiAgICAgIC8vIOebtOaOpee7k+adn+W3seaWuemAmuivnVxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5lbmRDdXJyZW50U2Vzc2lvbihzeXN0ZW1TdGF0ZSwgcm9vbUlkLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6L+c56uv6LWE5rqQ6Z+z6KeG6aKR54q25oCB5Y+Y5YyW77yM6ZyA5pu05pawIHNlc3Npb24g5Lit5Lq65ZGY55qE6K6+5aSH54q25oCBXG4gICAqL1xuICBwcml2YXRlIF9yZWNlaXZlRGV2aWNlRW5hYmxlQ2hhbmdlSGFuZGxlKHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrLmdldFVzZXJJZCgpO1xuICAgICAgY29uc3QgbWVkaWFUeXBlID0gdHJhY2suaXNBdWRpb1RyYWNrKCkgPyBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPIDogUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTztcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgIXRyYWNrLmlzT3duZXJNdXRlZCgpLCB0cmFjZUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53mjILmlq3ml7bvvIzpnIDmuIXnqbrlhoXlrZjvvIznprvlvIDmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgX3Nlc3Npb25DbG9zZUhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5LuF5Zyo6KKr5Yqo5oyC5pat5pe25riF56m65Yib5bu655qE5a6i5oi356uvIGNhbGxJZO+8jFxuICAgICAqIOS4jeW9seWTjeS4u+WKqOWRvOWPq+WQjuaMguaWreaXtuS4iuaKpSDlrqLmiLfnq68gY2FsbElkXG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9pc0xhdW5jaEhhbmd1cCkge1xuICAgICAgdGhpcy5fY2xpZW50Q2FsbElkID0gJyc7XG4gICAgfVxuICAgIHRoaXMuX2lzTGF1bmNoSGFuZ3VwID0gZmFsc2U7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25DbG9zZShjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOW6lOeUqOWxguS6i+S7tlxuICAgKiDljIXlkKvigJzmlLbliLDlkbzlj6vjgIHpgJror53nu5PmnZ/jgIHpgJror53kurrlkZjnirbmgIHlj5jmm7TjgIHpgJror53nsbvlnovlj5jmm7TigJ3nrYnkuovku7ZcbiAgICogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lciDlr7nosaHor7flj4LogIMgYXBpRG9jXG4gICAqL1xuICBzZXRDYWxsUGx1c0V2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PLCBsaXN0ZW5lciA/IE9iamVjdC5rZXlzKGxpc3RlbmVyKS5qb2luKCcsJykgOiBudWxsKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5yZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOmfs+inhumikeS4iuS4i+ihjOS4ouWMheaVsOaNruebkeWQrFxuICAgKiDmr4/np5LkuIrmiqXkuIDmrKFcbiAgICogQHBhcmFtIGxpc3RlbmVyIOexu+Wei+S4uiBJU3RhdHVzUmVwb3J0TGlzdGVuZXLvvIzor6bnu4blrprkuYnlj6/lj4LogIMgYXBpRG9jXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblNlbmRQYWNrZXRMb3NzICDlj5HpgIHkuKLljIXnjofkv6Hmga/lm57osINcbiAgICogQHBhcmFtIGxpc3RlbmVyLm9uUmVjZWl2ZVBhY2tldExvc3Mg5o6l5pS25Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqL1xuICBzZXRTdGF0dXNSZXBvcnRMaXN0ZW5lcihsaXN0ZW5lcjogSVN0YXR1c1JlcG9ydExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PLCBsaXN0ZW5lciA/IE9iamVjdC5rZXlzKGxpc3RlbmVyKS5qb2luKCcsJykgOiBudWxsKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0Q2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6KaB6KeC55yL5Lq65ZGYKOWMheaLrOiHquW3seWSjOWvueaWuSnnmoTlqpLkvZPmkq3mlL7lmahcbiAgICogQHBhcmFtIGxpc3Qg5Li65LiA5Liq5YiX6KGo77yM5Y+v5Lyg5YWl5aSa5Lq655qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBpdGVtLnVzZXJJZCDnlKjmiLcgaWRcbiAgICogQHBhcmFtIGl0ZW0udmlkZW9FbGVtZW50IOS4gOS4qiB2aWRlbyDlhYPntKDvvIznlKjkuo7mkq3mlL7op4bpopHvvIzpnIDopoHmjILovb3lnKjkuJrliqHlsYLpobXpnaLkuIpcbiAgICogQHBhcmFtIGl0ZW0uaXNUaW55IOaYr+WQpuingueci+WIq+S6uueahOWwj+a1ge+8jOWwj+eql+WPo+aXtuWPr+S7pemFjee9ruS4uiB0cnVl77yM5Y+v6IqC55yB5bim5a6977yMdXNlcklkIOS4uui/nOerr+eUqOaIt+aXtuacieaViFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuiuvue9ruaIkOWKn1xuICAgKi9cbiAgc2V0VmlkZW9WaWV3KGxpc3Q6IHt1c2VySWQ6IHN0cmluZywgdmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk/OiBib29sZWFufVtdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBsaXN0OiBsaXN0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHVzZXJJZCwgdmlkZW9FbGVtZW50LCBpc1RpbnkgfSA9IGl0ZW07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGVsZW1lbnROYW1lOiB2aWRlb0VsZW1lbnQ/Lm5vZGVOYW1lLFxuICAgICAgICAgIGlzVGlueSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlBcnJheShsaXN0KSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIGxpc3Q6IG5vdCBlbXB0eSBhcnJheSwgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkobGlzdCl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGxpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCB9ID0gaXRlbTtcbiAgICAgIGlmICghbm90RW1wdHlTdHJpbmcodXNlcklkKSkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fVklFV19SLCBgcGFyYW1zIGVyciwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGVWaWRlb05vZGVOYW1lKHZpZGVvRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHZpZGVvRWxlbWVudDogbmVlZCBhIHZpZGVvIGVsZW1lbnQsIHZhbHVlOiAke3ZpZGVvRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdmlkZW9FbGVtZW50Lm5vZGVOYW1lIDogdmlkZW9FbGVtZW50fWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb1ZpZXcobGlzdCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOafkOS4quS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiDkuI3op4LnnIvmn5DkuKrkurrnmoTop4bpopHml7bvvIzkuJrliqHlsYLlj6/ku6Xnm7TmjqXnp7vpmaTlr7nlupTnmoQgdmlkZW8g5qCH562+77yMXG4gICAqIOiwgyByZW1vdmVWaWRlb1ZpZXcg5pa55rOV77yMU0RLIOWGhemDqOS8muWBnOatouaOpeaUtuWvueaWueeahOWqkuS9k+S8oOi+k1xuICAgKiBAcGFyYW0gdXNlcklkcyDnlKjmiLcgaWQg5YiX6KGoXG4gICAqIEByZXR1cm5zIGNvZGUg6L+U5Zue5piv5ZCm5Yig6Zmk5oiQ5YqfXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10pOiB7IGNvZGU6IG51bWJlciB9IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHVzZXJJZHMsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qOA5rWLXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SLCAnc3VjY2VzJywgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUucmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHMsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmkq3mlL7mjIflrprkurrlkZjnmoTpn7Pop4bpopHlqpLkvZNcbiAgICog5pKt5pS+5p+Q5Liq5Lq655qE6KeG6aKR5YmN77yM6K+356Gu5L+d5bey57uP6LCD55SoIGBzZXRWaWRlb1ZpZXdgIOaWueazleS4uuWFtuiuvue9ruinhumikeinhuWbvlxuICAgKiBAcGFyYW0gdXNlcklkIOaMh+Wumuimgeafpeeci+afkOS4quS6uueahOWqkuS9k+i1hOa6kFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOaMh+WumuaSreaUvumfs+mikei/mOaYr+inhumikVxuICAgKiBAcmV0dXJucyDov5Tlm57mmK/lkKbmkq3mlL7miJDlip9cbiAgICovXG4gIGFzeW5jIHBsYXlNZWRpYSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LiN5pKt5pS+6Ieq5bex55qE5aOw6Z+zXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyAmJiB1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreS4muWKoeWxguaYr+WQpuiuvue9rui/h+W9k+WJjeS6uuWRmOeahOinhumikeinhuWbvlxuICAgICAqL1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3IH0gPSB0aGlzLl9ydGNNb2R1bGUuZ2V0VXNlclZpZXdNYXAoKVt1c2VySWRdIHx8IHt9O1xuICAgIGlmIChtZWRpYVR5cGUgIT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXZpZGVvVmlldykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVR9LCB2aWRlbyB2aWV3IG5vdCBzZXRgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlZJREVPX1ZJRVdfTk9UX1NFVCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUucGxheU1lZGlhKHVzZXJJZCwgbWVkaWFUeXBlLCB2aWRlb1ZpZXcsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuinhumikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDop4bpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7mkYTlg4/lpLTorr7lpIcgaWTjgIHluKfnjofjgIHliIbovqjnjofnrYnvvIxcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRWaWRlb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZVZpZGVvQ29uZmlnQnVpbGRlcigpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ1ZpZGVvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruinhumikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLliIfmjaLmkYTlg4/lpLTjgIHph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldFZpZGVvQ29uZmlnKGNmZzogSVZpZGVvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZnJhbWVSYXRlLCByZXNvbHV0aW9uLCBtYXhCaXRyYXRlLCBtaW5CaXRyYXRlLFxuICAgIH0gPSBjZmc7XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNGcmFtZVJhdGVbZnJhbWVSYXRlXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIGZyYW1lUmF0ZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtmcmFtZVJhdGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghUkNDYWxsUGx1c1Jlc29sdXRpb25bcmVzb2x1dGlvbl0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCByZXNvbHV0aW9uIGlzIGlsbGVnYWwsIHZhbHVlOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlQml0cmF0ZShtaW5CaXRyYXRlLCBtYXhCaXRyYXRlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsICdzdWNjZXNzJyk7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDpn7PpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7puqblhYvpo47orr7lpIcgaWRcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRBdWRpb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZUF1ZGlvQ29uZmlnQnVpbGRlcigpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ0F1ZGlvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuWuieWNk+aOqOmAgeS/oeaBr+aehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIOeUqOS6juaehOmAoOWuieWNk+aOqOmAgeS/oeeahOmFjee9rumhuVxuICAgKiDorr7nva7lrozpnIDosIMgYnVpbGQg5pa55rOV6I635Y+W6K6+572u55qEIGFuZHJvaWRQdXNoQ29uZmlnIOaVsOaNrlxuICAgKiDmnIDnu4jpnIDmioogYW5kcm9pZFB1c2hDb25maWcg5Lyg5YWlIHN0YXJ0Q2FsbOOAgWludml0ZeOAgWhhbmd1cCDmlrnms5XnmoQgcHVzaENvbmZpZy5hbmRyb2lkQ29uZmlnIOS4rVxuICAgKi9cbiAgY3JlYXRlQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyKCk6IFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rumfs+mikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldEF1ZGlvQ29uZmlnKGNmZzogSUF1ZGlvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuICAgIGNvbnN0IHsgc2FtcGxlUmF0ZSwgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gY2ZnO1xuICAgIGlmIChzYW1wbGVSYXRlICYmICFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIHNhbXBsZVJhdGU6IHR5cGUgaXMgbnVtYmVyLCB2YWx1ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuXG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvlj6vkurrlkZggdXNlcklkIOWIl+ihqO+8jOWNleS6uuWRvOWPq+S7hemcgOWcqOaVsOe7hOS4reaUvue9ruWvueaWueS4gOS6uueahCB1c2VySWRcbiAgICogQHBhcmFtIHR5cGUg5Y2V5Lq65ZG85Y+rIG9yIOWkmuS6uuWRvOWPq1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmAmuivneWqkuS9k+exu+Weizog6Z+z6aKRIG9yIOmfs+inhumikVxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICogQHBhcmFtIGV4dHJhIOmZhOWKoOS/oeaBr++8jOS8mumAj+S8oOe7meiiq+WRvOWPq+aWuVxuICAgKiBAcmV0dXJucyBjYWxsSWQg5ZG85Y+r5oiQ5Yqf5ZCO77yM5Lqn55Sf55qE5Lya6K+dIGlkXG4gICAqL1xuICBhc3luYyBzdGFydENhbGwodXNlcklkczogc3RyaW5nW10sIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSA9IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSwgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlID0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTywgcHVzaENvbmZpZz86IElSQ0NhbGxQbHVzUHVzaENvbmZpZywgZXh0cmE/OiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBjYWxsSWQ/OiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IGdldFVVSUQoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfVCwgYHVzZXJJZHM6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBjYWxsVHlwZTogJHtjYWxsVHlwZX0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9LCBwdXNoQ29uZmlnOiAke3B1c2hDb25maWd9LCBleHRyYTogJHtleHRyYX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c1R5cGVbY2FsbFR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbFR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7Y2FsbFR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpO1xuICAgICAgaWYgKHJlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0cmEpIHtcbiAgICAgIGlmICghaXNTdHJpbmcoZXh0cmEpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGV4dHJhIGlzIGlsbGVnYWwsIHZhbHVlOiAke2V4dHJhfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0Qnl0ZUxlbmd0aChleHRyYSkgPiBNQVhfRVhUUkFfQllURVMpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCAncGFyYW1zIGVyciwgZXh0cmEgbWF4IHNpemUgaXMgMTI4S0InLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljZXogYogdXNlcklkcyDplb/luqbkuI3og73otoXov4cgMVxuICAgICAqL1xuICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDEgJiYgY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgWW91IGNhbiBvbmx5IGNhbGwgb25lIHBlcnNvbiBpbiBhIHNpbmdsZSBjYWxsLCB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlt7LlrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjlho3lj5Hotbflkbzlj6tcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVH0sIHNlc3Npb24gZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRDYWxsKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7IHVzZXJJZCB9KSksXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2xpZW50Q2FsbElkLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeSh7IHVzZXJJZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgZXh0cmEgfSksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19TVEFSVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbnVsbCwgdGhpcy5fY2xpZW50Q2FsbElkLCBudWxsLCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZDogZGF0YT8uY2FsbElkIHx8ICcnIH0pO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICAgKi9cbiAgICBjb25zdCB7IGNhbGxJZCwgY2xpZW50Q2FsbElkIH0gPSBkYXRhITtcbiAgICBpZiAodGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9PT0gY2xpZW50Q2FsbElkKSB7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmNsZWFyQWxsVGltZXIoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuaGFuZ3VwKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGB0aGUgJHtjYWxsSWR9IGNhbGwgaGFzIGJlZW4gaGFuZ3VwYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgSlNPTi5zdHJpbmdpZnkoeyBkYXRhLCBjb2RlIH0pLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBjYWxsSWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXliqDlhaXov5vooYzkuK3nmoTnvqTnu4TpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGpvaW5NdWx0aUNhbGwoY2FsbElkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEIH07XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aUluZm8gPSB0aGlzLl9jb250ZXh0LmdldE5hdmlJbmZvKCk7XG4gICAgaWYgKCFuYXZpSW5mbyB8fCAhaXNTdXBwb3J0TWVkaWFTZXJ2ZXIobmF2aUluZm8pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlOiBnZXRTZXNzaW9uQ29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0U2Vzc2lvbkNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgZ2V0IGNhbGwgZGF0YSBlcnJvciwgY29kZTogJHtnZXRTZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldFNlc3Npb25Db2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBtZWRpYVR5cGUgfSA9IGRhdGEhO1xuXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAobWFpblNlc3Npb24gJiYgbWFpblNlc3Npb24uZ2V0Q2FsbElkKCkgIT09IGNhbGxJZCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldE1lZGlhVHJhY2tzQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmpvaW5DYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7fku5bkurpcbiAgICog5Y2V5Lq66YCa6K+d5Lit6YKA6K+35LuW5Lq65Lya5byV5Y+R6YCa6K+d57G75Z6L5Y+Y5pu0XG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+S6uuWIl+ihqFxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICogQHBhcmFtIGV4dHJhIOmZhOWKoOS/oeaBr++8jOS8mumAj+S8oOe7meiiq+mCgOivt+aWuVxuICAgKiBAcmV0dXJucyBidXN5VXNlcnMg6L+U5Zue5b+Z57q/5Lq65ZGY5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGV4dHJhPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgYnVzeVVzZXJzPzogUkNDYWxsUGx1c0NhbGxVc2VyW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1QsIGBjYWxsSWQ6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBwdXNoQ29uZmlnOiAke3B1c2hDb25maWd9LCBleHRyYTogJHtleHRyYX1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpO1xuICAgICAgaWYgKHJlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgcGFyYW1zIGVyciwgcHVzaENvbmZpZyBpcyBpbGxlZ2FsLCBtc2c6ICR7cmVzLmVycm9yTXNnfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRyYSkge1xuICAgICAgaWYgKCFpc1N0cmluZyhleHRyYSkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBwYXJhbXMgZXJyLCBleHRyYSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtleHRyYX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEJ5dGVMZW5ndGgoZXh0cmEpID4gTUFYX0VYVFJBX0JZVEVTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCAncGFyYW1zIGVyciwgZXh0cmEgbWF4IHNpemUgaXMgMTI4S0InLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5HotbfpgoDor7dcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuaW52aXRlKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgIH0pKSxcbiAgICAgIHB1c2hDb25maWcsXG4gICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoeyB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIGV4dHJhIH0pLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidXN5VXNlcnMgPSBbXTtcbiAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycz8ubGVuZ3RoKSB7XG4gICAgICBidXN5VXNlcnMucHVzaCguLi5kYXRhIS5idXN5bGluZVVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZCxcbiAgICAgICAgc3RhdGU6IHVzZXIuc2Vzc2lvblN0YXR1cyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHN1Y2Nlc3MgYnVzeVVzZXJzOiAke0pTT04uc3RyaW5naWZ5KGJ1c3lVc2Vycyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBidXN5VXNlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGFjY2VwdChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKblrZjlnKjpgJror51cbiAgICAgKiDpnIDku47lvZPliY3pgJror53ojrflj5YgbWVpZGFUeXBlXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKTtcbiAgICBpZiAoIW1haW5TZXNzaW9uICYmICFob2xkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWMuuWIhuaOpeWQrCBtYWluU2Vzc2lvbiDlkowgaG9sZFNlc3Npb25cbiAgICAgKiDlpoLmnpzmjqXlkKwgaG9sZFNlc3Npb27vvIzpnIDlhYjmjILmlq0gbWFpblNlc3Npb25cbiAgICAgKi9cbiAgICBjb25zdCBpc0FjY2VwdEhvbGRTZXNzaW9uID0gY2FsbElkID09PSBob2xkU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGlzQWNjZXB0SG9sZFNlc3Npb24pIHtcbiAgICAgIGNvbnN0IHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH0gPSBhd2FpdCB0aGlzLmhhbmd1cChtYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpO1xuICAgICAgaWYgKGhhbmd1cE1haW5TZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGhhbmd1cCBtYWluU2Vzc2lvbiBlcnJvciBjb2RlOiAke2hhbmd1cE1haW5TZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZ3JhZGVNYWluU2Vzc2lvbihjYWxsSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IG1haW5TZXNzaW9uIS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+aOpeWQrFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5hY2NlcHQoe1xuICAgICAgY2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUNDRVBUX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBtYWluU2Vzc2lvbiEpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9faW5uZXJIYW5ndXAob3B0czogSUhhbmd1cEZvckJ1c3lPcHRzLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gb3B0cztcblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0SXNMb2NhbENsaWVudEhhbmd1cCh0cnVlKTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLmNsZWFyQWxsVGltZXIoY2FsbElkLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5oYW5ndXAob3B0cywgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNhbGxJZCA9PT0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldENhbGxJZCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNsb3NlKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOS4uuWPr+mAieWPguaVsO+8jOS4jeS8oOaXtu+8jOaMguaWreato+WcqOi/m+ihjOeahOS4uyBzZXNzaW9u77yM5Lyg5YWl5pe25Y+v5oyH5a6a5oyC5pat5Li76YCa6K+d5oiW5pqC5pyq5bu656uL6L+e5o6l55qE6YCa6K+dXG4gICAqIOaaguacquW7uueri+i/nuaOpeeahOmAmuivne+8muaMh+W3suWcqOmAmuivneS4reaXtu+8jOaUtuWIsOWRvOWPq+S9huaaguacquaOpeWQrOeahOmAmuivnVxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcsIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH0sIHB1c2hDb25maWc6ICR7cHVzaENvbmZpZ31gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbkNhbGxJZCA9IG1haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuXG4gICAgLyoqXG4gICAgICog5qCh6aqM5Lyg5YWl55qEIGNhbGxJZCDmmK/lkKbmraPnoa5cbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmIGNhbGxJZCAhPT0gbWFpblNlc3Npb25DYWxsSWQgJiYgIXRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQgaXMgaW52YWxpZCwgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FMTF9JRF9JTlZBTElEIH07XG4gICAgfVxuXG4gICAgdGhpcy5faXNMYXVuY2hIYW5ndXAgPSB0cnVlO1xuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IGNhbGxJZCB8fCBtYWluU2Vzc2lvbkNhbGxJZDtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24odGhpcy5fbmVlZEhhbmd1cENhbGxJZCk7XG4gICAgY29uc3QgaGFuZ3VwU2Vzc2lvbiA9IGhvbGRTZXNzaW9uIHx8IG1haW5TZXNzaW9uO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5oyC5pat5pe255qE5Lq65ZGY57O757uf54q25oCBXG4gICAgICovXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHVzZXJJbmZvKSA9PiB1c2VySW5mby51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpWzBdLnN0YXRlO1xuICAgIGNvbnN0IGlzQ2FsbGVlID0gW21haW5TZXNzaW9uLmdldENyZWF0b3JVc2VySWQoKSwgbWFpblNlc3Npb24uZ2V0SW52aXRlclVzZXJJZCgpXS5pbmNsdWRlcyhjdXJyZW50VXNlcklkKTtcbiAgICBjb25zdCBzeXN0ZW1TdGF0ZSA9IGdldEhhbmd1cFN5c3RlbVN0YXRlKHVzZXJTdGF0ZSwgaXNDYWxsZWUpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9faW5uZXJIYW5ndXAoe1xuICAgICAgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLFxuICAgICAgc3lzdGVtU3RhdGUsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql5oyC5pat5Z+L54K55pWw5o2uXG4gICAgICovXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfSEFOR1VQX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBoYW5ndXBTZXNzaW9uISwgdGhpcy5fY2xpZW50Q2FsbElkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHNpZ25hbCBlcnJvciBjb2RlIDogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPSBudWxsO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reWPkei1t+WqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcmV0dXJucyB0cmFuc2FjdGlvbklkIOWuouaIt+err+WSjOacjeWKoeerr+S6pOS6kueahOS6i+WKoSBpZO+8jOWcqOWPlua2iOaIluW6lOetlOWqkuS9k+exu+Wei+WIh+aNouaXtuS8oOWFpVxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdENoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCB0cmFuc2FjdGlvbklkPzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLmdldEN1cnJlbnRDYWxsU2Vzc2lvbigpO1xuICAgIGNvbnN0IG9sZE1lZGlhVHlwZSA9IG1haW5TZXNzaW9uPy5nZXRNZWRpYVR5cGUoKTtcblxuICAgIGlmIChtZWRpYVR5cGUgPT09IG9sZE1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5NRURJQVRZUEVfSU5WQUxJRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yik5pat5piv5ZCm5Zyo6YCa6K+d5LitXG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5HotbflqpLkvZPnsbvlnovliIfmjaJcbiAgICAgKi9cbiAgICBjb25zdCB0b1VzZXJJZHMgPSBtYWluU2Vzc2lvbj8uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHVzZXIpID0+IHVzZXIudXNlcklkICE9PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKS5tYXAoKHVzZXIpID0+IHVzZXIudXNlcklkKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7IG1lZGlhVHlwZSwgdG9Vc2VySWRzOiB0b1VzZXJJZHMgfHwgW10gfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBzdWNjZXNzIHRyYW5zYWN0aW9uSWQ6ICR7ZGF0YSEudHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IGRhdGEhLnRyYW5zYWN0aW9uSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmtojliIfmjaLlqpLkvZPnsbvlnovlj5jmm7Tor7fmsYJcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li65Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGC6L+U5Zue55qEIHRyYW5zYWN0aW9uSWRcbiAgICovXG4gIGFzeW5jIGNhbmNlbENoYW5nZU1lZGlhVHlwZSh0cmFuc2FjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgdHJhbnNhY3Rpb25JZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yik5pat5piv5ZCm5Zyo6YCa6K+d5LitXG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPlua2iOWqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYW5jZWxDaGFuZ2VNZWRpYVR5cGUoeyB0cmFuc2FjdGlvbklkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5Y+Y5pu05bqU562UXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIOWuouaIt+err+WSjOacjeWKoeerr+S6pOS6kueahOS6i+WKoSBpZO+8jOS4uiBvblJlY2VpdmVkQ2hhbmdlVG9WaWRlbyDnm5HlkKzmlLbliLAgdHJhbnNhY3Rpb25JZCDlj4LmlbDlgLxcbiAgICovXG4gIGFzeW5jIHJlcGx5Q2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZywgaXNBZ3JlZTogYm9vbGVhbik6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfVCwgYHRyYW5zYWN0aW9uSWQ6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcodHJhbnNhY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgdHJhbnNhY3Rpb25JZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dHJhbnNhY3Rpb25JZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuICAgIGlmICghaXNCb29sZWFuKGlzQWdyZWUpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcGFyYW0gZXJyb3IsIGlzQWdyZWU6IHR5cGUgaXMgYm9vbGVhbiwgdmFsdWU6ICR7aXNBZ3JlZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yik5pat5piv5ZCm5Zyo6YCa6K+d5LitXG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnJlc3BvbnNlQ2hhbmdlTWVkaWFUeXBlKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgICBhZ3JlZTogaXNBZ3JlZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHNpZ25hbCBlcnJvcjogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+dXG4gICAqIEByZXR1cm5zIFJDQ2FsbFBsdXNTZXNzaW9uIOWvueixoeaIliBudWxsIOS4uuW9k+WJjeato+WcqOi/m+ihjOeahOmAmuivneWvueixoVxuICAgKi9cbiAgZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk6IFJDQ2FsbFBsdXNTZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7juacjeWKoeWZqOiOt+WPluacque7k+adn+eahOmAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZWNvcmRzIOS4gOe7hOacque7k+adn+eahOmAmuivneiusOW9lVxuICAgKi9cbiAgYXN5bmMgZ2V0QXZhaWxhYmxlQ2FsbFJlY29yZHNGcm9tU2VydmVyKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJlY29yZHM/OiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXSB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0T3BlbkNhbGxMaXN0KHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzdWNjZXNzLCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgcmVjb3JkczogZGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIhumhteafpeaJvuW9k+WJjeeUqOaIt+eahOWFqOmDqOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gc3RhcnRUaW1lc3RhbXAg6LW35aeL5pe26Ze05oiz77yM6L+U5Zue5aSn5LqO5q2k5pe26Ze05oiz55qE6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBjb3VudCDmr4/mrKHojrflj5bnmoTmlbDph49cbiAgICogQHJldHVybnMgcmVzdWx0Lmhhc01vcmUg5piv5ZCm5pyJ5pu05aSa6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlc3VsdC5saXN0IOmAmuivneiusOW9leWIl+ihqO+8jOexu+Wei+S4uiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXe+8jOWPr+mAmui/hyBhcGlEb2Mg5p+l55yL5YW35L2T5YyF5ZCr5a2X5q61XG4gICAqIEByZXR1cm5zIHJlc3VsdC5tYXhUaW1lIOWIl+ihqOS4reacgOWkp+aXtumXtOaIs++8jOWmguaenCBoYXNNb3JlIOS4uiB0cnVl77yM57un57ut6I635Y+W5pe277yM5Lyg5YWl5q2k5pe26Ze05oizXG4gICAqL1xuICBhc3luYyBnZXRDYWxsUmVjb3JkcyhzdGFydFRpbWVzdGFtcDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVzdWx0PzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCwgYHN0YXJ0VGltZXN0YW1wOiAke3N0YXJ0VGltZXN0YW1wfSwgY291bnQ6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShpc051bWJlcihzdGFydFRpbWVzdGFtcCkgJiYgc3RhcnRUaW1lc3RhbXAgPj0gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgc3RhcnRUaW1lc3RhbXA6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke3N0YXJ0VGltZXN0YW1wfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIShpc051bWJlcihjb3VudCkgJiYgY291bnQgPiAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBjb3VudDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsTG9nTGlzdCh7XG4gICAgICB0aW1lc3RhbXA6IHN0YXJ0VGltZXN0YW1wLFxuICAgICAgY291bnQsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZXN1bHQ6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5qC55o2uIGNhbGxJZCDpm4blkIjmibnph4/liKDpmaTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNhbGxJZHMgY2FsbElkIOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQ2FsbFJlY29yZHNGcm9tU2VydmVyKGNhbGxJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9ULCBgY2FsbElkczogJHtjYWxsSWRzLmpvaW4oJywnKX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheShjYWxsSWRzKVxuICAgICAgJiYgY2FsbElkcy5ldmVyeSgoY2FsbElkKSA9PiBub3RFbXB0eVN0cmluZyhjYWxsSWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWRzOiBub3QgZW1wdHkgYXJyYXksIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgY2FsbElkczogJHtKU09OLnN0cmluZ2lmeShjYWxsSWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmRlbGV0ZUNhbGxMb2coY2FsbElkcywgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4heepuuaJgOaciemAmuivneiusOW9lVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ2FsbFJlY29yZHNGcm9tU2VydmVyKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnJlbW92ZUFsbENhbGxMb2codHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9BTExfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv5pGE5YOP5aS0XG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3miZPlvIDmkYTlg4/lpLTvvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/miZPlvIDmkYTlg4/lpLTnmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICogQHJldHVybnMgdHJhY2sg5pGE5YOP5aS06KeG6aKR6LWE5rqQXG4gICAqL1xuICBhc3luYyBzdGFydENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmkYTlg4/lpLTotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2s/LmlzUHVibGlzaGVkKCkgJiYgdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldFN0YXRlKCkgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5wdWJsaXNoVmlkZW9UcmFjaygpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCBgcHVibGlzaCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZCv55So6LWE5rqQXG4gICAgICog5omp5pWj5ZCv55So6LWE5rqQ5raI5oGv77yM5aaC5p6c5aSx6LSl77yM5YiZIHN0YXJ0Q2FtZXJhIOihjOS4uuWksei0pVxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZTogdW5tdXRlQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmVuYWJsZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKHVubXV0ZUNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTICYmIHVubXV0ZUNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7dW5tdXRlQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHVubXV0ZUNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbPpl63mkYTlg4/lpLRcbiAgICovXG4gIGFzeW5jIHN0b3BDYW1lcmEoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZGlzYWJsZVZpZGVvVHJhY2soKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCBgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95VHJhY2sodHJhY2shKTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTywgZmFsc2UsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5YiH5o2i5pGE5YOP5aS0XG4gICAqIOWIh+aNouaIkOWKn+WQjiBgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcmAg55uR5ZCs5Zmo55qEIGBvblVzZXJNZWRpYUF2YWlsYWJsZWAg5Lit5Lya5pS25Yiw5paw5YiH5o2i55qE5pGE5YOP5aS06LWE5rqQ5Y+v5pKt5pS+77yM5q2k5pe26LCD55SoIGBjYWxsUGx1c0NsaWVudC5wbGF5TWVkaWEoKWAg5Y+v5pi+56S65paw5pGE5YOP5aS055qE55S76Z2iXG4gICAqIEBwYXJhbSBjYW1lcmFJZCDmtY/op4jlmajkuK3lj5blvpfnmoTmkYTlg4/lpLTorr7lpIcgaWTvvIzlj6/osIMgcGx1Z2luLXJ0YyDnmoQgZ2V0Q2FtZXJhcyDmlrnms5Xlj5blvpdcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivneWJjeWSjOmAmuivneS4remDveWPr+iwg+eUqFxuICAgKi9cbiAgYXN5bmMgc3dpdGNoQ2FtZXJhKGNhbWVyYUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9ULCBgY2FtZXJhSWQ6ICR7Y2FtZXJhSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbWVyYUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgcGFyYW0gZXJyb3IsIGNhbWVyYUlkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgaWYgKHNlc3Npb24uZ2V0TWVkaWFUeXBlKCkgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX1ZJREVPX0NBTEx9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTCB9O1xuICAgIH1cblxuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldFZpZGVvQ29uZmlnKHRoaXMuX3ZpZGVvQ29uZmlnKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNoYW5nZVZpZGVvRGV2aWNlKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBjYWxsIGNsaWVudCBjaGFuZ2VWaWRlb0RldmljZSBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/puqblhYvpo45cbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOm6puWFi+mjju+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOm6puWFi+mjjueahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKi9cbiAgYXN5bmMgc3RhcnRNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgYGNyZWF0ZSBtaWNyb3Bob25lIGF1ZGlvIHRyYWNrIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgdHJ1ZSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRyYWNrIS5pc093bmVyTXV0ZWQoKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgdW5tdXRlQ29kZSA9IGF3YWl0IHRyYWNrIS51bm11dGUoKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiB1bm11dGVDb2RlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXrem6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5YWz6Zet6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5YWz6Zet6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdG9wTWljcm9waG9uZSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZGlzYWJsZUF1ZGlvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyAmJiBjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCBmYWxzZSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpuqblhYvpo47mmK/lkKblvIDlkK9cbiAgICovXG4gIGlzTWljcm9waG9uZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgcmV0dXJuICEhdHJhY2sgJiYgIXRyYWNrLmlzT3duZXJNdXRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruaJgOaciei/nOerr+mfs+mikea1geaYr+WQpuWPr+eUqFxuICAgKiBAcGFyYW0gZW5hYmxlIOS4uiB0cnVlIOaXtu+8jOWQr+eUqOaJgOaciei/nOerr+mfs+mikea1ge+8m+S4uiBmYWxzZSDml7bvvIzpnZnpn7PmiYDmnInov5znq6/pn7PpopHmtYFcbiAgICovXG4gIGFzeW5jIHNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZTogYm9vbGVhbik6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUuc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgU0RLIOeJiOacrOS/oeaBr1xuICAgKiBAcmV0dXJucyBTREsg54mI5pys5Y+3XG4gICAqL1xuICBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIF9fVkVSU0lPTl9fO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaRhOWDj+WktOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgZ2V0Q2FtZXJhcygpIHtcbiAgICBjb25zdCBjYW1lcmFzID0gYXdhaXQgZGV2aWNlLmdldENhbWVyYXMoKTtcbiAgICByZXR1cm4gY2FtZXJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpuqblhYvpo47liJfooahcbiAgICovXG4gIGFzeW5jIGdldE1pY3JvcGhvbmVzKCkge1xuICAgIGNvbnN0IG1pY3JvcGhvbmVzID0gYXdhaXQgZGV2aWNlLmdldE1pY3JvcGhvbmVzKCk7XG4gICAgcmV0dXJuIG1pY3JvcGhvbmVzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNVbmRlZmluZWQsIExvZ0xldmVsLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBJVmFsaWRhdGVSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lWYWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbi8qKlxuICog5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUluaXRPcHRzID0gKG9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghb3B0cykge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRzKTtcbiAgLy8g5b+F5Lyg5Y+C5pWw6aqM6K+BXG4gIGlmICgha2V5cy5pbmNsdWRlcygncnRjQ2xpZW50JykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOU1RBTExfUlRDX1BMVUdJTiB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cy5ydGNDbGllbnQpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ3J0Y0NsaWVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ29iamVjdFxcJycgfTtcbiAgfVxuXG4gIHJldHVybiB7IGlzTGVnYWw6IHRydWUgfTtcbn07XG5cbi8qKlxuICogcmVnaXN0ZXJDYWxsRXZlbnRMaXN0ZW5lciDlj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlzdGVuZXIgPSAobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG5cbiAgLy8g5qCh6aqM5piv5ZCm57y65bCR5b+F6KaB55uR5ZCs5Zue6LCD5rOo5YaMXG4gIGNvbnN0IHJlcXVpcmVkS2V5cyA9IFsnb25JbnZpdGUnLCAnb25TZXNzaW9uQ2xvc2UnLCAnb25SZW1vdGVUcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgcmVxdWlyZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBtaXNzaW5nS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG5cbiAgbGV0IHJlczogSVZhbGlkYXRlUmVzID0geyBpc0xlZ2FsOiB0cnVlIH07XG5cbiAgLy8g5qCh6aqM5b+F6KaB55uR5ZCs5piv5ZCm5pivIGZ1bmN0aW9uIOexu+Wei1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHJlcXVpcmVkS2V5c1tpXTtcbiAgICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXJbPGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXI+a2V5XSkpIHtcbiAgICAgIHJlcyA9IHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYCcke2tleX0nIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgJ2Z1bmN0aW9uJ2AgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIGlzVW5kZWZpbmVkLCBMb2dMLCBQbHVnaW5Db250ZXh0LCBWZXJzaW9uTWFuYWdlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2xpZW50IH0gZnJvbSAnLi9jb3JlL2FwaS9SQ0NhbGxQbHVzQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVJbml0T3B0cyB9IGZyb20gJy4vY29yZS91dGlscy92YWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0luaXRPcHRzIH0gZnJvbSAnLi9jb3JlL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQXVkaW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IFJDVmlkZW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXInO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCEpO1xuICAgIGVuZ2luZUxvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTkRFWF9JTlNUQUxMX0NBTExfUExVU19QTFVHSU5fTywgYENhbGxQbHVzIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0NsaWVudChjb250ZXh0LCBlbmdpbmVMb2dnZXIsIHJ1bnRpbWUsIG9wdGlvbnMpO1xuICB9LFxufTtcblxuZXhwb3J0IHtcbiAgaW5zdGFsbGVyLFxuICAvKiBjbGFzcyAqL1xuICBSQ0NhbGxQbHVzQ2xpZW50LFxuICBSQ0NhbGxQbHVzU2Vzc2lvbixcbiAgUkNBdWRpb0NvbmZpZ0J1aWxkZXIsXG4gIFJDVmlkZW9Db25maWdCdWlsZGVyLFxuICBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyLFxufTtcbi8qKlxuICog5a+85Ye65p6a5Li+5ZKM5o6l5Y+j5a6a5LmJXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbiJdLCJuYW1lcyI6WyJSQ0NhbGxQbHVzQ29kZSIsIlJDQ2FsbFBsdXNMb2dnZXJUYWciLCJSQ0NhbGxQbHVzU2Vzc2lvbiIsIl9zZXNzaW9uIiwiX2NhbGxFbmdpbmUiLCJfbG9nZ2VyIiwiX19wdWJsaWNGaWVsZCIsInVzZXIiLCJ1c2VySWQiLCJ1c2VyU3RhdGUiLCJjYW1lcmFFbmFibGUiLCJtaWNyb3Bob25lRW5hYmxlIiwidHJhY2VJZCIsImNvZGUiLCJjbGllbnRTdGFydFRpbWUiLCJkYXRhIiwiUkNDYWxsUGx1c1R5cGUiLCJSQ0NhbGxQbHVzVHlwZTIiLCJSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlMiIsIlJDQ2FsbFBsdXNDYWxsU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IiwiUkNDYWxsUGx1c1JlYXNvbiIsIlJDQXVkaW9Db25maWdCdWlsZGVyIiwibWljcm9waG9uZUlkIiwibWluIiwibWF4IiwiaXNOdW1iZXIiLCJzYW1wbGVSYXRlIiwiUkNWaWRlb0NvbmZpZ0J1aWxkZXIiLCJSQ0NhbGxQbHVzUmVzb2x1dGlvbiIsIlJDQ2FsbFBsdXNGcmFtZVJhdGUiLCJmcHMiLCJyZXNvbHV0aW9uIiwiY2FtZXJhSWQiLCJ0cmFuMkNhbGxMb2ciLCJjYWxsTG9nTGlzdCIsImNhbGxJZCIsImNhbGxUeXBlIiwiY2FsbERpciIsIm1lZGlhVHlwZSIsImNhbGxpbmdVc2VySWQiLCJjYWxsVXNlcklkcyIsImNhbGxTdGF0dXMiLCJzZXNzaW9uU3RhdHVzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwic2VjcmV0Q2hhdCIsInN5bmNUaW1lIiwic3lzU3RhdHVzIiwiY3J0VGltZSIsInBhcnNlU3RhdHVzRGF0YSIsInJpbmdpbmdEYXRhIiwiaGFuZ3VwRGF0YSIsImFjY2VwdERhdGEiLCJvdGhlckludml0ZWREYXRhIiwiaXRlbSIsInZhbGlkYXRlVmlkZW9Ob2RlTmFtZSIsImVsZW1lbnQiLCJ2YWxpZGF0ZVN5c1N0YXRlIiwiY3J0U3RhdGUiLCJuZXdTdGF0ZSIsImlzSW5WYWxpZCIsImludmFsaWRTdGF0ZXMiLCJ2YWxpZGF0ZVVzZXJTdGF0ZSIsImdldEhhbmd1cFN5c3RlbVN0YXRlIiwiaXNDYWxsZWUiLCJzeXN0ZW1TdGF0ZSIsImlzU3VwcG9ydE1lZGlhU2VydmVyIiwibmF2aUluZm8iLCJ2b2lwQ2FsbEluZm8iLCJzdHJhdGVneSIsInZhbGlkYXRlQml0cmF0ZSIsIm1pbkJpdHJhdGUiLCJtYXhCaXRyYXRlIiwiZ2V0VXNlclZpZGVvVmlld0luZm8iLCJ1c2VyVmlld01hcCIsInVzZXJWaWV3TWFwSW5mbyIsInZpZGVvVmlldyIsImlzVGlueSIsInB1c2hDb25maWdzVG9KU09OIiwiaU9TQ29uZmlnIiwiYW5kcm9pZENvbmZpZyIsImNsaWVudENhbGxJZCIsInRocmVhZElkIiwiYXBuc0NvbGxhcHNlSWQiLCJyaWNoTWVkaWFVcmkiLCJjaGFubmVsSWRNaSIsImNoYW5uZWxJZEhXIiwiY2hhbm5lbElkT1BQTyIsInR5cGVWaXZvIiwiZmNtQ2hhbm5lbElkIiwiZmNtQ29sbGFwc2VLZXkiLCJmY21JbWFnZVVybCIsIm1pTGFyZ2VJY29uVXJsIiwiaW1wb3J0YW5jZUhXIiwiY2F0ZWdvcnlIVyIsImltYWdlVXJsSFciLCJjYXRlZ29yeVZpdm8iLCJpbXBvcnRhbmNlSG9ub3IiLCJpbWFnZVVybEhvbm9yIiwiQVBOUyIsIkhXIiwicHVzaENvbmdmaWdzIiwiRkNNIiwiTUkiLCJPUFBPIiwiVklWTyIsIkhPTk9SIiwidHJhbnNTZXJ2ZXJQdXNoRXh0IiwicHVzaENvbmZpZyIsInB1c2hUaXRsZSIsImRpc2FibGVQdXNoVGl0bGUiLCJ0ZW1wbGF0ZUlkIiwicHVzaEV4dCIsImlzQm9vbGVhbiIsInZhbGlkYXRlUHVzaENvbmZpZyIsInB1c2hDb25maWdLZXlzIiwia2V5IiwiaW5kZXgiLCJpc1VuZGVmaW5lZCIsImlzU3RyaW5nIiwidmFsaWRhdGVJT1NDb25maWdSZXMiLCJ2YWxpZGF0ZUlPU0NvbmZpZyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZyIsImFuZHJvaWRDb25maWdLZXlzIiwiZ2V0Qnl0ZUxlbmd0aCIsInN0ciIsImNoYXJzZXQiLCJ0b3RhbCIsImNhbGN1bGF0ZVVURjE2Qnl0ZUxlbmd0aCIsImNhbGN1bGF0ZVVURjhCeXRlTGVuZ3RoIiwiY2hhdENvZGUiLCJpIiwiUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWciLCJSQ0NhbGxQTHVzU3RhdGlzdGljcyIsIl9jb250ZXh0IiwidGFnIiwic2Vzc2lvbiIsImludml0ZVNvdXJjZSIsImV4dHJhIiwibm93VGltZSIsImNvbW1vbkRhdGEiLCJEaWFsb2dBY3Rpb24iLCJEaWFsb2dUeXBlIiwiU2VjcmV0Q2FsbFR5cGUiLCJTZWNyZXRDYWxsVHlwZTIiLCJDYWxsVGltZXJFdmVudFR5cGUiLCJSQ0NhbGxJbm5lclNlc3Npb24iLCJFdmVudEVtaXR0ZXIiLCJfY2FsbElkIiwiX3N0YXRlIiwiX2NhbGxUeXBlIiwiX21lZGlhVHlwZSIsIl9zdGFydENhbGxlcklkIiwiX2NhbGxlcklkIiwiX2NhbGxVc2VycyIsImVuYWJsZSIsInVzZXJzIiwiY2hhbmdlZFVzZXJzIiwibmV3VXNlclN0YXRlIiwibmV3U3RhdGVUaW1lIiwibmV3U3lzU3RhdGUiLCJoYXNVc2VyIiwib2xkU3RhdGVUaW1lIiwib2xkU3lzdGVtU3RhdGUiLCJvbGRVc2VyU3RhdGUiLCJpc0ludmFsaWRTeXNTdGF0ZSIsImlzSW52YWxpZFVzZXJTdGF0ZSIsImlzSW52YWxpZE9ucGhvbmVFbmQiLCJlcnIiLCJzdGF0ZSIsInR5cGUiLCJ0aW1lcklkIiwiaXNMb2NhbENsaWVudEhhbmd1cCIsIkNhbGxTZXJ2ZXJBY3Rpb24iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsInNsZWVwIiwibWlsbGlzZWNvbmQiLCJyZXNvbHZlIiwibmVlZFJldHJ5Q29kZSIsIkVycm9yQ29kZSIsIlJDUlRDQ29kZSIsInJldHJ5QXN5bmNGbiIsImFzeW5jRm4iLCJmbkFyZ3MiLCJjdXJyZW50UmV0cnlUaW1lIiwibWF4RHVyYXRpb24iLCJpbnRlcnZhbHMiLCJvbkVycm9yIiwicmVzIiwiaXR2IiwiQ2FsbEhvb2tzVHlwZSIsIlB1Ykludml0ZUNhbGxNaXNzUmVhc29uIiwiUHViSW52aXRlQ2FsbE1pc3NSZWZlciIsIlNpZ25hbFRyYW5zcG9ydGVyIiwiX3J1bnRpbWUiLCJfaW5pdE9wdHMiLCJfdGltZUNvcnJlY3Rpb25lciIsImdldFVVSUQyMiIsImxpc3RlbmVyIiwibXNnIiwidG9Vc2VycyIsInRhcmdldFR5cGUiLCJ0YXJnZXRJZCIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJLZXkiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNEaXJlY3RseSIsImN1cnJlbnRVSWQiLCJjdXJyZW50VXNlciIsImRpYWxvZ1R5cGUiLCJhY3Rpb24iLCJleHRyYUtleVZhbCIsImNhbGxTZXNzaW9uVXNlcnMiLCJ0b0RldmljZUlkIiwiY2FsbERpYWxvZ0VudGl0eXMiLCJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsInV1aWQiLCJDQUxMX0RCX05BTUUiLCJEQl9WRVJTSU9OIiwibG9nZ2VyIiwiX1JDQ2FsbEluZGV4REIiLCJyZXEiLCJldiIsIm9iak5hbWUiLCJfYSIsInZhbCIsInJlamVjdCIsIlJDQ2FsbEluZGV4REIiLCJBYm5vcm1hbENhbGwiLCJvYmpTdG9yZSIsInVzZXJBYm5vcm1hbENhbGxJZHMiLCJpZCIsIkNhbGxTZXJ2ZXJFdmVudFR5cGUiLCJSQ0NhbGxQbHVzSW5uZXJDb2RlIiwiVGltZUNvcnJlY3Rpb25lciIsIl9zaW5nbGVDYWxsRHVyYXRpb25FdiIsInNlcnZlclN0YXJ0VGltZSIsImN1cnJlbnRSVFQiLCJjbGllbnRGaXJzdEZyYW1lVGltZSIsIkZvcndhcmRUeXBlIiwiUkNDYWxsUGx1c0ludml0ZVNvdXJjZSIsIlJDQ2FsbERpcmVjdGlvbiIsIkNBTExfVElNRV9PVVQiLCJfUkNDYWxsRW5naW5lIiwiX3JlcG9ydEFwcEV2ZW50TW9kdWxlIiwiY3VycmVudFVzZXJJZCIsImJ1c3lsaW5lVXNlcnMiLCJpbnZpdGVyVGltZXJJZCIsInNlbGZTdGF0ZSIsImludml0ZWVzU3RhdGUiLCJidXN5VXNlcnNTdGF0ZSIsImJ1c3lVc2VySWQiLCJpbnZpdGVkVXNlcnNTdGF0ZSIsImJ1c3lsaW5lVXNlcnNTdGF0ZSIsInRyYW5zYWN0aW9uSWQiLCJyZXFNZWRpYVR5cGUiLCJjYWxsTG9nIiwicmVzRGF0YSIsImxpc3QiLCJ1c2VyU2Vzc2lvblN0YXR1cyIsImNhbGxEaXJlY3Rpb24iLCJzZXNzaW9uVXNlcnMiLCJpbm5lclNlc3Npb24iLCJuZXdVc2VycyIsImlzSWRsZSIsIm5vdyIsImRlbGF5VGltZSIsInN0cmVhbVJlYWR5VGltZSIsImN1cnJlbnRVc2VyU3lzdGVtU3RhdGUiLCJob2xkQ2FsbElkIiwic3RhdGVUaW1lIiwiaW52aXRlVXNlcklkIiwiaW52aXRlZVRpbWVySWQiLCJjYWxsUGx1c1Nlc3Npb24iLCJvdGhlcnNTdGF0ZSIsInN0YXR1c1RpbWUiLCJvdGhlckludml0ZWRNZW1iZXIiLCJfYiIsIl9jIiwiaW52aXRlZE1lbWJlciIsInVzZXJzU3RhdGUiLCJjYWxsU2Vzc2lvbmFTdGF0dXMiLCJzZXNzaW9uU3RhdGUiLCJ1bk5lZWRVcFN0YXRlIiwic3RhcnRDYWxsZXJJZCIsIl9kIiwic2VsZkVuZCIsInN0YXRlcyIsImlzTWFpblNlc3Npb24iLCJjdXJyZW50VXNlclNhdGUiLCJldmVudFRpbWUiLCJldmVudEFyZ3MiLCJldmVudFR5cGUiLCJmcm9tVXNlcklkIiwiZmlyc3RGcmFtZVRpbWUiLCJwcm9tb3RlcklkIiwicmVhc29uIiwiY3VycmVudENhbGxJZCIsIm9sZFRyYW5zSWQiLCJvbGRBY3Rpb24iLCJPbGRNZWRpYVR5cGUiLCJjaGFuZ2VNZWRpYVR5cGVSZXN1bHQiLCJfZSIsImlzU2VsZkhhbmd1cCIsImNsb3NlZFNlc3Npb24iLCJjcnRVc2VyRGF0YSIsImhhbmd1cFJlYXNvbiIsImlzTmVlZFVwIiwiaW52aXRlclVzZXJJZCIsIlJDQ2FsbEVuZ2luZSIsIlJUQ1Jlc291cmNlVGFnIiwiX1JUQ01vZHVsZSIsImRlZmF1bHRWaWRlb1RyYWNrIiwidHJhY2siLCJkZWZhdWx0QXVkaW9UcmFjayIsInZpZGVvQ29uZmlnIiwiYXVkaW9Db25maWciLCJsb2NhbFRyYWNrIiwicm9vbSIsInJvb21Vc2Vyc0lkIiwiZXJyb3IiLCJwdWJQYXJhbXMiLCJjdXJyZW50Um9vbUlkIiwicmVjZW50VHJhY2tzIiwibG9jYWxUcmFja3MiLCJuZWVkRGVzdHJveVRyYWNrIiwibmV3VHJhY2siLCJ0cmFja3MiLCJSVENNb2RlIiwic3ViVGlueSIsImJ5U2VydmVyIiwidXNlcklkcyIsInZpZGVvVHJhY2siLCJhdWRpb1RyYWNrIiwiYXVkaW9MZXZlbFJlcG9ydExpc3QiLCJyb29tSWQiLCJraWNrRXh0cmEiLCJSQ0tpY2tSZWFzb24iLCJuZWVkU3ViVHJhY2tzIiwicmVwb3J0Iiwic2VuZGVycyIsInJlY2VpdmVycyIsImtpbmQiLCJwYWNrZXRzTG9zdFJhdGUiLCJydHQiLCJ0cmFja0lkIiwiYml0cmF0ZSIsImhlbHBlciIsImxvY2FsVmlkZW9UcmFjayIsImxvY2FsQXVkaW9UcmFjayIsIlJDTG9jYWxUcmFjayIsInZpZGVvRWxlbWVudCIsInN1YlBhcmFtcyIsInVuc3ViVHJhY2tzIiwiUlRDTW9kdWxlIiwiUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSIsImV2ZW50TmFtZSIsImF0dHJzIiwiaGFuZGxlIiwiaW52aXRlZVVzZXJMaXN0IiwicmVjb3JkIiwiY2FsbEZpcnN0RnJhbWVUaW1lIiwiYXVkaW9MZXZlbCIsIkNhbGxTZXJ2ZXJFcnJvckNvZGUiLCJSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIiwiTUFYX0VYVFJBX0JZVEVTIiwiUkNDYWxsUGx1c0NsaWVudCIsIm5ld1Nlc3Npb24iLCJtYWluU2Vzc2lvbiIsIm5vdEVtcHR5QXJyYXkiLCJub3RFbXB0eVN0cmluZyIsImNmZyIsImZyYW1lUmF0ZSIsImVycm9yTXNnIiwiZ2V0TWVkaWFUcmFja3NDb2RlIiwiZ2V0U2Vzc2lvbkNvZGUiLCJidXN5VXNlcnMiLCJob2xkU2Vzc2lvbiIsImhhbmd1cE1haW5TZXNzaW9uQ29kZSIsIm1haW5TZXNzaW9uQ2FsbElkIiwiaGFuZ3VwU2Vzc2lvbiIsInVzZXJJbmZvIiwib2xkTWVkaWFUeXBlIiwidG9Vc2VySWRzIiwiaXNBZ3JlZSIsInN0YXJ0VGltZXN0YW1wIiwiY291bnQiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJ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
|