@rongcloud/plugin-call-plus 1.1.1 → 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.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 ke=Object.defineProperty;var Fe=(g,l,N)=>l in g?ke(g,l,{enumerable:!0,configurable:!0,writable:!0,value:N}):g[l]=N;var I=(g,l,N)=>(Fe(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}},de=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}},he=t=>t&&t.nodeName&&t.nodeName.toUpperCase()==="VIDEO",Ne=(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},Ae=(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},Re=(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},Se=t=>{const s=[];for(const e in t){const{videoView:_,isTiny:i}=t[e];s.push({userId:e,videoView:_.nodeName,isTiny:i})}return s};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 Oe{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=Ne(f,L),y=Ae(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),ue=t=>new Promise(s=>{setTimeout(s,t)}),ge=[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||!ge.includes(E.code)||Date.now()+L-e>_?E:(o&&o(E.code),await ue(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 Ue 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 me=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("")},fe=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const s=Math.random()*16|0;return(t==="x"?s:s&3|8).toString(16)}),pe=()=>{let t=fe();return t=`${t.replace(/-/g,"")}0`,t=parseInt(t,16),t=me(t),t.length>22&&(t=t.slice(0,22)),t},Me="RC_CALLPLUS",De=1;let w;const V=class V{constructor(){}static init(s,e){w=s,this.isSupport()||w.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const _=window.indexedDB.open(Me,De);_.onerror=i=>{w.warn("[RCCallIndexDB]",`open indexDB req failed -> ${i.target.error}`)},_.onsuccess=i=>{this._db=i.target.result,this._db&&(this._db.onclose=r=>{w.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{w.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{w.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)?w.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=()=>{w.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=>{w.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),w.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),w.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(V,"_db",null),I(V,"_instance",null);let q=V;class ye{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 Pe{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 le=60*1e3,B=class B 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 Pe(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new Ue(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 ye(_,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=pe(),{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(),_)},le)),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)},le);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(B.__INNER_INVITE__,P,H);const Z=T.map(({userId:ae,sessionStatus:ve,sysStatus:we,targetType:Be,targetId:$e,statusTime:He})=>({userId:ae,userState:ve,systemState:we,targetType:Be,targetId:$e,stateTime:He,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(B.__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}=de(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(B.__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(B.__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(B.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,i),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:_},i)}_onCallTypeChange(e,_,i){this._reportAppEventModule.onCallTypeChanged(_,e,i)}};I(B,"__INNER_SESSION_CLOSE__","inner-session-close"),I(B,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(B,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(B,"__INNER_INVITE__","inner-invite");let J=B;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:Se(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:Se(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 Ve{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 Ie=(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))(Ie||{});class Ce{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 Ve(e),this._callPlusStatistics=new Oe(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(!he(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};if(e===u.AUDIO&&s===this._context.getCurrentId())return this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,"success",_),{code:a.SUCCESS};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===Ie.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=Re(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.1"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const Ge=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"},be={tag:"RCCallPlus",verify(t){return l.VersionManage.add("plugin-call-plus","1.1.1"),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 _=Ge(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.1, Commit: f2e9aab8b7f19afd4f772d1665c3afc9fb979871"),new Ce(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=Ce,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=be,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+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJWaWRlb1ZpZXdJbmZvID0gKHVzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9KSA9PiB7XG4gIGNvbnN0IHVzZXJWaWV3TWFwSW5mbyA9IFtdO1xuICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB1c2VyVmlld01hcCkge1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3LCBpc1RpbnkgfSA9IHVzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgdXNlclZpZXdNYXBJbmZvLnB1c2goe1xuICAgICAgdXNlcklkLFxuICAgICAgdmlkZW9WaWV3OiB2aWRlb1ZpZXcubm9kZU5hbWUsXG4gICAgICBpc1RpbnksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVzZXJWaWV3TWFwSW5mbztcbn07XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB7XG4gIC8qKlxuICAgKiDlj5HotbfpgJror51cbiAgICovXG4gIExfUVNfU1RBUlRfQ0FMTF9TID0gJ0NhbGwtc3RhcnQtUycsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICovXG4gIExfUVNfQUNDRVBUX0NBTExfUyA9ICdDYWxsLWFjY2VwdC1TJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9RU19IQU5HVVBfQ0FMTF9TID0gJ0NhbGwtaGFuZ3VwLVMnLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+dXG4gICAqL1xuICBMX1FTX1JFQ0VJVkVfQ0FMTF9TID0gJ0NhbGwtcmVjdi1TJyxcbiAgLyoqXG4gICAqIOW8guW4uOaMguaWrVxuICAgKi9cbiAgTF9RU19BQk5PUk1BTF9IQU5HVVBfUyA9ICdDYWxsLWludGVycnVwdC1TJ1xufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIFBsdWdpbkNvbnRleHQgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNTZXNzaW9uLCBSQ0NhbGxQbHVzVHlwZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsUEx1c1N0YXRpc3RpY3Mge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICkge1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFN0YXRpc3RpY3NEYXRhKFxuICAgIHRhZzogUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcsXG4gICAgY29kZTogbnVtYmVyLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uIHwgbnVsbCxcbiAgICBjbGllbnRDYWxsSWQ/OiBzdHJpbmcsXG4gICAgaW52aXRlU291cmNlPzogUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB8IG51bGwsXG4gICAgZXh0cmE/OiB7XG4gICAgICBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgICBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsXG4gICAgICBjYWxsSWQ6IHN0cmluZyxcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCBub3dUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQgfSA9IHNlc3Npb24gPyB7IG1lZGlhVHlwZTogc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSwgY2FsbFR5cGU6IHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSwgY2FsbElkOiBzZXNzaW9uLmdldENhbGxJZCgpIH0gOiBleHRyYSE7XG4gICAgY29uc3QgY29tbW9uRGF0YSA9IHtcbiAgICAgIGNyOiAndW5rbm93bicsXG4gICAgICBuZXQ6ICd1bmtub3duJyxcbiAgICAgIGNvZDogY29kZSxcbiAgICAgIG10cDogbWVkaWFUeXBlLFxuICAgICAgY3RwOiBjYWxsVHlwZSxcbiAgICAgIGNpZDogY2FsbElkLFxuICAgICAgdGltZTogbm93VGltZSxcbiAgICAgIHVpZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSxcbiAgICB9O1xuXG4gICAgY2xpZW50Q2FsbElkICYmIE9iamVjdC5hc3NpZ24oY29tbW9uRGF0YSwgeyBjY2lkOiBjbGllbnRDYWxsSWQgfSk7XG5cbiAgICBsZXQgZGF0YSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDlkbzlj6tcbiAgICAgICAqL1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1JFQ0VJVkVfQ0FMTF9TOlxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgcmY6IGludml0ZVNvdXJjZSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKipcbiAgICAgICAqIOW8guW4uOaMguaWrVxuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUJOT1JNQUxfSEFOR1VQX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R6LW344CB5o6l5ZCs44CB5oyC5pat6YCa6K+dXG4gICAgICAgICAqL1xuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIC4uLmNvbW1vbkRhdGEsXG4gICAgICAgICAgZHVyOiBub3dUaW1lIC0gc3RhcnRUaW1lLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdMLWNhbGwtcGx1cy1zdGF0aXN0aWMnLCBKU09OLnN0cmluZ2lmeShkYXRhKSwgdGFnKTtcblxuICAgIHRoaXMuX2xvZ2dlci5fX3N0YXRpc3RpY3ModGFnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gIH1cbn1cbiIsIi8qKlxuICog5a+56K+d5Yqo5L2cXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ0FjdGlvbiB7XG4gIC8qKlxuICAgKiDor7fmsYJcbiAgICovXG4gIFJFUVVFU1QgPSAncmVxdWVzdCcsXG4gIC8qKlxuICAgKiDmjqXlj5dcbiAgICovXG4gIEFDQ0VQVCA9ICdhY2NlcHQnLFxuICAvKipcbiAgICog5ouS57udXG4gICAqL1xuICBSRUZVU0UgPSAncmVmdXNlJyxcbiAgLyoqXG4gICAqIOivt+axguWPlua2iFxuICAgKi9cbiAgQ0FOQ0VMID0gJ2NhbmNlbCcsXG4gIC8qKlxuICAgKiDpgJrnn6VcbiAgICovXG4gIE5PVElDRSA9ICdub3RpY2UnLFxuICAvKipcbiAgICog6LaF5pe2XG4gICAqL1xuICBUSU1FT1VUID0gJ3RpbWVvdXQnXG59XG4iLCIvKipcbiAqIOWvueivneexu+Wei1xuICovXG5leHBvcnQgZW51bSBEaWFsb2dUeXBlIHtcbiAgU1dJVENIX01FRElBX1RZUEUgPSAxXG59XG4iLCIvKipcbiAqIOmAmuivnemineWkluexu+Wei++8iOenu+WKqOerr+eJueacie+8iVxuICovXG5leHBvcnQgZW51bSBTZWNyZXRDYWxsVHlwZSB7XG4gIC8qKlxuICAgKiDmma7pgJrpgJror51cbiAgICovXG4gIE5PUk1BTCxcbiAgLyoqXG4gICAqIOWvhuiBilxuICAgKi9cbiAgU0VDUkVUXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgRGlhbG9nQWN0aW9uIH0gZnJvbSAnLi4vZW51bXMvRGlhbG9nQWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDYWxsU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBJU2Vzc2lvblVzZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgdmFsaWRhdGVTeXNTdGF0ZSwgdmFsaWRhdGVVc2VyU3RhdGUgfSBmcm9tICcuLi91dGlscy9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5cbmV4cG9ydCBlbnVtIENhbGxUaW1lckV2ZW50VHlwZSB7XG4gIElOVklURVIgPSAnaW52aXRlcicsXG4gIElOVklURUUgPSAnaW52aXRlZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT2xkRGlhbG9nRGF0YXtcbiAgdHJhbnNhY3Rpb25JZD86IHN0cmluZztcbiAgYWN0aW9uOiBEaWFsb2dBY3Rpb247XG4gIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZTtcbn1cblxuLyoqXG4gKiBTREsg5YaF6YOo5L2/55SoIFNlc3Npb24g5a6e5L6LXG4gKi9cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbm5lclNlc3Npb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog6K+35rGC5pu05paw55qEIG1lZGlhVHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVxTWVkaWFUeXBlITogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGxcblxuICAvKipcbiAgICog6YKA6K+36ICF6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVyVGltZXJJZCE6IG51bWJlclxuXG4gIC8qKlxuICAgKiDooqvpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZWVUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBfY2FsbFVzZXJzOiBJU2Vzc2lvblVzZXJbXSA9IFtdXG5cbiAgLyoqXG4gICAqIOaXpyBkaWFsb2cg5pWw5o2u77yM55So5LqO5a+55q+UXG4gICAqL1xuICBwcml2YXRlIF9vbGREaWFsb2dEYXRhITogSU9sZERpYWxvZ0RhdGFcblxuICAvKipcbiAgICog6K6w5b2V5piv5ZCm5pys5Zyw5pyJ5oyC5patXG4gICAqL1xuICBwcml2YXRlIGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIENhbGwgSURcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOeKtuaAgVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXRlOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneexu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAvKipcbiAgICAgKiDpgJror53lqpLkvZPnsbvlnotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gICAgLyoqXG4gICAgICogc2Vzc2lvbiDlkbzlj6vlj5HotbfogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGFydENhbGxlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog5pys5qyhIHNlc3Npb24g55qE6YKA6K+36ICFXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDlvZPliY0gc2Vzc2lvbiDkurrlkZjkv6Hmga/liJfooahcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIENhbGxJRFxuICAgKi9cbiAgcHVibGljIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvblN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsVHlwZSgpOiBSQ0NhbGxQbHVzVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOWPkei1t+iAhVxuICAgKi9cbiAgcHVibGljIGdldFN0YXJ0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRDYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKzmrKEgc2Vzc2lvbiDpgoDor7fogIVcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5Ygc2Vzc2lvbiB1c2VyIGxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiBJU2Vzc2lvblVzZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxVc2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxTWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxTWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIGludml0ZXJUaW1lcklkXG4gICAqL1xuICBwdWJsaWMgZ2V0SW52aXRlclRpbWVySWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlclRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlZVRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVlVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVlVGltZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxUaW1lcklkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9pbnZpdGVyVGltZXJJZCwgdGhpcy5faW52aXRlZVRpbWVySWRdO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08sIGB1c2VySWQ6ICR7dXNlcklkfSwgbWVkaWFUeXBlOiAke21lZGlhVHlwZX0sIGVuYWJsZTogJHtlbmFibGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gdGhpcy5fY2FsbFVzZXJzLmZpbmQoKGl0ZW0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpO1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIHVzZXJTdGF0ZSEubWljcm9waG9uZUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclN0YXRlIS5jYW1lcmFFbmFibGUgPSBlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOS6uuWRmOWIl+ihqCwg5bm26L+U5Zue5pu05paw55qE5Lq65ZGY5YiX6KGoXG4gICAqIOagueaNruS6uuWRmOeKtuaAgeWOu+a3u+WKoOOAgeWIoOmZpOOAgeabtOaWsFxuICAgKiDmoLnmja7nirbmgIHml7bpl7TvvIzliKTmlq3mmK/lkKbmm7TmlrDvvIzml6Dml7bpl7TmiLPnmoTkuLrmnKzlnLDnirbmgIHosIPmlbTvvIznm7TmjqXmm7TmlrBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2VyTGlzdCh1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZyk6IElTZXNzaW9uVXNlcltdIHtcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VyU3RhdGU6IG5ld1VzZXJTdGF0ZSxcbiAgICAgICAgc3RhdGVUaW1lOiBuZXdTdGF0ZVRpbWUsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBuZXdTeXNTdGF0ZSxcbiAgICAgIH0gPSB1c2VyO1xuICAgICAgY29uc3QgbmVlZEFkZFN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DQUxMSU5HLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9XQUlUXTtcbiAgICAgIGlmIChuZWVkQWRkU3RhdGVzLmluY2x1ZGVzKG5ld1VzZXJTdGF0ZSkpIHtcbiAgICAgICAgLy8g55u05o6l5re75Yqg5pWw5o2uXG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGBwdXNoIHVzZXI6ICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX2NhbGxVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgICBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOabtOaWsOaVsOaNrlxuICAgICAgICBsZXQgaGFzVXNlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NhbGxVc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHVzZXJJZCwgc3RhdGVUaW1lOiBvbGRTdGF0ZVRpbWUsIHN5c3RlbVN0YXRlOiBvbGRTeXN0ZW1TdGF0ZSwgdXNlclN0YXRlOiBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgfSA9IHRoaXMuX2NhbGxVc2Vyc1tpXTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSB1c2VyLnVzZXJJZCkge1xuICAgICAgICAgICAgaGFzVXNlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRTeXNTdGF0ZSA9IHZhbGlkYXRlU3lzU3RhdGUob2xkU3lzdGVtU3RhdGUsIG5ld1N5c1N0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFVzZXJTdGF0ZSA9IHZhbGlkYXRlVXNlclN0YXRlKG9sZFVzZXJTdGF0ZSwgbmV3VXNlclN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkT25waG9uZUVuZCA9IG5ld1N5c1N0YXRlID09PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCAmJiBvbGRTeXN0ZW1TdGF0ZSAhPT0gUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORSAmJiBuZXdVc2VyU3RhdGUgIT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5peg5pWI55qE54q25oCB77yaXG4gICAgICAgICAgICAgKiDmlrDkuIvlj5HnirbmgIHnmoTml7bpl7TlsI/kuo7lvZPliY3nirbmgIHnmoTml7bpl7Qg5LiUIHN5c3RlbVN0YXRlIOWSjCB1c2VyU3RhdGUg5Z2H5piv5peg5pWI55qEXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICgobmV3U3RhdGVUaW1lICYmIG9sZFN0YXRlVGltZSAmJiBuZXdTdGF0ZVRpbWUgPCBvbGRTdGF0ZVRpbWUpIHx8IChpc0ludmFsaWRTeXNTdGF0ZSAmJiBpc0ludmFsaWRVc2VyU3RhdGUpKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHRpbWVvdXQgdXNlciBzdGF0ZTogb2xkOiR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgdXNlcklkLCBvbGRTdGF0ZVRpbWUsIG9sZFN5c3RlbVN0YXRlLCBvbGRVc2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgfSl9OyBuZXc6JHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIOebtOaOpeimhuebluabtOaWsFxuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gY292ZXIgJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJzW2ldID0gdXNlcjtcbiAgICAgICAgICAgICAgIWlzSW52YWxpZE9ucGhvbmVFbmQgJiYgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDml6DmraTnlKjmiLfnm7TmjqXmt7vliqBcbiAgICAgICAgaWYgKCFoYXNVc2VyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IC0+IG5vdXNlciBwdXNoICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZFVzZXJzO1xuICB9XG5cbiAgcHVibGljIHNldE9sZERpYWxvZ0RhdGEoZGF0YTogSU9sZERpYWxvZ0RhdGEpIHtcbiAgICB0aGlzLl9vbGREaWFsb2dEYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIOabtOaWsCBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YCa6K+d57G75Z6L77yI5Y2H6ZmN57qn6K6+572u77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2FsbFR5cGUoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlKSB7XG4gICAgdGhpcy5fY2FsbFR5cGUgPSBjYWxsVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlqpLkvZPnsbvlnovvvIjljYfpmY3nuqfvvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOivt+axgueahOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJlcU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcmVxTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBpbnZ0ZXIgdGltZXIgaWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUaW1lcklkKHR5cGU6IENhbGxUaW1lckV2ZW50VHlwZSwgdGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGUgPT09IENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSKSB7XG4gICAgICB0aGlzLl9pbnZpdGVyVGltZXJJZCA9IHRpbWVySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludml0ZWVUaW1lcklkID0gdGltZXJJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WXG4gICAqL1xuICBwdWJsaWMgZ2V0T2xkRGlhbG9nRGF0YSgpOiBJT2xkRGlhbG9nRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX29sZERpYWxvZ0RhdGE7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5piv5ZCm5piv5bex56uv5oyC5patXG4gICAqL1xuICBwdWJsaWMgc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsQ2xpZW50SGFuZ3VwID0gaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXA7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJBY3Rpb24ge1xuICAvKipcbiAgICog5byA5aeL5Y2V5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9TSU5HTEVfQ0FMTCA9ICdzdGFydFNpbmdsZUNhbGwnLFxuICAvKipcbiAgICog5byA5aeL5aSa5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9HUk9VUF9DQUxMID0gJ3N0YXJ0R3JvdXBDYWxsJyxcbiAgLyoqXG4gICAqIOmCgOivt+WlveWPi+WKoOWFpemAmuivnVxuICAgKi9cbiAgSU5WSVRFX0NBTEwgPSAnaW52aXRlQ2FsbCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgoDor7fpgJror53mlbDmja5cbiAgICovXG4gIFBVQl9JTlZJVEVfQ0FMTCA9ICdwdWJJbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneWTjemTg1xuICAgKi9cbiAgUklOR0lOR19DQUxMID0gJ3JpbmdDYWxsJyxcbiAgLyoqXG4gICAqIOaOpeWPl+mAmuivnVxuICAgKi9cbiAgQUNDRVBUX0NBTEwgPSAnYWNjZXB0Q2FsbCcsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIEpPSU5fQ0FMTCA9ICdqb2luQ2FsbCcsXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICovXG4gIEhBTkdVUF9DQUxMID0gJ2hhbmd1cENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBTVEFUVVNfVVBfQ0FMTCA9ICdzdGF0dXNVcENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiL5Y+RXG4gICAqL1xuICBTVEFUVVNfRE9XTl9DQUxMID0gJ3N0YXR1c0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgRVZFTlRfVVBfQ0FMTCA9ICdldmVudFVwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIvlj5FcbiAgICovXG4gIEVWRU5UX0RPV05fQ0FMTCA9ICdldmVudERvd25DYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4iuihjFxuICAgKi9cbiAgRElBTE9HX1VQX0NBTEwgPSAnZGlhbG9nVXBDYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4i+ihjFxuICAgKi9cbiAgRElBTE9HX0RPV05fQ0FMTCA9ICdkaWFsb2dEb3duQ2FsbCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfkvJror53mlbDmja7liJfooahcbiAgICovXG4gIEdFVF9DQUxMX1VTRVJfU0VTU0lPTl9MSVNUID0gJ2dldENhbGxVU2VyU2Vzc2lvbkxpc3QnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5ZCM5q2lXG4gICAqL1xuICBTWU5DX0NBTExfTE9HID0gJ3N5bmNDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOaXpeW/l+iusOW9leS4i+WPkVxuICAgKi9cbiAgUFVCX0NBTExfTE9HID0gJ3B1YkNhbGxMb2cnLFxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBERUxfQ0FMTF9MT0cgPSAnZGVsZXRlQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmn6Xor6LlvZPliY3nlKjmiLflt7LmnInnmoQgY2FsbCDnirbmgIFcbiAgICovXG4gIFFSWV9DQUxMX1NUQVRFID0gJ3F1ZXJ5VXNlckhhc0NhbGwnLFxuICAvKipcbiAgICog5p+l6K+iIGNhbGxTZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBRUllfU1JWX1RJTUVTVEFNUCA9ICdnZXRDYWxsU3J2VGltZVN0YW1wJyxcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeUqOaIt+i/m+ihjOeahCBjYWxsIOWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfU1RBVEVfTElTVCA9ICdnZXRVc2VyQ2FsbFN0YXRlTGlzdCcsXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfpgJror53orrDlvZVcbiAgICovXG4gIENMRUFSX0NBTExfTE9HID0gJ2NsZWFuQ2FsbExvZycsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDkvJror53kv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1NFU1NJT04gPSAnZ2V0Q2FsbFNlc3Npb24nLFxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBHRVRfQ0FMTF9USU1FX0lORk8gPSAnZ2V0Q2FsbFRpbWVJbmZvJyxcbiAgLyoqXG4gICAqIOe7k+adn+W9k+WJjeeUqOaIt+W8guW4uOeahGNhbGxTZXNzaW9uKOWMheWQq+WQhOS4qumYtuautSnvvIzkuLvopoHnlKjkuo7lupTnlKjlvILluLjpgIDlh7rlho3lkK/liqjjgIHlkITnp43pgJror53lvILluLjlvZPkuK3jgILphYzmg4XosIPnlKhcbiAgICovXG4gIEVORF9BQk5PUk1BTF9DQUxMID0gJ2VuZFVzZXJBYm5vcm1hbENhbGxzJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgU1lTX1NUQVRVU19VUCA9ICdzeXNTdGF0dXNVcCcsXG4gIC8qKlxuICAgKiDkuIrmiqXpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFVQX0NBTExfTE9HX1JFQURFRCA9ICd1cENhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R6YCa6K+d6K6w5b2V5bey6K+754q25oCBXG4gICAqL1xuICBQVUJfQ0FMTF9MT0dfUkVBREVEID0gJ3B1YkNhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R5LiL6KGM5L+h5Luk5pWw5o2u5bqP5Y+3SWQg77yI5byx572R6KGl5YG/5pa55rOV77yM56e75Yqo56uv5bey5a6e546w77yMUEMg5pyq5a6e546w77yJXG4gICAqL1xuICBQVUJfTkFDS19TRVFfSUQgPSAncHViTkFDS1NlcUlkJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+WPguS4jueahOacque7k+adn+eahGNhbGxTZXNzaW9u55qEQ2FsbElk5YiX6KGo77yMZ3JvdXDkuJPnlKjvvIzlj6/lnKhncm91cGNhbGznu5PmnZ/ml7bvvIzooaXlgb/lkITnq6/nmoTlv6vmjbflhaXlj6PmmK/lkKbmtojlpLHnmoTliKTmlq1cbiAgICovXG4gIEdFVF9VU0VSX0NBTExfU0VTU0lPTl9JRF9MSVNUID0gJ2dldFVzZXJDYWxsU2Vzc2lvbklkTGlzdCdcbn1cbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHRpbWVySW50ZXJ2YWwgPSAoZnVuOiBGdW5jdGlvbiwgaXR2OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0SW50ZXJ2YWwoZnVuLCBpdHYpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1pbGxpc2Vjb25kOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmQpO1xufSk7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5cbmV4cG9ydCB0eXBlIFRSZXRyeUVycm9yQ29kZSA9IENhbGxTZXJ2ZXJFcnJvckNvZGUgfCBSQ1JUQ0NvZGUgfCBudW1iZXIgfCBFcnJvckNvZGVcbmV4cG9ydCBpbnRlcmZhY2UgcmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5Xml7bplb9cbiAgICovXG4gIG1heER1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqUXG4gICAqL1xuICBpbnRlcnZhbHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICAgKi9cbiAgaW5kZXg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDph43or5XlpLHotKXnmoTlm57osINcbiAgICovXG4gIG9uRXJyb3I/OiAoY29kZTogVFJldHJ5RXJyb3JDb2RlKSA9PiB2b2lkXG59XG5cbmNvbnN0IG5lZWRSZXRyeUNvZGU6IFRSZXRyeUVycm9yQ29kZVtdID0gW1xuICAvKipcbiAgICogSU0g5bqV5bGC6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBFcnJvckNvZGUuUkNfTkVUX0NIQU5ORUxfSU5WQUxJRCxcbiAgRXJyb3JDb2RlLlJDX05FVF9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlJDX01TR19SRVNQX1RJTUVPVVQsXG4gIC8qKlxuICAgKiBSVEMg6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBSQ1JUQ0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCxcbiAgUkNSVENDb2RlLlJFUVVFU1RfRkFJTEVELFxuXG5dO1xuXG4vKipcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuYXN5bmNGbiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuZm5BcmdzIOWHveaVsOeahOWPguaVsFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5jdXJyZW50UmV0cnlUaW1lIOW9k+WJjemHjeivleaXtumXtOaIs1xuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5tYXhEdXJhdGlvbiDmnIDlpKfph43or5Xml7bplb9cbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMuaW50ZXJ2YWxzIOair+W6pumHjeivlemXtOmalFxuICogQHBhcmFtIHJldHJ5T3B0aW9ucy5pbmRleCDmoq/luqbph43or5Xpl7TpmpTmlbDnu4TkuIvmoIdcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5QXN5bmNGbiA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IERhdGUubm93KCksXG4gIG1heER1cmF0aW9uID0gNjAgKiAxMDAwLFxuICBpbnRlcnZhbHMgPSBbMiAqIDEwMDAsIDQgKiAxMDAwLCA4ICogMTAwMCwgMTYgKiAxMDAwLCAzMiAqIDEwMDAsIDY0ICogMTAwMF0sXG4gIGluZGV4ID0gMCxcbiAgb25FcnJvcixcbn06IHJldHJ5T3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIC8vIGNvbnN0IGl0diA9IGludGVydmFsc1tpbmRleF0gfHwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXVxuICAvLyBpbmRleCsrXG4gIC8vIGl0diDlhpnmrbsgMjAwMCBtcyAs5ZCO57ut6ZyA6KaB5YaN5pS+5byA5qKv5bqm6YeN6K+VXG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpXG4gICAgfHwgKChEYXRlLm5vdygpICsgaXR2IC0gY3VycmVudFJldHJ5VGltZSkgPiBtYXhEdXJhdGlvbik7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXN5bmNGbih7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heER1cmF0aW9uLFxuICAgICAgaW50ZXJ2YWxzLFxuICAgICAgaW5kZXgsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIHJldHJ5QnlUaW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAgICovXG4gIGFzeW5jRm46IEZ1bmN0aW9uO1xuICAvKipcbiAgICog5Ye95pWw55qE5Y+C5pWwXG4gICAqL1xuICBmbkFyZ3M6IGFueVtdO1xuICAvKipcbiAgICog5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gICAqL1xuICBjdXJyZW50UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwLCDpu5jorqQgMiDmrKFcbiAgICovXG4gIG1heFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5QXNueWNGbkJ5VGltZSA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IDAsXG4gIG1heFJldHJ5VGltZSA9IDIsXG4gIG9uRXJyb3IsXG59OiByZXRyeUJ5VGltZU9wdGlvbnMpOiBQcm9taXNlPFI+ID0+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgYXN5bmNGbiguLi5mbkFyZ3MpO1xuICBjb25zdCBpdHYgPSAyICogMTAwMDtcbiAgY3VycmVudFJldHJ5VGltZSsrO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpIHx8IGN1cnJlbnRSZXRyeVRpbWUgPiBtYXhSZXRyeVRpbWU7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXNueWNGbkJ5VGltZSh7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heFJldHJ5VGltZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgeyBJUHViSW52aXRlQ29uIH0gZnJvbSAnLi9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG5leHBvcnQgZW51bSBDYWxsSG9va3NUeXBlIHtcbiAgb25CZWZvcmVQdWJsaXNoID0gJ29uQmVmb3JlUHVibGlzaCcsXG4gIG9uUHVibGlzaFJlcyA9ICdvblB1Ymxpc2hSZXMnLFxuICBvblB1Ykludml0ZUNhbGwgPSAnb25QdWJJbnZpdGVDYWxsJyxcbiAgb25QdWJJbnZpdGVDYWxsUHVsbEt2ID0gJ29uUHViSW52aXRlQ2FsbFB1bGxLdicsXG4gIG9uUHViSW52aXRlQ2FsbE1pc3MgPSAnb25QdWJJbnZpdGVDYWxsTWlzcydcbn1cblxuZXhwb3J0IGVudW0gUHViSW52aXRlQ2FsbE1pc3NSZWFzb24ge1xuICBOT1RfQ1VSUkVOVF9ERVZJQ0VJRCA9ICdub3QgY3VycmVudCBkZXZpY2UgaWQnLFxuICBTRUNSRVRfQ0FMTCA9ICdzZWNyZXQgY2FsbCcsXG4gIE5PVF9JTlZJVEVFID0gJ25vdCBhbiBpbnZpdGVlJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIHtcbiAgUFVCX0lOVklURSA9ICdwdWJpbnZpdGVjYWxsJyxcbiAgUFVMTF9LVl9JTlZJVEUgPSAncHVsbGt2X2ludml0ZWNhbGwnLFxuICBQVVNIID0gJ3N5c3RlbV9wdWJzaCdcbn1cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZ31cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxNaXNzSW5mbyA9IElQdWJJbnZpdGVDb24gJiB7IGV4dHJhOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCByZWZlcjogUHViSW52aXRlQ2FsbE1pc3NSZWZlcn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgZ2V0VVVJRDIyLCBJUnVudGltZSwgaXNOdWxsLCBpc1N0cmluZywgbG9nZ2VyLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyQWN0aW9uJztcbmltcG9ydCB7XG4gIElBY2NlcHRDYWxsQ29uLFxuICBJQmFzZVNpbmdhbENvbixcbiAgSUNsZWFyQ2FsbExvZ1JlcyxcbiAgSUNvbnBlbnNhdGlvbkRhdGEsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSURpYWxvZ1VwQ2FsbENvbixcbiAgSUV2ZW50RG93bkNhbGxDb24sXG4gIElFdmVudFVwQ2FsbENvbixcbiAgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0VXNlckNhbGxTdGF0ZUxpc3RSZXMsXG4gIElIYW5ndXBDYWxsQ29uLFxuICBJSW52aXRlQ2FsbENvbixcbiAgSUludml0ZUNhbGxSZXMsXG4gIElKb2luQ2FsbENvbixcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElRcnlVc2VySGFzQ2FsbFJlcyxcbiAgSVJpbmdpbmdDYWxsQ29uLFxuICBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lcixcbiAgSVN0YXJ0Q2FsbENvbixcbiAgSVN0YXJ0Q2FsbFJlcyxcbiAgSVN0YXJ0R3JvdXBDb24sXG4gIElTdGFydFNpbmdsZUNvbixcbiAgSVN0YXR1c0Rvd25Db250LFxuICBJU3RhdHVzVXBDb24sXG4gIElTeW5jQ2FsbExvZ0NvbixcbiAgSVN5bmNDYWxsTG9nUmVzTGlzdCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgRGlhbG9nVHlwZSB9IGZyb20gJy4uL2VudW1zL0RpYWxvZ1R5cGUnO1xuaW1wb3J0IHsgSVJDQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JSW5kZXgnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IFRpbWVDb3JyZWN0aW9uZXIgfSBmcm9tICcuL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgcmV0cnlBc3luY0ZuIH0gZnJvbSAnLi4vdXRpbHMvcmV0cnknO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGNsYXNzIFNpZ25hbFRyYW5zcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIOebkeWQrOWvueixoVxuICAgKi9cbiAgX2xpc3RlbmVyITogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXJcblxuICAvKipcbiAgICog6ZyA6KaB6YeN6K+V55qEIGFjdGlvblxuICAgKi9cbiAgX25lZWRSZXRyeUFjdGlvbnM6IENhbGxTZXJ2ZXJBY3Rpb25bXSA9IFtcbiAgICBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLkFDQ0VQVF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCxcbiAgXVxuXG4gIF9zZXNzaW9uSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbnRleHQub25DYWxsSW5mbyA9IHRoaXMuX29uUmVjdkNhbGxTaWduYWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jb250ZXh0Lm9uY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gdGhpcy5fb25JTUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IGdldFVVSUQyMigpO1xuICB9XG5cbiAgZ2V0U2Vzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChtc2c6IElTdGFydENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xpZW50Q2FsbElkLCBjYWxsVHlwZSwgdG9Vc2VycywgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgbmlja05hbWUsIG9sZFJvb21JZCxcbiAgICB9ID0gbXNnO1xuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydFNpbmdsZUNhbGwoe1xuICAgICAgICBjbGllbnRDYWxsSWQsXG4gICAgICAgIHRvVXNlcklkOiB0b1VzZXJzWzBdLnVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZWNyZXRDaGF0LFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgb2xkUm9vbUlkLFxuICAgICAgICB0b09yZ0lkOiB0b1VzZXJzWzBdLm9yZ0lkIHx8ICcnLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0R3JvdXBDYWxsKHtcbiAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBuaWNrTmFtZSxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNpbmdsZUNhbGwobXNnOiBJU3RhcnRTaW5nbGVDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydFNpbmdsZUNvbiwgSVN0YXJ0Q2FsbFJlcz4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9TSU5HTEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydEdyb3VwQ2FsbChtc2c6IElTdGFydEdyb3VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR1JPVVBfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydEdyb3VwQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX0dST1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52aXRlQ2FsbChtc2c6IElJbnZpdGVDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlQ2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lOVklURV9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElJbnZpdGVDYWxsQ29uLCBJSW52aXRlQ2FsbFJlcz4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5JTlZJVEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByaW5naW5nQ2FsbChtc2c6IElSaW5naW5nQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUklOR19ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElSaW5naW5nQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlJJTkdJTkdfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY2NlcHRDYWxsKG1zZzogSUFjY2VwdENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0FDQ0VQVF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElBY2NlcHRDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgam9pbkNhbGwobXNnOiBJSm9pbkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElKb2luQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkpPSU5fQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5ndXBDYWxsKG1zZzogSUhhbmd1cENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0hBTkdVUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSGFuZ3VwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkhBTkdVUF9DQUxMLCBtc2cpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCkge1xuICAgICAgLy8g5a2Y5Zyo5Y2V5ZG8IEEg5oyC5pat5ZCO55u05o6l6Lii5Ye6IELvvIxDYWxsU2VydmVyIOW3suenu+mZpCBjYWxsLCBCIOWQjuWIsCBDYWxsU2VydmVyIOeahCBoYW5ndXAg5Lya6L2s5Li6IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1TvvIzmlYXlv73nlaVcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXR1c1VwQ2FsbChtc2c6IElTdGF0dXNVcENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9TVEFUVVNfVVBfVCwgYGNhbGwgc3RhdHVzIHVwIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhdHVzVXBDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TVEFUVVNfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBldmVudFVwQ2FsbChtc2c6IElFdmVudFVwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9FVkVOVF9VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElFdmVudFVwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlhbG9nVXBDYWxsKG1zZzogSURpYWxvZ1VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJRGlhbG9nVXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbFJlY29yZCh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9ERUxFVEVfQ0FMTF9SRUNPUkRfVCwgYGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHtjYWxsSWRzOiBzdHJpbmdbXX0sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkRFTF9DQUxMX0xPRywge1xuICAgICAgY2FsbElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jQ2FsbExvZyhtc2c6IElTeW5jQ2FsbExvZ0NvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN5bmNDYWxsTG9nUmVzTGlzdH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1JFQ09SRF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTeW5jQ2FsbExvZ0NvbiwgSVN5bmNDYWxsTG9nUmVzTGlzdD4obXNnLnVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWU5DX0NBTExfTE9HLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlckhhc0NhbGwoKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVFyeVVzZXJIYXNDYWxsUmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElRcnlVc2VySGFzQ2FsbFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlFSWV9DQUxMX1NUQVRFLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IHsgc3luY1RpbWU6IG51bWJlcn19PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1NFUlZFUl9USU1FX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCB7IHN5bmNUaW1lOiBudW1iZXJ9Pih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX1NSVl9USU1FU1RBTVAsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1RJTUVfSU5GT19ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8eyBjYWxsSWQ6IHN0cmluZ30sIElHZXRDYWxsVGltZUluZm9SZXM+KGNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9USU1FX0lORk8sIHsgY2FsbElkIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVzZXJDYWxsU3RhdGVMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0FWQUlMQUJMRV9DQUxMX0xJU1RfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NUQVRFX0xJU1QsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyQ2FsbFJlY29yZCh0cmFjZUlkOiBzdHJpbmcpOlByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElDbGVhckNhbGxMb2dSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJQ2xlYXJDYWxsTG9nUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uQ0xFQVJfQ0FMTF9MT0csIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElCYXNlU2luZ2FsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9JTkZPX0JZX0NBTExJRF9ULCBgY2FsbElkOiAke29wdHMuY2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9TRVNTSU9OLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeXNTdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9VU0VSX1NZU1RFTV9TVEFURV9VUF9ULCBgb3B0czogJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5c1N0YXR1c1VwT3B0cywgdW5kZWZpbmVkPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWVNfU1RBVFVTX1VQLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cENhbGxMb2dSZWFkZWQob3B0czogSUJhc2VTaW5nYWxDb24pOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUJhc2VTaW5nYWxDb24sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlVQX0NBTExfTE9HX1JFQURFRCwgb3B0cyk7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIHByaXZhdGUgX29uSU1Db25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08sIGBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSU1TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgLyoqXG4gICAgICog6L+e5o6l5oiQ5Yqf5ZCO5ZCv5Yqo5pe26Ze05qCh5q2j5ZmoXG4gICAgICovXG4gICAgaWYgKHN0YXRlID09PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0YXJ0KHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5Y+R6YCBXG4gICAqIEBwYXJhbSB0YXJnZXRJZCDojrflj5YgY2FsbCBsb2cgKHN5bmNDYWxsTG9nKSDml7bkvKAgdXNlcklkLCDlhbbku5YgYWN0aW9uIOS8oCBjYWxsSWRcbiAgICogQHBhcmFtIGtleSBjYWxsIHNlcnZlciDlrprkuYkgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIGFjdGlvbiDmkLrluKblj4LmlbDvvIzml6Dlj4LmlbDkvKDnqbrlrZfnrKbkuLJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsU2lnbmFsIDxULCBSPih0YXJnZXRJZDogc3RyaW5nLCBrZXk6IENhbGxTZXJ2ZXJBY3Rpb24sIG9wdGlvbnM6IFQpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBSfT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucyA/IEpTT04uc3RyaW5naWZ5KHsgLi4ub3B0aW9ucywgLi4ueyBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZCB9IH0pIDogJyc7XG5cbiAgICBsZXQgcmVzdWx0OiB7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBjb2RlOiBFcnJvckNvZGV9O1xuICAgIGlmICh0aGlzLl9uZWVkUmV0cnlBY3Rpb25zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8e2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSB8IHVuZGVmaW5lZCwgY29kZTogRXJyb3JDb2RlfT4oe1xuICAgICAgICBhc3luY0ZuOiB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvLmJpbmQodGhpcy5fY29udGV4dCksXG4gICAgICAgIGZuQXJnczogW3RhcmdldElkLCBrZXksIHZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvKHRhcmdldElkLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSByZXN1bHQ7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IHsga2V5OiBzZXJ2ZXJLZXksIHZhbHVlOiBzZXJ2ZXJWYWwgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHNlcnZlclZhbCkuZGF0YSBhcyBSO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgZGF0YTogcGFyc2VkRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5o6l5pS2XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsU2lnbmFsKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NJR05BTF9EQVRBX08sIGBkYXRhOiAke2RhdGF9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBkYXRhTGlzdCA9IEpTT04ucGFyc2UoZGF0YSkubGlzdCBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nIH1bXTtcbiAgICBkYXRhTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9JTlZJVEVfQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoaW5mbyBhcyBJUHViSW52aXRlQ29uLCB0cnVlLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25TdGF0dXNEb3duQ2FsbChpbmZvIGFzIElTdGF0dXNEb3duQ29udCwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25FdmVudERvd25DYWxsKGluZm8gYXMgSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGluZm8gYXMgSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPRzpcbiAgICAgICAgICB0aGlzLl9vblB1YkNhbGxMb2coaW5mbyBhcyBJUHViQ2FsbExvZywgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfQ0FMTF9MT0dfUkVBREVEOlxuICAgICAgICAgIC8vIHBhc3Mg5pqC5pyq55So5YiwXG4gICAgICAgICAgLy8gdGhpcy5fb25QdWJDYWxsTG9nUmVhZGVkKGluZm8gYXMgSVB1YkNhbGxMb2dSZWFkZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX05BQ0tfU0VRX0lEOlxuICAgICAgICAgIC8vIFRPRE8gY2FsbCDlvLHnvZHooaXlgb/mlrnmoYjmtonlj4rmlrnms5XvvIxQQyDmnKrlgZrvvIzmraTlpITpmLLmraLotbDliLAgZGVmYXVsdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX29uQ29ucGVuc2F0aW9uRGF0YShpbmZvIGFzIElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gZGV2aWNlSWQg5Yik5pat5pWw5o2u5piv5ZCm5bqU6K+l5LiL5Y+RXG4gICAqIGRldmljZUlkIOS4uuepuuWtl+espuS4suaIliBudWxsIOebtOaOpeS4i+WPkVxuICAgKiBkZXZpY2VJZCDmnInlhbfkvZPnmoTlgLzvvIzmoLnmja4gZGV2aWNlSWQg5Yik5pat5piv5ZCm5piv5bex56uv55qEIGRldmljZUlkXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkRGF0YShkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGwoZGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKGRldmljZUlkKSAmJiAoZGV2aWNlSWQ/Lmxlbmd0aCA9PT0gMCB8fCBkZXZpY2VJZCA9PT0gdGhpcy5fc2Vzc2lvbklkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgoDor7dcbiAgICogQHBhcmFtIGlzRGlyZWN0bHkg5piv5ZCm5Li655u05Y+R5L+h5LukXG4gICAqL1xuICBwcml2YXRlIF9vblB1Ykludml0ZUNhbGwoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseSA9IHRydWUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VUlkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VUlkKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBjdXJyZW50VXNlcjogJHtKU09OLnN0cmluZ2lmeShjdXJyZW50VXNlcil9LCBjdXJyZW50VXNlcklkOiAke2N1cnJlbnRVSWR9LCBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWREYXRhKGRhdGEudG9EZXZpY2VJZCB8fCAnJykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIEEg5ZKMIEIg576k6YCa6K+d5Lit77yMQSDlho3pgoDor7cgQ++8jEIg5ZKMIEInIOmDveS8muS8muaUtuWIsCBwdWJJbnZpdGVDYWxsLCBCJyDmlLbliLDnmoQgcHViSW52aXRlQ2FsbCDnmoQgdG9EZXZpY2VJZCDkuI3kuLroh6rlt7HvvIzml6DpnIDlpITnkIZcblxuICAgICAgLy8gaG9va3Mg5Zue6LCD5aSE55CGXG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uTk9UX0NVUlJFTlRfREVWSUNFSUQsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH07XG4gICAgICBpZiAoaXNEaXJlY3RseSkge1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIGluZm8pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSW52aXRlKGRhdGEsIGlzRGlyZWN0bHksIHRyYWNlSWQpO1xuICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGwsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxQdWxsS3YsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDnirbmgIHlj5jmm7TvvJrlk43pk4PjgIHlv5nnoozjgIHpgJror53nrYnlvoXjgIHlr7nmlrnmnKrmjqXlkKzjgIHlt7HmlrnmnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX29uU3RhdHVzRG93bkNhbGwoZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmlbDmja7kuK3ov4fmu6TmjonmnKrlj5jmm7TnmoQgdXNlclNlc3Npb25cbiAgICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBCb29sZWFuKGl0ZW0uY2hhbmdlZCkpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sIGBub3QgY3VycmVudCBkZXZpY2VJZCAtPiBkZXZpY2VJbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdG9EZXZpY2VJZDogZGF0YS50b0RldmljZUlkLFxuICAgICAgICBjbGllbnREZXZpY2VJZDogdGhpcy5fc2Vzc2lvbklkLFxuICAgICAgfSl9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDkuI3mmK/nu5nlvZPliY3orr7lpIfkuIvlj5HnmoTnirbmgIHlpITnkIZcbiAgICAgIHRoaXMuX2xpc3RlbmVyLm9uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lci5vblN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCwgdGhpcy5fc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53kuovku7blj5jmm7TvvJrmiZPlvIB85YWz6ZetIOaRhOWDj+WktFxuICAgKi9cbiAgcHJpdmF0ZSBfb25FdmVudERvd25DYWxsKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9saXN0ZW5lci5vbkV2ZW50RG93bihkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53osIPmlbTkuovku7blj4rnu5PmnpxcbiAgICog5LqL5Lu277ya5aqS5L2T57G75Z6L5YiH5o2iXG4gICAqIOWKqOS9nO+8muivt+axguOAgeaOpeWPl+OAgeaLkue7neOAgeWPlua2iFxuICAgKi9cbiAgcHJpdmF0ZSBfb25EaWFsb2dEb3duQ2FsbChkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZGlhbG9nVHlwZSwgYWN0aW9uLCBleHRyYUtleVZhbCB9ID0gZGF0YTtcbiAgICBzd2l0Y2ggKGRpYWxvZ1R5cGUpIHtcbiAgICAgIGNhc2UgRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRTpcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIub25Td2l0Y2hNZWRpYVR5cGUoZGF0YSwgdHJhY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WQju+8jOaXpeW/l+S4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25QdWJDYWxsTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PLCBgY2FsbCByZWNvcmQ6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vblJlY3ZDYWxsRW5kTG9nKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihpeWBv+aVsOaNruWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Db25wZW5zYXRpb25EYXRhKGRhdGE6IElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DT01QTEVNRU5UQVJZX0RBVEFfTywgJycsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgc2VjcmV0Q2hhdCwgZHVyYXRpb24sIGNhbGxTdGF0dXMsIGNhbGxpbmdVc2VySWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRvRGV2aWNlSWQsIGNhbGxEaWFsb2dFbnRpdHlzLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgaXNQdWJJbnZpdGVDYWxsRGF0YSA9IGNhbGxTZXNzaW9uVXNlcnMuc29tZSgoaXRlbSkgPT4gaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEICYmIGl0ZW0udXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcblxuICAgIGlmIChpc1B1Ykludml0ZUNhbGxEYXRhKSB7XG4gICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgICAgc2VjcmV0Q2hhdCxcbiAgICAgIH0sIHRydWUsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB0b0RldmljZUlkLFxuICAgICAgICBjYWxsU3RhdHVzLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmIChjYWxsRGlhbG9nRW50aXR5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjYWxsRGlhbG9nRW50aXR5cy5mb3JFYWNoKChkYXRhKSA9PiB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGRhdGEsIHRyYWNlSWQpLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHN0cmluZzEwdG82NCA9IChudW1iZXI6IG51bWJlcikgPT4ge1xuICBjb25zdCBjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpZ2tsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElHS0xNTk9QUVJTVFVWV1hZWisvJy5zcGxpdCgnJyk7XG4gIGNvbnN0IHJhZGl4ID0gY2hhcnMubGVuZ3RoICsgMTtcbiAgbGV0IHF1dGllbnQgPSArbnVtYmVyO1xuICBjb25zdCBhcnIgPSBbXTtcbiAgZG8ge1xuICAgIGNvbnN0IG1vZCA9IHF1dGllbnQgJSByYWRpeDtcbiAgICBxdXRpZW50ID0gKHF1dGllbnQgLSBtb2QpIC8gcmFkaXg7XG4gICAgYXJyLnVuc2hpZnQoY2hhcnNbbW9kXSk7XG4gIH0gd2hpbGUgKHF1dGllbnQpO1xuICByZXR1cm4gYXJyLmpvaW4oJycpO1xufTtcblxuY29uc3QgZ2V0VVVJRCA9ICgpID0+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+35o6l5pS25p2l5rqQXG4gICAqL1xuICByZjogUkNDYWxsUGx1c0ludml0ZVNvdXJjZVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWRvOWHulxuICAgKi9cbiAgT1VUID0gLTEsXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICovXG4gIEdST1VQID0gMCxcbiAgLyoqXG4gICAqIOWRvOWFpVxuICAgKi9cbiAgSU4gPSAxXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBJUnVudGltZSwgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2cgfSBmcm9tICcuL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBnZXRVVUlEMjIgfSBmcm9tICcuL3V0aWxzL3JhbmRvbSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBBYm5vcm1hbENhbGwgfSBmcm9tICcuL21vZHVsZXMvQWJub3JtYWxDYWxsJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFdmVudFR5cGUgfSBmcm9tICcuL2VudW1zL0NhbGxTZXJ2ZXJFdmVudFR5cGUnO1xuaW1wb3J0IHsgVGltZUNvcnJlY3Rpb25lciB9IGZyb20gJy4vbW9kdWxlcy9UaW1lQ29ycmVjdGlvbmVyJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNTZXNzaW9uJztcbmltcG9ydCB7IEZvcndhcmRUeXBlIH0gZnJvbSAnLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQge1xuICBDYWxsSG9va3NUeXBlLCBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiwgUHViSW52aXRlQ2FsbE1pc3NSZWZlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IFJDQ2FsbERpcmVjdGlvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRGlyZWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG5jb25zdCBDQUxMX1RJTUVfT1VUID0gNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsRW5naW5lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXzogc3RyaW5nID0gJ2lubmVyLXNlc3Npb24tY29ubmVjdCdcblxuICBzdGF0aWMgX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fOiBzdHJpbmcgPSAnaW5uZXItY2hhbmdlLW1lZGlhLXR5cGUnXG5cbiAgc3RhdGljIF9fSU5ORVJfSU5WSVRFX186IHN0cmluZyA9ICdpbm5lci1pbnZpdGUnXG5cbiAgLyoqXG4gICAqIOS4uyBzZXNzaW9uXG4gICAqL1xuICBfbWFpblNlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbiB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOWcqOmAmuivneS4reaUtuWIsOeahCDpgoDor7cgc2Vzc2lvblxuICAgKi9cbiAgX2hvbGRTZXNzaW9uczogUkNDYWxsSW5uZXJTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDkv6Hku6TmqKHlnZdcbiAgICovXG4gIF9zaWduYWxNb2R1bGU6IFNpZ25hbFRyYW5zcG9ydGVyXG5cbiAgLyoqXG4gICAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWZqFxuICAgKi9cbiAgX2Fibm9ybWFsTW9kdWxlOiBBYm5vcm1hbENhbGxcblxuICAvKipcbiAgICog6K6w5b2V5Y2V5ZG85Lit77yM5piv5ZCm5LiK5oql6L+H56ys5LiA5binXG4gICAqIOe9riB0cnVlIOaXtuacuu+8muaUtuWIsOi/nOerr+esrOS4gOW4p++8jOaIkOWKn+S4iuaKpSBTZXJ2ZXJcbiAgICog572uIGZhbHNlIOaXtuacuu+8mumAmuivnee7k+adn1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNVcEZpcnN0RnJhbWVUaW1lOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6YCa6K+d5Li6IE9OQ0FMTCDml7bvvIxTREsg6ZyA57uZ5Lia5Yqh5bGC5LiK5oql6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAqIOS8muaUtuWIsOWkmuasoSBPTkNBTEzvvIzmiYDku6XpnIDopoHmoIfor4bmmK/lkKblt7Lmipvov4fkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX2NhbGxTdGFydE1hcDoge1xuICAgIFtjYWxsSWQ6IHN0cmluZ106IHtcbiAgICAgIGlzUmVjZWl2ZUNhbGxTdGFydFRpbWU6IGJvb2xlYW4sXG4gICAgfVxuICB9ID0ge31cblxuICAvKipcbiAgICog5qCh5pe25ZmoXG4gICAqL1xuICBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lclxuXG4gIC8qKlxuICAgKiDmnoTpgKDlmahcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIgPSBuZXcgVGltZUNvcnJlY3Rpb25lcih0aGlzLCBfbG9nZ2VyLCB0aGlzLl9vblJlY3ZTaW5DYWxsRHVyYXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlID0gbmV3IFNpZ25hbFRyYW5zcG9ydGVyKF9jb250ZXh0LCBfcnVudGltZSwgX2luaXRPcHRzLCB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLCB0aGlzLl9sb2dnZXIpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgb25TdGF0dXNEb3duOiB0aGlzLl9vblN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uT3RoZXJDbGllbnRTdGF0dXNEb3duOiB0aGlzLl9vbk90aGVyQ2xpZW50U3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25FdmVudERvd246IHRoaXMuX29uRXZlbnREb3duLmJpbmQodGhpcyksXG4gICAgICBvblN3aXRjaE1lZGlhVHlwZTogdGhpcy5fb25Td2l0Y2hNZWRpYVR5cGUuYmluZCh0aGlzKSxcbiAgICAgIG9uUmVjdkNhbGxFbmRMb2c6IHRoaXMuX29uUmVjdkNhbGxFbmRMb2cuYmluZCh0aGlzKSxcbiAgICAgIG9uSU1TdGF0ZUNoYW5nZTogdGhpcy5fb25JTVN0YXRlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUgPSBuZXcgQWJub3JtYWxDYWxsKF9ydW50aW1lLCBfbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwob3B0czogSVN0YXJ0Q2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN1bHR9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgdG9Vc2VycywgdGFyZ2V0SWQsIHRhcmdldFR5cGUsIG9sZFJvb21JZCxcbiAgICB9ID0gb3B0cztcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5zdGFydENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHNlY3JldENoYXQ6IFNlY3JldENhbGxUeXBlLk5PUk1BTCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG9sZFJvb21JZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWxsSWQsIGJ1c3lsaW5lVXNlcnMgfSA9IGRhdGEhO1xuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5JTlZJVEVELFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG5cbiAgICAvLyDljZXlkbzlkK/liqjlkbzlj6votoXml7borqHml7blmagsIOe+pOWRvOaXoOi2heaXtumAu+i+kVxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICBjb25zdCBpbnZpdGVyVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoZGF0YSEuY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFUiwgaW52aXRlclRpbWVySWQpO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeW3seaWueS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORyxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkNBTExJTkcsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgaW52aXRlZXNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgbGV0IGJ1c3lVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgIGlmIChidXN5bGluZVVzZXJzKSB7XG4gICAgICBidXN5VXNlcnNTdGF0ZSA9IGJ1c3lsaW5lVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWVzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8g6KKr6YKA6K+36ICF5Lit6ZyA6L+H5ruk5Ye65b+Z56KM55So5oi3XG4gICAgICBpbnZpdGVlc1N0YXRlID0gaW52aXRlZXNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbc2VsZlN0YXRlLCAuLi5pbnZpdGVlc1N0YXRlLCAuLi5idXN5VXNlcnNTdGF0ZSFdLCB0cmFjZUlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBjb2RlLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+3XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKG9wdHM6IElJbnZpdGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlUmVzfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjpgoDor7dcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9Vc2VycyB9ID0gb3B0cztcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmludml0ZUNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICAvLyDljZXlkbzkuK3pgoDor7fmiJDlip/vvIzljbPmm7TmlrAgY2FsbCBzZXNzaW9uIOmAmuivneexu+Wei+S4uue+pOWRvFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDlj5jmm7TkuLrnvqTlkbxcbiAgICAgICAgdGhpcy5fb25DYWxsVHlwZUNoYW5nZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSwgUkNDYWxsUGx1c1R5cGUuTVVMVEksIHRyYWNlSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyDpgJrnn6XooqvpgoDor7fkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIGxldCBpbnZpdGVkVXNlcnNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgbGV0IGJ1c3lsaW5lVXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzKSB7XG4gICAgICAgIGJ1c3lsaW5lVXNlcnNTdGF0ZSA9IGRhdGEhLmJ1c3lsaW5lVXNlcnM/Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbmQoKHVzZXIpID0+IHVzZXIudXNlcklkID09PSBpdGVtLnVzZXJJZCkhO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpbnZpdGVkVXNlcnNTdGF0ZSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeWxpbmVVc2Vyc1N0YXRlIS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFsuLi5pbnZpdGVkVXNlcnNTdGF0ZSwgLi4uYnVzeWxpbmVVc2Vyc1N0YXRlXSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVIYW5ndXBcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbFRpbWVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZm9yRWFjaCgoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqIOmAmuivneivt+axguWPlua2iOOAgemAmuivneaLkue7nVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmhhbmd1cENhbGwoe1xuICAgICAgY2FsbElkOiBvcHRzLmNhbGxJZCxcbiAgICAgIHN5c1N0YXR1czogb3B0cy5zeXN0ZW1TdGF0ZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXmlLbpgoDor7dcbiAgICog6YCa6K+d5Lit5Y+I5pS25Yiw5paw5p2l55S15ZCO77yM5o6l5ZCs5paw5p2l55S15pe277yM5b+F6aG75YWI5oyC5pat5LmL5YmN55qE6YCa6K+d77yIbWFpblNlc3Npb27vvIlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQob3B0czogSUFjY2VwdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjmjqXlkKxcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5hY2NlcHRDYWxsKHsgY2FsbElkOiBvcHRzLmNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HKTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXliqDlhaVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChvcHRzOiBJSm9pbkNhbGxPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5YWI5pS25YiwIG9uSW52aXRl77yM5rKh5pyJ5o6l6YCa6L+HIGpvaW5DYWxsIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuam9pbkNhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgb3B0cy5jYWxsSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g5aaC5p6c5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOS7jiBzZXJ2ZXIg6I635Y+W5b2T5YmN5Yqg5YWl55qEIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihvcHRzLmNhbGxJZCwgdHJ1ZSwgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShvcHRzLmNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtOivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSZXFDaGFuZ2VNZWRpYVR5cGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFLZXlWYWwgPSB7XG4gICAgICBtZWRpYVR5cGU6IG9wdHMubWVkaWFUeXBlLFxuICAgIH07XG4gICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG9wdHMubWVkaWFUeXBlKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gZ2V0VVVJRDIyKCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgdG9Vc2VySWRzOiBvcHRzLnRvVXNlcklkcyxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IERpYWxvZ0FjdGlvbi5SRVFVRVNULFxuICAgICAgZXh0cmFLZXlWYWwsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkYXRhOiB7IHRyYW5zYWN0aW9uSWQgfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+exu+Wei+WPmOabtOivt+axguWTjeW6lFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc3BvbnNlQ2hhbmdlTWVkaWFUeXBlKG9wdHM6IElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxTWVkaWFUeXBlID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0UmVxTWVkaWFUeXBlKCk7XG4gICAgaWYgKG9wdHMuYWdyZWUpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZU1lZGlhVHlwZShyZXFNZWRpYVR5cGUhKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZDogb3B0cy50cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IG9wdHMuYWdyZWUgPyBEaWFsb2dBY3Rpb24uQUNDRVBUIDogRGlhbG9nQWN0aW9uLlJFRlVTRSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmtojpgJror53lqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUob3B0czogSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLkNBTkNFTCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBsb2cg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbExvZ0xpc3Qob3B0czogSUdldENhbGxMb2dMaXN0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN5bmNDYWxsTG9nKHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHN5bmNUaW1lOiBvcHRzLnRpbWVzdGFtcCxcbiAgICAgIGNvdW50OiBvcHRzLmNvdW50LFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IGNhbGxMb2c6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdID0gZGF0YSEuY2FsbExvZ0xpc3QubWFwKChpdGVtKSA9PiB0cmFuMkNhbGxMb2coaXRlbSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGhhc01vcmU6IEJvb2xlYW4oZGF0YT8uaGFzTW9yZSksXG4gICAgICAgIG1heFRpbWU6IGRhdGEhLm1heFRpbWUsXG4gICAgICAgIGxpc3Q6IGNhbGxMb2csXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d5pel5b+XXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbExvZyhjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGVsZXRlQ2FsbFJlY29yZChjdXJyZW50VXNlcklkLCBjYWxsSWRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlLCBkYXRhOiBkYXRhIS5zeW5jVGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOaXtumXtOS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9wZW5DYWxsTGlzdCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXSB9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiByZXNEYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gcmVzRGF0YSEuY2FsbFN0YXRlTGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsaW5nVXNlcklkLCBjYWxsVXNlcklkcywgY2FsbFN0YXR1cywgY3J0VGltZSwgdXNlclNlc3Npb25TdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLCBzdGFydFRpbWUsIHN5bmNUaW1lLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBjb25zdCBjYWxsRGlyZWN0aW9uID0gKGNhbGxpbmdVc2VySWQgPT09IGN1cnJlbnRVc2VySWQpID8gUkNDYWxsRGlyZWN0aW9uLk9VVCA6IFJDQ2FsbERpcmVjdGlvbi5JTjtcbiAgICAgIGNvbnN0IHsgY2xpZW50U3RhcnRUaW1lID0gc3RhcnRUaW1lIH0gPSB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBzdGFydFRpbWUsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgY2FsbERpcmVjdGlvbixcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxVc2VySWRzLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIHVzZXJTdGF0ZTogdXNlclNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogMCxcbiAgICAgICAgZHVyYXRpb246IE1hdGguZmxvb3IoKCtuZXcgRGF0ZSgpIC0gY2xpZW50U3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IDAsXG4gICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IGxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfnmoQgY2FsbCBsb2dcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4cgY2FsbElkIOiOt+WPliBzZXNzaW9uIOivpue7huS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblJlc30+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2Vzc2lvbihvcHRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbGluZ1VzZXJJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFN0YXR1cywgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc3luY1RpbWUsXG4gICAgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VycyA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3RhcnRDYWxsZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHN5bmNUaW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEhvbGRTZXNzaW9uKGNhbGxJZDogc3RyaW5nKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICBjb25zdCBpbm5lclNlc3Npb24gPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIHJldHVybiBpbm5lclNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3kuLsgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldExvY2FsTWFpblNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpblNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24odGhpcy5fbWFpblNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruS4uyBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmmK/mnKznq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XkurrlkZjnirbmgIFcbiAgICogQ2FsbENsaWVudCDkuZ/pnIDopoHmm7TmlrDkurrlkZjnirbmgIHvvIzlrprkuYnkuLrlhazlhbHlh73mlbBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZDogc3RyaW5nLCB1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTywgYHVwZGF0ZVVzZXJzU3RhdGUgLT4gdXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcnMpfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pu05pawIHNlc3Npb24g5Lq65ZGY5YiX6KGoXG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChpdGVtKSA9PiBpdGVtPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcblxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IFtdO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBjb25zdCBuZXdVc2VycyA9IHVzZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRVc2VyU3RhdGUgPSBzZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiB1c2VySWQgPT09IGl0ZW0udXNlcklkKVswXSB8fCB7fTtcbiAgICAgICAgY29uc3QgaXNJZGxlID0gaXRlbS51c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG4gICAgICAgIGNvbnN0IHsgY2FtZXJhRW5hYmxlID0gZmFsc2UsIG1pY3JvcGhvbmVFbmFibGUgPSBmYWxzZSB9ID0gaXNJZGxlID8geyBjYW1lcmFFbmFibGU6IGZhbHNlLCBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSB9IDogb2xkVXNlclN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgY2FtZXJhRW5hYmxlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY2hhbmdlZFVzZXJzLnB1c2goLi4uc2Vzc2lvbi51cGRhdGVVc2VyTGlzdChuZXdVc2VycywgdHJhY2VJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICAgIC8vIOmAmuefpeS6i+S7tlxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMuX29uVXNlclN0YXRlQ2hhbmdlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsIGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFN0YXJpbmdUaW1lKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkurrlkZjns7vnu5/nirbmgIHkuIrmiqVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeXN0ZW1TdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuc3lzU3RhdHVzVXAob3B0cywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG85Lit5pS25Yiw6L+c56uv5rWB5ZCO77yM57uZIENhbGxTZXJ2ZXIg5LiK5oql77yM55So5LqO5aSE55CG6K6h5pe26YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBGaXJzdEZyYW1lVGltZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3Qgbm9OZWVkVXBDb25kaXRpb24gPSAhdGhpcy5fbWFpblNlc3Npb25cbiAgICAgIHx8ICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsVHlwZSgpICE9PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpXG4gICAgICB8fCB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWU7XG4gICAgaWYgKG5vTmVlZFVwQ29uZGl0aW9uKSB7XG4gICAgICAvLyDkuI3lrZggbWFpblNlc3Npb24g5oiWIOmAmui/h+exu+Wei+S4jeS4uuWNleWRvOaXtu+8jOS4jeS4iuaKpe+8jOebtOaOpei/lOWbnuaIkOWKn1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKTtcbiAgICBjb25zdCBzdHJlYW1SZWFkeVRpbWUgPSBNYXRoLmZsb29yKG5vdyArIGRlbGF5VGltZSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfVCwgYG5vdzogJHtub3d9OyBkZWxheTogJHtkZWxheVRpbWV9OyBzdHJlYW1SZWFkeVRpbWU6ICR7c3RyZWFtUmVhZHlUaW1lfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5ldmVudFVwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBldmVudFR5cGU6IENhbGxTZXJ2ZXJFdmVudFR5cGUuRklSU1RfRlJBTUUsXG4gICAgICBldmVudEFyZ3M6IHsgc3RyZWFtUmVhZHlUaW1lIH0sXG4gICAgICBldmVudFRpbWU6IERhdGUubm93KCksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS4iuWxguaooeaLnyBzdGF0dXNEb3duQ2FsbCwg57uT5p2fIHNlc3Npb25cbiAgICog6YCa6K+d5bu656uL5ZCO77yM5Y+q6IO957uT5p2fIG1haW5TZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZW5kQ3VycmVudFNlc3Npb24oY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICBjb25zdCBzZXNzaW9uVXNlcnM6IElDYWxsU2Vzc2lvblVzZXJbXSA9IHRoaXMuX21haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdXNlcklkLCB1c2VyU3RhdGUsIHN5c3RlbVN0YXRlLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IGN1cnJlbnRVc2VyU3lzdGVtU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQsXG4gICAgICAgICAgc3RhdHVzVGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKSxcbiAgICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGE6IElTdGF0dXNEb3duQ29udCA9IHtcbiAgICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgICBjYWxsU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVELFxuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvblVzZXJzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGCIFJUQyDliqDlhaXmiL/pl7TlkI7ph43mlrDlvIDlp4vmoKHml7ZcbiAgICovXG4gIHB1YmxpYyBzdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIucmVzdGFydCh0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWxheVRpbWVJbmZvKCk6IElHZXREZWxheVRpbWVJbmZvUmVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlUaW1lOiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldExvY2FsRGVsYXlUaW1lKCksXG4gICAgICBydHQ6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0UlRUKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob2xkU2Vzc2lvbiDljYfnuqfkuLogbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyB1cGdyYWRlTWFpblNlc3Npb24oaG9sZENhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBob2xkQ2FsbElkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpPy5bMF07XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIElNIOeKtuaAgeWPmOabtOWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25JTVN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICBsZXQgdGltZXJJZDogbnVtYmVyID0gMDtcbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5ESVNDT05ORUNURUQpIHtcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgICAgLy8g5pat572R562J5b6FIDYwcyDlkI7op6blj5Egb25TZXNzaW9uQ2xvc2VcbiAgICAgICAgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0lNX1NUQVRFX0NIQU5HRV9PLCAnZW5kQ3VycmVudFNlc3Npb24sIElNIGRpc2Nvbm5lY3RlZCBmb3IgbW9yZSB0aGFuIDYwcycsIHRyYWNlSWQpO1xuICAgICAgICAgIHRoaXMuZW5kQ3VycmVudFNlc3Npb24oUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUiwgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpISwgdHJhY2VJZCk7XG4gICAgICAgIH0sIENBTExfVElNRV9PVVQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRpbWVySWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIblj5HotbfpgoDor7fjgIHmlLbliLDpgoDor7flkI7orqHml7botoXml7ZcbiAgICog5o+Q5YmN5qih5oufIF9vblN0YXR1c0Rvd24sIOS4jeWGjeS+nei1liBDYWxsU2VydmVyIOS4i+WPkeeahCBfb25TdGF0dXNEb3duXG4gICAqIOWkhOeQhue9kee7nOW8guW4uOaDheWGteS4i+S4iuaKpSBDYWxsU2VydmVyIOWksei0pe+8jENhbGxTZXJ2ZXIg5LiN5Lya5LiL5Y+RIF9vblN0YXR1c0Rvd24g5oOF5Ya1XG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQ6IHN0cmluZywgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgY2FsbCB0aW1lb3V0IGNhbGxJZDogJHtjYWxsSWR9LCB1c2VyU3RhdGU6ICR7dXNlclN0YXRlfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NBTExfVElNRU9VVF9PLCBgaGFuZGxlQ2FsbFRpbWVvdXQgd2l0aG91dCBzZXNzaW9uLCBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgdGhpcy5fb25TdGF0dXNEb3duKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRvRGV2aWNlSWQ6IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSxcbiAgICAgIGNhbGxTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQsXG4gICAgICBkdXJhdGlvbjogMCxcbiAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKHVzZXIpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXRlVGltZSxcbiAgICAgICAgfSA9IHVzZXI7XG5cbiAgICAgICAgbGV0IHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbjtcbiAgICAgICAgbGV0IHNlc3Npb25TdGF0dXM6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlO1xuICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgICAgc3lzU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRCA6IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSO1xuICAgICAgICAgIHNlc3Npb25TdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTk9fQU5TV0VSIDogUkNDYWxsUGx1c1JlYXNvbi5NSVNTRUQ7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUaW1lOiBzdGF0ZVRpbWUgPyBzdGF0ZVRpbWUgKyAxIDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogc2Vzc2lvbi5nZXRDYWxsZXJJZCgpLFxuICAgICAgICAgIHN5c1N0YXR1cyxcbiAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5byA5ZCv6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdGFydFRpbWVyKGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgIGNvbnN0IHRpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlQ2FsbFRpbWVvdXQoY2FsbElkLCB1c2VyU3RhdGUsIHRyYWNlSWQpO1xuICAgICAgLy8g5LiK5oqlIGNhbGwgc2VydmVyIOi2heaXtlxuICAgICAgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXR1c1VwQ2FsbCh7IGNhbGxJZCwgc2Vzc2lvblN0YXR1czogdXNlclN0YXRlIH0sIHRyYWNlSWQpO1xuICAgIH0sIENBTExfVElNRV9PVVQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUQVJUX0NBTExfVElNRVJfTywgYGNhbGxJZDogJHtjYWxsSWR9LCB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRpbWVySWQ7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i6LaF5pe26K6h5pe25ZmoXG4gICAqL1xuICBwcml2YXRlIF9zdG9wVGltZXIodGltZXJJZDogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PLCBgdGltZXJJZDogJHt0aW1lcklkfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDpgJror53pgoDor7dcbiAgICovXG4gIHByaXZhdGUgX29uSW52aXRlKGRhdGE6IElQdWJJbnZpdGVDb24sIGlzRGlyZWN0bHk6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgaW52aXRlVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU2Vzc2lvblVzZXJzLCBzZWNyZXRDaGF0LCBjYWxsaW5nVXNlcklkLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgaWYgKHNlY3JldENoYXQgPT09IFNlY3JldENhbGxUeXBlLlNFQ1JFVCkge1xuICAgICAgLy8g5aaC5p6c5piv5a+G6IGK6YCa6K+d5LiN5aSE55CGXG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLlNFQ1JFVF9DQUxMLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c6Ieq5bex5piv6KKr6YKA6K+355qE55So5oi3XG4gICAgY29uc3QgaXNJbnZpdGVlID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGlzSW52aXRlZSkge1xuICAgICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgICAvLyDnlJ/miJAgY2FsbFNlc3Npb25cbiAgICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5SSU5HSU5HLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBpbnZpdGVVc2VySWQsXG4gICAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgICAgW10sXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICk7XG4gICAgICAvLyBjYWxsIHNlcnZlciDlk43pk4PkuIrmiqVcbiAgICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yaW5naW5nQ2FsbCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcblxuICAgICAgLyoqXG4gICAgICAgKiDlkK/liqjmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAqL1xuICAgICAgY29uc3QgaW52aXRlZVRpbWVySWQgPSB0aGlzLl9zdGFydFRpbWVyKGNhbGxJZCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELCB0cmFjZUlkKTtcbiAgICAgIGlubmVyU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVFLCBpbnZpdGVlVGltZXJJZCk7XG5cbiAgICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBpbm5lclNlc3Npb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDnlJ/miJDlia8gc2Vzc2lvbnNcbiAgICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnB1c2goaW5uZXJTZXNzaW9uKTtcbiAgICAgICAgLy8g5pu05paw5Li7IHNlc3Npb24g54q25oCB5Li6IEhPTERcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOaKm+WHuuW3seaWueiiq+mCgOivt1xuICAgICAgY29uc3QgY2FsbFBsdXNTZXNzaW9uID0gbmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGlubmVyU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsKGNhbGxQbHVzU2Vzc2lvbiwgdHJhY2VJZCk7XG5cbiAgICAgIGNvbnN0IGludml0ZVNvdXJjZSA9IGlzRGlyZWN0bHkgPyBSQ0NhbGxQbHVzSW52aXRlU291cmNlLlBVQl9JTlZJVEVfQ0FMTCA6IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVMTF9LVl9JTlZJVEVfQ0FMTDtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgY2FsbFBsdXNTZXNzaW9uLCBpbnZpdGVTb3VyY2UpO1xuXG4gICAgICBjb25zdCBvdGhlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBjYWxsU2Vzc2lvblVzZXJzLm1hcCgoe1xuICAgICAgICB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cywgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIHN0YXR1c1RpbWUsXG4gICAgICB9KSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIHN0YXRlVGltZTogc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICAvLyDmipvlh7rkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIG90aGVyc1N0YXRlLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfSU5WSVRFRSxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIOi/h+a7pOWHuuWFtuS7lueUqOaIt+WSjOiHquW3sVxuICAgIGNvbnN0IG90aGVySW52aXRlZE1lbWJlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCAmJiBpdGVtLnVzZXJJZCAhPT0gaW52aXRlVXNlcklkICYmIGl0ZW0uc2Vzc2lvblN0YXR1cyA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCk7XG4gICAgLy8g5oqb5Ye6576k6IGK5Lit6KKr6YKA6K+355qE5YW25LuW5Lq6XG4gICAgaWYgKG90aGVySW52aXRlZE1lbWJlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDpgJrnn6UgY2FsbFR5cGUg57G75Z6L5Y+Y5pu0XG4gICAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGludml0ZWRNZW1iZXI6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICAgICAgY29uc3QgdXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIG90aGVySW52aXRlZE1lbWJlci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgICAgIGludml0ZWRNZW1iZXIucHVzaCh7IGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMgfSk7XG4gICAgICAgIHVzZXJzU3RhdGUucHVzaCh7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9vbk90aGVyTWVtYmVySW52aXRlKGludml0ZWRNZW1iZXIpO1xuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgdXNlcnNTdGF0ZSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDmjILmlq3vvIjlr7nmlrnpgJror53lj5bmtojjgIHpgJror53mi5Lnu53vvIlcbiAgICovXG4gIHByaXZhdGUgX29uSGFuZ3VwKGRhdGE6IElIYW5ndXBJbmZvW10sIGNhbGxTZXNzaW9uYVN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSkge1xuICAgICAgICAgIGlmIChpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgICAgICAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOaLkuaOpeOAgeW/meeijOOAgeacquaOpeWQrCDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25BY2NlcHQoZGF0YTogSUFjY2VwdEluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFNlc3Npb25TdGF0ZSgpO1xuICAgIGNvbnN0IHVuTmVlZFVwU3RhdGUgPSBbXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCxcbiAgICBdO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFXG4gICAgICAmJiBzZXNzaW9uU3RhdGUgJiYgdW5OZWVkVXBTdGF0ZS5pbmNsdWRlcyhzZXNzaW9uU3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRDYWxsZXJJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRTdGFydENhbGxlcklkKCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDljZXlkbzmlLbliLDlr7nmlrnmjqXlkKzml7bvvIzpnIDlrozmiJDlj5HluIPotYTmupDkuIDns7vliJfliqjkvZxcbiAgICAgKi9cbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiBzdGFydENhbGxlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICBjb25zdCBhY2NlcHRVc2VySW5mbyA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZyb21Vc2VySWQgIT09IGN1cnJlbnRVc2VySWQpO1xuICAgICAgYWNjZXB0VXNlckluZm8gJiYgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKSEuZ2V0Q2FsbElkKCksIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIFcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cbiAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZXJUaW1lcklkKCksIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25TdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog6YCa6K+d54q25oCB5Li66L+e5o6l54q25oCB5pe277yM5L+d5a2Y5pyN5Yqh5LiL5Y+R55qE6YCa6K+d5byA5aeL5pe26Ze0XG4gICAgICovXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFN0YXR1cywgc3RhcnRUaW1lLCBzeW5jVGltZSwgY2FsbElkLFxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChjYWxsSWQgIT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdID0gdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gfHwge307XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICAgKiDmnaHku7bvvJrpgJror53nirbmgIHkuLogT05DQUxMIOS4lOacquS4iuaKpei/h+mAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZVxuICAgICAgJiYgY2FsbFN0YXR1cyA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmlzUmVjZWl2ZUNhbGxTdGFydFRpbWUgPSB0cnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWUgfSA9IGF3YWl0IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSEsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSEsXG4gICAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOiuoeeul+aYr+WQpumAmuivnee7k+adn1xuICAgIGxldCBzZWxmRW5kID0gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDkuIrmiqXkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBpc0xlZnQgPSBbXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEUsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkRFQ0xJTkVELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUixcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVELFxuICAgICAgXS5pbmNsdWRlcyhpdGVtLnNlc3Npb25TdGF0dXMpO1xuICAgICAgaWYgKGlzTGVmdCAmJiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICBzZWxmRW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBpdGVtLnN5c1N0YXR1cyxcbiAgICAgICAgc3RhdGVUaW1lOiBpdGVtLnN0YXR1c1RpbWUsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNoYW5nZWRVc2VycywgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDmsqHmnIkgc2Vzc2lvbiDkuI3lpITnkIbkvJror53nirbmgIHlj5jmm7RcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uICYmICF0aGlzLl9ob2xkU2Vzc2lvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6K6h566X5Ye65ZON5bqU5Yqo5L2c77yM5bm25oqb5Ye65L+h5oGvXG4gICAgY29uc3Qge1xuICAgICAgaGFuZ3VwRGF0YSwgYWNjZXB0RGF0YSwgb3RoZXJJbnZpdGVkRGF0YSxcbiAgICB9ID0gcGFyc2VTdGF0dXNEYXRhKGRhdGEpO1xuXG4gICAgaGFuZ3VwRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uSGFuZ3VwKGhhbmd1cERhdGEsIGRhdGEuY2FsbFN0YXR1cywgdHJhY2VJZCk7XG4gICAgYWNjZXB0RGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX29uQWNjZXB0KGFjY2VwdERhdGEsIHRyYWNlSWQpO1xuXG4gICAgaWYgKG90aGVySW52aXRlZERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1iZXJJbnZpdGUob3RoZXJJbnZpdGVkRGF0YSk7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5ZyoIGNhbGxTZXNzaW9uIOeKtuaAgeS4uiBFbmRlZCDml7bpgJrnn6Ugb25TZXNzaW9uQ2xvc2VcbiAgICBpZiAoZGF0YS5jYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVEIHx8IHNlbGZFbmQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDlhbbku5bnq6/nmoTnirbmgIHkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgX29uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIGNhbGxTdGF0dXMgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBjYWxsU2Vzc2lvblVzZXJzLmZpbmQoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG5cbiAgICBpZiAoY3VycmVudFVzZXIgJiYgKHRoaXMuX21haW5TZXNzaW9uIHx8IHRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpKSB7XG4gICAgICAvLyDmmK/lt7Hnq6/nirbmgIHlj5jmm7TkuJTlrZjlnKggc2Vzc2lvbiDlho3ljrvpgJrnn6XkurrlkZjnirbmgIHlj5jmm7Tlm57osIPvvIzkuI3lrZjlnKggc2Vzc2lvbiDkuI3pnIDopoHpgJrnn6VcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzdGF0dXNUaW1lIH0gPSBjdXJyZW50VXNlcjtcbiAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IFtSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkddO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlpoLmnpzoh6rlt7HmnKrmjqXlkKzkuLvpgJror53vvIzmlLbliLDlpJrnq68gQ29ubmVjdGluZyDnirbmgIHvvIzpnIDmipvlh7ogc2Vzc2lvbkNsb3NlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpc01haW5TZXNzaW9uID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyU2F0ZSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKT8udXNlclN0YXRlO1xuICAgICAgICBjb25zdCBpc0FjY2VwdE1haW5TZXNzaW9uID0gaXNNYWluU2Vzc2lvbiAmJiBjdXJyZW50VXNlclNhdGUgJiYgc3RhdGVzLmluY2x1ZGVzKGN1cnJlbnRVc2VyU2F0ZSk7XG4gICAgICAgIGlmICghaXNBY2NlcHRNYWluU2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFt7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfQUNDRVBULFxuICAgICAgICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH1dLCB0cmFjZUlkKTtcblxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkNsb3NlKGRhdGEsIHRyYWNlSWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDkuovku7bkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX29uRXZlbnREb3duKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGV2ZW50VGltZSwgZXZlbnRBcmdzLCBldmVudFR5cGUsIGZyb21Vc2VySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gQ2FsbFNlcnZlckV2ZW50VHlwZS5DQUxMX0RVUkFUSU9OICYmIGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICBjb25zdCB7IGZpcnN0RnJhbWVUaW1lIH0gPSBldmVudEFyZ3MgYXMgeyBmaXJzdEZyYW1lVGltZTogbnVtYmVyIH07XG4gICAgICAvLyDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lOiBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgZmlyc3RGcmFtZVRpbWUsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PLCBgY2xpZW50Rmlyc3RGcmFtZVRpbWU6ICR7Y2xpZW50Rmlyc3RGcmFtZVRpbWV9YCwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XljZXlkbwgZHVyYXRpb24g5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZTaW5DYWxsRHVyYXRpb24oY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHsgY2FsbElkLCAuLi57IGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSB9IH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWqkuS9k+WPmOabtOebuOWFs+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Td2l0Y2hNZWRpYVR5cGUoZGF0YTogSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGFjdGlvbiwgZXh0cmFLZXlWYWwsIHRyYW5zYWN0aW9uSWQsIHByb21vdGVySWQsXG4gICAgfSA9IGRhdGE7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUsIHJlYXNvbiB9ID0gZXh0cmFLZXlWYWw7XG5cbiAgICBjb25zdCBjdXJyZW50Q2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpO1xuICAgIGlmIChjYWxsSWQgIT09IGN1cnJlbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYG5vdCBjdXJyZW50IHNlc3Npb24gY2FsbElkOiAke2N1cnJlbnRDYWxsSWR9LCByZWN2Q2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0cmFuc2FjdGlvbklkOiBvbGRUcmFuc0lkLCBhY3Rpb246IG9sZEFjdGlvbiwgbWVkaWFUeXBlOiBPbGRNZWRpYVR5cGUgfSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRPbGREaWFsb2dEYXRhKCkgfHwge307XG4gICAgaWYgKG9sZFRyYW5zSWQgPT09IHRyYW5zYWN0aW9uSWQgJiYgb2xkQWN0aW9uID09PSBhY3Rpb24gJiYgT2xkTWVkaWFUeXBlID09PSBtZWRpYVR5cGUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgJ2R1cGxpY2F0ZSBkaWFsb2cgZGF0YScsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX01FRElBVFlQRV9DSEFOR0VfTywgYGFjdGlvbjogJHthY3Rpb259LCByZWFzb246ICR7cmVhc29ufWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldE9sZERpYWxvZ0RhdGEoeyB0cmFuc2FjdGlvbklkLCBhY3Rpb24sIG1lZGlhVHlwZSB9KTtcblxuICAgIC8vIOWNh+e6p+a1geeoi+WkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5SRVFVRVNUKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5DQU5DRUw6XG4gICAgICAgICAgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkFDQ0VQVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVNZWRpYVR5cGUodGhpcy5fbWFpblNlc3Npb24hLmdldFJlcU1lZGlhVHlwZSgpISk7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uUkVGVVNFOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIERpYWxvZ0FjdGlvbi5USU1FT1VUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuQ0hBTkdFX01FRElBX1RZUEVfVElNRU9VVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdFtjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdF1cbiAgICAgICYmIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgYXMgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgLy8g6ZmN57qn6YCa55+l5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLk5PVElDRSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXJlYXNvbikge1xuICAgICAgdGhpcy5fcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgY2FsbCBsb2cg5pel5b+XXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsRW5kTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYWxsTG9nID0gdHJhbjJDYWxsTG9nKGRhdGEpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsUmVjb3JkKGNhbGxMb2csIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn1xuICAgKi9cbiAgcHVibGljIHNlc3Npb25DbG9zZShkYXRhOiB7IGNhbGxJZDogc3RyaW5nLCB0b0RldmljZUlkOiBzdHJpbmd9LCB0cmFjZUlkOiBzdHJpbmcsIGlzU2VsZkhhbmd1cDogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBkYXRhO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgLy8g5q2j5bi457uT5p2f77yM5riF6Zmk5pys5Zyw5a2Y5YKo55qEIGNhbGxJZFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLnJlbW92ZUFibm9ybWFsQ2FsbElkcyhjdXJyZW50VXNlcklkLCBbY2FsbElkXSk7XG5cbiAgICBsZXQgY2xvc2VkU2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFjbG9zZWRTZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGB1bmV4cGVjdCBzZXNzaW9uIGNhbGxJZCAtPiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08sIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8gc2Vzc2lvbiBjbG9zZSDlkI7nu5PmnZ/miYDmnInotoXml7borqHml7blmahcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICAvLyDnu5PmnZ8g5LiK5oql56ys5LiA5binXG4gICAgICBpZiAoY2xvc2VkU2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5rS+5Y+R6YCa6K+d57uT5p2f77yM5aSE55CG6YCa6K+d57uT5p2f5ZCOIFJUQyDpgIDmiL/pl7TnrYnpgLvovpFcbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoUkNDYWxsRW5naW5lLl9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fLCBjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql6YCa6K+d57uT5p2fXG4gICAgICog5aSa56uv5YW25LuW56uv5oyC5pat6YCa6K+d77yM6ZyA5oqK5pys56uv5Lq65ZGY57O757uf54q25oCB6L2s5YyW5Li6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUFxuICAgICAqL1xuICAgIGNvbnN0IGNydFVzZXJEYXRhID0gY2xvc2VkU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcbiAgICBsZXQgaGFuZ3VwUmVhc29uO1xuICAgIGlmIChpc1NlbGZIYW5ndXAgJiYgZGF0YS50b0RldmljZUlkICE9PSB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCkpIHtcbiAgICAgIGhhbmd1cFJlYXNvbiA9IGNsb3NlZFNlc3Npb24uZ2V0SXNMb2NhbENsaWVudEhhbmd1cCgpID8gY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlIDogUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSEFOR1VQO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbEVuZGVkKG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihjbG9zZWRTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpLCBoYW5ndXBSZWFzb24gfHwgY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOenu+mZpCBzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKGNhbGxJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faG9sZFNlc3Npb25zLmZpbmRJbmRleCgoc2Vzc2lvbikgPT4gc2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgICB0aGlzLl9ob2xkU2Vzc2lvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOaXtu+8jOS7juacjeWKoeerr+iOt+WPluaVsOaNrueUn+aIkCBtYWluU2Vzc2lvbiwg5bm26YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZXNzaW9uQnlTZXJ2ZXIoY2FsbElkOiBzdHJpbmcsIGlzTmVlZFVwOmJvb2xlYW4gPSBmYWxzZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBlcnJjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfSwgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHN0YXJ0Q2FsbGVySWQsXG4gICAgfSA9IGRhdGEhO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBzdGFydENhbGxlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcbiAgICBpZiAoaXNOZWVkVXApIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDkurrlkZjnirbmgIHlj5jmm7TpgJrnn6VcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBjYWxsU2Vzc2lvblVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbzlrrnnp7vliqjnq68gb25QaG9uZSDml6Dms5XmtojpmaTpl67pophcbiAgICogQTEg56e75Yqo56uv5ZKMIEIg5q2j5ZyoIGNhbGwg5Lit77yM5LiUIG9uUGhvbmUg54q25oCB77yMIEExIOadgOi/m+eoi+WQju+8jEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCB5peg5rOV5raI5aSxXG4gICAqIEEyIOWkmuerr+WcqOaOpeWQrOWSjOebtOaOpeWKoOWFpSBjYWxsIOaXtu+8jOS4iuaKpSBvblBob25lRW5kIOeKtuaAge+8jOa2iOmZpCBCIOerr+WxleekuueahCBvblBob25lIOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORV9FTkQsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcblxuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g5Y6fIGNsaWVudCDkuK3lrprkuYnnmoTkuovku7ZcbiAgcHJpdmF0ZSBfb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUgfSA9IHVzZXI7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGUsXG4gICAgICAgIHJlYXNvbjogc3lzdGVtU3RhdGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIOaUtuWIsOiHquW3sSBzeXN0ZW1TdGF0ZSDkuLogOTk577yM55u05o6l56a75byA5oi/6Ze0XG4gICAgICog5aSE55CG6KKr5Y+r5o6l5ZCs55qE556s6Ze077yM5Li75Y+r5ZCM5pe25oyC5pat55qE5oOF5Ya177yM5LiN5o6J56a75byA5oi/6Ze06YCa6K+d5LiN5Lya57uT5p2fXG4gICAgICovXG4gICAgdXNlcnMuZm9yRWFjaCgoeyB1c2VySWQsIHN5c3RlbVN0YXRlIH0pID0+IHtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgJiYgc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQUJOT1JNQUxfRU5EKSB7XG4gICAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtYmVySW52aXRlKGluZm86IElPdGhlck1lbUluZm9bXSkge1xuICAgIGluZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGNvbnN0IGludml0ZXJVc2VySWQgPSB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0SW52aXRlclVzZXJJZCgpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VySW52aXRlZChbdXNlcklkXSwgaW52aXRlclVzZXJJZCEsIGNhbGxJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoaW5mbzogSUNoYW5nZU1lZGlhVHlwZUluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUgfSA9IGluZm87XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QodXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdChpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUpIHtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCBpbmZvLm1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoe1xuICAgICAgLi4uaW5mbyxcbiAgICAgIGNvZGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNhbGxUeXBlQ2hhbmdlKGNhbGxJZDogc3RyaW5nLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlLCBjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSVENSZXNvdXJjZVRhZyB7XG4gIC8qKlxuICAgKiDmma7pgJrpn7Pop4bpopHmtYFcbiAgICovXG4gIE5PUk1BTCA9ICdSb25nQ2xvdWRSVEMnLFxuICAvKipcbiAgICog5bGP5bmV5YiG5Lqr5rWBXG4gICAqL1xuICBTQ1JFRU4gPSAnU2NyZWVuU2hhcmUnXG59XG4iLCJpbXBvcnQge1xuICBQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgUlRDTW9kZSwgQmFzaWNMb2dnZXIsIEV2ZW50RW1pdHRlciwgaXNCb29sZWFuLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ1JUQ1Jvb20sXG4gIFJDUlRDQ2xpZW50LFxuICBSQ1JUQ0NvZGUsXG4gIFJDTG9jYWxUcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIElTdWJzY3JpYmVBdHRyLFxuICBSQ1JlbW90ZVZpZGVvVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ1RyYWNrLFxuICBSQ0xvY2FsVmlkZW9UcmFjayxcbiAgSVB1Ymxpc2hBdHRycyxcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIGhlbHBlcixcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElBdWRpb0NvbmZpZyxcbiAgSUNhbGxQbHVzSW5pdE9wdHMsXG4gIElTdGF0dXNSZXBvcnRMaXN0ZW5lcixcbiAgSVZpZGVvQ29uZmlnLFxuICBSQ0NhbGxQbHVzQ29kZSxcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cyxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUlRDUmVzb3VyY2VUYWcgfSBmcm9tICcuLi9lbnVtcy9SVENSZXNvdXJjZVRhZyc7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBDYWxsSG9va3NUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxLaWNrRXh0cmEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSVENNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IElNZWRpYU11dGVDaGFuZ2VJbmZvLCBJTWVtYmVySW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBnZXRVc2VyVmlkZW9WaWV3SW5mbyB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5cbmludGVyZmFjZSBJSm9pblJUQ1Jvb21SZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIHJvb20/OiBSQ1JUQ1Jvb20gfCB1bmRlZmluZWQ7XG4gIHVzZXJJZHM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElTdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGZhaWxlZExpc3Q/OiAoSVN1YnNjcmliZUF0dHIpW10gfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJUHViUmVzIHtcbiAgY29kZTogUkNSVENDb2RlO1xuICBsaXZlVXJsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbmludGVyZmFjZSBSQ0tpY2tFeHRyYSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJUQ01vZHVsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXByb2Nlc3MtZmFpbGVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXBlZXJjb25uZWN0aW9uLWFibm9ybWFsLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX1NFTEZfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1zZWxmLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLW90aGVyLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX186IHN0cmluZyA9ICdpbm5lci1yZWNlaXZlLWZpcnN0LWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0tJQ0tPRkZfXzogc3RyaW5nID0gJ2lubmVyLWtpY2tvZmYtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXzogc3RyaW5nID0gJ2lubmVyLW9uLWRldmljZS1lbmFibGUtY2hhbmdlJ1xuXG4gIC8qKlxuICAgKiBSQ1JUQyDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiDlt7HmlrnnmoTpn7Pop4bpopEgdHJhY2tzXG4gICAqL1xuICBwcml2YXRlIF9sb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXVxuXG4gIC8qKlxuICAgKiBSQ1JUQ1Jvb20g5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3Jvb206IFJDUlRDUm9vbSB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIHByaXZhdGUgX2NhbGxNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2lzUHViVGlueTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOinhumikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOmfs+mikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOWtmOWCqOiuvue9rueahOS6uuWRmOWSjOinhuWbvlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlclZpZXdNYXA6IHsgW3VzZXJJZDogc3RyaW5nXTogeyB2aWRlb1ZpZXc6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueTogYm9vbGVhbiB9IH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfcmVtb3RlQXVkaW9FbmFibGU6IGJvb2xlYW4gPSB0cnVlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX2luaXRPcHRzPy5ydGNDbGllbnQ7XG4gICAgdGhpcy5faXNQdWJUaW55ID0gX2luaXRPcHRzLmlzUHViVGlueSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmkYTlg4/lpLTotYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6KeG6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdFZpZGVvVHJhY2sgJiYgIXRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bpuqblhYvpo47otYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6Z+z6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0QXVkaW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRBdWRpb1RyYWNrICYmICF0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRBdWRpb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7pgJror53nsbvlnovliJvlu7rpn7PjgIHop4bpopHotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpn7PpopHmiJbpn7Pop4bpopFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fY2FsbE1lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgc2V0VmlkZW9Db25maWcodmlkZW9Db25maWc6IElWaWRlb0NvbmZpZykge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0gdmlkZW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgc2V0QXVkaW9Db25maWcoYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZykge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0gYXVkaW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9ULCBgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghaXNCb29sZWFuKGVuYWJsZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgYHBhcmFtIGVycm9yLCBlbmFibGU6IHR5cGUgaXMgYm9vbGVhbiwgdmFsdWU6ICR7ZW5hYmxlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IGVuYWJsZTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGlvVHJhY2tzID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2tzKCkuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIGF1ZGlvVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlKSB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3lUcmFjayh0cmFjazogUkNMb2NhbFRyYWNrKSB7XG4gICAgdHJhY2suZGVzdHJveSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9jYWxUcmFja3MuZmluZEluZGV4KChsb2NhbFRyYWNrKSA9PiBsb2NhbFRyYWNrLmdldFRyYWNrSWQoKSA9PT0gdHJhY2suZ2V0VHJhY2tJZCgpKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlc3Npb24g6L+e5o6lXG4gICAqL1xuICBhc3luYyBzZXNzaW9uQ29ubmVjdGVkKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgLy8gMS4g5Yqg5oi/6Ze0XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHJvb20gfSA9IGF3YWl0IHRoaXMuam9pblJUQ1Jvb20oY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBlcnJDb2RlIC0+ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rOo5YaMIFJUQyDnm7jlhbPnm5HlkKxcbiAgICAgICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgICAgICB0aGlzLl9yZWdSVENMaXN0ZW5lcnMoKTtcblxuICAgICAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgICAgIGNvbnN0IHJvb21Vc2Vyc0lkID0gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVXNlcklkcygpIHx8IFtdO1xuICAgICAgICBpZiAocm9vbVVzZXJzSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQocm9vbVVzZXJzSWQubWFwKCh1c2VySWQpID0+ICh7IGNhbGxJZCwgdXNlcklkIH0pKSwgdHJhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY2FsbElkIC0+ICR7Y2FsbElkfSwgZXJyIG1zZyAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlj5HluIPmtYFcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25CZWZvcmVQdWJsaXNoKTtcbiAgICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55XG4gICAgICAgICAgPyB0aGlzLl9sb2NhbFRyYWNrcy5tYXAoKHRyYWNrKSA9PiAodHJhY2suaXNWaWRlb1RyYWNrKCkgPyB7IHRyYWNrLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrKSlcbiAgICAgICAgICA6IHRoaXMuX2xvY2FsVHJhY2tzO1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMucHVibGlzaChwdWJQYXJhbXMsIHRyYWNlSWQpO1xuICAgICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ymxpc2hSZXMsIGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1AsICdzZXNzaW9uQ29ubmVjdGVkIGxvY2FsIHRyYWNrcyBpcyBlbXB0eScsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBwdWJsaXNoIEV4Y2VwdGlvbiBjYWxsSWQgLT4gJHtjYWxsSWR9LCBlcnIgbXNnIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgc2Vzc2lvbkNsb3NlKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog6ZSA5q+B5pys56uv6LWE5rqQXG4gICAgICovXG4gICAgdGhpcy5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgY3VycmVudFJvb21JZCA9IHRoaXMuX3Jvb20/LmdldFJvb21JZCgpO1xuICAgIGlmICh0aGlzLl9yb29tICYmIGNhbGxJZCA9PT0gY3VycmVudFJvb21JZCkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDms6jplIDlhoXlrZjmlbDmja5cbiAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgYGxlYXZlUm9vbSBmYWlsZWQsIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHN1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCAnbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbjogbm90IGluIHJvb20nLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FNRVJBX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqIDEuIOWQr+eUqOWJjeW6lOeUqOWxgumcgOWFiOWIm+W7uuinhumikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlfT4ge1xuICAgIC8vIOiOt+WPluacrOerr+inhumikSB0cmFja1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5aaC5p6c6LWE5rqQ5rKh6KKr56aB55So77yM6L+U5Zue5oiQ5YqfXG4gICAgICovXG4gICAgaWYgKCF0cmFjayEuaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3liIfmjaLop4bpopHorr7lpIdcbiAgICovXG4gIGFzeW5jIGNoYW5nZVZpZGVvRGV2aWNlKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoTovahcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgLy8g5pW055CG5ZCO55qE6L2oXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICBsZXQgbmVlZERlc3Ryb3lUcmFjazogUkNMb2NhbFRyYWNrO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzICYmIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g6LWE5rqQ6YeK5pS+XG4gICAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICAgICAgbmVlZERlc3Ryb3lUcmFjayA9IHRyYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDku47mnKzlnLDnvJPlrZjkuK3liKDpmaTplIDmr4HnmoQgdHJhY2tcbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigoaXRlbSkgPT4gbmVlZERlc3Ryb3lUcmFjayAmJiAoaXRlbS5nZXRUcmFja0lkKCkgIT09IG5lZWREZXN0cm95VHJhY2suZ2V0VHJhY2tJZCgpKSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g57uZ5pys5Zyw5Yqg5LiK5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOmAmuefpeS4iuWxgiB0cmFja1JlYWR5XG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkocmVjZW50VHJhY2tzLCB0cmFjZUlkKTtcblxuICAgIC8vIOW3suWKoOWFpeaIv+mXtFxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBkaXNhYmxlQXVkaW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIHwgUkNSVENDb2RlLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUlDUk9QSE9ORV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2subXV0ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovljYfjgIHpmY1cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QsIGBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgIC8qKlxuICAgICAqIOWNh+e6pyDpn7PpopEgLT4g6Z+z6KeG6aKRXG4gICAgICogMS4g5Lia5Yqh5bGC6ZyA6KaB5YWI6YCa6L+HIGNyZWF0ZUxvY2FsVHJhY2tzIOWIm+W7uuacrOWcsOinhumikSB0cmFja1xuICAgICAqIDIuIFNESyDlj6rlpITnkIblj5HluIPop4bpopEgdHJhY2tcbiAgICAgKi9cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICAvLyAxLiDojrflj5bnvJPlrZjkuK3nmoTop4bpopEgdHJhY2tcbiAgICAgIGxldCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2s6IG5ld1RyYWNrIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgY3JlYXRlIHZpZGVvIHRyYWNrIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2sgPSBuZXdUcmFjaztcbiAgICAgICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAgICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcbiAgICAgIH1cbiAgICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogdHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrITtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKFtwdWJQYXJhbXNdLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgcHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmY3nuqcg6Z+z6KeG6aKRIC0+IOmfs+mikVxuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIC8vIDEuIOiOt+WPluacrOWcsOinhumikSB0cmFja1xuICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuXG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbSEudW5wdWJsaXNoKFt0cmFja10pO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHVucHVibGlzaCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDph4rmlL7op4bpopEgdHJhY2tcbiAgICAgICAgdGhpcy5kZXN0cm95VHJhY2sodHJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWKoOWFpSBSVEMg5oi/6Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pblJUQ1Jvb20oY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHJvb20/OiBSQ1JUQ1Jvb20sIHRyYWNrcz86IFJDUmVtb3RlVHJhY2tbXSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9ULCBgY2FsbDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlLCByb29tLCB0cmFja3MgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SUpvaW5SVENSb29tUmVzPih7XG4gICAgICBhc3luY0ZuOiB0aGlzLl9ydGNDbGllbnQuam9pblJUQ1Jvb20uYmluZCh0aGlzLl9ydGNDbGllbnQpLFxuICAgICAgZm5BcmdzOiBbY2FsbElkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIFJUQ01vZGUuQ0FMTF0sXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfSk9JTl9SVENfUk9PTV9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLkpPSU5fUk9PTV9FUlIsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgdGhpcy5fb25TZWxmSm9pbmVkKHsgY2FsbElkLCB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgfSwgdHJhY2VJZCk7XG4gICAgdHJhY2tzPy5sZW5ndGggJiYgdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzKTtcblxuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCByb29tLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3Vic2NyaWJlVHJhY2tzKHRyYWNrczogKElTdWJzY3JpYmVBdHRyKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcGFyYW1zOiB0cmFja3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2ssIHN1YlRpbnkgfSA9IGl0ZW07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhY2tJZDogdHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIHN1YlRpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVN1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEuc3Vic2NyaWJlLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzLCBjb2RlKTtcblxuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uU1VCU0NSSUJFX0VSUiwgdHJhY2VJZCk7XG5cbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg5Y+W5raI6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5zdWJzY3JpYmVUcmFja3ModHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20hLnVuc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVsZWFzZVN0b3JlZERhdGEoKSB7XG4gICAgdGhpcy5fcm9vbSA9IG51bGw7XG4gICAgdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgPSB0cnVlO1xuICAgIHRoaXMuX3VzZXJWaWV3TWFwID0ge307XG4gIH1cblxuICBnZXRSZW1vdGVUcmFja3MoKTogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119IHtcbiAgICBjb25zdCB0cmFja3M6IHsgW3VzZXJJZDogc3RyaW5nXTogUkNSZW1vdGVUcmFja1tdfSA9IHt9O1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHRyYWNrcztcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySWRzID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVVc2VySWRzKCk7XG4gICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQ6IHN0cmluZykgPT4ge1xuICAgICAgdHJhY2tzW3VzZXJJZF0gPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCh1c2VySWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFja3M7XG4gIH1cblxuICBnZXRSZW1vdGVUcmFjayh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20/LmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCkuZmluZCgodHJhY2spID0+ICgobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSA/IHRyYWNrLmlzQXVkaW9UcmFjaygpIDogdHJhY2suaXNWaWRlb1RyYWNrKCkpKTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIFJUQyDkuovku7bnm5HlkKzms6jlhoxcbiAgICovXG4gIHByaXZhdGUgX3JlZ1JUQ0xpc3RlbmVycygpIHtcbiAgICAvLyDms6jlhozmiL/pl7Tkuovku7bnm5HlkKxcbiAgICB0aGlzLl9yb29tIS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKHtcbiAgICAgIC8qKlxuICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgKiBAZGVzY3JpcHRpb24g6KKr6Lii5Ye65oi/6Ze05Y+v6IO95piv55Sx5LqO5pyN5Yqh56uv6LaF5Ye65LiA5a6a5pe26Ze05pyq6IO95pS25YiwIHJ0Y1Bpbmcg5raI5oGv77yM5omA5Lul6K6k5Li65bex5pa556a757q/44CCXG4gICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICog5b2T5YC85Li6IGZhbHNlIOaXtu+8jOivtOaYjuacrOerryBydGNQaW5nIOi2heaXtlxuICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgKi9cbiAgICAgIG9uS2lja09mZjogKGJ5U2VydmVyOiBib29sZWFuLCBzdGF0ZT86IFJDS2lja1JlYXNvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLl9vbktpY2tPZmYoYnlTZXJ2ZXIsIHRoaXMuX3Jvb20hLmdldFJvb21JZCgpLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VTdG9yZWREYXRhKCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi35Yqg5YWlXG4gICAgICBvblVzZXJKb2luOiAodXNlcklkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBjb25zdCBpbmZvID0gdXNlcklkLm1hcCgoaWQpID0+ICh7IGNhbGxJZDogdGhpcy5fY2FsbElkLCB1c2VySWQ6IGlkIH0pKTtcbiAgICAgICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQoaW5mbywgdHJhY2VJZCk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv55So5oi356a75byAXG4gICAgICBvblVzZXJMZWF2ZTogKHVzZXJJZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPkeW4g1xuICAgICAgb25UcmFja1B1Ymxpc2g6IHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoLmJpbmQodGhpcyksXG4gICAgICAvLyDov5znq6/otYTmupDlj5bmtojlj5HluINcbiAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6IHRoaXMuX29uVHJhY2tVbnB1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWHhuWkh+Wwsee7qlxuICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25SZW1vdGVUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOinhumikVxuICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25WaWRlb011dGVDaGFnbmUoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IHZpZGVvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogdmlkZW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIOWPkeW4g+iAheemgeeUqOOAgeWQr+eUqOmfs+mikVxuICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgdGhpcy5fb25BdWRpb011dGVDaGFuZ2Uoe1xuICAgICAgICAgIGZyb21Vc2VySWQ6IGF1ZGlvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uOiB0aGlzLl9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbi5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOi0qOmHj+aVsOaNruaKpeWRiuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgb25TdGF0ZVJlcG9ydDogdGhpcy5fb25SVENTdGF0ZVJlcG9ydC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIC8vIOazqOWGjOmfs+mHj+S4iuaKpeS6i+S7tlxuICAgIHRoaXMuX3Jvb20hLm9uQXVkaW9MZXZlbENoYW5nZSgoYXVkaW9MZXZlbFJlcG9ydExpc3QpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTG9jYWxUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlbW90ZVRyYWNrUmVhZHkodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3MpO1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX18pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LaWNrT2ZmKGJ5U2VydmVyOiBib29sZWFuLCByb29tSWQ6IHN0cmluZywgc3RhdGU/OiBSQ0tpY2tSZWFzb24sIGtpY2tFeHRyYT86IFJDQ2FsbEtpY2tFeHRyYSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTywgYHJvb25JZDogJHtyb29tSWR9LCBieVNlcnZlcjogJHtieVNlcnZlcn0sIHN0YXRlOiAke3N0YXRlfSwga2lja0V4dHJhOiAke0pTT04uc3RyaW5naWZ5KGtpY2tFeHRyYSl9YCk7XG4gICAgbGV0IHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICBpZiAoYnlTZXJ2ZXIpIHtcbiAgICAgIGlmIChraWNrRXh0cmEpIHtcbiAgICAgICAgc3lzdGVtU3RhdGUgPSBraWNrRXh0cmEua2lja1JlYXNvbkNvZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uS0lDS0VEX0JZX1NFUlZFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0tJQ0s6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0RJU0NPTk5FQ1RFRDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLklNX0xPR09VVDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5MT0dPVVQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5PVEhFUl9DTElFTlRfSU1fQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9MT0dJTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgc3lzdGVtU3RhdGUsIHJvb21JZCk7XG4gIH1cblxuICAvKipcbiAgICogUlRDIFBlZXIg5byC5bi45YWz6ZetXG4gICAqIOenu+WKqOerr+acquWkhOeQhuatpOWbnuiwg++8jOWumuS5iSBzeXNTdGF0dXMg5Li6IENPTk5FQ1RJT05fRVJSXG4gICAqL1xuICBwcml2YXRlIF9vblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbigpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PLCAnJywgdHJhY2VJZCk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uU2VsZkpvaW5lZChpbmZvOiBJTWVtYmVySW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX1NFTEZfSk9JTkVEX18sIGluZm8uY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1BVQkxJU0hfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmfs+mikeaXtu+8jOebtOaOpeiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF0/LnZpZGVvVmlldykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgeyBpc1RpbnkgfSA9IHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgICAgIG5lZWRTdWJUcmFja3MucHVzaCh7IHRyYWNrLCBzdWJUaW55OiBpc1RpbnkgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9vblRyYWNrVW5wdWJsaXNoKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX1VOUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlVHJhY2tzKHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkF1ZGlvTXV0ZUNoYW5nZShpbmZvOiBJTWVkaWFNdXRlQ2hhbmdlSW5mbykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfRU5BQkxFX0NIQU5HRV9PLCBKU09OLnN0cmluZ2lmeSh7IGluZm8gfSksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2soaW5mby50cmFja0lkKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVmlkZW9NdXRlQ2hhZ25lKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrISk7XG4gIH1cblxuICBwcml2YXRlIF9vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpIHtcbiAgICBjb25zdCB7IHNlbmRlcnMsIHJlY2VpdmVycyB9ID0gcmVwb3J0O1xuICAgIHNlbmRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyBraW5kLCBwYWNrZXRzTG9zdFJhdGUsIHJ0dCB9ID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLl9jYWxsTWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPICYmIGtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25TZW5kUGFja2V0TG9zcyhwYWNrZXRzTG9zdFJhdGUgfHwgMCwgcnR0IHx8IDApO1xuICAgIH0pO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHRyYWNrSWQsIGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgYml0cmF0ZSxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gaGVscGVyLnBhcnNlVHJhY2tJZCh0cmFja0lkKTtcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgW3VzZXJJZDogc3RyaW5nXTogUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cztcbiAgICAgIH0gPSB7fTtcbiAgICAgIGRhdGFbdXNlcklkXSA9IHtcbiAgICAgICAgcGFja2V0TG9zdFJhdGU6IHBhY2tldHNMb3N0UmF0ZSEsXG4gICAgICAgIGJpdFJhdGU6IGJpdHJhdGUsXG4gICAgICB9O1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0dXNSZXBvcnRMaXN0ZW5lcj8ub25SZWNlaXZlUGFja2V0TG9zcyhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogUlRDIOaOpeaUtuacgOe7iOWksei0peWQjumcgOimgeiwg+eUqCBoYW5ndXAg5oyC5pat55qE5oOF5Ya1XG4gKi9cbiAgcHJpdmF0ZSBfb25SVENNZXRob2RGYWlsKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHN5c3RlbVN0YXRlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1Kb2luZWQoaW5mbzogSU1lbWJlckluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX09USEVSX0pPSU5FRF9fLCBpbmZvLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDpn7PpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlQXVkaW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbEF1ZGlvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc0F1ZGlvVHJhY2soKSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX2F1ZGlvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fYXVkaW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDop4bpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFZpZGVvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc1ZpZGVvVHJhY2soKSAmJiAhaXRlbS5pc0Rlc3Ryb3llZCgpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICAvLyDmnKzmrKHnvJPlrZhcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgLy8g6YCa55+l5LiK5bGCXG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6KeG6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxWaWRlb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsVmlkZW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsVmlkZW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxBdWRpb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsQXVkaW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsQXVkaW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaCh0cmFja3M6IChSQ0xvY2FsVHJhY2sgfCBJUHVibGlzaEF0dHJzKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfVCwgYHRyYWNrc0lkczogJHt0cmFja3MubWFwKChpdGVtKSA9PiAoKGl0ZW0gaW5zdGFuY2VvZiBSQ0xvY2FsVHJhY2spID8gaXRlbS5nZXRUcmFja0lkKCkgOiBpdGVtLnRyYWNrLmdldFRyYWNrSWQoKSkpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElQdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20hLnB1Ymxpc2guYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLlBVQkxJU0hfRVJSLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoVmlkZW9UcmFjaygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IGRlZmF1bHRWaWRlb1RyYWNrITtcbiAgICByZXR1cm4gdGhpcy5fcm9vbSEucHVibGlzaChbcHViUGFyYW1zXSk7XG4gIH1cblxuICBzZXRWaWRlb1ZpZXcobGlzdDoge3VzZXJJZDogc3RyaW5nLCB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueT86IGJvb2xlYW59W10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQsIGlzVGlueSA9IGZhbHNlIH0gPSBpdGVtO1xuICAgICAgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXSA9IHtcbiAgICAgICAgdmlkZW9WaWV3OiB2aWRlb0VsZW1lbnQsXG4gICAgICAgIGlzVGlueSxcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIOiuvue9ruacrOerr+inhuWbvuaXtu+8jOWPquWtmOWCqOaVsOaNru+8jOaXoOmcgOiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICog6K6+572u6L+c56uv6KeG5Zu+5pe277yM5aaC5p6c5bey57uP5Yqg5YWl5oi/6Ze077yM5YiZ6I635Y+W6L+c56uv6LWE5rqQ55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW1vdGVUcmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpO1xuICAgICAgY29uc3Qgc3ViUGFyYW1zID0gKHJlbW90ZVRyYWNrcyFbdXNlcklkXSB8fCBbXSkubWFwKCh0cmFjaykgPT4gKHtcbiAgICAgICAgdHJhY2ssXG4gICAgICAgIHN1YlRpbnk6IGlzVGlueSxcbiAgICAgIH0pKS5maWx0ZXIoKHsgdHJhY2sgfSkgPT4gIXRyYWNrLmlzU3Vic2NyaWJlZCgpKTtcbiAgICAgIG5lZWRTdWJUcmFja3MucHVzaCguLi5zdWJQYXJhbXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIG5lZWRTdWJUcmFja0lkczogbmVlZFN1YlRyYWNrcy5tYXAoKHsgdHJhY2sgfSkgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICAgIH0sXG4gICAgKSwgdHJhY2VJZCk7XG5cbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTop4blm77ml7bvvIzlj5bmtojorqLpmIXotYTmupBcbiAgICovXG4gIHJlbW92ZVZpZGVvVmlldyh1c2VySWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdW5zdWJUcmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IFtdO1xuICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKClbdXNlcklkXTtcbiAgICAgIGlmICh0cmFja3MgJiYgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB2aWRlb1RyYWNrID0gdHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICAgICAgdmlkZW9UcmFjay5sZW5ndGggJiYgdW5zdWJUcmFja3MucHVzaCh2aWRlb1RyYWNrWzBdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTywgSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHVzZXJWaWV3TWFwOiBnZXRVc2VyVmlkZW9WaWV3SW5mbyh0aGlzLl91c2VyVmlld01hcCksXG4gICAgICAgIHVuc3ViVHJhY2tzOiB1bnN1YlRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIGlmICh1bnN1YlRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmFja3ModW5zdWJUcmFja3MsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blrZjlgqjnmoTkurrlkZjlkowgdmlkZW8g5YWD57Sg5pWw5o2uXG4gICAqL1xuICBnZXRVc2VyVmlld01hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclZpZXdNYXA7XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+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+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4jeaSreaUvuiHquW3seeahOWjsOmfs1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgdXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3kuJrliqHlsYLmmK/lkKborr7nva7ov4flvZPliY3kurrlkZjnmoTop4bpopHop4blm75cbiAgICAgKi9cbiAgICBjb25zdCB7IHZpZGVvVmlldyB9ID0gdGhpcy5fcnRjTW9kdWxlLmdldFVzZXJWaWV3TWFwKClbdXNlcklkXSB8fCB7fTtcbiAgICBpZiAobWVkaWFUeXBlICE9PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICF2aWRlb1ZpZXcpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuVklERU9fVklFV19OT1RfU0VUfSwgdmlkZW8gdmlldyBub3Qgc2V0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnBsYXlNZWRpYSh1c2VySWQsIG1lZGlhVHlwZSwgdmlkZW9WaWV3LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNWaWRlb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6KeG6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u5pGE5YOP5aS06K6+5aSHIGlk44CB5bin546H44CB5YiG6L6o546H562J77yMXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0VmlkZW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVWaWRlb0NvbmZpZ0J1aWxkZXIoKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNWaWRlb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7op4bpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC5YiH5o2i5pGE5YOP5aS044CB6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRWaWRlb0NvbmZpZyhjZmc6IElWaWRlb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGZyYW1lUmF0ZSwgcmVzb2x1dGlvbiwgbWF4Qml0cmF0ZSwgbWluQml0cmF0ZSxcbiAgICB9ID0gY2ZnO1xuXG4gICAgaWYgKCFSQ0NhbGxQbHVzRnJhbWVSYXRlW2ZyYW1lUmF0ZV0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBmcmFtZVJhdGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7ZnJhbWVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNSZXNvbHV0aW9uW3Jlc29sdXRpb25dKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsIGBwYXJhbSBlcnJvciwgcmVzb2x1dGlvbiBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtyZXNvbHV0aW9ufWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rpn7PpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNBdWRpb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6Z+z6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u6bqm5YWL6aOO6K6+5aSHIGlkXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0QXVkaW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVBdWRpb0NvbmZpZ0J1aWxkZXIoKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNBdWRpb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pn7PpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRBdWRpb0NvbmZpZyhjZmc6IElBdWRpb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcbiAgICBjb25zdCB7IHNhbXBsZVJhdGUsIG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IGNmZztcbiAgICBpZiAoc2FtcGxlUmF0ZSAmJiAhaXNOdW1iZXIoc2FtcGxlUmF0ZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBzYW1wbGVSYXRlOiB0eXBlIGlzIG51bWJlciwgdmFsdWU6ICR7c2FtcGxlUmF0ZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBlcnJvck1zZyB9ID0gdmFsaWRhdGVCaXRyYXRlKG1pbkJpdHJhdGUsIG1heEJpdHJhdGUpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1IsIGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgJ3N1Y2Nlc3MnKTtcblxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0QXVkaW9Db25maWcodGhpcy5fYXVkaW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr5Y+r5Lq65ZGYIHVzZXJJZCDliJfooajvvIzljZXkurrlkbzlj6vku4XpnIDlnKjmlbDnu4TkuK3mlL7nva7lr7nmlrnkuIDkurrnmoQgdXNlcklkXG4gICAqIEBwYXJhbSB0eXBlIOWNleS6uuWRvOWPqyBvciDlpJrkurrlkbzlj6tcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpgJror53lqpLkvZPnsbvlnos6IOmfs+mikSBvciDpn7Pop4bpopFcbiAgICogQHJldHVybnMgY2FsbElkIOWRvOWPq+aIkOWKn+WQju+8jOS6p+eUn+eahOS8muivnSBpZFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYWxsKHVzZXJJZHM6IHN0cmluZ1tdLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUgPSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSA9IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBjYWxsSWQ/OiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IGdldFVVSUQoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfVCwgYHVzZXJJZHM6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBjYWxsVHlwZTogJHtjYWxsVHlwZX0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNUeXBlW2NhbGxUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke2NhbGxUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V6IGKIHVzZXJJZHMg6ZW/5bqm5LiN6IO96LaF6L+HIDFcbiAgICAgKi9cbiAgICBpZiAodXNlcklkcy5sZW5ndGggPiAxICYmIGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIFlvdSBjYW4gb25seSBjYWxsIG9uZSBwZXJzb24gaW4gYSBzaW5nbGUgY2FsbCwgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5bey5a2Y5ZyoIHNlc3Npb24g5LiN5YWB6K645YaN5Y+R6LW35ZG85Y+rXG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1R9LCBzZXNzaW9uIGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnN0YXJ0Q2FsbCh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoeyB1c2VySWQgfSkpLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1NUQVJUX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBudWxsLCB0aGlzLl9jbGllbnRDYWxsSWQsIG51bGwsIHsgbWVkaWFUeXBlLCBjYWxsVHlwZSwgY2FsbElkOiBkYXRhPy5jYWxsSWQgfHwgJycgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWRvOWPq+i/h+eoi+S4reaMguaWrVxuICAgICAqL1xuICAgIGNvbnN0IHsgY2FsbElkLCBjbGllbnRDYWxsSWQgfSA9IGRhdGEhO1xuICAgIGlmICh0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID09PSBjbGllbnRDYWxsSWQpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5oYW5ndXAoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHRoZSAke2NhbGxJZH0gY2FsbCBoYXMgYmVlbiBoYW5ndXBgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLk1VTFRJKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBKU09OLnN0cmluZ2lmeSh7IGRhdGEsIGNvZGUgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGNhbGxJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpei/m+ihjOS4reeahOe+pOe7hOmAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOmAmuivnSBpZFxuICAgKi9cbiAgYXN5bmMgam9pbk11bHRpQ2FsbChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGU6IGdldFNlc3Npb25Db2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTZXNzaW9uKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChnZXRTZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBnZXQgY2FsbCBkYXRhIGVycm9yLCBjb2RlOiAke2dldFNlc3Npb25Db2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gZGF0YSE7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbiAmJiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSAhPT0gY2FsbElkKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuam9pbkNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4remCgOivt+S7luS6ulxuICAgKiDljZXkurrpgJror53kuK3pgoDor7fku5bkurrkvJrlvJXlj5HpgJror53nsbvlnovlj5jmm7RcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65YiX6KGoXG4gICAqIEByZXR1cm5zIGJ1c3lVc2VycyDov5Tlm57lv5nnur/kurrlkZjliJfooahcbiAgICovXG4gIGFzeW5jIGludml0ZSh1c2VySWRzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGJ1c3lVc2Vycz86IFJDQ2FsbFBsdXNDYWxsVXNlcltdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9ULCBgY2FsbElkOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+mCgOivt1xuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5pbnZpdGUoe1xuICAgICAgdG9Vc2VyczogdXNlcklkcy5tYXAoKHVzZXJJZCkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgfSkpLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidXN5VXNlcnMgPSBbXTtcbiAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycz8ubGVuZ3RoKSB7XG4gICAgICBidXN5VXNlcnMucHVzaCguLi5kYXRhIS5idXN5bGluZVVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZCxcbiAgICAgICAgc3RhdGU6IHVzZXIuc2Vzc2lvblN0YXR1cyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHN1Y2Nlc3MgYnVzeVVzZXJzOiAke0pTT04uc3RyaW5naWZ5KGJ1c3lVc2Vycyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBidXN5VXNlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGFjY2VwdChjYWxsSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q29ubmVjdGlvblN0YXR1cygpICE9PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKblrZjlnKjpgJror51cbiAgICAgKiDpnIDku47lvZPliY3pgJror53ojrflj5YgbWVpZGFUeXBlXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKTtcbiAgICBpZiAoIW1haW5TZXNzaW9uICYmICFob2xkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWMuuWIhuaOpeWQrCBtYWluU2Vzc2lvbiDlkowgaG9sZFNlc3Npb25cbiAgICAgKiDlpoLmnpzmjqXlkKwgaG9sZFNlc3Npb27vvIzpnIDlhYjmjILmlq0gbWFpblNlc3Npb25cbiAgICAgKi9cbiAgICBjb25zdCBpc0FjY2VwdEhvbGRTZXNzaW9uID0gY2FsbElkID09PSBob2xkU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGlzQWNjZXB0SG9sZFNlc3Npb24pIHtcbiAgICAgIGNvbnN0IHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH0gPSBhd2FpdCB0aGlzLmhhbmd1cChtYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpO1xuICAgICAgaWYgKGhhbmd1cE1haW5TZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGhhbmd1cCBtYWluU2Vzc2lvbiBlcnJvciBjb2RlOiAke2hhbmd1cE1haW5TZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZ3JhZGVNYWluU2Vzc2lvbihjYWxsSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IG1haW5TZXNzaW9uIS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+aOpeWQrFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5hY2NlcHQoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQ0NFUFRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG1haW5TZXNzaW9uISk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19pbm5lckhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKHRydWUpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cChvcHRzLCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlID09PSBDYWxsU2VydmVyRXJyb3JDb2RlLkNBTExfTk9UX0VYSVNUKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY2FsbElkID09PSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg5Li65Y+v6YCJ5Y+C5pWw77yM5LiN5Lyg5pe277yM5oyC5pat5q2j5Zyo6L+b6KGM55qE5Li7IHNlc3Npb27vvIzkvKDlhaXml7blj6/mjIflrprmjILmlq3kuLvpgJror53miJbmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror51cbiAgICog5pqC5pyq5bu656uL6L+e5o6l55qE6YCa6K+d77ya5oyH5bey5Zyo6YCa6K+d5Lit5pe277yM5pS25Yiw5ZG85Y+r5L2G5pqC5pyq5o6l5ZCs55qE6YCa6K+dXG4gICAqL1xuICBhc3luYyBoYW5ndXAoY2FsbElkPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmICghbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw57G75Z6L5qCh6aqMXG4gICAgICovXG4gICAgaWYgKGNhbGxJZCAmJiAhaXNTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5TZXNzaW9uQ2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDmoKHpqozkvKDlhaXnmoQgY2FsbElkIOaYr+WQpuato+ehrlxuICAgICAqL1xuICAgIGlmIChjYWxsSWQgJiYgY2FsbElkICE9PSBtYWluU2Vzc2lvbkNhbGxJZCAmJiAhdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbihjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZCBpcyBpbnZhbGlkLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQUxMX0lEX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IHRydWU7XG5cbiAgICB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkID0gY2FsbElkIHx8IG1haW5TZXNzaW9uQ2FsbElkO1xuICAgIGNvbnN0IGhvbGRTZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRIb2xkU2Vzc2lvbih0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkKTtcbiAgICBjb25zdCBoYW5ndXBTZXNzaW9uID0gaG9sZFNlc3Npb24gfHwgbWFpblNlc3Npb247XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmjILmlq3ml7bnmoTkurrlkZjns7vnu5/nirbmgIFcbiAgICAgKi9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSBtYWluU2Vzc2lvbi5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlckluZm8pID0+IHVzZXJJbmZvLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZClbMF0uc3RhdGU7XG4gICAgY29uc3QgaXNDYWxsZWUgPSBbbWFpblNlc3Npb24uZ2V0Q3JlYXRvclVzZXJJZCgpLCBtYWluU2Vzc2lvbi5nZXRJbnZpdGVyVXNlcklkKCldLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGNvbnN0IHN5c3RlbVN0YXRlID0gZ2V0SGFuZ3VwU3lzdGVtU3RhdGUodXNlclN0YXRlLCBpc0NhbGxlZSk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZDogdGhpcy5fbmVlZEhhbmd1cENhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXmjILmlq3ln4vngrnmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19IQU5HVVBfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIGhhbmd1cFNlc3Npb24hLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgc2lnbmFsIGVycm9yIGNvZGUgOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Zyo5Y+W5raI5oiW5bqU562U5aqS5L2T57G75Z6L5YiH5o2i5pe25Lyg5YWlXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk7XG4gICAgY29uc3Qgb2xkTWVkaWFUeXBlID0gbWFpblNlc3Npb24/LmdldE1lZGlhVHlwZSgpO1xuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gb2xkTWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+WqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHRvVXNlcklkcyA9IG1haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlcikgPT4gdXNlci51c2VySWQgIT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpLm1hcCgodXNlcikgPT4gdXNlci51c2VySWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHsgbWVkaWFUeXBlLCB0b1VzZXJJZHM6IHRvVXNlcklkcyB8fCBbXSB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHN1Y2Nlc3MgdHJhbnNhY3Rpb25JZDogJHtkYXRhIS50cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhbnNhY3Rpb25JZDogZGF0YSEudHJhbnNhY3Rpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOWIh+aNouWqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLrlj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLov5Tlm57nmoQgdHJhbnNhY3Rpb25JZFxuICAgKi9cbiAgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+W5raI5aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbmNlbENoYW5nZU1lZGlhVHlwZSh7IHRyYW5zYWN0aW9uSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovlj5jmm7TlupTnrZRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li6IG9uUmVjZWl2ZWRDaGFuZ2VUb1ZpZGVvIOebkeWQrOaUtuWIsCB0cmFuc2FjdGlvbklkIOWPguaVsOWAvFxuICAgKi9cbiAgYXN5bmMgcmVwbHlDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nLCBpc0FncmVlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oaXNBZ3JlZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgaXNBZ3JlZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtpc0FncmVlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFncmVlOiBpc0FncmVlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3ov5vooYzkuK3nmoTpgJror51cbiAgICogQHJldHVybnMgUkNDYWxsUGx1c1Nlc3Npb24g5a+56LGh5oiWIG51bGwg5Li65b2T5YmN5q2j5Zyo6L+b6KGM55qE6YCa6K+d5a+56LGhXG4gICAqL1xuICBnZXRDdXJyZW50Q2FsbFNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh5Zmo6I635Y+W5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlY29yZHMg5LiA57uE5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBnZXRBdmFpbGFibGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVjb3Jkcz86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRPcGVuQ2FsbExpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHN1Y2Nlc3MsIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZWNvcmRzOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YiG6aG15p+l5om+5b2T5YmN55So5oi355qE5YWo6YOo6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBzdGFydFRpbWVzdGFtcCDotbflp4vml7bpl7TmiLPvvIzov5Tlm57lpKfkuo7mraTml7bpl7TmiLPnmoTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNvdW50IOavj+asoeiOt+WPlueahOaVsOmHj1xuICAgKiBAcmV0dXJucyByZXN1bHQuaGFzTW9yZSDmmK/lkKbmnInmm7TlpJrpgJror53orrDlvZVcbiAgICogQHJldHVybnMgcmVzdWx0Lmxpc3Qg6YCa6K+d6K6w5b2V5YiX6KGo77yM57G75Z6L5Li6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtd77yM5Y+v6YCa6L+HIGFwaURvYyDmn6XnnIvlhbfkvZPljIXlkKvlrZfmrrVcbiAgICogQHJldHVybnMgcmVzdWx0Lm1heFRpbWUg5YiX6KGo5Lit5pyA5aSn5pe26Ze05oiz77yM5aaC5p6cIGhhc01vcmUg5Li6IHRydWXvvIznu6fnu63ojrflj5bml7bvvIzkvKDlhaXmraTml7bpl7TmiLNcbiAgICovXG4gIGFzeW5jIGdldENhbGxSZWNvcmRzKHN0YXJ0VGltZXN0YW1wOiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByZXN1bHQ/OiBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19ULCBgc3RhcnRUaW1lc3RhbXA6ICR7c3RhcnRUaW1lc3RhbXB9LCBjb3VudDogJHtjb3VudH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghKGlzTnVtYmVyKHN0YXJ0VGltZXN0YW1wKSAmJiBzdGFydFRpbWVzdGFtcCA+PSAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBzdGFydFRpbWVzdGFtcDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7c3RhcnRUaW1lc3RhbXB9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghKGlzTnVtYmVyKGNvdW50KSAmJiBjb3VudCA+IDApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IsIGBwYXJhbXMgZXJyb3IsIGNvdW50OiBpcyBhIG51bWJlciA+PSAwLCB2YWx1ZTogJHtjb3VudH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxMb2dMaXN0KHtcbiAgICAgIHRpbWVzdGFtcDogc3RhcnRUaW1lc3RhbXAsXG4gICAgICBjb3VudCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlc3VsdDogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOmbhuWQiOaJuemHj+WIoOmZpOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY2FsbElkcyBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoY2FsbElkczogc3RyaW5nW10pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1QsIGBjYWxsSWRzOiAke2NhbGxJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KGNhbGxJZHMpXG4gICAgICAmJiBjYWxsSWRzLmV2ZXJ5KChjYWxsSWQpID0+IG5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZHM6IG5vdCBlbXB0eSBhcnJheSwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZGVsZXRlQ2FsbExvZyhjYWxsSWRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5riF56m65omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVtb3ZlQWxsQ2FsbExvZyh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/mkYTlg4/lpLRcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOaRhOWDj+WktO+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOaRhOWDj+WktOeahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKiBAcmV0dXJucyB0cmFjayDmkYTlg4/lpLTop4bpopHotYTmupBcbiAgICovXG4gIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaRhOWDj+WktOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjaz8uaXNQdWJsaXNoZWQoKSAmJiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnB1Ymxpc2hWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBwdWJsaXNoIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKiDmianmlaPlkK/nlKjotYTmupDmtojmga/vvIzlpoLmnpzlpLHotKXvvIzliJkgc3RhcnRDYW1lcmEg6KGM5Li65aSx6LSlXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiB1bm11dGVDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MgJiYgdW5tdXRlQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHt1bm11dGVDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogdW5tdXRlQ29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgYXN5bmMgc3RvcENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlVmlkZW9UcmFjaygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsIGBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lUcmFjayh0cmFjayEpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBmYWxzZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLmkYTlg4/lpLRcbiAgICog5YiH5o2i5oiQ5Yqf5ZCOIGBJQ2FsbFBsdXNFdmVudExpc3RlbmVyYCDnm5HlkKzlmajnmoQgYG9uVXNlck1lZGlhQXZhaWxhYmxlYCDkuK3kvJrmlLbliLDmlrDliIfmjaLnmoTmkYTlg4/lpLTotYTmupDlj6/mkq3mlL7vvIzmraTml7bosIPnlKggYGNhbGxQbHVzQ2xpZW50LnBsYXlNZWRpYSgpYCDlj6/mmL7npLrmlrDmkYTlg4/lpLTnmoTnlLvpnaJcbiAgICogQHBhcmFtIGNhbWVyYUlkIOa1j+iniOWZqOS4reWPluW+l+eahOaRhOWDj+WktOiuvuWkhyBpZO+8jOWPr+iwgyBwbHVnaW4tcnRjIOeahCBnZXRDYW1lcmFzIOaWueazleWPluW+l1xuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d5YmN5ZKM6YCa6K+d5Lit6YO95Y+v6LCD55SoXG4gICAqL1xuICBhc3luYyBzd2l0Y2hDYW1lcmEoY2FtZXJhSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1QsIGBjYW1lcmFJZDogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FtZXJhSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBwYXJhbSBlcnJvciwgY2FtZXJhSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGNhbGwgY2xpZW50IGNoYW5nZVZpZGVvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+m6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdGFydE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgY3JlYXRlIG1pY3JvcGhvbmUgYXVkaW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1bm11dGVDb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHVubXV0ZUNvZGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3lhbPpl63puqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/lhbPpl63puqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0b3BNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlQXVkaW9UcmFjaygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIGZhbHNlLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjuaYr+WQpuW8gOWQr1xuICAgKi9cbiAgaXNNaWNyb3Bob25lRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICByZXR1cm4gISF0cmFjayAmJiAhdHJhY2suaXNPd25lck11dGVkKCk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5omA5pyJ6L+c56uv6Z+z6aKR5rWB5piv5ZCm5Y+v55SoXG4gICAqIEBwYXJhbSBlbmFibGUg5Li6IHRydWUg5pe277yM5ZCv55So5omA5pyJ6L+c56uv6Z+z6aKR5rWB77yb5Li6IGZhbHNlIOaXtu+8jOmdmemfs+aJgOaciei/nOerr+mfs+mikea1gVxuICAgKi9cbiAgYXN5bmMgc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3J0Y01vZHVsZS5zZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBTREsg54mI5pys5L+h5oGvXG4gICAqIEByZXR1cm5zIFNESyDniYjmnKzlj7dcbiAgICovXG4gIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX19WRVJTSU9OX187XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pGE5YOP5aS05YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRDYW1lcmFzKCkge1xuICAgIGNvbnN0IGNhbWVyYXMgPSBhd2FpdCBkZXZpY2UuZ2V0Q2FtZXJhcygpO1xuICAgIHJldHVybiBjYW1lcmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlum6puWFi+mjjuWIl+ihqFxuICAgKi9cbiAgYXN5bmMgZ2V0TWljcm9waG9uZXMoKSB7XG4gICAgY29uc3QgbWljcm9waG9uZXMgPSBhd2FpdCBkZXZpY2UuZ2V0TWljcm9waG9uZXMoKTtcbiAgICByZXR1cm4gbWljcm9waG9uZXM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1VuZGVmaW5lZCwgTG9nTGV2ZWwsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7IElWYWxpZGF0ZVJlcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lciwgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcblxuLyoqXG4gKiDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSW5pdE9wdHMgPSAob3B0czogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRlUmVzID0+IHtcbiAgaWYgKCFvcHRzKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG1pc3NpbmcgcGFyYW1ldGVyIC0+IG9wdGlvbnMnIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMpO1xuICAvLyDlv4XkvKDlj4LmlbDpqozor4FcbiAgaWYgKCFrZXlzLmluY2x1ZGVzKCdydGNDbGllbnQnKSkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5TVEFMTF9SVENfUExVR0lOIH07XG4gIH1cbiAgaWYgKCFpc09iamVjdChvcHRzLnJ0Y0NsaWVudCkpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgaXNMZWdhbDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiByZWdpc3RlckNhbGxFdmVudExpc3RlbmVyIOWPguaVsOagoemqjFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcik6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnbWlzc2luZyBwYXJhbWV0ZXIgLT4gbGlzdGVuZXInIH07XG4gIH1cblxuICAvLyDmoKHpqozmmK/lkKbnvLrlsJHlv4XopoHnm5HlkKzlm57osIPms6jlhoxcbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydvbkludml0ZScsICdvblNlc3Npb25DbG9zZScsICdvblJlbW90ZVRyYWNrUmVhZHknXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhsaXN0ZW5lcik7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICByZXF1aXJlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cblxuICBsZXQgcmVzOiBJVmFsaWRhdGVSZXMgPSB7IGlzTGVnYWw6IHRydWUgfTtcblxuICAvLyDmoKHpqozlv4XopoHnm5HlkKzmmK/lkKbmmK8gZnVuY3Rpb24g57G75Z6LXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVxdWlyZWRLZXlzW2ldO1xuICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcls8a2V5b2YgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcj5rZXldKSkge1xuICAgICAgcmVzID0geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiBgJyR7a2V5fScgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSAnZnVuY3Rpb24nYCB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgaXNVbmRlZmluZWQsIExvZ0wsIFBsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDbGllbnQgfSBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL2NvcmUvbW9kdWxlcy9SQ0NhbGxQbHVzU2Vzc2lvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZUluaXRPcHRzIH0gZnJvbSAnLi9jb3JlL3V0aWxzL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSUNhbGxQbHVzSW5pdE9wdHMgfSBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9jb3JlL2FwaS9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9jb3JlL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbFBsdXNDbGllbnQsIElDYWxsUGx1c0luaXRPcHRzPiA9IHtcbiAgdGFnOiAnUkNDYWxsUGx1cycsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIFZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbC1wbHVzJywgX19WRVJTSU9OX18pO1xuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBUaGUgY3VycmVudCBlbmdpbmUgdmVyc2lvbiAnJHtWZXJzaW9uTWFuYWdlLmdldEluZm8oKS5lbmdpbmV9JyBlcnJvciwgcGx1Z2luLWNhbGwtcGx1cyByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgc2V0dXAoY29udGV4dDogUGx1Z2luQ29udGV4dCwgcnVudGltZTogSVJ1bnRpbWUsIG9wdGlvbnM6IElDYWxsUGx1c0luaXRPcHRzKTogUkNDYWxsUGx1c0NsaWVudCB7XG4gICAgLy8g5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gICAgY29uc3QgdmFsaWRhdGVSZXMgPSB2YWxpZGF0ZUluaXRPcHRzKG9wdGlvbnMpO1xuICAgIGlmICghdmFsaWRhdGVSZXMuaXNMZWdhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQ2FsbFBsdXNMaWIgaW5zdGFsbGVyIHN0ZXVwXSR7dmFsaWRhdGVSZXMubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOWIm+W7uiBlbmdpbmUgbG9nZ2VyXG4gICAgY29uc3QgZW5naW5lTG9nZ2VyID0gY29udGV4dC5jcmVhdGVMb2dnZXIoJ0NhbGxQbHVzTGliJywgJ1JUQycpO1xuICAgIC8vIOiuvue9riDovpPlh7rnuqfliKtcbiAgICBjb25zdCBvdXRwdXRMZXZlbCA9IGlzVW5kZWZpbmVkKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpID8gTG9nTC5XQVJOIDogb3B0aW9ucy5sb2dPdXRwdXRMZXZlbDtcbiAgICBlbmdpbmVMb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3V0cHV0TGV2ZWwhKTtcbiAgICBlbmdpbmVMb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08sIGBDYWxsUGx1cyBWZXJzaW9uOiAke19fVkVSU0lPTl9ffSwgQ29tbWl0OiAke19fQ09NTUlUX0lEX199YCk7XG5cbiAgICByZXR1cm4gbmV3IFJDQ2FsbFBsdXNDbGllbnQoY29udGV4dCwgZW5naW5lTG9nZ2VyLCBydW50aW1lLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgLyogY2xhc3MgKi9cbiAgUkNDYWxsUGx1c0NsaWVudCxcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQXVkaW9Db25maWdCdWlsZGVyLFxuICBSQ1ZpZGVvQ29uZmlnQnVpbGRlcixcbn07XG4vKipcbiAqIOWvvOWHuuaemuS4vuWSjOaOpeWPo+WumuS5iVxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvYXBpL2ludGVyZmFjZSc7XG4iXSwibmFtZXMiOlsiUkNDYWxsUGx1c0NvZGUiLCJSQ0NhbGxQbHVzTG9nZ2VyVGFnIiwiUkNDYWxsUGx1c1Nlc3Npb24iLCJfc2Vzc2lvbiIsIl9jYWxsRW5naW5lIiwiX2xvZ2dlciIsIl9fcHVibGljRmllbGQiLCJ1c2VyIiwidXNlcklkIiwidXNlclN0YXRlIiwiY2FtZXJhRW5hYmxlIiwibWljcm9waG9uZUVuYWJsZSIsInRyYWNlSWQiLCJjb2RlIiwiY2xpZW50U3RhcnRUaW1lIiwiZGF0YSIsIlJDQ2FsbFBsdXNUeXBlIiwiUkNDYWxsUGx1c1R5cGUyIiwiUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlIiwiUkNDYWxsUGx1c01lZGlhVHlwZTIiLCJSQ0NhbGxQbHVzQ2FsbFN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCIsIlJDQ2FsbFBsdXNSZWFzb24iLCJSQ0F1ZGlvQ29uZmlnQnVpbGRlciIsIm1pY3JvcGhvbmVJZCIsIm1pbiIsIm1heCIsImlzTnVtYmVyIiwic2FtcGxlUmF0ZSIsIlJDVmlkZW9Db25maWdCdWlsZGVyIiwiUkNDYWxsUGx1c1Jlc29sdXRpb24iLCJSQ0NhbGxQbHVzRnJhbWVSYXRlIiwiZnBzIiwicmVzb2x1dGlvbiIsImNhbWVyYUlkIiwidHJhbjJDYWxsTG9nIiwiY2FsbExvZ0xpc3QiLCJjYWxsSWQiLCJjYWxsVHlwZSIsImNhbGxEaXIiLCJtZWRpYVR5cGUiLCJjYWxsaW5nVXNlcklkIiwiY2FsbFVzZXJJZHMiLCJjYWxsU3RhdHVzIiwic2Vzc2lvblN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsInNlY3JldENoYXQiLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsImdldFVzZXJWaWRlb1ZpZXdJbmZvIiwidXNlclZpZXdNYXAiLCJ1c2VyVmlld01hcEluZm8iLCJ2aWRlb1ZpZXciLCJpc1RpbnkiLCJSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyIsIlJDQ2FsbFBMdXNTdGF0aXN0aWNzIiwiX2NvbnRleHQiLCJ0YWciLCJzZXNzaW9uIiwiY2xpZW50Q2FsbElkIiwiaW52aXRlU291cmNlIiwiZXh0cmEiLCJub3dUaW1lIiwiY29tbW9uRGF0YSIsIkRpYWxvZ0FjdGlvbiIsIkRpYWxvZ1R5cGUiLCJTZWNyZXRDYWxsVHlwZSIsIlNlY3JldENhbGxUeXBlMiIsIkNhbGxUaW1lckV2ZW50VHlwZSIsIlJDQ2FsbElubmVyU2Vzc2lvbiIsIkV2ZW50RW1pdHRlciIsIl9jYWxsSWQiLCJfc3RhdGUiLCJfY2FsbFR5cGUiLCJfbWVkaWFUeXBlIiwiX3N0YXJ0Q2FsbGVySWQiLCJfY2FsbGVySWQiLCJfY2FsbFVzZXJzIiwiZW5hYmxlIiwidXNlcnMiLCJjaGFuZ2VkVXNlcnMiLCJuZXdVc2VyU3RhdGUiLCJuZXdTdGF0ZVRpbWUiLCJuZXdTeXNTdGF0ZSIsImhhc1VzZXIiLCJpIiwib2xkU3RhdGVUaW1lIiwib2xkU3lzdGVtU3RhdGUiLCJvbGRVc2VyU3RhdGUiLCJpc0ludmFsaWRTeXNTdGF0ZSIsImlzSW52YWxpZFVzZXJTdGF0ZSIsImlzSW52YWxpZE9ucGhvbmVFbmQiLCJlcnIiLCJzdGF0ZSIsInR5cGUiLCJ0aW1lcklkIiwiaXNMb2NhbENsaWVudEhhbmd1cCIsIkNhbGxTZXJ2ZXJBY3Rpb24iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsInNsZWVwIiwibWlsbGlzZWNvbmQiLCJyZXNvbHZlIiwibmVlZFJldHJ5Q29kZSIsIkVycm9yQ29kZSIsIlJDUlRDQ29kZSIsInJldHJ5QXN5bmNGbiIsImFzeW5jRm4iLCJmbkFyZ3MiLCJjdXJyZW50UmV0cnlUaW1lIiwibWF4RHVyYXRpb24iLCJpbnRlcnZhbHMiLCJpbmRleCIsIm9uRXJyb3IiLCJyZXMiLCJpdHYiLCJDYWxsSG9va3NUeXBlIiwiUHViSW52aXRlQ2FsbE1pc3NSZWFzb24iLCJQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIiwiU2lnbmFsVHJhbnNwb3J0ZXIiLCJfcnVudGltZSIsIl9pbml0T3B0cyIsIl90aW1lQ29ycmVjdGlvbmVyIiwiZ2V0VVVJRDIyIiwibGlzdGVuZXIiLCJtc2ciLCJ0b1VzZXJzIiwidGFyZ2V0VHlwZSIsInRhcmdldElkIiwibmlja05hbWUiLCJvbGRSb29tSWQiLCJjYWxsSWRzIiwib3B0cyIsIlJDQ29ubmVjdGlvblN0YXR1cyIsImtleSIsIm9wdGlvbnMiLCJ2YWx1ZSIsInJlc3VsdCIsInNlcnZlcktleSIsInNlcnZlclZhbCIsInBhcnNlZERhdGEiLCJpbmZvIiwiZGV2aWNlSWQiLCJpc051bGwiLCJpc1N0cmluZyIsImlzRGlyZWN0bHkiLCJjdXJyZW50VUlkIiwiY3VycmVudFVzZXIiLCJkaWFsb2dUeXBlIiwiYWN0aW9uIiwiZXh0cmFLZXlWYWwiLCJjYWxsU2Vzc2lvblVzZXJzIiwidG9EZXZpY2VJZCIsImNhbGxEaWFsb2dFbnRpdHlzIiwic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJ1dWlkIiwiQ0FMTF9EQl9OQU1FIiwiREJfVkVSU0lPTiIsImxvZ2dlciIsIl9SQ0NhbGxJbmRleERCIiwicmVxIiwiZXYiLCJvYmpOYW1lIiwiX2EiLCJ2YWwiLCJyZWplY3QiLCJSQ0NhbGxJbmRleERCIiwiQWJub3JtYWxDYWxsIiwib2JqU3RvcmUiLCJ1c2VyQWJub3JtYWxDYWxsSWRzIiwiaWQiLCJDYWxsU2VydmVyRXZlbnRUeXBlIiwiUkNDYWxsUGx1c0lubmVyQ29kZSIsIlRpbWVDb3JyZWN0aW9uZXIiLCJfc2luZ2xlQ2FsbER1cmF0aW9uRXYiLCJzZXJ2ZXJTdGFydFRpbWUiLCJjdXJyZW50UlRUIiwiY2xpZW50Rmlyc3RGcmFtZVRpbWUiLCJGb3J3YXJkVHlwZSIsIlJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UiLCJSQ0NhbGxEaXJlY3Rpb24iLCJDQUxMX1RJTUVfT1VUIiwiX1JDQ2FsbEVuZ2luZSIsIl9yZXBvcnRBcHBFdmVudE1vZHVsZSIsImN1cnJlbnRVc2VySWQiLCJidXN5bGluZVVzZXJzIiwiaW52aXRlclRpbWVySWQiLCJzZWxmU3RhdGUiLCJpbnZpdGVlc1N0YXRlIiwiYnVzeVVzZXJzU3RhdGUiLCJidXN5VXNlcklkIiwiaW52aXRlZFVzZXJzU3RhdGUiLCJidXN5bGluZVVzZXJzU3RhdGUiLCJ0cmFuc2FjdGlvbklkIiwicmVxTWVkaWFUeXBlIiwiY2FsbExvZyIsInJlc0RhdGEiLCJsaXN0IiwidXNlclNlc3Npb25TdGF0dXMiLCJjYWxsRGlyZWN0aW9uIiwic2Vzc2lvblVzZXJzIiwiaW5uZXJTZXNzaW9uIiwibmV3VXNlcnMiLCJpc0lkbGUiLCJub3ciLCJkZWxheVRpbWUiLCJzdHJlYW1SZWFkeVRpbWUiLCJjdXJyZW50VXNlclN5c3RlbVN0YXRlIiwiaG9sZENhbGxJZCIsInN0YXRlVGltZSIsImludml0ZVVzZXJJZCIsImludml0ZWVUaW1lcklkIiwiY2FsbFBsdXNTZXNzaW9uIiwib3RoZXJzU3RhdGUiLCJzdGF0dXNUaW1lIiwib3RoZXJJbnZpdGVkTWVtYmVyIiwiX2IiLCJfYyIsImludml0ZWRNZW1iZXIiLCJ1c2Vyc1N0YXRlIiwiY2FsbFNlc3Npb25hU3RhdHVzIiwic2Vzc2lvblN0YXRlIiwidW5OZWVkVXBTdGF0ZSIsInN0YXJ0Q2FsbGVySWQiLCJfZCIsInNlbGZFbmQiLCJzdGF0ZXMiLCJpc01haW5TZXNzaW9uIiwiY3VycmVudFVzZXJTYXRlIiwiZXZlbnRUaW1lIiwiZXZlbnRBcmdzIiwiZXZlbnRUeXBlIiwiZnJvbVVzZXJJZCIsImZpcnN0RnJhbWVUaW1lIiwicHJvbW90ZXJJZCIsInJlYXNvbiIsImN1cnJlbnRDYWxsSWQiLCJvbGRUcmFuc0lkIiwib2xkQWN0aW9uIiwiT2xkTWVkaWFUeXBlIiwiY2hhbmdlTWVkaWFUeXBlUmVzdWx0IiwiX2UiLCJpc1NlbGZIYW5ndXAiLCJjbG9zZWRTZXNzaW9uIiwiY3J0VXNlckRhdGEiLCJoYW5ndXBSZWFzb24iLCJpc05lZWRVcCIsImludml0ZXJVc2VySWQiLCJSQ0NhbGxFbmdpbmUiLCJSVENSZXNvdXJjZVRhZyIsIl9SVENNb2R1bGUiLCJkZWZhdWx0VmlkZW9UcmFjayIsInRyYWNrIiwiZGVmYXVsdEF1ZGlvVHJhY2siLCJ2aWRlb0NvbmZpZyIsImF1ZGlvQ29uZmlnIiwiaXNCb29sZWFuIiwibG9jYWxUcmFjayIsInJvb20iLCJyb29tVXNlcnNJZCIsImVycm9yIiwicHViUGFyYW1zIiwiY3VycmVudFJvb21JZCIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwibmVlZERlc3Ryb3lUcmFjayIsIm5ld1RyYWNrIiwidHJhY2tzIiwiUlRDTW9kZSIsInN1YlRpbnkiLCJieVNlcnZlciIsInVzZXJJZHMiLCJ2aWRlb1RyYWNrIiwiYXVkaW9UcmFjayIsImF1ZGlvTGV2ZWxSZXBvcnRMaXN0Iiwicm9vbUlkIiwia2lja0V4dHJhIiwiUkNLaWNrUmVhc29uIiwibmVlZFN1YlRyYWNrcyIsInJlcG9ydCIsInNlbmRlcnMiLCJyZWNlaXZlcnMiLCJraW5kIiwicGFja2V0c0xvc3RSYXRlIiwicnR0IiwidHJhY2tJZCIsImJpdHJhdGUiLCJoZWxwZXIiLCJsb2NhbFZpZGVvVHJhY2siLCJsb2NhbEF1ZGlvVHJhY2siLCJSQ0xvY2FsVHJhY2siLCJ2aWRlb0VsZW1lbnQiLCJzdWJQYXJhbXMiLCJ1bnN1YlRyYWNrcyIsIlJUQ01vZHVsZSIsIlJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUiLCJldmVudE5hbWUiLCJhdHRycyIsImhhbmRsZSIsImludml0ZWVVc2VyTGlzdCIsInJlY29yZCIsImNhbGxGaXJzdEZyYW1lVGltZSIsImF1ZGlvTGV2ZWwiLCJDYWxsU2VydmVyRXJyb3JDb2RlIiwiUkNDYWxsUGx1c0NsaWVudCIsIm5ld1Nlc3Npb24iLCJtYWluU2Vzc2lvbiIsIm5vdEVtcHR5QXJyYXkiLCJub3RFbXB0eVN0cmluZyIsImlzVW5kZWZpbmVkIiwiY2ZnIiwiZnJhbWVSYXRlIiwiZXJyb3JNc2ciLCJnZXRNZWRpYVRyYWNrc0NvZGUiLCJnZXRTZXNzaW9uQ29kZSIsImJ1c3lVc2VycyIsImhvbGRTZXNzaW9uIiwiaGFuZ3VwTWFpblNlc3Npb25Db2RlIiwibWFpblNlc3Npb25DYWxsSWQiLCJoYW5ndXBTZXNzaW9uIiwidXNlckluZm8iLCJvbGRNZWRpYVR5cGUiLCJ0b1VzZXJJZHMiLCJpc0FncmVlIiwic3RhcnRUaW1lc3RhbXAiLCJjb3VudCIsInVubXV0ZUNvZGUiLCJkZXZpY2UiLCJ2YWxpZGF0ZUluaXRPcHRzIiwiaXNPYmplY3QiLCJpbnN0YWxsZXIiLCJydW50aW1lIiwiVmVyc2lvbk1hbmFnZSIsImNvbnRleHQiLCJ2YWxpZGF0ZVJlcyIsImVuZ2luZUxvZ2dlciIsIm91dHB1dExldmVsIiwiTG9nTCJdLCJtYXBwaW5ncyI6IjZnQkFHTyxNQUFNQSxFQUFpQixDQUk1QixRQUFTLEVBSVQsWUFBYSxNQUliLGNBQWUsTUFJZixZQUFhLE1BSWIsa0JBQW1CLE1BSW5CLGVBQWdCLE1BSWhCLHdCQUF5QixNQUl6QixrQkFBbUIsTUFJbkIsZ0JBQWlCLE1BSWpCLHVCQUF3QixNQUl4QixnQkFBaUIsTUFJakIscUNBQXNDLE1BSXRDLG9CQUFxQixNQUlyQixjQUFlLE1BSWYsa0JBQW1CLE1BSW5CLHdCQUF5QixNQUl6Qix1QkFBd0IsTUFJeEIsa0JBQW1CLE1BSW5CLG1CQUFvQixLQUN0QixFQ2hGWSxJQUFBQyxHQUFBQSxJQUNWQSxFQUFBLG1DQUFxQyxxQ0FJckNBLEVBQUEsdUNBQXlDLHlDQUl6Q0EsRUFBQSx3Q0FBMEMsMENBSTFDQSxFQUFBLCtDQUFpRCxpREFDakRBLEVBQUEsZ0RBQWtELGtEQUlsREEsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSx5Q0FBMkMsMkNBQzNDQSxFQUFBLHNDQUF3Qyx3Q0FJeENBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHNDQUF3Qyx3Q0FDeENBLEVBQUEsMENBQTRDLDRDQUk1Q0EsRUFBQSw0QkFBOEIsOEJBQzlCQSxFQUFBLDRCQUE4Qiw4QkFJOUJBLEVBQUEsK0JBQWlDLGlDQUNqQ0EsRUFBQSwrQkFBaUMsaUNBSWpDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsb0NBQXNDLHNDQUl0Q0EsRUFBQSwyQkFBNkIsNkJBSTdCQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsMkJBQTZCLDZCQUM3QkEsRUFBQSwyQkFBNkIsNkJBSTdCQSxF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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+j5a6a5LmJXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9hcGkvaW50ZXJmYWNlJztcbiJdLCJuYW1lcyI6WyJSQ0NhbGxQbHVzQ29kZSIsIlJDQ2FsbFBsdXNMb2dnZXJUYWciLCJSQ0NhbGxQbHVzU2Vzc2lvbiIsIl9zZXNzaW9uIiwiX2NhbGxFbmdpbmUiLCJfbG9nZ2VyIiwiX19wdWJsaWNGaWVsZCIsInVzZXIiLCJ1c2VySWQiLCJ1c2VyU3RhdGUiLCJjYW1lcmFFbmFibGUiLCJtaWNyb3Bob25lRW5hYmxlIiwidHJhY2VJZCIsImNvZGUiLCJjbGllbnRTdGFydFRpbWUiLCJkYXRhIiwiUkNDYWxsUGx1c1R5cGUiLCJSQ0NhbGxQbHVzVHlwZTIiLCJSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlMiIsIlJDQ2FsbFBsdXNDYWxsU3RhdGUiLCJSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IiwiUkNDYWxsUGx1c1JlYXNvbiIsIlJDQXVkaW9Db25maWdCdWlsZGVyIiwibWljcm9waG9uZUlkIiwibWluIiwibWF4IiwiaXNOdW1iZXIiLCJzYW1wbGVSYXRlIiwiUkNWaWRlb0NvbmZpZ0J1aWxkZXIiLCJSQ0NhbGxQbHVzUmVzb2x1dGlvbiIsIlJDQ2FsbFBsdXNGcmFtZVJhdGUiLCJmcHMiLCJyZXNvbHV0aW9uIiwiY2FtZXJhSWQiLCJ0cmFuMkNhbGxMb2ciLCJjYWxsTG9nTGlzdCIsImNhbGxJZCIsImNhbGxUeXBlIiwiY2FsbERpciIsIm1lZGlhVHlwZSIsImNhbGxpbmdVc2VySWQiLCJjYWxsVXNlcklkcyIsImNhbGxTdGF0dXMiLCJzZXNzaW9uU3RhdHVzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsImR1cmF0aW9uIiwic2VjcmV0Q2hhdCIsInN5bmNUaW1lIiwic3lzU3RhdHVzIiwiY3J0VGltZSIsInBhcnNlU3RhdHVzRGF0YSIsInJpbmdpbmdEYXRhIiwiaGFuZ3VwRGF0YSIsImFjY2VwdERhdGEiLCJvdGhlckludml0ZWREYXRhIiwiaXRlbSIsInZhbGlkYXRlVmlkZW9Ob2RlTmFtZSIsImVsZW1lbnQiLCJ2YWxpZGF0ZVN5c1N0YXRlIiwiY3J0U3RhdGUiLCJuZXdTdGF0ZSIsImlzSW5WYWxpZCIsImludmFsaWRTdGF0ZXMiLCJ2YWxpZGF0ZVVzZXJTdGF0ZSIsImdldEhhbmd1cFN5c3RlbVN0YXRlIiwiaXNDYWxsZWUiLCJzeXN0ZW1TdGF0ZSIsImlzU3VwcG9ydE1lZGlhU2VydmVyIiwibmF2aUluZm8iLCJ2b2lwQ2FsbEluZm8iLCJzdHJhdGVneSIsInZhbGlkYXRlQml0cmF0ZSIsIm1pbkJpdHJhdGUiLCJtYXhCaXRyYXRlIiwiZ2V0VXNlclZpZGVvVmlld0luZm8iLCJ1c2VyVmlld01hcCIsInVzZXJWaWV3TWFwSW5mbyIsInZpZGVvVmlldyIsImlzVGlueSIsInB1c2hDb25maWdzVG9KU09OIiwiaU9TQ29uZmlnIiwiYW5kcm9pZENvbmZpZyIsImNsaWVudENhbGxJZCIsInRocmVhZElkIiwiYXBuc0NvbGxhcHNlSWQiLCJyaWNoTWVkaWFVcmkiLCJjaGFubmVsSWRNaSIsImNoYW5uZWxJZEhXIiwiY2hhbm5lbElkT1BQTyIsInR5cGVWaXZvIiwiZmNtQ2hhbm5lbElkIiwiZmNtQ29sbGFwc2VLZXkiLCJmY21JbWFnZVVybCIsIm1pTGFyZ2VJY29uVXJsIiwiaW1wb3J0YW5jZUhXIiwiY2F0ZWdvcnlIVyIsImltYWdlVXJsSFciLCJjYXRlZ29yeVZpdm8iLCJpbXBvcnRhbmNlSG9ub3IiLCJpbWFnZVVybEhvbm9yIiwiQVBOUyIsIkhXIiwicHVzaENvbmdmaWdzIiwiRkNNIiwiTUkiLCJPUFBPIiwiVklWTyIsIkhPTk9SIiwidHJhbnNTZXJ2ZXJQdXNoRXh0IiwicHVzaENvbmZpZyIsInB1c2hUaXRsZSIsImRpc2FibGVQdXNoVGl0bGUiLCJ0ZW1wbGF0ZUlkIiwicHVzaEV4dCIsImlzQm9vbGVhbiIsInZhbGlkYXRlUHVzaENvbmZpZyIsInB1c2hDb25maWdLZXlzIiwia2V5IiwiaW5kZXgiLCJpc1VuZGVmaW5lZCIsImlzU3RyaW5nIiwidmFsaWRhdGVJT1NDb25maWdSZXMiLCJ2YWxpZGF0ZUlPU0NvbmZpZyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZyIsImFuZHJvaWRDb25maWdLZXlzIiwiZ2V0Qnl0ZUxlbmd0aCIsInN0ciIsImNoYXJzZXQiLCJ0b3RhbCIsImNhbGN1bGF0ZVVURjE2Qnl0ZUxlbmd0aCIsImNhbGN1bGF0ZVVURjhCeXRlTGVuZ3RoIiwiY2hhdENvZGUiLCJpIiwiUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWciLCJSQ0NhbGxQTHVzU3RhdGlzdGljcyIsIl9jb250ZXh0IiwidGFnIiwic2Vzc2lvbiIsImludml0ZVNvdXJjZSIsImV4dHJhIiwibm93VGltZSIsImNvbW1vbkRhdGEiLCJEaWFsb2dBY3Rpb24iLCJEaWFsb2dUeXBlIiwiU2VjcmV0Q2FsbFR5cGUiLCJTZWNyZXRDYWxsVHlwZTIiLCJDYWxsVGltZXJFdmVudFR5cGUiLCJSQ0NhbGxJbm5lclNlc3Npb24iLCJFdmVudEVtaXR0ZXIiLCJfY2FsbElkIiwiX3N0YXRlIiwiX2NhbGxUeXBlIiwiX21lZGlhVHlwZSIsIl9zdGFydENhbGxlcklkIiwiX2NhbGxlcklkIiwiX2NhbGxVc2VycyIsImVuYWJsZSIsInVzZXJzIiwiY2hhbmdlZFVzZXJzIiwibmV3VXNlclN0YXRlIiwibmV3U3RhdGVUaW1lIiwibmV3U3lzU3RhdGUiLCJoYXNVc2VyIiwib2xkU3RhdGVUaW1lIiwib2xkU3lzdGVtU3RhdGUiLCJvbGRVc2VyU3RhdGUiLCJpc0ludmFsaWRTeXNTdGF0ZSIsImlzSW52YWxpZFVzZXJTdGF0ZSIsImlzSW52YWxpZE9ucGhvbmVFbmQiLCJlcnIiLCJzdGF0ZSIsInR5cGUiLCJ0aW1lcklkIiwiaXNMb2NhbENsaWVudEhhbmd1cCIsIkNhbGxTZXJ2ZXJBY3Rpb24iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsInNsZWVwIiwibWlsbGlzZWNvbmQiLCJyZXNvbHZlIiwibmVlZFJldHJ5Q29kZSIsIkVycm9yQ29kZSIsIlJDUlRDQ29kZSIsInJldHJ5QXN5bmNGbiIsImFzeW5jRm4iLCJmbkFyZ3MiLCJjdXJyZW50UmV0cnlUaW1lIiwibWF4RHVyYXRpb24iLCJpbnRlcnZhbHMiLCJvbkVycm9yIiwicmVzIiwiaXR2IiwiQ2FsbEhvb2tzVHlwZSIsIlB1Ykludml0ZUNhbGxNaXNzUmVhc29uIiwiUHViSW52aXRlQ2FsbE1pc3NSZWZlciIsIlNpZ25hbFRyYW5zcG9ydGVyIiwiX3J1bnRpbWUiLCJfaW5pdE9wdHMiLCJfdGltZUNvcnJlY3Rpb25lciIsImdldFVVSUQyMiIsImxpc3RlbmVyIiwibXNnIiwidG9Vc2VycyIsInRhcmdldFR5cGUiLCJ0YXJnZXRJZCIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJLZXkiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNEaXJlY3RseSIsImN1cnJlbnRVSWQiLCJjdXJyZW50VXNlciIsImRpYWxvZ1R5cGUiLCJhY3Rpb24iLCJleHRyYUtleVZhbCIsImNhbGxTZXNzaW9uVXNlcnMiLCJ0b0RldmljZUlkIiwiY2FsbERpYWxvZ0VudGl0eXMiLCJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsInV1aWQiLCJDQUxMX0RCX05BTUUiLCJEQl9WRVJTSU9OIiwibG9nZ2VyIiwiX1JDQ2FsbEluZGV4REIiLCJyZXEiLCJldiIsIm9iak5hbWUiLCJfYSIsInZhbCIsInJlamVjdCIsIlJDQ2FsbEluZGV4REIiLCJBYm5vcm1hbENhbGwiLCJvYmpTdG9yZSIsInVzZXJBYm5vcm1hbENhbGxJZHMiLCJpZCIsIkNhbGxTZXJ2ZXJFdmVudFR5cGUiLCJSQ0NhbGxQbHVzSW5uZXJDb2RlIiwiVGltZUNvcnJlY3Rpb25lciIsIl9zaW5nbGVDYWxsRHVyYXRpb25FdiIsInNlcnZlclN0YXJ0VGltZSIsImN1cnJlbnRSVFQiLCJjbGllbnRGaXJzdEZyYW1lVGltZSIsIkZvcndhcmRUeXBlIiwiUkNDYWxsUGx1c0ludml0ZVNvdXJjZSIsIlJDQ2FsbERpcmVjdGlvbiIsIkNBTExfVElNRV9PVVQiLCJfUkNDYWxsRW5naW5lIiwiX3JlcG9ydEFwcEV2ZW50TW9kdWxlIiwiY3VycmVudFVzZXJJZCIsImJ1c3lsaW5lVXNlcnMiLCJpbnZpdGVyVGltZXJJZCIsInNlbGZTdGF0ZSIsImludml0ZWVzU3RhdGUiLCJidXN5VXNlcnNTdGF0ZSIsImJ1c3lVc2VySWQiLCJpbnZpdGVkVXNlcnNTdGF0ZSIsImJ1c3lsaW5lVXNlcnNTdGF0ZSIsInRyYW5zYWN0aW9uSWQiLCJyZXFNZWRpYVR5cGUiLCJjYWxsTG9nIiwicmVzRGF0YSIsImxpc3QiLCJ1c2VyU2Vzc2lvblN0YXR1cyIsImNhbGxEaXJlY3Rpb24iLCJzZXNzaW9uVXNlcnMiLCJpbm5lclNlc3Npb24iLCJuZXdVc2VycyIsImlzSWRsZSIsIm5vdyIsImRlbGF5VGltZSIsInN0cmVhbVJlYWR5VGltZSIsImN1cnJlbnRVc2VyU3lzdGVtU3RhdGUiLCJob2xkQ2FsbElkIiwic3RhdGVUaW1lIiwiaW52aXRlVXNlcklkIiwiaW52aXRlZVRpbWVySWQiLCJjYWxsUGx1c1Nlc3Npb24iLCJvdGhlcnNTdGF0ZSIsInN0YXR1c1RpbWUiLCJvdGhlckludml0ZWRNZW1iZXIiLCJfYiIsIl9jIiwiaW52aXRlZE1lbWJlciIsInVzZXJzU3RhdGUiLCJjYWxsU2Vzc2lvbmFTdGF0dXMiLCJzZXNzaW9uU3RhdGUiLCJ1bk5lZWRVcFN0YXRlIiwic3RhcnRDYWxsZXJJZCIsIl9kIiwic2VsZkVuZCIsInN0YXRlcyIsImlzTWFpblNlc3Npb24iLCJjdXJyZW50VXNlclNhdGUiLCJldmVudFRpbWUiLCJldmVudEFyZ3MiLCJldmVudFR5cGUiLCJmcm9tVXNlcklkIiwiZmlyc3RGcmFtZVRpbWUiLCJwcm9tb3RlcklkIiwicmVhc29uIiwiY3VycmVudENhbGxJZCIsIm9sZFRyYW5zSWQiLCJvbGRBY3Rpb24iLCJPbGRNZWRpYVR5cGUiLCJjaGFuZ2VNZWRpYVR5cGVSZXN1bHQiLCJfZSIsImlzU2VsZkhhbmd1cCIsImNsb3NlZFNlc3Npb24iLCJjcnRVc2VyRGF0YSIsImhhbmd1cFJlYXNvbiIsImlzTmVlZFVwIiwiaW52aXRlclVzZXJJZCIsIlJDQ2FsbEVuZ2luZSIsIlJUQ1Jlc291cmNlVGFnIiwiX1JUQ01vZHVsZSIsImRlZmF1bHRWaWRlb1RyYWNrIiwidHJhY2siLCJkZWZhdWx0QXVkaW9UcmFjayIsInZpZGVvQ29uZmlnIiwiYXVkaW9Db25maWciLCJsb2NhbFRyYWNrIiwicm9vbSIsInJvb21Vc2Vyc0lkIiwiZXJyb3IiLCJwdWJQYXJhbXMiLCJjdXJyZW50Um9vbUlkIiwicmVjZW50VHJhY2tzIiwibG9jYWxUcmFja3MiLCJuZWVkRGVzdHJveVRyYWNrIiwibmV3VHJhY2siLCJ0cmFja3MiLCJSVENNb2RlIiwic3ViVGlueSIsImJ5U2VydmVyIiwidXNlcklkcyIsInZpZGVvVHJhY2siLCJhdWRpb1RyYWNrIiwiYXVkaW9MZXZlbFJlcG9ydExpc3QiLCJyb29tSWQiLCJraWNrRXh0cmEiLCJSQ0tpY2tSZWFzb24iLCJuZWVkU3ViVHJhY2tzIiwicmVwb3J0Iiwic2VuZGVycyIsInJlY2VpdmVycyIsImtpbmQiLCJwYWNrZXRzTG9zdFJhdGUiLCJydHQiLCJ0cmFja0lkIiwiYml0cmF0ZSIsImhlbHBlciIsImxvY2FsVmlkZW9UcmFjayIsImxvY2FsQXVkaW9UcmFjayIsIlJDTG9jYWxUcmFjayIsInZpZGVvRWxlbWVudCIsInN1YlBhcmFtcyIsInVuc3ViVHJhY2tzIiwiUlRDTW9kdWxlIiwiUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSIsImV2ZW50TmFtZSIsImF0dHJzIiwiaGFuZGxlIiwiaW52aXRlZVVzZXJMaXN0IiwicmVjb3JkIiwiY2FsbEZpcnN0RnJhbWVUaW1lIiwiYXVkaW9MZXZlbCIsIkNhbGxTZXJ2ZXJFcnJvckNvZGUiLCJSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIiwiTUFYX0VYVFJBX0JZVEVTIiwiUkNDYWxsUGx1c0NsaWVudCIsIm5ld1Nlc3Npb24iLCJtYWluU2Vzc2lvbiIsIm5vdEVtcHR5QXJyYXkiLCJub3RFbXB0eVN0cmluZyIsImNmZyIsImZyYW1lUmF0ZSIsImVycm9yTXNnIiwiZ2V0TWVkaWFUcmFja3NDb2RlIiwiZ2V0U2Vzc2lvbkNvZGUiLCJidXN5VXNlcnMiLCJob2xkU2Vzc2lvbiIsImhhbmd1cE1haW5TZXNzaW9uQ29kZSIsIm1haW5TZXNzaW9uQ2FsbElkIiwiaGFuZ3VwU2Vzc2lvbiIsInVzZXJJbmZvIiwib2xkTWVkaWFUeXBlIiwidG9Vc2VySWRzIiwiaXNBZ3JlZSIsInN0YXJ0VGltZXN0YW1wIiwiY291bnQiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJYixjQUFlLE1BSWYsWUFBYSxNQUliLGtCQUFtQixNQUluQixlQUFnQixNQUloQix3QkFBeUIsTUFJekIsa0JBQW1CLE1BSW5CLGdCQUFpQixNQUlqQix1QkFBd0IsTUFJeEIsZ0JBQWlCLE1BSWpCLHFDQUFzQyxNQUl0QyxvQkFBcUIsTUFJckIsY0FBZSxNQUlmLGtCQUFtQixNQUluQix3QkFBeUIsTUFJekIsdUJBQXdCLE1BSXhCLGtCQUFtQixNQUluQixtQkFBb0IsS0FDdEIsRUNoRlksSUFBQUMsR0FBQUEsSUFDVkEsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSwrQ0FBaUQsaURBQ2pEQSxFQUFBLGdEQUFrRCxrREFJbERBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHlDQUEyQywyQ0FDM0NBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxzQ0FBd0Msd0NBQ3hDQSxFQUFBLDBDQUE0Qyw0Q0FJNUNBLEVBQUEsNEJBQThCLDhCQUM5QkEsRUFBQSw0QkFBOEIsOEJBSTlCQSxFQUFBLCtCQUFpQyxpQ0FDakNBLEVBQUEsK0JBQWlDLGlDQUlqQ0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsMkJBQTZCLDZCQUk3QkEsRUFBQSwyQkFBNkIsNkJBSTdCQSxFQUFBLDJCQUE2Qiw2QkFDN0JBLEVBQUEsMkJBQTZCLDZCQUk3QkEsRUFBQSwyQkFBNkIsNkJBQzdCQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsOENBQWdELGdEQUNoREEsRUFBQSw4Q0FBZ0QsZ0RBSWhEQSxFQUFBLDZDQUErQywrQ0FDL0NBLEVBQUEsNkNBQStDLCtDQUkvQ0EsRUFBQSw0Q0FBOEMsOENBQzlDQSxFQUFBLDRDQUE4Qyw4Q0FJOUNBLEVBQUEsNkNBQStDLCtDQUMvQ0EsRUFBQSw2Q0FBK0MsK0NBSy9DQSxFQUFBLDJEQUE2RCw4REFDN0RBLEVBQUEsMkRBQTZELDhEQUk3REEsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHFDQUF1Qyx1Q0FJdkNBLEVBQUEsa0RBQW9ELG9EQUNwREEsRUFBQSxrREFBb0Qsb0RBSXBEQSxFQUFBLHdEQUEwRCwwREFDMURBLEVBQUEsd0RBQTBELDBEQUkxREEsRUFBQSxpQ0FBbUMsbUNBQ25DQSxFQUFBLGlDQUFtQyxtQ0FJbkNBLEVBQUEsZ0NBQWtDLGtDQUNsQ0EsRUFBQSxnQ0FBa0Msa0NBSWxDQSxFQUFBLGtDQUFvQyxvQ0FDcENBLEVBQUEsa0NBQW9DLG9DQUlwQ0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHFDQUF1Qyx1Q0FJdkNBLEVBQUEsb0NBQXNDLHNDQUN0Q0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLG1DQUFxQyxxQ0FDckNBLEVBQUEsbUNBQXFDLHFDQUNyQ0EsRUFBQSw4QkFBZ0MsZ0NBSWhDQSxFQUFBLHNDQUF3Qyx3Q0FDeENBLEVBQUEsc0NBQXdDLHdDQUN4Q0EsRUFBQSxpQ0FBbUMsbUNBSW5DQSxFQUFBLCtCQUFpQyxpQ0FDakNBLEVBQUEsK0JBQWlDLGlDQUNqQ0EsRUFBQSwwQkFBNEIsNEJBQzVCQSxFQUFBLDBCQUE0Qiw0QkFJNUJBLEVBQUEsMkNBQTZDLDZDQUM3Q0EsRUFBQSwyQ0FBNkMsNkNBSTdDQSxFQUFBLHlCQUEyQiwyQkFDM0JBLEVBQUEseUJBQTJCLDJCQUkzQkEsRUFBQSwyQkFBNkIsNkJBQzdCQSxFQUFBLDJCQUE2Qiw2QkFJN0JBLEVBQUEsdUJBQXlCLHlCQUN6QkEsRUFBQSx1QkFBeUIseUJBSXpCQSxFQUFBLHlCQUEyQiwyQkFDM0JBLEVBQUEseUJBQTJCLDJCQUkzQkEsRUFBQSxrQ0FBb0Msb0NBSXBDQSxFQUFBLCtCQUFpQyxpQ0FDakNBLEVBQUEsK0JBQWlDLGlDQUNqQ0EsRUFBQSwrQkFBaUMsaUNBSWpDQSxFQUFBLDZCQUErQiwrQkFDL0JBLEVBQUEsNkJBQStCLCtCQUMvQkEsRUFBQSw2QkFBK0IsK0JBSS9CQSxFQUFBLGtDQUFvQyxvQ0FDcENBLEVBQUEsa0NBQW9DLG9DQUlwQ0EsRUFBQSxrQ0FBb0Msb0NBQ3BDQSxFQUFBLGtDQUFvQyxvQ0FJcENBLEVBQUEscUNBQXVDLHVDQUl2Q0EsRUFBQSx1Q0FBeUMseUNBSXpDQSxFQUFBLDJDQUE2Qyw2Q0FJN0NBLEVBQUEsZ0NBQWtDLGtDQUlsQ0EsRUFBQSxtREFBcUQscURBSXJEQSxFQUFBLGlDQUFtQyxtQ0FDbkNBLEVBQUEsaUNBQW1DLG1DQUluQ0EsRUFBQSw2QkFBK0IsK0JBQy9CQSxFQUFBLDZCQUErQiwrQkFJL0JBLEVBQUEsNkJBQStCLCtCQUMvQkEsRUFBQSw2QkFBK0IsK0JBTS9CQSxFQUFBLG1DQUFxQyxxQ0FDckNBLEVBQUEsa0NBQW9DLG9DQUlwQ0EsRUFBQSw4QkFBZ0MsZ0NBSWhDQSxFQUFBLDRCQUE4Qiw4QkFJOUJBLEVBQUEsOEJBQWdDLGdDQUNoQ0EsRUFBQSw4QkFBZ0MsZ0NBSWhDQSxFQUFBLGlDQUFtQyxtQ0FJbkNBLEVBQUEsOEJBQWdDLGdDQUloQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLHFDQUF1Qyx1Q0FJdkNBLEVBQUEsc0NBQXdDLHdDQUl4Q0EsRUFBQSwwQ0FBNEMsNENBSTVDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsNENBQThDLDhDQUk5Q0EsRUFBQSwwQ0FBNEMsNENBSTVDQSxFQUFBLCtDQUFpRCxpREFJakRBLEVBQUEseUNBQTJDLDJDQUkzQ0EsRUFBQSwrQ0FBaUQsaURBSWpEQSxFQUFBLDRDQUE4Qyw4Q0FJOUNBLEVBQUEsZ0RBQWtELGtEQUlsREEsRUFBQSx1Q0FBeUMseUNBSXpDQSxFQUFBLHNDQUF3Qyx3Q0FJeENBLEVBQUEsMkNBQTZDLDZDQUk3Q0EsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLGdDQUFrQyxrQ0FJbENBLEVBQUEsNkJBQStCLCtCQUkvQkEsRUFBQSxpQ0FBbUMsbUNBSW5DQSxFQUFBLGdDQUFrQyxrQ0FJbENBLEVBQUEsZ0NBQWtDLGtDQUNsQ0EsRUFBQSxnQ0FBa0Msa0NBSWxDQSxFQUFBLHlDQUEyQywyQ0FJM0NBLEVBQUEseUNBQTJDLDJDQUkzQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLG9DQUFzQyxzQ0FJdENBLEVBQUEsMkNBQTZDLDZDQUk3Q0EsRUFBQSx5Q0FBMkMsMkNBQzNDQSxFQUFBLHlDQUEyQywyQ0FJM0NBLEVBQUEsb0NBQXNDLHNDQUN0Q0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLHVCQUF5Qix5QkFJekJBLEVBQUEsc0JBQXdCLHdCQUl4QkEsRUFBQSx5QkFBMkIsMkJBSTNCQSxFQUFBLGdEQUFrRCxrREFDbERBLEVBQUEsZ0RBQWtELGtEQUNsREEsRUFBQSxnREFBa0Qsa0RBSWxEQSxFQUFBLHdDQUEwQywwQ0FDMUNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSxnQ0FBa0Msa0NBSWxDQSxFQUFBLDBDQUE0Qyw0Q0FDNUNBLEVBQUEsMENBQTRDLDRDQUk1Q0EsRUFBQSxvQ0FBc0Msc0NBSXRDQSxFQUFBLHlDQUEyQywyQ0FJM0NBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBSXZDQSxFQUFBLGtDQUFvQyxvQ0FDcENBLEVBQUEsa0NBQW9DLG9DQUlwQ0EsRUFBQSxxQ0FBdUMsdUNBamI3QkEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNZTCxNQUFNQyxDQUFrQixDQU83QixZQUNtQkMsRUFDQUMsRUFDQUMsRUFDakIsQ0FWTUMsRUFBQSxrQkFBcUIsR0FFckJBLEVBQUEsaUJBQW9CLEdBRXBCQSxFQUFBLGVBQWtCLElBR1AsS0FBQSxTQUFBSCxFQUNBLEtBQUEsWUFBQUMsRUFDQSxLQUFBLFFBQUFDLEVBRVosS0FBQSxRQUFVLEtBQUssU0FBUyxVQUFVLENBQ3pDLENBS08sV0FBb0IsQ0FDekIsT0FBTyxLQUFLLE9BQ2QsQ0FLTyxVQUFnQyxDQUM5QixPQUFBLEtBQUssU0FBUyxpQkFDdkIsQ0FLTyxhQUE4QixDQUM1QixPQUFBLEtBQUssU0FBUyxhQUN2QixDQUtPLGNBQW9DLENBQ2xDLE9BQUEsS0FBSyxTQUFTLGNBQ3ZCLENBS08sYUFBdUUsQ0FDNUUsT0FBTyxLQUFLLFNBQVMsWUFBYyxFQUFBLElBQUtFLEdBQVMsQ0FDekMsS0FBQSxDQUNKLE9BQUFDLEVBQVEsVUFBQUMsRUFBVyxhQUFBQyxFQUFjLGlCQUFBQyxDQUMvQixFQUFBSixFQUNHLE1BQUEsQ0FDTCxPQUFBQyxFQUNBLE1BQU9DLEVBQ1AsYUFBQUMsRUFDQSxpQkFBQUMsQ0FBQSxDQUNGLENBQ0QsQ0FDSCxDQUtBLGtCQUEyQixDQUNsQixPQUFBLEtBQUssU0FBUyxrQkFDdkIsQ0FNQSxrQkFBMkIsQ0FDbEIsT0FBQSxLQUFLLFNBQVMsYUFDdkIsQ0FLQSxNQUFNLG9CQUFrRSxDQUNoRSxNQUFBQyxFQUFVLEtBQUssUUFBUSxjQUFjLEVBRTNDLEdBREEsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHFDQUFzQyxHQUFJVyxDQUFPLEVBQ25GLEtBQUssV0FDUCxNQUFPLENBQUUsS0FBTVosRUFBZSxRQUFTLFVBQVcsS0FBSyxZQUV6RCxLQUFNLENBQUUsS0FBQWEsRUFBTSxnQkFBQUMsR0FBb0IsTUFBTSxLQUFLLFlBQVksbUJBQW1CLENBQUUsT0FBUSxLQUFLLFNBQVdGLENBQU8sRUFDekcsT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IscUNBQXNDLFlBQVlZLENBQUksR0FBSUQsQ0FBTyxFQUNqRyxDQUFFLEtBQUFDLENBQUssSUFHaEIsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLHFDQUFzQyxVQUFXVyxDQUFPLEVBQzlGLEtBQUssV0FBYUUsRUFDWCxDQUNMLEtBQU1kLEVBQWUsUUFDckIsVUFBVyxLQUFLLFVBQUEsRUFFcEIsQ0FNQSxNQUFNLGFBQTBELENBQ3hELE1BQUFZLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFHM0MsR0FGQSxLQUFLLFFBQVEsS0FBS1gsRUFBb0Isa0NBQW1DLEdBQUlXLENBQU8sRUFFaEYsS0FBSyxVQUNGLFlBQUEsUUFBUSxLQUFLWCxFQUFvQixrQ0FBbUMsU0FBU0QsRUFBZSxPQUFPLGVBQWUsS0FBSyxTQUFTLEdBQUlZLENBQU8sRUFDekksQ0FBRSxLQUFNWixFQUFlLFFBQVMsU0FBVSxLQUFLLFdBR2xELEtBQUEsQ0FBRSxLQUFBYSxFQUFNLEtBQUFFLENBQVMsRUFBQSxNQUFNLEtBQUssWUFBWSxnQkFBZ0IsS0FBSyxRQUFTSCxDQUFPLEVBQy9FLE9BQUFDLElBQVNiLEVBQWUsU0FDMUIsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLGtDQUFtQyxTQUFTWSxDQUFJLEdBQUlELENBQU8sRUFDM0YsQ0FBRSxLQUFBQyxDQUFLLElBR1gsS0FBQSxRQUFRLEtBQUtaLEVBQW9CLGtDQUFtQyxTQUFTRCxFQUFlLE9BQU8sZUFBZWUsRUFBTSxRQUFRLEdBQUlILENBQU8sRUFDaEosS0FBSyxVQUFZRyxFQUFNLFNBQ2hCLENBQ0wsS0FBTWYsRUFBZSxRQUNyQixTQUFVLEtBQUssU0FBQSxFQUVuQixDQUNGLENDcklZLElBQUFnQixHQUFBQSxJQUlWQSxFQUFBQyxFQUFBLE9BQUEsQ0FBQSxFQUFBLFNBSUFELEVBQUFDLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFSVUQsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNIQUUsR0FBQUEsSUFJVkEsRUFBQUEsRUFBQSxLQUFPLENBQVAsRUFBQSxPQUlBQSxFQUFBQSxFQUFBLFFBQVUsR0FBVixFQUFBLFVBSUFBLEVBQUFBLEVBQUEsUUFBVSxHQUFWLEVBQUEsVUFJQUEsRUFBQUEsRUFBQSxRQUFVLEdBQVYsRUFBQSxVQUlBQSxFQUFBQSxFQUFBLGlCQUFtQixHQUFuQixFQUFBLG1CQUlBQSxFQUFBQSxFQUFBLGNBQWdCLEdBQWhCLEVBQUEsZ0JBSUFBLEVBQUFBLEVBQUEsV0FBYSxHQUFiLEVBQUEsYUFJQUEsRUFBQUEsRUFBQSxPQUFTLEdBQVQsRUFBQSxTQUlBQSxFQUFBQSxFQUFBLFFBQVUsR0FBVixFQUFBLFVBSUFBLEVBQUFBLEVBQUEsTUFBUSxHQUFSLEVBQUEsUUFJQUEsRUFBQUEsRUFBQSxVQUFZLElBQVosRUFBQSxZQUlBQSxFQUFBQSxFQUFBLE9BQVMsSUFBVCxFQUFBLFNBSUFBLEVBQUFBLEVBQUEsVUFBWSxJQUFaLEVBQUEsWUFJQUEsRUFBQUEsRUFBQSxTQUFXLElBQVgsRUFBQSxXQUlBQSxFQUFBQSxFQUFBLE1BQVEsR0FBUixFQUFBLFFBNURVQSxJQUFBQSxHQUFBLENBQUEsQ0FBQSxFQ0dBQyxHQUFBQSxJQUlWQSxFQUFBQyxFQUFBLE1BQUEsQ0FBQSxFQUFBLFFBSUFELEVBQUFDLEVBQUEsWUFBQSxDQUFBLEVBQUEsY0FJQUQsRUFBQUMsRUFBQSxNQUFBLENBQUEsRUFBQSxRQVpVRCxJQUFBQSxHQUFBLENBQUEsQ0FBQSxFQ0FBRSxHQUFBQSxJQUlWQSxFQUFBQSxFQUFBLEtBQU8sQ0FBUCxFQUFBLE9BSUFBLEVBQUFBLEVBQUEsUUFBVSxHQUFWLEVBQUEsVUFJQUEsRUFBQUEsRUFBQSxRQUFVLEdBQVYsRUFBQSxVQUlBQSxFQUFBQSxFQUFBLFFBQVUsR0FBVixFQUFBLFVBSUFBLEVBQUFBLEVBQUEsaUJBQW1CLEdBQW5CLEVBQUEsbUJBSUFBLEVBQUFBLEVBQUEsY0FBZ0IsR0FBaEIsRUFBQSxnQkFJQUEsRUFBQUEsRUFBQSxXQUFhLEdBQWIsRUFBQSxhQUlBQSxFQUFBQSxFQUFBLE9BQVMsR0FBVCxFQUFBLFNBSUFBLEVBQUFBLEVBQUEsTUFBUSxHQUFSLEVBQUEsUUFJQUEsRUFBQUEsRUFBQSxTQUFXLElBQVgsRUFBQSxXQUlBQSxFQUFBQSxFQUFBLE9BQVMsSUFBVCxFQUFBLFNBSUFBLEVBQUFBLEVBQUEsU0FBVyxJQUFYLEVBQUEsV0FJQUEsRUFBQUEsRUFBQSxTQUFXLElBQVgsRUFBQSxXQUVBQSxFQUFBQSxFQUFBLE1BQVEsR0FBUixFQUFBLFFBdERVQSxJQUFBQSxHQUFBLENBQUEsQ0FBQSxFQ0hBQyxHQUFBQSxJQUlWQSxFQUFBQSxFQUFBLHlCQUEyQixDQUEzQixFQUFBLDJCQUlBQSxFQUFBQSxFQUFBLHlCQUEyQixDQUEzQixFQUFBLDJCQUlBQSxFQUFBQSxFQUFBLHdCQUEwQixDQUExQixFQUFBLDBCQUlBQSxFQUFBQSxFQUFBLDBCQUE0QixDQUE1QixFQUFBLDRCQWhCVUEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNBQUMsR0FBQUEsSUFDVkEsRUFBQUEsRUFBQSxLQUFPLENBQVAsRUFBQSxPQUNBQSxFQUFBQSxFQUFBLFFBQVUsR0FBVixFQUFBLFVBQ0FBLEVBQUFBLEVBQUEsUUFBVSxHQUFWLEVBQUEsVUFDQUEsRUFBQUEsRUFBQSxRQUFVLEdBQVYsRUFBQSxVQUNBQSxFQUFBQSxFQUFBLGlCQUFtQixHQUFuQixFQUFBLG1CQUNBQSxFQUFBQSxFQUFBLGNBQWdCLEdBQWhCLEVBQUEsZ0JBQ0FBLEVBQUFBLEVBQUEsV0FBYSxHQUFiLEVBQUEsYUFDQUEsRUFBQUEsRUFBQSxPQUFTLEdBQVQsRUFBQSxTQUNBQSxFQUFBQSxFQUFBLFNBQVcsR0FBWCxFQUFBLFdBQ0FBLEVBQUFBLEVBQUEsYUFBZSxHQUFmLEVBQUEsZUFJQUEsRUFBQUEsRUFBQSxrQkFBb0IsR0FBcEIsRUFBQSxvQkFJQUEsRUFBQUEsRUFBQSxpQkFBbUIsR0FBbkIsRUFBQSxtQkFJQUEsRUFBQUEsRUFBQSxhQUFlLEdBQWYsRUFBQSxlQUlBQSxFQUFBQSxFQUFBLE1BQVEsR0FBUixFQUFBLFFBSUFBLEVBQUFBLEVBQUEsVUFBWSxJQUFaLEVBQUEsWUFJQUEsRUFBQUEsRUFBQSxPQUFTLElBQVQsRUFBQSxTQUlBQSxFQUFBQSxFQUFBLFVBQVksSUFBWixFQUFBLFlBSUFBLEVBQUFBLEVBQUEsU0FBVyxJQUFYLEVBQUEsV0FJQUEsRUFBQUEsRUFBQSxxQkFBdUIsSUFBdkIsRUFBQSx1QkFJQUEsRUFBQUEsRUFBQSxvQkFBc0IsSUFBdEIsRUFBQSxzQkFJQUEsRUFBQUEsRUFBQSxjQUFnQixJQUFoQixFQUFBLGdCQUlBQSxFQUFBQSxFQUFBLFlBQWMsSUFBZCxFQUFBLGNBSUFBLEVBQUFBLEVBQUEsY0FBZ0IsSUFBaEIsRUFBQSxnQkFJQUEsRUFBQUEsRUFBQSxlQUFpQixJQUFqQixFQUFBLGlCQUlBQSxFQUFBQSxFQUFBLGlCQUFtQixJQUFuQixFQUFBLG1CQUlBQSxFQUFBQSxFQUFBLGVBQWlCLElBQWpCLEVBQUEsaUJBSUFBLEVBQUFBLEVBQUEsT0FBUyxJQUFULEVBQUEsU0FJQUEsRUFBQUEsRUFBQSxtQkFBcUIsSUFBckIsRUFBQSxxQkFJQUEsRUFBQUEsRUFBQSxvQkFBc0IsSUFBdEIsRUFBQSxzQkFJQUEsRUFBQUEsRUFBQSxxQkFBdUIsSUFBdkIsRUFBQSx1QkFJQUEsRUFBQUEsRUFBQSxvQkFBc0IsSUFBdEIsRUFBQSxzQkFJQUEsRUFBQUEsRUFBQSxzQkFBd0IsSUFBeEIsRUFBQSx3QkFJQUEsRUFBQUEsRUFBQSxxQkFBdUIsSUFBdkIsRUFBQSx1QkFJQUEsRUFBQUEsRUFBQSx1QkFBeUIsSUFBekIsRUFBQSx5QkFJQUEsRUFBQUEsRUFBQSx3QkFBMEIsSUFBMUIsRUFBQSwwQkFJQUEsRUFBQUEsRUFBQSx3QkFBMEIsSUFBMUIsRUFBQSwwQkFJQUEsRUFBQUEsRUFBQSxjQUFnQixJQUFoQixFQUFBLGdCQUlBQSxFQUFBQSxFQUFBLDBCQUE0QixJQUE1QixFQUFBLDRCQUlBQSxFQUFBQSxFQUFBLHdCQUEwQixJQUExQixFQUFBLDBCQUlBQSxFQUFBQSxFQUFBLDJCQUE2QixJQUE3QixFQUFBLDZCQWxJVUEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNJWixNQUFxQkMsRUFBcUIsQ0FHeEMsWUFDVW5CLEVBQ1IsQ0FKTUMsRUFBQSxvQkFBNkIsQ0FBQSxHQUczQixLQUFBLFFBQUFELENBQ1AsQ0FNSCx1QkFBdUJvQixFQUE0QyxDQUNqRSxZQUFLLGFBQWEsYUFBZUEsRUFDMUIsSUFDVCxDQVNBLFdBQVdDLEVBQWFDLEVBQW1DLENBQ3pELE1BQUksQ0FBQ0MsRUFBQUEsU0FBU0YsQ0FBRyxHQUFLLENBQUNFLEVBQUEsU0FBU0QsQ0FBRyxHQUFLQSxHQUFPLEdBQUtELEdBQU8sR0FBS0MsRUFBTUQsR0FDL0QsS0FBQSxRQUFRLE1BQU16QixFQUFvQixzQ0FBdUMsd0JBQXdCMEIsQ0FBRyxTQUFTRCxDQUFHLGlEQUFpRCxFQUMvSixPQUVULEtBQUssYUFBYSxXQUFhQSxFQUMvQixLQUFLLGFBQWEsV0FBYUMsRUFDeEIsS0FDVCxDQU1BLGNBQWNFLEVBQTBDLENBQ2xELE9BQUNELEVBQUFBLFNBQVNDLENBQVUsR0FJeEIsS0FBSyxhQUFhLFdBQWFBLEVBQ3hCLE9BSkwsS0FBSyxRQUFRLE1BQU01QixFQUFvQiwwQ0FBMkMsK0JBQStCNEIsQ0FBVSxFQUFFLEVBQ3RILEtBSVgsQ0FHQSxPQUFzQixDQUNwQixPQUFPLEtBQUssWUFDZCxDQUNGLENDbERBLE1BQXFCQyxFQUFxQixDQU14QyxZQUNVekIsRUFDUixDQVBNQyxFQUFBLG9CQUE2QixDQUNuQyxXQUFZeUIsRUFBcUIsYUFBQSxVQUNqQyxVQUFXQyxFQUFvQixZQUFBLE1BQUEsR0FJdkIsS0FBQSxRQUFBM0IsQ0FDUCxDQUdILGFBQWE0QixFQUFnRCxDQUN2RCxPQUFDRCxFQUFBQSxZQUFvQkMsQ0FBRyxHQUk1QixLQUFLLGFBQWEsVUFBWUEsRUFDdkIsT0FKTCxLQUFLLFFBQVEsTUFBTWhDLEVBQW9CLHlDQUEwQyx3QkFBd0JnQyxDQUFHLEVBQUUsRUFDdkcsS0FJWCxDQUdBLG1CQUFtQkMsRUFBd0QsQ0FDckUsT0FBQ0gsRUFBQUEsYUFBcUJHLENBQVUsR0FJcEMsS0FBSyxhQUFhLFdBQWFBLEVBQ3hCLE9BSkwsS0FBSyxRQUFRLE1BQU1qQyxFQUFvQix5Q0FBMEMsK0JBQStCaUMsQ0FBVSxFQUFFLEVBQ3JILEtBSVgsQ0FPQSxtQkFBbUJDLEVBQXdDLENBQ3pELFlBQUssYUFBYSxTQUFXQSxFQUN0QixJQUNULENBU0EsV0FBV1QsRUFBYUMsRUFBbUMsQ0FDekQsTUFBSSxDQUFDQyxFQUFBQSxTQUFTRixDQUFHLEdBQUssQ0FBQ0UsRUFBQSxTQUFTRCxDQUFHLEdBQUtBLEdBQU8sR0FBS0QsR0FBTyxHQUFLQyxFQUFNRCxHQUMvRCxLQUFBLFFBQVEsTUFBTXpCLEVBQW9CLHNDQUF1Qyx3QkFBd0IwQixDQUFHLFNBQVNELENBQUcsaURBQWlELEVBQy9KLE9BRVQsS0FBSyxhQUFhLFdBQWFBLEVBQy9CLEtBQUssYUFBYSxXQUFhQyxFQUN4QixLQUNULENBR0EsT0FBc0IsQ0FDcEIsT0FBTyxLQUFLLFlBQ2QsQ0FDRixDQ2xEYSxNQUFBUyxHQUFnQkMsR0FBd0QsQ0FDN0UsS0FBQSxDQUNKLE9BQUFDLEVBQ0EsU0FBQUMsRUFDQSxRQUFBQyxFQUNBLFVBQUFDLEVBQ0EsY0FBQUMsRUFDQSxZQUFBQyxFQUNBLFdBQUFDLEVBQ0EsY0FBQUMsRUFDQSxVQUFBQyxFQUNBLFFBQUFDLEVBQ0EsU0FBQUMsRUFDQSxXQUFBQyxFQUNBLFNBQUFDLEVBQ0EsVUFBQUMsRUFDQSxRQUFBQyxDQUNFLEVBQUFmLEVBQ0csTUFBQSxDQUNMLE9BQUFDLEVBQ0EsU0FBQUMsRUFDQSxjQUFlQyxFQUNmLFVBQUFDLEVBRUEsYUFBY0MsRUFDZCxZQUFBQyxFQUNBLGFBQWNDLEVBQ2QsVUFBV0MsRUFDWCxlQUFnQkMsRUFDaEIsYUFBY0MsRUFDZCxTQUFBQyxFQUNBLGNBQWVFLEVBQ2YsWUFBYUMsRUFDYixnQkFBaUJDLENBQUEsQ0FFckIsRUFZYUMsR0FBbUJ0QyxHQUF3QyxDQUNoRSxLQUFBLENBQUUsT0FBQXVCLEVBQVEsV0FBQU0sQ0FBZSxFQUFBN0IsRUFDekJ1QyxFQUE4QixDQUFBLEVBQzlCQyxFQUE0QixDQUFBLEVBQzVCQyxFQUE0QixDQUFBLEVBQzVCQyxFQUFvQyxDQUFBLEVBQ3JDLE9BQUExQyxFQUFBLGlCQUFpQixRQUFTMkMsR0FBUyxDQUN0QyxLQUFNLENBQUUsT0FBQWxELEVBQVEsY0FBQXFDLEVBQWUsVUFBQU0sQ0FBQSxFQUFjTyxFQUM3QyxPQUFRYixFQUFlLENBQ3JCLEtBQUszQixFQUEyQixRQUM5QnVDLEVBQWlCLEtBQUssQ0FDcEIsT0FBQW5CLEVBQ0EsT0FBQTlCLEVBQ0EsVUFBV3FDLENBQUEsQ0FDWixFQUNELE1BQ0YsS0FBSzNCLEVBQTJCLFFBRTlCb0MsRUFBWSxLQUFLLENBQUUsT0FBQWhCLEVBQVEsV0FBWTlCLENBQVEsQ0FBQSxFQUMvQyxNQUNGLEtBQUtVLEVBQTJCLFdBRTlCc0MsRUFBVyxLQUFLLENBQUUsV0FBWWhELENBQVEsQ0FBQSxFQUN0QyxNQUNGLEtBQUtVLEVBQTJCLFVBQ2hDLEtBQUtBLEVBQTJCLFNBQ2hDLEtBQUtBLEVBQTJCLE1BQ2hDLEtBQUtBLEVBQTJCLEtBQzlCcUMsRUFBVyxLQUFLLENBQ2QsT0FBQWpCLEVBQ0EsV0FBWTlCLEVBQ1osVUFBV3FDLEVBQ1gsWUFBYU0sQ0FBQSxDQUNkLEVBQ0QsS0FHSixDQUFBLENBQ0QsRUFFTSxDQUNMLFlBQUFHLEVBQ0EsV0FBQUMsRUFDQSxXQUFBQyxFQUNBLGlCQUFBQyxDQUFBLENBRUosRUFPYUUsR0FBeUJDLEdBQWlCQSxHQUFXQSxFQUFRLFVBQVlBLEVBQVEsU0FBUyxZQUFrQixJQUFBLFFBTTVHQyxHQUFtQixDQUFDQyxFQUE0QkMsSUFBK0IsQ0FDMUYsSUFBSUMsRUFBWSxHQUNoQixNQUFNQyxFQUFnQixDQUNwQjFDLEVBQWlCLFFBQ2pCQSxFQUFpQixRQUNqQkEsRUFBaUIsaUJBQ2pCQSxFQUFpQixjQUNqQkEsRUFBaUIsV0FDakJBLEVBQWlCLE1BQUEsRUFFbkIsT0FBUXVDLEVBQVUsQ0FDaEIsS0FBS3ZDLEVBQWlCLE9BQ2hCMEMsRUFBYyxTQUFTRixDQUFRLElBQ3JCQyxFQUFBLElBRWQsS0FHSixDQUNPLE9BQUFBLENBQ1QsRUFNYUUsR0FBb0IsQ0FBQ0osRUFBc0NDLElBQXlDLENBQy9HLElBQUlDLEVBQVksR0FDaEIsTUFBTUMsRUFBZ0IsQ0FDcEIvQyxFQUEyQixRQUMzQkEsRUFBMkIsUUFDM0JBLEVBQTJCLGlCQUMzQkEsRUFBMkIsY0FDM0JBLEVBQTJCLFdBQzNCQSxFQUEyQixNQUFBLEVBRTdCLE9BQVE0QyxFQUFVLENBQ2hCLEtBQUs1QyxFQUEyQixPQUMxQitDLEVBQWMsU0FBU0YsQ0FBUSxJQUNyQkMsRUFBQSxJQUVkLEtBR0osQ0FDTyxPQUFBQSxDQUNULEVBUWFHLEdBQXVCLENBQUMxRCxFQUF1QzJELElBQXNCLENBQzVGLElBQUFDLEVBQ0osT0FBUTVELEVBQVcsQ0FDakIsS0FBS1MsRUFBMkIsUUFDOUJtRCxFQUFjOUMsRUFBaUIsVUFDL0IsTUFDRixLQUFLTCxFQUEyQixRQUNoQyxLQUFLQSxFQUEyQixRQUM5Qm1ELEVBQWM5QyxFQUFpQixTQUMvQixNQUNGLEtBQUtMLEVBQTJCLFdBQ2hCbUQsRUFBQUQsRUFBVzdDLEVBQWlCLFNBQVdBLEVBQWlCLFVBQ3RFLE1BQ0YsS0FBS0wsRUFBMkIsT0FDOUJtRCxFQUFjOUMsRUFBaUIsTUFDL0IsS0FDSixDQUNPLE9BQUE4QyxDQUNULEVBS2FDLEdBQXdCQyxHQUF3QixDQUNyRCxLQUFBLENBQUUsYUFBQUMsQ0FBaUIsRUFBQUQsRUFDekIsR0FBSSxDQUFDQyxFQUNJLE1BQUEsR0FHVCxLQUFNLENBQUUsU0FBQUMsQ0FBYSxFQUFBLEtBQUssTUFBTUQsQ0FBWSxFQUM1QyxPQUFJQyxJQUFhLENBS25CLEVBRWFDLEdBQWtCLENBQUNDLEVBQXFCQyxLQUMvQ0QsR0FBY0EsSUFBZSxLQUMzQixDQUFDL0MsRUFBQUEsU0FBUytDLENBQVUsR0FBS0EsR0FBYyxHQUNsQyxDQUFFLEtBQU0zRSxFQUFlLFlBQWEsU0FBVSx1REFBdUQyRSxDQUFVLEtBSXRIQyxHQUFjQSxJQUFlLEtBQzNCLENBQUNoRCxFQUFBQSxTQUFTZ0QsQ0FBVSxHQUFLQSxHQUFjLEdBQ2xDLENBQUUsS0FBTTVFLEVBQWUsWUFBYSxTQUFVLHVEQUF1RDRFLENBQVUsSUFJdEhELEdBQWNDLEdBQWNBLEVBQWFELEVBQ3BDLENBQUUsS0FBTTNFLEVBQWUsWUFBYSxTQUFVLCtCQUErQjRFLENBQVUsaUJBQWlCRCxDQUFVLGtDQUFtQyxFQUd2SixDQUFFLEtBQU0zRSxFQUFlLFNBR25CNkUsR0FBd0JDLEdBQXdGLENBQzNILE1BQU1DLEVBQWtCLENBQUEsRUFDeEIsVUFBV3ZFLEtBQVVzRSxFQUFhLENBQ2hDLEtBQU0sQ0FBRSxVQUFBRSxFQUFXLE9BQUFDLENBQU8sRUFBSUgsRUFBWXRFLENBQU0sRUFDaER1RSxFQUFnQixLQUFLLENBQ25CLE9BQUF2RSxFQUNBLFVBQVd3RSxFQUFVLFNBQ3JCLE9BQUFDLENBQUEsQ0FDRCxDQUNILENBQ08sT0FBQUYsQ0FDVCxFQU9NRyxHQUFvQixDQUFDQyxFQUE0QixDQUFBLEVBQUlDLEVBQW9DLENBQUEsRUFBSUMsSUFBaUMsQ0FDNUgsS0FBQSxDQUNKLFNBQUFDLEVBQVUsZUFBQUMsRUFBZ0IsYUFBQUMsQ0FDeEIsRUFBQUwsRUFDRSxDQUNKLFlBQUFNLEVBQWEsWUFBQUMsRUFBYSxjQUFBQyxFQUFlLFNBQUFDLEVBQVUsYUFBQUMsRUFBYyxlQUFBQyxFQUFnQixZQUFBQyxFQUNqRixlQUFBQyxFQUFnQixhQUFBQyxFQUFjLFdBQUFDLEVBQVksV0FBQUMsRUFBWSxhQUFBQyxFQUFjLGdCQUFBQyxFQUFpQixjQUFBQyxDQUNuRixFQUFBbEIsRUFDRW1CLEVBQWdDLENBQUEsRUFDekJqQixJQUFBaUIsRUFBSyxXQUFXLEVBQUlqQixHQUM1QmlCLEVBQUEsa0JBQWtCLEVBQUloQixHQUFrQkYsRUFDN0NHLElBQWlCZSxFQUFLLGFBQWVmLEdBRXJDLE1BQU1nQixFQUE4QixDQUFBLEVBQ3BDZCxJQUFnQmMsRUFBRyxVQUFZZCxHQUMvQlMsSUFBZUssRUFBRyxNQUFRTCxHQUMxQkQsSUFBZU0sRUFBRyxTQUFXTixHQUM3Qk0sRUFBRyxXQUFhUCxHQUFnQixTQUVoQyxNQUFNUSxFQUFvQixDQUN4QixDQUNFLEdBQUFELENBQ0YsRUFDQSxDQUNFLEtBQUFELENBQ0YsQ0FBQSxFQUdFLElBQUFHLEdBQ0FaLEdBQWtCQyxHQUFlRixLQUNuQ2EsRUFBTSxDQUFBLEVBQ05aLElBQW1CWSxFQUFJLGFBQWVaLEdBQ3RDQyxJQUFnQlcsRUFBSSxTQUFXWCxHQUMvQkYsSUFBaUJhLEVBQUksVUFBWWIsR0FDcEJZLEVBQUEsQ0FBQyxFQUFFLElBQU1DLEdBR3BCLElBQUFDLEdBQ0FsQixHQUFlTyxLQUNqQlcsRUFBSyxDQUFBLEVBQ0xsQixJQUFnQmtCLEVBQUcsVUFBWWxCLEdBQy9CTyxJQUFtQlcsRUFBRyxlQUFpQlgsR0FDMUJTLEVBQUEsQ0FBQyxFQUFFLEdBQUtFLEdBR25CLElBQUFDLEdBQ0FqQixJQUNGaUIsR0FBTyxDQUFBLEVBQ1BBLEdBQUssVUFBWWpCLEVBQ0pjLEVBQUEsQ0FBQyxFQUFFLEtBQU9HLElBR3JCLElBQUFDLEdBQ0FqQixHQUFZUSxLQUNkUyxFQUFPLENBQUEsRUFDUGpCLElBQWFpQixFQUFLLGVBQWlCakIsR0FDbkNRLElBQWlCUyxFQUFLLFNBQVdULEdBQ3BCSyxFQUFBLENBQUMsRUFBRSxLQUFPSSxHQUdyQixJQUFBQyxFQUNKLE9BQUlULEdBQW1CQyxLQUNyQlEsRUFBUSxDQUFBLEVBQ1JULElBQW9CUyxFQUFNLFdBQWFULEdBQ3ZDQyxJQUFrQlEsRUFBTSxNQUFRUixHQUNuQkcsRUFBQSxDQUFDLEVBQUUsTUFBUUssR0FHbkIsS0FBSyxVQUFVTCxDQUFZLENBQ3BDLEVBS2FNLEdBQXFCLENBQUNDLEVBQW1DM0IsSUFBeUIsQ0FDdkYsS0FBQSxDQUNKLFVBQUE0QixFQUFZLEdBQUksVUFBQTlCLEVBQVcsY0FBQUMsRUFBZSxpQkFBQThCLEVBQWtCLFdBQUFDLENBQzFELEVBQUFILEVBQ0VJLEVBQWUsQ0FDbkIsWUFBYWxDLEdBQWtCQyxFQUFXQyxFQUFlQyxDQUFZLENBQUEsRUFFN0RnQyxPQUFBQSxFQUFBQSxVQUFBSCxDQUFnQixJQUFNRSxFQUFRLGFBQWVGLEdBQ3ZERCxJQUFjRyxFQUFRLE1BQVFILEdBQzlCRSxJQUFlQyxFQUFRLFdBQWFELEdBQzdCLEtBQUssVUFBVUMsQ0FBTyxDQUMvQixFQUthRSxHQUFzQk4sR0FBc0MsQ0FDdkUsTUFBTU8sRUFBaUIsQ0FBQyxZQUFhLFlBQWEsZ0JBQWlCLG1CQUFvQixZQUFZLEVBRW5HLEdBQUksQ0FEZSxPQUFPLEtBQUtQLENBQVUsRUFBRSxNQUFPUSxHQUFRRCxFQUFlLFNBQVNDLENBQUcsQ0FBQyxFQUU3RSxNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxjQUFjdUgsRUFBZSxLQUFLLEdBQUcsQ0FBQyxFQUFBLEVBSXBELFFBQVNFLEVBQVEsRUFBR0EsRUFBUUYsRUFBZSxPQUFRRSxJQUFTLENBQ3BELE1BQUFELEVBQU1ELEVBQWVFLENBQUssRUFJaEMsR0FBSUQsSUFBUSxvQkFDTixHQUFBLENBQUNFLEVBQUFBLFlBQVlWLEVBQVdRLENBQUcsQ0FBQyxHQUFLLENBQUNILFlBQVVMLEVBQVdRLENBQUcsQ0FBQyxFQUN0RCxNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxHQUFHd0gsQ0FBRyxrQkFBQSxXQUdYQSxJQUFRLGFBQ2RBLElBQVEsZUFJUFIsRUFBV1EsQ0FBRyxHQUFLLENBQUNHLFdBQVNYLEVBQVdRLENBQUcsQ0FBQyxFQUN2QyxNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxHQUFHd0gsQ0FBRyxpQkFBQSxDQUl4QixDQUNNLEtBQUEsQ0FBRSxVQUFBckMsRUFBVyxjQUFBQyxDQUFrQixFQUFBNEIsRUFLL0JZLEVBQXVCQyxHQUFrQjFDLEdBQWEsQ0FBRSxDQUFBLEVBQzFELEdBQUF5QyxFQUFxQixPQUFTNUgsRUFBZSxRQUN4QyxPQUFBNEgsRUFNVCxNQUFNRSxFQUEyQkMsR0FBc0IzQyxHQUFpQixDQUFFLENBQUEsRUFDdEUsT0FBQTBDLEVBQXlCLE9BQVM5SCxFQUFlLFFBQzVDOEgsRUFHRixDQUFFLEtBQU05SCxFQUFlLFFBQ2hDLEVBRU02SCxHQUFxQjFDLEdBQThCLENBQ3ZELEtBQU0sQ0FBRSxTQUFBRyxFQUFVLGFBQUFFLEdBQWlCTCxHQUFhLENBQUEsRUFDaEQsT0FBSUcsR0FBWSxDQUFDcUMsV0FBU3JDLENBQVEsRUFDekIsQ0FDTCxLQUFNdEYsRUFBZSxZQUNyQixTQUFVLG1DQUFBLEVBSVZ3RixHQUFnQixDQUFDbUMsV0FBU25DLENBQVksRUFDakMsQ0FDTCxLQUFNeEYsRUFBZSxZQUNyQixTQUFVLHVDQUFBLEVBR1AsQ0FBRSxLQUFNQSxFQUFlLFFBQ2hDLEVBRU0rSCxHQUF5QjNDLEdBQXVCLENBQ3BELE1BQU00QyxFQUFvQixDQUFDLGNBQWUsaUJBQWtCLGNBQWUsYUFBYyxlQUFnQixhQUFjLGdCQUFpQixXQUFZLGVBQWdCLGVBQWdCLGlCQUFrQixjQUFlLGtCQUFtQixlQUFlLEVBRXZQLEdBQUksQ0FEZSxPQUFPLEtBQUs1QyxDQUFhLEVBQUUsTUFBT29DLEdBQVFRLEVBQWtCLFNBQVNSLENBQUcsQ0FBQyxFQUVuRixNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxjQUFjZ0ksRUFBa0IsS0FBSyxHQUFHLENBQUMsRUFBQSxFQUl2RCxRQUFTUCxFQUFRLEVBQUdBLEVBQVFPLEVBQWtCLE9BQVFQLElBQVMsQ0FDdkQsTUFBQUQsRUFBTVEsRUFBa0JQLENBQUssRUFDL0IsR0FBQUQsSUFBUSxnQkFBa0JBLElBQVEsbUJBQ2hDLEdBQUFwQyxFQUFjb0MsQ0FBRyxHQUFLcEMsRUFBY29DLENBQUcsSUFBTSxPQUFTcEMsRUFBY29DLENBQUcsSUFBTSxTQUN4RSxNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxpQkFBaUJ3SCxDQUFHLHNCQUFBLFVBR3pCcEMsRUFBY29DLENBQUcsR0FBSyxDQUFDRyxFQUFBQSxTQUFTdkMsRUFBY29DLENBQUcsQ0FBQyxFQUlwRCxNQUFBLENBQ0wsS0FBTXhILEVBQWUsWUFDckIsU0FBVSxpQkFBaUJ3SCxDQUFHLGlCQUFBLENBR3BDLENBQ08sTUFBQSxDQUFFLEtBQU14SCxFQUFlLFFBQ2hDLEVBRWFpSSxHQUFnQixDQUFDQyxFQUFhQyxFQUFrQixVQUFZLENBQ3ZFLElBQUlDLEVBQVEsRUFDWixPQUFJRCxJQUFZLFNBQ2RDLEVBQVFDLEdBQXlCSCxDQUFHLEVBRXBDRSxFQUFRRSxHQUF3QkosQ0FBRyxFQUU5QkUsQ0FDVCxFQUVNQyxHQUE0QkgsR0FBZ0IsQ0FDaEQsSUFBSUUsRUFBUSxFQUFPRyxFQUNuQixRQUFTQyxFQUFJLEVBQUc3RyxFQUFNdUcsRUFBSSxPQUFRTSxFQUFJN0csRUFBSzZHLElBQzlCRCxFQUFBTCxFQUFJLFdBQVdNLENBQUMsRUFDdkJELEdBQVksTUFDTEgsR0FBQSxFQUVBQSxHQUFBLEVBR04sT0FBQUEsQ0FDVCxFQUVNRSxHQUEyQkosR0FBZ0IsQ0FDL0MsSUFBSUUsRUFBUSxFQUFPRyxFQUNuQixRQUFTQyxFQUFJLEVBQUc3RyxFQUFNdUcsRUFBSSxPQUFRTSxFQUFJN0csRUFBSzZHLElBQzlCRCxFQUFBTCxFQUFJLFdBQVdNLENBQUMsRUFDdkJELEVBQVcsSUFDSkgsR0FBQSxFQUNBRyxHQUFZLEtBQ1pILEdBQUEsRUFDQUcsR0FBWSxNQUNaSCxHQUFBLEVBRUFBLEdBQUEsRUFHTixPQUFBQSxDQUNULEVDcGVZLElBQUFLLEdBQUFBLElBSVZBLEVBQUEsa0JBQW9CLGVBSXBCQSxFQUFBLG1CQUFxQixnQkFJckJBLEVBQUEsbUJBQXFCLGdCQUlyQkEsRUFBQSxvQkFBc0IsY0FJdEJBLEVBQUEsdUJBQXlCLG1CQXBCZkEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNPWixNQUFxQkMsRUFBcUIsQ0FDeEMsWUFDbUJySSxFQUNBc0ksRUFDakIsQ0FGaUIsS0FBQSxRQUFBdEksRUFDQSxLQUFBLFNBQUFzSSxDQUVuQixDQUVPLHFCQUNMQyxFQUNBL0gsRUFDQWlDLEVBQ0ErRixFQUNBeEQsRUFDQXlELEVBQ0FDLEVBS0EsQ0FDTSxNQUFBQyxFQUFVLENBQUMsSUFBSSxLQUNmLENBQUUsVUFBQXZHLEVBQVcsU0FBQUYsRUFBVSxPQUFBRCxDQUFXLEVBQUF1RyxFQUFVLENBQUUsVUFBV0EsRUFBUSxhQUFnQixFQUFBLFNBQVVBLEVBQVEsY0FBZSxPQUFRQSxFQUFRLFVBQUEsQ0FBZ0IsRUFBQUUsRUFDbEpFLEVBQWEsQ0FDakIsR0FBSSxVQUNKLElBQUssVUFDTCxJQUFLcEksRUFDTCxJQUFLNEIsRUFDTCxJQUFLRixFQUNMLElBQUtELEVBQ0wsS0FBTTBHLEVBQ04sSUFBSyxLQUFLLFNBQVMsYUFBYSxDQUFBLEVBR2xDM0QsR0FBZ0IsT0FBTyxPQUFPNEQsRUFBWSxDQUFFLEtBQU01RCxFQUFjLEVBRWhFLElBQUl0RSxFQUFPLEtBRVgsT0FBUTZILEVBQUssQ0FJWCxLQUFLSCxFQUF3QixvQkFDcEIxSCxFQUFBLENBQ0wsR0FBR2tJLEVBQ0gsR0FBSUgsQ0FBQSxFQUVOLE1BSUYsS0FBS0wsRUFBd0IsdUJBQ3BCMUgsRUFBQSxDQUNMLEdBQUdrSSxDQUFBLEVBRUwsTUFDRixRQUlTbEksRUFBQSxDQUNMLEdBQUdrSSxFQUNILElBQUtELEVBQVVsRyxDQUFBLENBRXJCLENBRUEsS0FBSyxRQUFRLEtBQUssd0JBQXlCLEtBQUssVUFBVS9CLENBQUksRUFBRzZILENBQUcsRUFFcEUsS0FBSyxRQUFRLGFBQWFBLEVBQUssS0FBSyxVQUFVN0gsQ0FBSSxDQUFDLENBQ3JELENBQ0YsQ0N6RVksSUFBQW1JLEdBQUFBLElBSVZBLEVBQUEsUUFBVSxVQUlWQSxFQUFBLE9BQVMsU0FJVEEsRUFBQSxPQUFTLFNBSVRBLEVBQUEsT0FBUyxTQUlUQSxFQUFBLE9BQVMsU0FJVEEsRUFBQSxRQUFVLFVBeEJBQSxJQUFBQSxHQUFBLENBQUEsQ0FBQSxFQ0FBQyxHQUFBQSxJQUNWQSxFQUFBQSxFQUFBLGtCQUFvQixDQUFwQixFQUFBLG9CQURVQSxJQUFBQSxHQUFBLENBQUEsQ0FBQSxFQ0FBQyxJQUFBQSxJQUlWQSxFQUFBQyxFQUFBLE9BQUEsQ0FBQSxFQUFBLFNBSUFELEVBQUFDLEVBQUEsT0FBQSxDQUFBLEVBQUEsU0FSVUQsSUFBQUEsSUFBQSxDQUFBLENBQUEsRUNRQUUsSUFBQUEsSUFDVkEsRUFBQSxRQUFVLFVBQ1ZBLEVBQUEsUUFBVSxVQUZBQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQWNMLE1BQU1DLFdBQTJCQyxFQUFBQSxZQUFhLENBa0NuRCxZQUltQkMsRUFJVEMsRUFJQUMsRUFJQUMsRUFJQUMsRUFJQUMsRUFJQUMsRUFDUzFKLEVBQ2pCLENBQ00sUUE3REFDLEVBQUEsc0JBS0FBLEVBQUEsd0JBS0FBLEVBQUEsd0JBVUFBLEVBQUEsdUJBS0FBLEVBQUEsMkJBQStCLElBU3BCLEtBQUEsUUFBQW1KLEVBSVQsS0FBQSxPQUFBQyxFQUlBLEtBQUEsVUFBQUMsRUFJQSxLQUFBLFdBQUFDLEVBSUEsS0FBQSxlQUFBQyxFQUlBLEtBQUEsVUFBQUMsRUFJQSxLQUFBLFdBQUFDLEVBQ1MsS0FBQSxRQUFBMUosQ0FHbkIsQ0FLTyxXQUFvQixDQUN6QixPQUFPLEtBQUssT0FDZCxDQUtPLGlCQUF1QyxDQUM1QyxPQUFPLEtBQUssTUFDZCxDQUtPLGFBQThCLENBQ25DLE9BQU8sS0FBSyxTQUNkLENBS08sY0FBb0MsQ0FDekMsT0FBTyxLQUFLLFVBQ2QsQ0FLTyxrQkFBMkIsQ0FDaEMsT0FBTyxLQUFLLGNBQ2QsQ0FLTyxhQUFzQixDQUMzQixPQUFPLEtBQUssU0FDZCxDQUtPLGFBQThCLENBQ25DLE9BQU8sS0FBSyxVQUNkLENBS08saUJBQThDLENBQ25ELE9BQU8sS0FBSyxhQUNkLENBS08sbUJBQTRCLENBQ2pDLE9BQU8sS0FBSyxlQUNkLENBS08sbUJBQTRCLENBQ2pDLE9BQU8sS0FBSyxlQUNkLENBRU8sZ0JBQTJCLENBQ2hDLE1BQU8sQ0FBQyxLQUFLLGdCQUFpQixLQUFLLGVBQWUsQ0FDcEQsQ0FFTyxvQkFBb0JHLEVBQWdCaUMsRUFBZ0N1SCxFQUFpQnBKLEVBQWlCLENBQ3RHLEtBQUEsUUFBUSxLQUFLWCxFQUFvQix5Q0FBMEMsV0FBV08sQ0FBTSxnQkFBZ0JpQyxDQUFTLGFBQWF1SCxDQUFNLEdBQUlwSixDQUFPLEVBQ2xKLE1BQUFILEVBQVksS0FBSyxXQUFXLEtBQU1pRCxHQUFTbEQsSUFBV2tELEVBQUssTUFBTSxFQUNuRWpCLElBQWN0QixFQUFvQixNQUNwQ1YsRUFBVyxpQkFBbUJ1SixFQUU5QnZKLEVBQVcsYUFBZXVKLENBRTlCLENBT08sZUFBZUMsRUFBdUJySixFQUFpQyxDQUM1RSxNQUFNc0osRUFBK0IsQ0FBQSxFQUMvQixPQUFBRCxFQUFBLFFBQVMxSixHQUFTLENBQ2hCLEtBQUEsQ0FDSixVQUFXNEosRUFDWCxVQUFXQyxFQUNYLFlBQWFDLENBQ1gsRUFBQTlKLEVBRUEsR0FEa0IsQ0FBQ1csRUFBMkIsUUFBU0EsRUFBMkIsUUFBU0EsRUFBMkIsYUFBYSxFQUNySCxTQUFTaUosQ0FBWSxFQUVoQyxLQUFBLFFBQVEsS0FBS2xLLEVBQW9CLG9DQUFxQyxjQUFjLEtBQUssVUFBVU0sQ0FBSSxDQUFDLEdBQUlLLENBQU8sRUFDbkgsS0FBQSxXQUFXLEtBQUtMLENBQUksRUFDekIySixFQUFhLEtBQUszSixDQUFJLE1BQ2pCLENBRUwsSUFBSStKLEVBQVUsR0FDZCxRQUFTOUIsRUFBSSxFQUFHQSxFQUFJLEtBQUssV0FBVyxPQUFRQSxJQUFLLENBQ3pDLEtBQUEsQ0FDSixPQUFBaEksRUFBUSxVQUFXK0osRUFBYyxZQUFhQyxFQUFnQixVQUFXQyxDQUFBLEVBQ3ZFLEtBQUssV0FBV2pDLENBQUMsRUFDakIsR0FBQWhJLElBQVdELEVBQUssT0FBUSxDQUNoQitKLEVBQUEsR0FDSixNQUFBSSxFQUFvQjdHLEdBQWlCMkcsRUFBZ0JILENBQVcsRUFDaEVNLEVBQXFCekcsR0FBa0J1RyxFQUFjTixDQUFZLEVBRWpFUyxFQUFzQlAsSUFBZ0I5SSxFQUFpQixjQUFnQmlKLElBQW1CakosRUFBaUIsVUFBWTRJLElBQWlCakosRUFBMkIsS0FNekssR0FBS2tKLEdBQWdCRyxHQUFnQkgsRUFBZUcsR0FBa0JHLEdBQXFCQyxFQUFxQixDQUMxRyxHQUFBLENBQ0YsS0FBSyxRQUFRLEtBQUsxSyxFQUFvQixvQ0FBcUMsMkJBQTJCLEtBQUssVUFBVSxDQUNuSCxPQUFBTyxFQUFRLGFBQUErSixFQUFjLGVBQUFDLEVBQWdCLGFBQUFDLENBQUEsQ0FDdkMsQ0FBQyxTQUFTLEtBQUssVUFBVWxLLENBQUksQ0FBQyxHQUFJSyxDQUFPLFFBQ25DaUssRUFBSyxDQUNQLEtBQUEsUUFBUSxNQUFNNUssRUFBb0Isb0NBQXFDLHVCQUF3QjRLLEVBQWMsT0FBTyxHQUFJakssQ0FBTyxDQUN0SSxDQUNBLEtBQUEsS0FDSyxDQUVBLEtBQUEsUUFBUSxLQUFLWCxFQUFvQixvQ0FBcUMsMkJBQTJCLEtBQUssVUFBVU0sQ0FBSSxDQUFDLEdBQUlLLENBQU8sRUFDaEksS0FBQSxXQUFXNEgsQ0FBQyxFQUFJakksRUFDcEIsQ0FBQXFLLEdBQXVCVixFQUFhLEtBQUszSixDQUFJLEVBQzlDLEtBQ0YsQ0FDRixDQUNGLENBRUsrSixJQUNFLEtBQUEsUUFBUSxLQUFLckssRUFBb0Isb0NBQXFDLGlDQUFpQyxLQUFLLFVBQVVNLENBQUksQ0FBQyxHQUFJSyxDQUFPLEVBQ3RJLEtBQUEsV0FBVyxLQUFLTCxDQUFJLEVBQ3pCMkosRUFBYSxLQUFLM0osQ0FBSSxFQUUxQixDQUFBLENBQ0QsRUFDTTJKLENBQ1QsQ0FFTyxpQkFBaUJuSixFQUFzQixDQUM1QyxLQUFLLGVBQWlCQSxDQUN4QixDQU1PLG1CQUFtQitKLEVBQTRCLENBQ3BELEtBQUssT0FBU0EsQ0FDaEIsQ0FLTyxlQUFldkksRUFBMEIsQ0FDOUMsS0FBSyxVQUFZQSxDQUNuQixDQUtPLGdCQUFnQkUsRUFBZ0MsQ0FDckQsS0FBSyxXQUFhQSxDQUNwQixDQUtPLG1CQUFtQkEsRUFBdUMsQ0FDL0QsS0FBSyxjQUFnQkEsQ0FDdkIsQ0FLTyxjQUFjc0ksRUFBMEJDLEVBQWlCLENBQzFERCxJQUFTLFVBQ1gsS0FBSyxnQkFBa0JDLEVBRXZCLEtBQUssZ0JBQWtCQSxDQUUzQixDQUtPLGtCQUFtQyxDQUN4QyxPQUFPLEtBQUssY0FDZCxDQUtPLHVCQUF1QkMsRUFBOEIsQ0FDMUQsS0FBSyxvQkFBc0JBLENBQzdCLENBRU8sd0JBQWtDLENBQ3ZDLE9BQU8sS0FBSyxtQkFDZCxDQUNGLENDaFRZLElBQUFDLEdBQUFBLElBSVZBLEVBQUEsa0JBQW9CLGtCQUlwQkEsRUFBQSxpQkFBbUIsaUJBSW5CQSxFQUFBLFlBQWMsYUFJZEEsRUFBQSxnQkFBa0IsZ0JBSWxCQSxFQUFBLGFBQWUsV0FJZkEsRUFBQSxZQUFjLGFBSWRBLEVBQUEsVUFBWSxXQUlaQSxFQUFBLFlBQWMsYUFJZEEsRUFBQSxlQUFpQixlQUlqQkEsRUFBQSxpQkFBbUIsaUJBSW5CQSxFQUFBLGNBQWdCLGNBSWhCQSxFQUFBLGdCQUFrQixnQkFJbEJBLEVBQUEsZUFBaUIsZUFJakJBLEVBQUEsaUJBQW1CLGlCQUluQkEsRUFBQSwyQkFBNkIseUJBSTdCQSxFQUFBLGNBQWdCLGNBSWhCQSxFQUFBLGFBQWUsYUFJZkEsRUFBQSxhQUFlLGdCQUlmQSxFQUFBLGVBQWlCLG1CQUlqQkEsRUFBQSxrQkFBb0Isc0JBSXBCQSxFQUFBLG9CQUFzQix1QkFJdEJBLEVBQUEsZUFBaUIsZUFJakJBLEVBQUEsaUJBQW1CLGlCQUluQkEsRUFBQSxtQkFBcUIsa0JBSXJCQSxFQUFBLGtCQUFvQix1QkFJcEJBLEVBQUEsY0FBZ0IsY0FJaEJBLEVBQUEsbUJBQXFCLGtCQUlyQkEsRUFBQSxvQkFBc0IsbUJBSXRCQSxFQUFBLGdCQUFrQixlQUlsQkEsRUFBQSw4QkFBZ0MsMkJBeEh0QkEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUNBTCxNQUFNQyxHQUFrQixDQUFDQyxFQUFnQkMsSUFBNEIsV0FBV0QsRUFBTUMsQ0FBTyxFQUl2RkMsR0FBU0MsR0FBd0IsSUFBSSxRQUFTQyxHQUFZLENBQ3JFLFdBQVdBLEVBQVNELENBQVcsQ0FDakMsQ0FBQyxFQ2dDS0UsR0FBbUMsQ0FJdkNDLEVBQUFBLFVBQVUsdUJBQ1ZBLEVBQUFBLFVBQVUsbUJBQ1ZBLEVBQUFBLFVBQVUsb0JBSVZDLEVBQUFBLFVBQVUsb0JBQ1ZBLEVBQUFBLFVBQVUsY0FFWixFQVVhQyxFQUFlLE1BQTJDLENBQ3JFLFFBQUFDLEVBQ0EsT0FBQUMsRUFDQSxpQkFBQUMsRUFBbUIsS0FBSyxJQUFJLEVBQzVCLFlBQUFDLEVBQWMsR0FBSyxJQUNuQixVQUFBQyxFQUFZLENBQUMsRUFBSSxJQUFNLEVBQUksSUFBTSxFQUFJLElBQU0sR0FBSyxJQUFNLEdBQUssSUFBTSxHQUFLLEdBQUksRUFDMUUsTUFBQXhFLEVBQVEsRUFDUixRQUFBeUUsQ0FDRixJQUFnQyxDQUM5QixNQUFNQyxFQUFNLE1BQU1OLEVBQVEsR0FBR0MsQ0FBTSxFQUk3Qk0sRUFBTSxFQUFJLElBS2hCLE9BSmtDRCxFQUFJLE9BQVNuTSxFQUFlLFNBQ3pELENBQUN5TCxHQUFjLFNBQVNVLEVBQUksSUFBSSxHQUM5QixLQUFLLElBQUksRUFBSUMsRUFBTUwsRUFBb0JDLEVBZXZDRyxHQVpNRCxHQUFBQSxFQUFRQyxFQUFJLElBQUksRUFDM0IsTUFBTWIsR0FBTWMsQ0FBRyxFQUNSUixFQUFhLENBQ2xCLFFBQUFDLEVBQ0EsT0FBQUMsRUFDQSxpQkFBQUMsRUFDQSxZQUFBQyxFQUNBLFVBQUFDLEVBQ0EsTUFBQXhFLEVBQ0EsUUFBQXlFLENBQUEsQ0FDRCxFQUdMLEVDM0ZZLElBQUFHLEdBQUFBLElBQ1ZBLEVBQUEsZ0JBQWtCLGtCQUNsQkEsRUFBQSxhQUFlLGVBQ2ZBLEVBQUEsZ0JBQWtCLGtCQUNsQkEsRUFBQSxzQkFBd0Isd0JBQ3hCQSxFQUFBLG9CQUFzQixzQkFMWkEsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUFRQUMsSUFBQUEsSUFDVkEsRUFBQSxxQkFBdUIsd0JBQ3ZCQSxFQUFBLFlBQWMsY0FDZEEsRUFBQSxZQUFjLGlCQUhKQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQU1BQyxHQUFBQSxJQUNWQSxFQUFBLFdBQWEsZ0JBQ2JBLEVBQUEsZUFBaUIsb0JBQ2pCQSxFQUFBLEtBQU8sZUFIR0EsSUFBQUEsR0FBQSxDQUFBLENBQUEsRUMrQkwsTUFBTUMsV0FBMEJoRCxFQUFBQSxZQUFhLENBc0JsRCxZQUNtQmIsRUFDQThELEVBQ0FDLEVBQ0FDLEVBQ0F0TSxFQUNqQixDQUNNLFFBekJSQyxFQUFBLGtCQUtBQSxFQUFBLHlCQUF3QyxDQUN0QzRLLEVBQWlCLGtCQUNqQkEsRUFBaUIsaUJBQ2pCQSxFQUFpQixZQUNqQkEsRUFBaUIsVUFDakJBLEVBQWlCLGFBQUEsR0FHbkI1SyxFQUFBLGtCQUFxQixJQU1GLEtBQUEsU0FBQXFJLEVBQ0EsS0FBQSxTQUFBOEQsRUFDQSxLQUFBLFVBQUFDLEVBQ0EsS0FBQSxrQkFBQUMsRUFDQSxLQUFBLFFBQUF0TSxFQUdqQixLQUFLLFNBQVMsV0FBYSxLQUFLLGtCQUFrQixLQUFLLElBQUksRUFDM0QsS0FBSyxTQUFTLHdCQUEwQixLQUFLLDJCQUEyQixLQUFLLElBQUksRUFDakYsS0FBSyxXQUFhdU0sRUFBQUEsV0FDcEIsQ0FFQSxjQUFlLENBQ2IsT0FBTyxLQUFLLFVBQ2QsQ0FFTyxpQkFBaUJDLEVBQXNDLENBQzVELEtBQUssVUFBWUEsQ0FDbkIsQ0FFQSxNQUFhLFVBQVVDLEVBQW9CbE0sRUFBZ0UsQ0FDbkcsS0FBQSxDQUNKLGFBQUF5RSxFQUFjLFNBQUE5QyxFQUFVLFFBQUF3SyxFQUFTLFVBQUF0SyxFQUFXLFdBQUFRLEVBQVksV0FBQStKLEVBQVksU0FBQUMsRUFBVSxTQUFBQyxFQUFVLFVBQUFDLEVBQVcsUUFBQS9GLEVBQVMsTUFBQTJCLENBQzFHLEVBQUErRCxFQUNBLE9BQUF2SyxJQUFhdkIsRUFBZSxPQUN2QixLQUFLLGdCQUFnQixDQUMxQixhQUFBcUUsRUFDQSxTQUFVMEgsRUFBUSxDQUFDLEVBQUUsT0FDckIsVUFBQXRLLEVBQ0EsV0FBQVEsRUFDQSxXQUFBK0osRUFDQSxTQUFBQyxFQUNBLFVBQUFFLEVBQ0EsUUFBU0osRUFBUSxDQUFDLEVBQUUsT0FBUyxHQUM3QixRQUFBM0YsRUFDQSxNQUFBMkIsR0FDQ25JLENBQU8sRUFFTCxLQUFLLGVBQWUsQ0FDekIsYUFBQXlFLEVBQ0EsUUFBQTBILEVBQ0EsVUFBQXRLLEVBQ0EsV0FBQXVLLEVBQ0EsU0FBQUMsRUFDQSxTQUFBQyxFQUNBLFVBQUFDLEVBQ0EsUUFBQS9GLEVBQ0EsTUFBQTJCLEdBQ0NuSSxDQUFPLENBQ1osQ0FFQSxNQUFhLGdCQUFnQmtNLEVBQXNCbE0sRUFBZ0UsQ0FDNUcsWUFBQSxRQUFRLEtBQUtYLEVBQW9CLG1DQUFvQyxXQUFXLEtBQUssVUFBVTZNLENBQUcsQ0FBQyxHQUFJbE0sQ0FBTyxFQUM1RyxLQUFLLGdCQUFnRCxLQUFLLFNBQVMsZUFBZ0JzSyxFQUFpQixrQkFBbUI0QixDQUFHLENBQ25JLENBRUEsTUFBYSxlQUFlQSxFQUFxQmxNLEVBQWdFLENBQzFHLFlBQUEsUUFBUSxLQUFLWCxFQUFvQixrQ0FBbUMsV0FBVyxLQUFLLFVBQVU2TSxDQUFHLENBQUMsR0FBSWxNLENBQU8sRUFDM0csS0FBSyxnQkFBK0MsS0FBSyxTQUFTLGVBQWdCc0ssRUFBaUIsaUJBQWtCNEIsQ0FBRyxDQUNqSSxDQUVBLE1BQWEsV0FBV0EsRUFBcUJsTSxFQUFpRSxDQUN2RyxZQUFBLFFBQVEsS0FBS1gsRUFBb0IsOEJBQStCLFdBQVcsS0FBSyxVQUFVNk0sQ0FBRyxDQUFDLEdBQUlsTSxDQUFPLEVBQ3ZHLEtBQUssZ0JBQWdEa00sRUFBSSxPQUFRNUIsRUFBaUIsWUFBYTRCLENBQUcsQ0FDM0csQ0FFQSxNQUFhLFlBQVlBLEVBQXNCbE0sRUFBMEMsQ0FDbEYsWUFBQSxRQUFRLEtBQUtYLEVBQW9CLDRCQUE2QixXQUFXLEtBQUssVUFBVTZNLENBQUcsQ0FBQyxHQUFJbE0sQ0FBTyxFQUNyRyxLQUFLLGdCQUE0Q2tNLEVBQUksT0FBUTVCLEVBQWlCLGFBQWM0QixDQUFHLENBQ3hHLENBRUEsTUFBYSxXQUFXQSxFQUFxQmxNLEVBQTBDLENBQ2hGLFlBQUEsUUFBUSxLQUFLWCxFQUFvQiw4QkFBK0IsV0FBVyxLQUFLLFVBQVU2TSxDQUFHLENBQUMsR0FBSWxNLENBQU8sRUFDdkcsS0FBSyxnQkFBMkNrTSxFQUFJLE9BQVE1QixFQUFpQixZQUFhNEIsQ0FBRyxDQUN0RyxDQUVBLE1BQWEsU0FBU0EsRUFBbUJsTSxFQUEwQyxDQUM1RSxZQUFBLFFBQVEsS0FBS1gsRUFBb0IsaUNBQWtDLFdBQVcsS0FBSyxVQUFVNk0sQ0FBRyxDQUFDLEdBQUlsTSxDQUFPLEVBQzFHLEtBQUssZ0JBQXlDa00sRUFBSSxPQUFRNUIsRUFBaUIsVUFBVzRCLENBQUcsQ0FDbEcsQ0FFQSxNQUFhLFdBQVdBLEVBQXFCbE0sRUFBMEMsQ0FDaEYsS0FBQSxRQUFRLEtBQUtYLEVBQW9CLDhCQUErQixXQUFXLEtBQUssVUFBVTZNLENBQUcsQ0FBQyxHQUFJbE0sQ0FBTyxFQUN4RyxLQUFBLENBQUUsS0FBQUMsQ0FBSyxFQUFJLE1BQU0sS0FBSyxnQkFBMkNpTSxFQUFJLE9BQVE1QixFQUFpQixZQUFhNEIsQ0FBRyxFQUNoSCxPQUFBak0sSUFBU2IsRUFBZSxZQUVuQixDQUFFLEtBQU1BLEVBQWUsU0FFekIsQ0FBRSxLQUFBYSxDQUFLLENBQ2hCLENBRUEsTUFBYSxhQUFhaU0sRUFBbUJsTSxFQUEwQyxDQUNoRixZQUFBLFFBQVEsS0FBS1gsRUFBb0Isc0NBQXVDLDBCQUEwQixLQUFLLFVBQVU2TSxDQUFHLENBQUMsR0FBSWxNLENBQU8sRUFDOUgsS0FBSyxnQkFBeUNrTSxFQUFJLE9BQVE1QixFQUFpQixlQUFnQjRCLENBQUcsQ0FDdkcsQ0FFQSxNQUFhLFlBQVlBLEVBQXNCbE0sRUFBMEMsQ0FDbEYsWUFBQSxRQUFRLEtBQUtYLEVBQW9CLHFDQUFzQyxXQUFXLEtBQUssVUFBVTZNLENBQUcsQ0FBQyxHQUFJbE0sQ0FBTyxFQUM5RyxLQUFLLGdCQUE0Q2tNLEVBQUksT0FBUTVCLEVBQWlCLGNBQWU0QixDQUFHLENBQ3pHLENBRUEsTUFBYSxhQUFhQSxFQUF1QmxNLEVBQTBDLENBQ3BGLFlBQUEsUUFBUSxLQUFLWCxFQUFvQixzQ0FBdUMsV0FBVyxLQUFLLFVBQVU2TSxDQUFHLENBQUMsR0FBSWxNLENBQU8sRUFDL0csS0FBSyxnQkFBNkNrTSxFQUFJLE9BQVE1QixFQUFpQixlQUFnQjRCLENBQUcsQ0FDM0csQ0FFQSxNQUFhLGlCQUFpQnRNLEVBQWdCNE0sRUFBbUJ4TSxFQUEyQyxDQUNyRyxZQUFBLFFBQVEsS0FBS1gsRUFBb0IsMENBQTJDLFlBQVksS0FBSyxVQUFVbU4sQ0FBTyxDQUFDLEdBQUl4TSxDQUFPLEVBQ3hILEtBQUssZ0JBQWdESixFQUFRMEssRUFBaUIsYUFBYyxDQUNqRyxRQUFBa0MsQ0FBQSxDQUNELENBQ0gsQ0FFQSxNQUFhLFlBQVlOLEVBQXNCbE0sRUFBc0UsQ0FDOUcsWUFBQSxRQUFRLEtBQUtYLEVBQW9CLHVDQUF3QyxXQUFXLEtBQUssVUFBVTZNLENBQUcsQ0FBQyxHQUFJbE0sQ0FBTyxFQUNoSCxLQUFLLGdCQUFzRGtNLEVBQUksT0FBUTVCLEVBQWlCLGNBQWU0QixDQUFHLENBQ25ILENBRUEsTUFBYSxrQkFBdUUsQ0FDNUUsTUFBQXRNLEVBQVMsS0FBSyxTQUFTLGFBQWEsRUFDMUMsT0FBTyxLQUFLLGdCQUEwQ0EsRUFBUTBLLEVBQWlCLGVBQWdCLElBQUksQ0FDckcsQ0FFQSxNQUFhLHVCQUF1QnRLLEVBQXNFLENBQ2xHLE1BQUFKLEVBQVMsS0FBSyxTQUFTLGFBQWEsRUFDMUMsWUFBSyxRQUFRLEtBQUtQLEVBQW9CLDRDQUE2QyxXQUFXTyxDQUFNLEdBQUlJLENBQU8sRUFDeEcsS0FBSyxnQkFBMkNKLEVBQVEwSyxFQUFpQixrQkFBbUIsSUFBSSxDQUN6RyxDQUVBLE1BQWEsZ0JBQWdCNUksRUFBZ0IxQixFQUFzRSxDQUNqSCxZQUFLLFFBQVEsS0FBS1gsRUFBb0IsMENBQTJDLFdBQVdxQyxDQUFNLEdBQUkxQixDQUFPLEVBQ3RHLEtBQUssZ0JBQXdEMEIsRUFBUTRJLEVBQWlCLG1CQUFvQixDQUFFLE9BQUE1SSxFQUFRLENBQzdILENBRUEsTUFBYSxxQkFBcUIxQixFQUEyRSxDQUNyRyxNQUFBSixFQUFTLEtBQUssU0FBUyxhQUFhLEVBQzFDLFlBQUssUUFBUSxLQUFLUCxFQUFvQiwrQ0FBZ0QsV0FBV08sQ0FBTSxHQUFJSSxDQUFPLEVBQzNHLEtBQUssZ0JBQWdESixFQUFRMEssRUFBaUIsb0JBQXFCLElBQUksQ0FDaEgsQ0FFQSxNQUFhLGdCQUFnQnRLLEVBQWtFLENBQ3ZGLE1BQUFKLEVBQVMsS0FBSyxTQUFTLGFBQWEsRUFDMUMsWUFBSyxRQUFRLEtBQUtQLEVBQW9CLHlDQUEwQyxXQUFXTyxDQUFNLEdBQUlJLENBQU8sRUFDckcsS0FBSyxnQkFBd0NKLEVBQVEwSyxFQUFpQixlQUFnQixJQUFJLENBQ25HLENBRUEsTUFBYSxlQUFlbUMsRUFBc0J6TSxFQUEyRSxDQUN0SCxZQUFBLFFBQVEsS0FBS1gsRUFBb0IsK0NBQWdELFdBQVdvTixFQUFLLE1BQU0sR0FBSXpNLENBQU8sRUFDaEgsS0FBSyxnQkFBMER5TSxFQUFLLE9BQVFuQyxFQUFpQixpQkFBa0JtQyxDQUFJLENBQzVILENBRUEsTUFBYSxZQUFZQSxFQUF3QnpNLEVBQTBDLENBQ3BGLFlBQUEsUUFBUSxLQUFLWCxFQUFvQiw0Q0FBNkMsU0FBUyxLQUFLLFVBQVVvTixDQUFJLENBQUMsR0FBSXpNLENBQU8sRUFDcEgsS0FBSyxnQkFBNkN5TSxFQUFLLE9BQVFuQyxFQUFpQixjQUFlbUMsQ0FBSSxDQUM1RyxDQUVBLE1BQWEsZ0JBQWdCQSxFQUErQyxDQUNwRSxNQUFBN00sRUFBUyxLQUFLLFNBQVMsYUFBYSxFQUMxQyxPQUFPLEtBQUssZ0JBQTJDQSxFQUFRMEssRUFBaUIsbUJBQW9CbUMsQ0FBSSxDQUMxRyxDQUdRLDJCQUEyQnZDLEVBQTJCLENBQ3RELE1BQUFsSyxFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLEtBQUssUUFBUSxLQUFLWCxFQUFvQix1Q0FBd0MsVUFBVTZLLENBQUssR0FBSWxLLENBQU8sRUFFbkcsS0FBQSxVQUFVLGdCQUFnQmtLLENBQUssRUFJaENBLElBQVV3QyxxQkFBbUIsVUFDMUIsS0FBQSxrQkFBa0IsTUFBTTFNLENBQU8sRUFFL0IsS0FBQSxrQkFBa0IsS0FBS0EsQ0FBTyxDQUV2QyxDQVFBLE1BQWMsZ0JBQXVCcU0sRUFBa0J6RixFQUF1QitGLEVBQStDLENBQzNILE1BQU1DLEVBQVFELEVBQVUsS0FBSyxVQUFVLENBQUUsR0FBR0EsRUFBYyxVQUFXLEtBQUssVUFBYyxDQUFBLEVBQUksR0FFeEYsSUFBQUUsRUFDQSxLQUFLLGtCQUFrQixTQUFTakcsQ0FBRyxFQUNyQ2lHLEVBQVMsTUFBTTdCLEVBQW1GLENBQ2hHLFFBQVMsS0FBSyxTQUFTLFlBQVksS0FBSyxLQUFLLFFBQVEsRUFDckQsT0FBUSxDQUFDcUIsRUFBVXpGLEVBQUtnRyxDQUFLLENBQUEsQ0FDOUIsRUFFREMsRUFBUyxNQUFNLEtBQUssU0FBUyxZQUFZUixFQUFVekYsRUFBS2dHLENBQUssRUFFekQsS0FBQSxDQUFFLEtBQUEzTSxFQUFNLEtBQUFFLENBQVMsRUFBQTBNLEVBQ25CLEdBQUE1TSxJQUFTNkssWUFBVSxRQUNyQixNQUFPLENBQUUsS0FBQTdLLENBQUssRUFFaEIsS0FBTSxDQUFFLElBQUs2TSxFQUFXLE1BQU9DLEdBQWM1TSxFQUN2QzZNLEVBQWEsS0FBSyxNQUFNRCxDQUFTLEVBQUUsS0FDbEMsTUFBQSxDQUNMLEtBQU0zTixFQUFlLFFBQ3JCLEtBQU00TixDQUFBLENBRVYsQ0FLUSxrQkFBa0I3TSxFQUFjLENBQ2hDLE1BQUFILEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFDM0MsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLGdEQUFpRCxTQUFTYyxDQUFJLEdBQUlILENBQU8sRUFFOUYsS0FBSyxNQUFNRyxDQUFJLEVBQUUsS0FDekIsUUFBUzJDLEdBQVMsQ0FDbkIsS0FBQSxDQUFFLElBQUE4RCxDQUFRLEVBQUE5RCxFQUNWbUssRUFBTyxLQUFLLE1BQU1uSyxFQUFLLEtBQUssRUFDbEMsT0FBUThELEVBQUssQ0FDWCxLQUFLMEQsRUFBaUIsZ0JBQ2YsS0FBQSxpQkFBaUIyQyxFQUF1QixHQUFNak4sQ0FBTyxFQUMxRCxNQUNGLEtBQUtzSyxFQUFpQixpQkFDZixLQUFBLGtCQUFrQjJDLEVBQXlCak4sQ0FBTyxFQUN2RCxNQUNGLEtBQUtzSyxFQUFpQixnQkFDZixLQUFBLGlCQUFpQjJDLEVBQTJCak4sQ0FBTyxFQUN4RCxNQUNGLEtBQUtzSyxFQUFpQixpQkFDZixLQUFBLGtCQUFrQjJDLEVBQTRCak4sQ0FBTyxFQUMxRCxNQUNGLEtBQUtzSyxFQUFpQixhQUNmLEtBQUEsY0FBYzJDLEVBQXFCak4sQ0FBTyxFQUMvQyxNQUNGLEtBQUtzSyxFQUFpQixvQkFHcEIsTUFDRixLQUFLQSxFQUFpQixnQkFFcEIsTUFDRixRQUNPLEtBQUEsb0JBQW9CMkMsRUFBMkJqTixDQUFPLEVBQzNELEtBQ0osQ0FBQSxDQUNELENBQ0gsQ0FPUSxhQUFha04sRUFBa0MsQ0FJakQsTUFIQUMsR0FBQUEsRUFBQUEsT0FBT0QsQ0FBUSxHQUdmbkcsRUFBQSxTQUFTbUcsQ0FBUSxLQUFNQSxHQUFBLFlBQUFBLEVBQVUsVUFBVyxHQUFLQSxJQUFhLEtBQUssWUFJekUsQ0FNUSxpQkFBaUIvTSxFQUFxQmlOLEVBQWEsR0FBTXBOLEVBQWlCLENBQzVFLEdBQUEsQ0FDSSxNQUFBcU4sRUFBYSxLQUFLLFNBQVMsYUFBYSxFQUN4Q0MsRUFBY25OLEVBQUssaUJBQWlCLEtBQU0yQyxHQUFTQSxFQUFLLFNBQVd1SyxDQUFVLEVBQzdFbkQsRUFBUSxLQUFLLFNBQVMsb0JBQW9CLEVBQ2hELEtBQUssUUFBUSxLQUFLN0ssRUFBb0Isc0NBQXVDLGdCQUFnQixLQUFLLFVBQVVpTyxDQUFXLENBQUMsb0JBQW9CRCxDQUFVLFlBQVluRCxDQUFLLEdBQUlsSyxDQUFPLFFBQzNLaUssRUFBSyxDQUNQLEtBQUEsUUFBUSxNQUFNNUssRUFBb0Isc0NBQXVDLFVBQVc0SyxFQUFjLE9BQU8sR0FBSWpLLENBQU8sQ0FDM0gsQ0FDQSxHQUFJLENBQUMsS0FBSyxhQUFhRyxFQUFLLFlBQWMsRUFBRSxFQUFHLENBQzdDLEtBQUssUUFBUSxLQUFLZCxFQUFvQixzQ0FBdUMsdUNBQXVDLEtBQUssVUFBVSxDQUNqSSxXQUFZYyxFQUFLLFdBQ2pCLGVBQWdCLEtBQUssVUFBQSxDQUN0QixDQUFDLEdBQUlILENBQU8sRUFJYixNQUFNaU4sRUFBTyxDQUNYLE1BQU8sS0FBSyxVQUFVOU0sQ0FBSSxFQUMxQixPQUFRdUwsR0FBd0IscUJBQ2hDLE1BQU8wQixFQUFhekIsRUFBdUIsV0FBYUEsRUFBdUIsY0FBQSxFQUU3RXlCLEVBQ0YsS0FBSyxLQUFLM0IsRUFBYyxvQkFBcUIsT0FBTyxPQUFPdEwsRUFBTThNLENBQUksQ0FBQyxFQUV0RSxLQUFLLEtBQUt4QixFQUFjLG9CQUFxQixPQUFPLE9BQU90TCxFQUFNOE0sQ0FBSSxDQUFDLEVBRXhFLE1BQ0YsQ0FFQSxLQUFLLFVBQVUsU0FBUzlNLEVBQU1pTixFQUFZcE4sQ0FBTyxFQUM3Q29OLEVBQ0YsS0FBSyxLQUFLM0IsRUFBYyxnQkFBaUIsT0FBTyxPQUFPdEwsRUFBTSxDQUFFLE1BQU8sS0FBSyxVQUFVQSxDQUFJLENBQUEsQ0FBRyxDQUFDLEVBRTdGLEtBQUssS0FBS3NMLEVBQWMsc0JBQXVCLE9BQU8sT0FBT3RMLEVBQU0sQ0FBRSxNQUFPLEtBQUssVUFBVUEsQ0FBSSxDQUFBLENBQUcsQ0FBQyxDQUV2RyxDQUtRLGtCQUFrQkEsRUFBdUJILEVBQWlCLENBTWhFLEdBSktHLEVBQUEsaUJBQW1CQSxFQUFLLGlCQUFpQixPQUFRMkMsR0FBUyxFQUFRQSxFQUFLLE9BQVEsRUFFcEYsS0FBSyxRQUFRLEtBQUt6RCxFQUFvQiwyQ0FBNEMsR0FBSVcsQ0FBTyxFQUV6RixDQUFDLEtBQUssYUFBYUcsRUFBSyxZQUFjLEVBQUUsRUFBRyxDQUM3QyxLQUFLLFFBQVEsS0FBS2QsRUFBb0IsMkNBQTRDLHVDQUF1QyxLQUFLLFVBQVUsQ0FDdEksV0FBWWMsRUFBSyxXQUNqQixlQUFnQixLQUFLLFVBQUEsQ0FDdEIsQ0FBQyxHQUFJSCxDQUFPLEVBRVIsS0FBQSxVQUFVLHdCQUF3QkcsRUFBTUgsQ0FBTyxFQUNwRCxNQUNGLENBQ0EsS0FBSyxVQUFVLGFBQWFHLEVBQU1ILEVBQVMsS0FBSyxVQUFVLENBQzVELENBS1EsaUJBQWlCRyxFQUF5QkgsRUFBaUIsQ0FDNUQsS0FBQSxVQUFVLFlBQVlHLEVBQU1ILENBQU8sQ0FDMUMsQ0FPUSxrQkFBa0JHLEVBQTBCSCxFQUFpQixDQUNuRSxLQUFNLENBQUUsV0FBQXVOLEVBQVksT0FBQUMsRUFBUSxZQUFBQyxDQUFBLEVBQWdCdE4sRUFDNUMsT0FBUW9OLEVBQVksQ0FDbEIsS0FBS2hGLEVBQVcsa0JBQ1QsS0FBQSxVQUFVLGtCQUFrQnBJLEVBQU1ILENBQU8sRUFDOUMsS0FHSixDQUNGLENBS1EsY0FBY0csRUFBbUJILEVBQWlCLENBQ25ELEtBQUEsUUFBUSxLQUFLWCxFQUFvQixvQ0FBcUMsZ0JBQWdCLEtBQUssVUFBVWMsQ0FBSSxDQUFDLEdBQUlILENBQU8sRUFFckgsS0FBQSxVQUFVLGlCQUFpQkcsRUFBTUgsQ0FBTyxDQUMvQyxDQUtRLG9CQUFvQkcsRUFBeUJILEVBQWlCLENBQ3BFLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwyQ0FBNEMsR0FBSVcsQ0FBTyxFQUN2RixLQUFBLENBQ0osT0FBQTBCLEVBQVEsU0FBQUMsRUFBVSxVQUFBRSxFQUFXLFdBQUFRLEVBQVksU0FBQUQsRUFBVSxXQUFBSixFQUFZLGNBQUFGLEVBQWUsaUJBQUE0TCxFQUFrQixXQUFBQyxFQUFZLGtCQUFBQyxFQUFtQixNQUFBekYsQ0FDN0gsRUFBQWhJLEVBRXdCdU4sRUFBaUIsS0FBTTVLLEdBQVNBLEVBQUssZ0JBQWtCeEMsRUFBMkIsU0FBV3dDLEVBQUssU0FBVyxLQUFLLFNBQVMsY0FBYyxFQUduSyxLQUFLLGlCQUFpQixDQUNwQixPQUFBcEIsRUFDQSxXQUFBaU0sRUFDQSxTQUFBaE0sRUFDQSxVQUFBRSxFQUNBLGFBQWNDLEVBQ2QsY0FBQUEsRUFDQSxpQkFBQTRMLEVBQ0EsV0FBQXJMLEVBQ0EsTUFBQThGLENBQUEsRUFDQyxHQUFNbkksQ0FBTyxFQUVoQixLQUFLLGtCQUFrQixDQUNyQixPQUFBMEIsRUFDQSxXQUFBaU0sRUFDQSxXQUFBM0wsRUFDQSxTQUFBSSxFQUNBLGlCQUFBc0wsR0FDQzFOLENBQU8sRUFHUjROLEVBQWtCLE9BQVMsR0FDWEEsRUFBQSxRQUFTek4sR0FBUyxLQUFLLGtCQUFrQkEsRUFBTUgsQ0FBTyxFQUFHLElBQUksQ0FFbkYsQ0FDRixDQ2pkQSxNQUFNNk4sR0FBZ0JDLEdBQW1CLENBQ2pDLE1BQUFDLEVBQVEsbUVBQW1FLE1BQU0sRUFBRSxFQUNuRkMsRUFBUUQsRUFBTSxPQUFTLEVBQzdCLElBQUlFLEVBQVUsQ0FBQ0gsRUFDZixNQUFNSSxFQUFNLENBQUEsRUFDVCxFQUFBLENBQ0QsTUFBTUMsRUFBTUYsRUFBVUQsRUFDdEJDLEdBQVdBLEVBQVVFLEdBQU9ILEVBQ3hCRSxFQUFBLFFBQVFILEVBQU1JLENBQUcsQ0FBQyxDQUNmLE9BQUFGLEdBQ0YsT0FBQUMsRUFBSSxLQUFLLEVBQUUsQ0FDcEIsRUFFTUUsR0FBVSxJQUFNLHVDQUF1QyxRQUFRLFFBQVVDLEdBQU0sQ0FDbkYsTUFBTUMsRUFBSSxLQUFLLE9BQU8sRUFBSSxHQUFLLEVBRXhCLE9BREdELElBQU0sSUFBTUMsRUFBS0EsRUFBSSxFQUFNLEdBQzVCLFNBQVMsRUFBRSxDQUN0QixDQUFDLEVBR1l0QyxHQUFZLElBQU0sQ0FDN0IsSUFBSXVDLEVBQXdCSCxLQUM1QixPQUFBRyxFQUFPLEdBQUdBLEVBQUssUUFBUSxLQUFNLEVBQUUsQ0FBQyxJQUN6QkEsRUFBQSxTQUFTQSxFQUFNLEVBQUUsRUFDeEJBLEVBQU9WLEdBQWFVLENBQUksRUFDcEJBLEVBQUssT0FBUyxLQUNUQSxFQUFBQSxFQUFLLE1BQU0sRUFBRyxFQUFFLEdBRWxCQSxDQUNULEVDM0JNQyxHQUFlLGNBRWZDLEdBQWEsRUFrQm5CLElBQUlDLEVBRUcsTUFBTUMsRUFBTixNQUFNQSxDQUFjLENBV3pCLGFBQWMsQ0FBQyxDQUVmLE9BQU8sS0FBS2xQLEVBQXNCZ04sRUFBb0IsQ0FDM0NpQyxFQUFBalAsRUFDSixLQUFLLGFBQ0RpUCxFQUFBLEtBQUssa0JBQW1CLG1EQUFtRCxFQUdwRixNQUFNRSxFQUFNLE9BQU8sVUFBVSxLQUFLSixHQUFjQyxFQUFVLEVBRXRERyxFQUFBLFFBQVdDLEdBQVksQ0FDekJILEVBQU8sS0FBSyxrQkFBbUIsOEJBQThCRyxFQUFHLE9BQU8sS0FBSyxFQUFFLENBQUEsRUFHNUVELEVBQUEsVUFBYUMsR0FBWSxDQUN0QixLQUFBLElBQU1BLEVBQUcsT0FBTyxPQUNqQixLQUFLLE1BQ0YsS0FBQSxJQUFJLFFBQVdBLEdBQVksQ0FDdkJILEVBQUEsS0FBSyxrQkFBbUIsVUFBVSxLQUFLLElBQUssSUFBSSw2QkFBNkJHLENBQUUsRUFBRSxFQUN4RixLQUFLLE9BQU8sQ0FBQSxFQUVULEtBQUEsSUFBSSxRQUFXQSxHQUFZLENBQ3ZCSCxFQUFBLEtBQUssa0JBQW1CLFVBQVUsS0FBSyxJQUFLLElBQUksdUJBQXVCRyxDQUFFLEVBQUUsRUFDbEYsS0FBSyxPQUFPLENBQUEsRUFFVCxLQUFBLElBQUksUUFBV0EsR0FBWSxDQUN2QkgsRUFBQSxLQUFLLGtCQUFtQixVQUFVLEtBQUssSUFBSyxJQUFJLHlCQUF5QkcsQ0FBRSxFQUFFLEVBQ3BGLEtBQUssT0FBTyxDQUFBLEdBR0ZGLEVBQUEsVUFBWSxJQUFJQSxFQUM5QmxDLEVBQUssVUFBVSxDQUFBLEVBR2JtQyxFQUFBLGdCQUFtQkMsR0FBWSxDQUM1QixLQUFBLElBQU1BLEVBQUcsT0FBTyxPQUVyQkYsRUFBYyxlQUFlLHNCQUF1QixDQUFFLFFBQVMsUUFBVSxDQUFBLENBQUEsQ0FFN0UsQ0FFQSxPQUFPLFFBQVMsQ0FDZCxLQUFLLElBQU0sS0FDWCxLQUFLLFVBQVksSUFDbkIsQ0FFQSxPQUFPLGFBQW9DLENBQ3pDLE9BQU8sS0FBSyxTQUNkLENBRUEsT0FBTyxXQUFxQixDQUMxQixNQUFPLEVBQUUsT0FBTyxPQUFXLEtBQWUsQ0FBQyxRQUFVLENBQUMsT0FBTyxVQUMvRCxDQUVBLE9BQU8sZUFBZUcsRUFBaUJyQyxFQUF1QixRQUV2RHNDLEVBQUFKLEVBQWMsTUFBZCxNQUFBSSxFQUFtQixpQkFBaUIsU0FBU0QsR0FHaERKLEVBQU8sTUFBTSxrQkFBbUIsa0JBQWtCSSxDQUFPLGlCQUFpQixFQUYvREgsRUFBYyxJQUFLLGtCQUFrQkcsRUFBU3JDLENBQUksQ0FJakUsQ0FNTyxTQUFhcUMsRUFBaUJFLEVBQTBCLENBQzdELE9BQU8sSUFBSSxRQUFRLENBQUNwRSxFQUFTcUUsSUFBVyxDQUNsQyxHQUFBLENBQUNOLEVBQWMsSUFBSyxDQUN0Qi9ELEVBQVEsRUFBSyxFQUNiLE1BQ0YsQ0FHTSxNQUFBZ0UsRUFEUUQsRUFBYyxJQUFJLFlBQVksQ0FBQ0csQ0FBTyxFQUFHLFdBQVcsRUFBRSxZQUFZQSxDQUFPLEVBQ3JFLElBQUlFLENBQUcsRUFFekJKLEVBQUksVUFBWSxJQUFNLENBQ3BCaEUsRUFBUSxFQUFJLENBQUEsRUFHZGdFLEVBQUksUUFBVSxJQUFNLENBQ1hGLEVBQUEsTUFBTSxrQkFBbUIsaUJBQWlCLEVBQ2pEOUQsRUFBUSxFQUFLLENBQUEsQ0FDZixDQUNELENBQ0gsQ0FNTyxVQUFja0UsRUFBaUJsSSxFQUFnQyxDQUNwRSxPQUFPLElBQUksUUFBUSxDQUFDZ0UsRUFBU3FFLElBQVcsQ0FDbEMsR0FBQSxDQUFDTixFQUFjLElBQUssQ0FDdEIvRCxFQUFRLElBQUksRUFDWixNQUNGLENBSU0sTUFBQWdFLEVBRlFELEVBQWMsSUFBSSxZQUFZLENBQUNHLENBQU8sQ0FBQyxFQUFFLFlBQVlBLENBQU8sRUFFeEQsSUFBSWxJLENBQUcsRUFFekJnSSxFQUFJLFVBQVksSUFBTSxDQUNwQmhFLEVBQVFnRSxFQUFJLE1BQU0sQ0FBQSxFQUdoQkEsRUFBQSxRQUFXQyxHQUFPLENBQ3BCSCxFQUFPLEtBQUssa0JBQW1CLHdCQUF3QkcsQ0FBRSxFQUFFLEVBQzNEakUsRUFBUSxJQUFJLENBQUEsQ0FDZCxDQUNELENBQ0gsQ0FLTyxZQUFnQmtFLEVBQWlCbEksRUFBYW9JLEVBQTBCLENBQzdFLE9BQU8sSUFBSSxRQUFRLENBQUNwRSxFQUFTcUUsSUFBVyxDQUNsQyxHQUFBLENBQUNOLEVBQWMsSUFBSyxDQUN0Qi9ELEVBQVEsRUFBSyxFQUNiLE1BQ0YsQ0FJTSxNQUFBZ0UsRUFGUUQsRUFBYyxJQUFJLFlBQVksQ0FBQ0csQ0FBTyxFQUFHLFdBQVcsRUFBRSxZQUFZQSxDQUFPLEVBRXJFLElBQUlFLENBQUcsRUFFekJKLEVBQUksVUFBWSxJQUFNLENBQ3BCaEUsRUFBUSxFQUFJLENBQUEsRUFHVmdFLEVBQUEsUUFBV0MsR0FBTyxDQUNwQmpFLEVBQVEsRUFBSyxFQUNiOEQsRUFBTyxLQUFLLGtCQUFtQiwwQkFBMEJHLENBQUUsRUFBRSxDQUFBLENBQy9ELENBQ0QsQ0FDSCxDQUVPLFlBQVlDLEVBQWlCbEksRUFBK0IsQ0FDakUsT0FBTyxJQUFJLFFBQVEsQ0FBQ2dFLEVBQVNxRSxJQUFXLENBQ2xDLEdBQUEsQ0FBQ04sRUFBYyxJQUFLLENBQ3RCL0QsRUFBUSxFQUFLLEVBQ2IsTUFDRixDQUlNLE1BQUFnRSxFQUZRRCxFQUFjLElBQUksWUFBWSxDQUFDRyxDQUFPLEVBQUcsV0FBVyxFQUFFLFlBQVlBLENBQU8sRUFFckUsT0FBT2xJLENBQUcsRUFFNUJnSSxFQUFJLFVBQVksSUFBTSxDQUNwQmhFLEVBQVEsRUFBSSxDQUFBLEVBR1ZnRSxFQUFBLFFBQVdDLEdBQU8sQ0FDcEJqRSxFQUFRLEVBQUssRUFDYjhELEVBQU8sS0FBSyxrQkFBbUIsMEJBQTBCRyxDQUFFLEVBQUUsQ0FBQSxDQUMvRCxDQUNELENBQ0gsQ0FDRixFQXZLRW5QLEVBSldpUCxFQUlJLE1BQTBCLE1BS3pDalAsRUFUV2lQLEVBU0ksWUFBa0MsTUFUNUMsSUFBTU8sR0FBTlAsRUNaQSxNQUFNUSxFQUFhLENBU3hCLFlBQ21CdEQsRUFDQXBNLEVBQ2pCLENBWE1DLEVBQUEsb0JBRUFBLEVBQUEsc0JBRUFBLEVBQUEsaUJBQW9CLHVCQUVwQkEsRUFBQSwwQkFPTixHQUppQixLQUFBLFNBQUFtTSxFQUNBLEtBQUEsUUFBQXBNLEVBRVosS0FBQSxrQkFBb0J5UCxHQUFjLFlBQ25DLEtBQUssa0JBQW1CLENBQ1pBLEdBQUEsS0FBSyxLQUFLLFFBQVMsQ0FDL0IsVUFBVyxJQUFNLENBQ1YsS0FBQSxjQUFnQkEsR0FBYyxhQUNyQyxDQUFBLENBQ0QsRUFDRCxNQUNGLENBQ0EsS0FBSyxZQUFjckQsRUFBUyxZQUM5QixDQUtPLG1CQUFtQmpNLEVBQWdCOEIsRUFBZ0IsRUFDeEMsS0FBSyxrQkFBb0IsS0FBSyxjQUFnQixLQUFLLGtCQUMzRCxLQUFLLEtBQU05QixFQUFROEIsQ0FBTSxDQUNuQyxDQUtPLHNCQUFzQjlCLEVBQWdCNE0sRUFBbUIsRUFDM0MsS0FBSyxrQkFBb0IsS0FBSyxpQkFBbUIsS0FBSyxxQkFDOUQsS0FBSyxLQUFNNU0sRUFBUTRNLENBQU8sQ0FDdkMsQ0FLTyxtQkFBbUI1TSxFQUEwQyxDQUUzRCxPQURTLEtBQUssa0JBQW9CLEtBQUssY0FBZ0IsS0FBSyxrQkFDcEQsS0FBSyxLQUFNQSxDQUFNLENBQ2xDLENBRVEsaUJBQWlCQSxFQUFnQjhCLEVBQWdCLENBQ25ELEdBQUEsQ0FDSSxNQUFBME4sRUFBaUMsS0FBSyxNQUFNLEtBQUssWUFBWSxRQUFRLEtBQUssU0FBUyxHQUFLLElBQUksRUFDOUYsSUFBQUMsRUFBc0JELEVBQVN4UCxDQUFNLEVBQ3JDeVAsRUFDRkEsRUFBb0IsS0FBSzNOLENBQU0sRUFFL0IyTixFQUFzQixDQUFDM04sQ0FBTSxFQUUvQjBOLEVBQVN4UCxDQUFNLEVBQUl5UCxFQUNuQixLQUFLLFlBQVksUUFBUSxLQUFLLFVBQVcsS0FBSyxVQUFVRCxDQUFRLENBQUMsUUFDMURuRixFQUFLLENBQ1osS0FBSyxRQUFRLEtBQUssaUJBQWtCLHlCQUEwQkEsRUFBYyxPQUFPLEVBQUUsQ0FDdkYsQ0FDRixDQUVRLG9CQUFvQnJLLEVBQWdCNE0sRUFBbUIsQ0FDekQsR0FBQSxDQUNJLE1BQUE0QyxFQUFpQyxLQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVEsS0FBSyxTQUFTLEdBQUssSUFBSSxFQUM5RixJQUFBQyxFQUFzQkQsRUFBU3hQLENBQU0sRUFDckN5UCxJQUNvQkEsRUFBQUEsRUFBb0IsT0FBUUMsR0FBTyxDQUFDOUMsRUFBUSxTQUFTOEMsQ0FBRSxDQUFDLEVBQzFFRCxFQUFvQixPQUFTLEVBQy9CRCxFQUFTeFAsQ0FBTSxFQUFJeVAsRUFFbkIsT0FBT0QsRUFBU3hQLENBQU0sRUFHeEIsS0FBSyxZQUFZLFFBQVEsS0FBSyxVQUFXLEtBQUssVUFBVXdQLENBQVEsQ0FBQyxTQUU1RG5GLEVBQUssQ0FDWixLQUFLLFFBQVEsS0FBSyxpQkFBa0IsNEJBQTZCQSxFQUFjLE9BQU8sRUFBRSxDQUMxRixDQUNGLENBRVEsaUJBQWlCckssRUFBMEMsQ0FDakUsSUFBSTRNLEVBQVUsS0FDVixHQUFBLENBRUksTUFBQTZDLEVBRGlDLEtBQUssTUFBTSxLQUFLLFlBQVksUUFBUSxLQUFLLFNBQVMsR0FBSyxJQUFJLEVBQzdEelAsQ0FBTSxFQUN2Q3lQLElBQ1E3QyxFQUFBNkMsU0FFTHBGLEVBQUssQ0FDWixLQUFLLFFBQVEsS0FBSyxpQkFBa0IseUJBQTBCQSxFQUFjLE9BQU8sRUFBRSxDQUN2RixDQUNPLE9BQUEsUUFBUSxRQUFRdUMsQ0FBTyxDQUNoQyxDQUVBLE1BQWMsY0FBYzVNLEVBQWdCOEIsRUFBZ0IsQ0FDdEQsR0FBQSxDQUNGLE1BQU12QixFQUFPLE1BQU0sS0FBSyxjQUFjLFVBQXFCLEtBQUssVUFBV1AsQ0FBTSxFQUM3RU8sR0FDR0EsRUFBQSxRQUFRLEtBQUt1QixDQUFNLEVBQ3hCLEtBQUssY0FBYyxZQUFZLEtBQUssVUFBVzlCLEVBQVEsQ0FDckQsT0FBQUEsRUFDQSxRQUFTTyxFQUFLLE9BQUEsQ0FDZixHQUVJLEtBQUEsY0FBYyxTQUFTLEtBQUssVUFBVyxDQUMxQyxPQUFBUCxFQUNBLFFBQVMsQ0FBQzhCLENBQU0sQ0FBQSxDQUNqQixRQUVJdUksRUFBSyxDQUNaLEtBQUssUUFBUSxLQUFLLGlCQUFrQixzQkFBdUJBLEVBQWMsT0FBTyxFQUFFLENBQ3BGLENBQ0YsQ0FFQSxNQUFjLGlCQUFpQnJLLEVBQWdCNE0sRUFBbUIsQ0FDNUQsR0FBQSxDQUNGLE1BQU1yTSxFQUFPLE1BQU0sS0FBSyxjQUFjLFVBQXFCLEtBQUssVUFBV1AsQ0FBTSxFQUM3RU8sSUFDR0EsRUFBQSxRQUFVQSxFQUFLLFFBQVEsT0FBUW1QLEdBQU8sQ0FBQzlDLEVBQVEsU0FBUzhDLENBQUUsQ0FBQyxFQUM1RG5QLEVBQUssUUFBUSxPQUFTLEVBQ3hCLEtBQUssY0FBYyxZQUFZLEtBQUssVUFBV1AsRUFBUSxDQUNyRCxPQUFBQSxFQUNBLFFBQVNPLEVBQUssT0FBQSxDQUNmLEVBRUQsS0FBSyxjQUFjLFlBQVksS0FBSyxVQUFXUCxDQUFNLFNBR2xEcUssRUFBSyxDQUNaLEtBQUssUUFBUSxLQUFLLGlCQUFrQix5QkFBMEJBLEVBQWMsT0FBTyxFQUFFLENBQ3ZGLENBQ0YsQ0FFQSxNQUFjLGNBQWNySyxFQUEwQyxDQUNwRSxJQUFJTyxFQUFPLEtBQ1AsR0FBQSxDQUNGQSxFQUFPLE1BQU0sS0FBSyxjQUFjLFVBQXFCLEtBQUssVUFBV1AsQ0FBTSxRQUNwRXFLLEVBQUssQ0FDWixLQUFLLFFBQVEsS0FBSyxpQkFBa0Isc0JBQXVCQSxFQUFjLE9BQU8sRUFBRSxDQUNwRixDQUNBLE9BQUk5SixFQUNLQSxFQUFLLFFBRVAsSUFDVCxDQUNGLENDOUpZLElBQUFvUCxJQUFBQSxJQUlWQSxFQUFBQSxFQUFBLE9BQVMsQ0FBVCxFQUFBLFNBSUFBLEVBQUFBLEVBQUEsY0FBZ0IsRUFBaEIsRUFBQSxnQkFJQUEsRUFBQUEsRUFBQSxZQUFjLEVBQWQsRUFBQSxjQVpVQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQ0hBQyxHQUFBQSxJQUNWQSxFQUFBQSxFQUFBLFFBQVUsQ0FBVixFQUFBLFVBSUFBLEVBQUFBLEVBQUEsc0JBQXdCLEtBQXhCLEVBQUEsd0JBSUFBLEVBQUFBLEVBQUEsb0JBQXNCLEtBQXRCLEVBQUEsc0JBVFVBLElBQUFBLEdBQUEsQ0FBQSxDQUFBLEVDVUwsTUFBTUMsRUFBaUIsQ0FvQzVCLFlBQ21CalEsRUFDQUMsRUFDQWlRLEVBQ2pCLENBcENNaFEsRUFBQSxZQUFlLEdBS2ZBLEVBQUEsb0JBQXVCLEtBS3ZCQSxFQUFBLG9CQUF1QixLQUt2QkEsRUFBQSxrQkFBcUIsR0FLckJBLEVBQUEsZ0JBQTBCLE1BS2pCQSxFQUFBLGlCQUFvQixFQUFJLEtBS3hCQSxFQUFBLHNCQUF5QixHQXdGbENBLEVBQUEsbUJBQWMsR0FvSWRBLEVBQUEseUJBQTRCLEdBRW5CQSxFQUFBLDRCQUErQixHQTNON0IsS0FBQSxZQUFBRixFQUNBLEtBQUEsUUFBQUMsRUFDQSxLQUFBLHNCQUFBaVEsQ0FHbkIsQ0FLQSxNQUFhLDBCQUEwQmhPLEVBQWdCMUIsRUFBeUYsQ0FDOUksS0FBSyxRQUFRLEtBQUtYLEVBQW9CLGdEQUFpRCxXQUFXcUMsQ0FBTSxHQUFJMUIsQ0FBTyxHQUMvRyxDQUFDLEtBQUssTUFBUSxLQUFLLEtBQU8sS0FBSyxlQUMzQixNQUFBLEtBQUssY0FBY0EsQ0FBTyxFQUc5QixLQUFLLEtBQU8sS0FBSyxjQUNkLEtBQUEsUUFBUSxNQUFNWCxFQUFvQixnREFBaUQsU0FBU21RLEVBQW9CLHFCQUFxQixHQUFJeFAsQ0FBTyxFQUlqSixLQUFBLENBQUUsS0FBQUMsRUFBTSxLQUFBRSxDQUFLLEVBQUksTUFBTSxLQUFLLFlBQVksZ0JBQWdCdUIsRUFBUTFCLENBQU8sRUFDekUsR0FBQUMsSUFBU2IsRUFBZSxRQUMxQixZQUFLLFFBQVEsTUFBTUMsRUFBb0IsZ0RBQWlELFNBQVNZLENBQUksR0FBSUQsQ0FBTyxFQUN6RyxDQUFFLEtBQUFDLENBQUssRUFHVixLQUFBLENBQUUsVUFBVzBQLENBQW9CLEVBQUF4UCxFQUNqQ0QsRUFBa0IsS0FBSyxNQUFNeVAsRUFBa0IsS0FBSyxVQUFVLEVBRXBFLElBQUl2TixHQURnQixLQUFLLE1BQ0ssS0FBSyxXQUFhdU4sR0FBbUIsSUFFbkUsT0FBSXZOLEVBQVcsSUFDYixLQUFLLFFBQVEsS0FBSy9DLEVBQW9CLGdEQUFpRCxxQkFBcUIrQyxDQUFRLEdBQUlwQyxDQUFPLEVBQ3BIb0MsRUFBQSxHQUlGQSxFQUFBLEtBQUssTUFBTUEsQ0FBUSxFQUUxQixLQUFLLEtBQU8sS0FBSyxjQUFnQixLQUFLLE1BQVEsS0FBSyxjQUNoRCxLQUFBLFFBQVEsTUFBTS9DLEVBQW9CLGdEQUFpRCxTQUFTbVEsRUFBb0IsbUJBQW1CLEdBQUl4UCxDQUFPLEVBSXJKLEtBQUssUUFBUSxLQUFLWCxFQUFvQixnREFBaUQsS0FBSyxVQUFVLENBQ3BHLElBQUssS0FBSyxLQUNWLE9BQVEsS0FBSyxXQUNiLGdCQUFBc1EsRUFDQSxnQkFBQXpQLEVBQ0EsU0FBQWtDLENBQUEsQ0FDRCxFQUFHcEMsQ0FBTyxFQUNKLENBQUUsS0FBQUMsRUFBTSxTQUFBbUMsRUFBVSxnQkFBQWxDLEVBQzNCLENBS08sb0JBQW9Cd0IsRUFBZ0JRLEVBQW1CbEMsRUFBMEUsQ0FFbEksR0FEQyxLQUFBLFFBQVEsS0FBS1gsRUFBb0Isd0NBQXlDLFdBQVdxQyxDQUFNLGdCQUFnQlEsQ0FBUyxHQUFJbEMsQ0FBTyxFQUNoSSxLQUFLLEtBQU8sS0FBSyxhQUNkLFlBQUEsUUFBUSxNQUFNWCxFQUFvQix3Q0FBeUMsU0FBU21RLEVBQW9CLHFCQUFxQixHQUFJeFAsQ0FBTyxFQUV4SSxLQUFBLHVCQUF1QjBCLEVBQVExQixDQUFPLEVBQ3BDLENBQUUsS0FBTXdQLEVBQW9CLHVCQUdyQyxNQUFNdFAsRUFBa0IsS0FBSyxNQUFNZ0MsRUFBWSxLQUFLLFVBQVUsRUFDOUQsWUFBSyxRQUFRLEtBQUs3QyxFQUFvQix3Q0FBeUMsS0FBSyxVQUFVLENBQzVGLElBQUssS0FBSyxLQUNWLE9BQVEsS0FBSyxXQUNiLE9BQVE2QyxFQUNSLGdCQUFBaEMsQ0FBQSxDQUNELEVBQUdGLENBQU8sRUFFUCxLQUFLLEtBQU8sS0FBSyxlQUVuQixLQUFLLGtCQUFvQixFQUVwQixLQUFBLHVCQUF1QjBCLEVBQVExQixDQUFPLEdBR3RDLENBQUUsS0FBTXdQLEVBQW9CLFFBQVMsZ0JBQUF0UCxDQUFnQixDQUM5RCxDQU9PLE1BQU1GLEVBQWlCLENBQ3hCLEtBQUssVUFBWSxLQUFLLGFBQWUsS0FBSyxpQkFLOUMsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHVCQUF3QixZQUFZLEtBQUssUUFBUSxFQUFFLEVBRXBGLEtBQUEsY0FHTCxLQUFLLGNBQWNXLENBQU8sRUFFckIsS0FBQSxTQUFXdUssR0FBZ0IsSUFBTSxDQUNwQyxLQUFLLFNBQVcsS0FDaEIsS0FBSyxNQUFNdkssQ0FBTyxDQUFBLEVBQ2pCLEtBQUssU0FBUyxFQUNuQixDQUtPLEtBQUtBLEVBQWlCLENBQ3RCLEtBQUEsUUFBUSxLQUFLWCxFQUFvQixzQkFBdUIsWUFBWSxLQUFLLFFBQVEsR0FBSVcsQ0FBTyxFQUM1RixLQUFBLFVBQVksYUFBYSxLQUFLLFFBQVEsRUFDM0MsS0FBSyxTQUFXLEtBRWhCLEtBQUssWUFBYyxDQUNyQixDQUtPLFFBQVFBLEVBQWlCLENBQ3pCLEtBQUEsUUFBUSxLQUFLWCxFQUFvQix5QkFBMEIsd0JBQXdCLEtBQUssSUFBSSxrQkFBa0IsS0FBSyxZQUFZLEdBQUlXLENBQU8sRUFDM0ksT0FBSyxLQUFPLEtBQUssZ0JBSXJCLEtBQUssS0FBS0EsQ0FBTyxFQUVqQixLQUFLLE1BQU1BLENBQU8sRUFDcEIsQ0FFTyxtQkFBNEIsQ0FDakMsT0FBTyxLQUFLLFVBQ2QsQ0FFTyxRQUFpQixDQUN0QixPQUFPLEtBQUssSUFDZCxDQUtBLE1BQWMsY0FBY0EsRUFBZ0UsQ0FDcEYsTUFBQWtDLEVBQVksS0FBSyxNQUVqQixDQUFFLEtBQUFqQyxFQUFNLEtBQU1xQyxHQUFhLE1BQU0sS0FBSyxZQUFZLHVCQUF1QnRDLENBQU8sRUFFaEZtQyxFQUFVLEtBQUssTUFDakIsR0FBQWxDLElBQVNiLEVBQWUsUUFDMUIsTUFBTyxDQUFFLEtBQUFhLENBQUssRUFHaEIsTUFBTTJQLEVBQWF6TixFQUFVRCxFQUd4QixPQUFBME4sRUFBYSxLQUFLLE1BQVEsS0FBSyxPQUFTLElBQU1BLEdBQWMsS0FBSyxlQUNwRSxLQUFLLEtBQU9BLEdBSVZBLEVBQWEsS0FBSyxjQUVwQixLQUFLLEtBQUs1UCxDQUFPLEVBR25CLEtBQUssV0FBY3NDLEVBQVlKLEVBQWEsS0FBSyxLQUFPLEVBRXhELEtBQUssUUFBUSxLQUFLN0MsRUFBb0IsZ0NBQWlDLEtBQUssVUFBVSxDQUNwRixJQUFLLEtBQUssS0FDVixPQUFRLEtBQUssVUFBQSxDQUNkLEVBQUdXLENBQU8sRUFFSixDQUFFLEtBQUFDLEVBQU0sVUFBVyxLQUFLLFVBQVcsQ0FDNUMsQ0FLQSxNQUFjLG9CQUFvQnlCLEVBQWdCMUIsRUFBa0gsQ0FDNUosTUFBQWtDLEVBQVksS0FBSyxNQUNqQixDQUFFLEtBQUFqQyxFQUFNLEtBQUFFLENBQUssRUFBSSxNQUFNLEtBQUssWUFBWSxnQkFBZ0J1QixFQUFRMUIsQ0FBTyxFQUN2RW1DLEVBQVUsS0FBSyxNQUVqQixHQUFBbEMsSUFBU2IsRUFBZSxRQUMxQixNQUFPLENBQUUsS0FBQWEsQ0FBSyxFQUdoQixNQUFNMlAsRUFBYXpOLEVBQVVELEVBR3pCME4sRUFBYSxLQUFLLE9BQ3BCLEtBQUssS0FBT0EsR0FHZCxLQUFLLFdBQWN6UCxFQUFNLFNBQVcrQixFQUFhLEtBQUssS0FBTyxFQUU3RCxLQUFLLFFBQVEsS0FBSzdDLEVBQW9CLGdDQUFpQyxLQUFLLFVBQVUsQ0FDcEYsT0FBQXFDLEVBQ0EsSUFBSyxLQUFLLEtBQ1YsT0FBUSxLQUFLLFVBQUEsQ0FDZCxFQUFHMUIsQ0FBTyxFQUVYLE1BQU1FLEVBQWtCLEtBQUssTUFBTUMsRUFBTSxVQUFZLEtBQUssVUFBVSxFQUM5RDBQLEVBQXVCLEtBQUssTUFBTTFQLEVBQU0sZUFBaUIsS0FBSyxVQUFVLEVBRzFFLE9BQUF5UCxFQUFhLEtBQUssYUFFYixDQUFFLEtBQU1KLEVBQW9CLFFBQVMsZ0JBQUF0UCxFQUFpQixxQkFBQTJQLENBQXFCLEVBRzdFLENBQUUsS0FBTUwsRUFBb0Isc0JBQXVCLGdCQUFBdFAsRUFBaUIscUJBQUEyUCxDQUFxQixDQUNsRyxDQVNBLE1BQWMsdUJBQXVCbk8sRUFBZ0IxQixFQUFpQixDQUVwRSxLQUFLLEtBQUtBLENBQU8sRUFDakIsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLDBDQUEyQyxXQUFXcUMsQ0FBTSxHQUFJMUIsQ0FBTyxFQUN2RyxLQUFBLENBQUUsS0FBQUMsRUFBTSxnQkFBQUMsRUFBaUIscUJBQUEyUCxHQUF5QixNQUFNLEtBQUssb0JBQW9Cbk8sRUFBUTFCLENBQU8sRUFFbEcsR0FBQUMsSUFBU3VQLEVBQW9CLFFBQVMsQ0FDbkMsS0FBQSxRQUFRLEtBQUtuUSxFQUFvQiwwQ0FBMkMsU0FBU0QsRUFBZSxPQUFPLEdBQUlZLENBQU8sRUFFM0gsS0FBSyxzQkFBc0IwQixFQUFReEIsRUFBa0IyUCxFQUF1QjdQLENBQU8sRUFDbkYsTUFDRixDQUNBLEdBQUksS0FBSyxrQkFBb0IsS0FBSyxzQkFBd0JDLElBQVN1UCxFQUFvQixzQkFBdUIsQ0FDdkcsS0FBQSxRQUFRLEtBQUtuUSxFQUFvQiwwQ0FBMkMsU0FBU21RLEVBQW9CLHFCQUFxQixHQUFJeFAsQ0FBTyxFQUU5SSxLQUFLLHNCQUFzQjBCLEVBQVF4QixFQUFrQjJQLEVBQXVCN1AsQ0FBTyxFQUNuRixNQUNGLENBQ0ksS0FBSyxrQkFBb0IsS0FBSyx1QkFLN0IsS0FBQSxvQkFDTCxXQUFXLElBQU0sQ0FDVixLQUFBLHVCQUF1QjBCLEVBQVExQixDQUFPLENBQUEsRUFDMUMsS0FBSyxTQUFTLEVBQ25CLENBQ0YsQ0MzU1ksSUFBQThQLElBQUFBLElBSVZBLEVBQUFBLEVBQUEsWUFBYyxDQUFkLEVBQUEsY0FJQUEsRUFBQUEsRUFBQSxRQUFVLENBQVYsRUFBQSxVQVJVQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQ0VBQyxJQUFBQSxJQUNWQSxFQUFBQSxFQUFBLGdCQUFrQixDQUFsQixFQUFBLGtCQUNBQSxFQUFBQSxFQUFBLG9CQUFzQixDQUF0QixFQUFBLHNCQUNBQSxFQUFBQSxFQUFBLFlBQWMsQ0FBZCxFQUFBLGNBSFVBLElBQUFBLElBQUEsQ0FBQSxDQUFBLEVDRkFDLElBQUFBLElBSVZBLEVBQUFBLEVBQUEsSUFBTSxFQUFOLEVBQUEsTUFJQUEsRUFBQUEsRUFBQSxNQUFRLENBQVIsRUFBQSxRQUlBQSxFQUFBQSxFQUFBLEdBQUssQ0FBTCxFQUFBLEtBWlVBLElBQUFBLElBQUEsQ0FBQSxDQUFBLEVDa0VaLE1BQU1DLEdBQWdCLEdBQUssSUFFZEMsRUFBTixNQUFNQSxVQUFxQnRILEVBQUFBLFlBQWEsQ0EyRDdDLFlBQ21CYixFQUNBOEQsRUFDQUMsRUFDQXJNLEVBQ0EwUSxFQUNqQixDQUNNLFFBdERSelEsRUFBQSxvQkFBMEMsTUFLMUNBLEVBQUEscUJBQXNDLENBQUEsR0FLdENBLEVBQUEsc0JBS0FBLEVBQUEsd0JBT1FBLEVBQUEsMkJBQStCLElBTS9CQSxFQUFBLHFCQUlKLENBQUEsR0FLSkEsRUFBQSwwQkFLUUEsRUFBQSxxQkFBd0IsSUFNYixLQUFBLFNBQUFxSSxFQUNBLEtBQUEsU0FBQThELEVBQ0EsS0FBQSxVQUFBQyxFQUNBLEtBQUEsUUFBQXJNLEVBQ0EsS0FBQSxzQkFBQTBRLEVBR1osS0FBQSxrQkFBb0IsSUFBSVYsR0FBaUIsS0FBTWhRLEVBQVMsS0FBSyx1QkFBdUIsS0FBSyxJQUFJLENBQUMsRUFDOUYsS0FBQSxjQUFnQixJQUFJbU0sR0FBa0I3RCxFQUFVOEQsRUFBVUMsRUFBVyxLQUFLLGtCQUFtQixLQUFLLE9BQU8sRUFDOUcsS0FBSyxjQUFjLGlCQUFpQixDQUNsQyxTQUFVLEtBQUssVUFBVSxLQUFLLElBQUksRUFDbEMsYUFBYyxLQUFLLGNBQWMsS0FBSyxJQUFJLEVBQzFDLHdCQUF5QixLQUFLLHlCQUF5QixLQUFLLElBQUksRUFDaEUsWUFBYSxLQUFLLGFBQWEsS0FBSyxJQUFJLEVBQ3hDLGtCQUFtQixLQUFLLG1CQUFtQixLQUFLLElBQUksRUFDcEQsaUJBQWtCLEtBQUssa0JBQWtCLEtBQUssSUFBSSxFQUNsRCxnQkFBaUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLENBQUEsQ0FDakQsRUFDRCxLQUFLLGdCQUFrQixJQUFJcUQsR0FBYXRELEVBQVVwTSxDQUFPLENBQzNELENBS0EsTUFBYSxVQUFVZ04sRUFBc0J6TSxFQUFtRSxDQUN4RyxNQUFBb1EsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsRUFDM0MsQ0FDSixTQUFBek8sRUFBVSxVQUFBRSxFQUFXLFFBQUFzSyxFQUFTLFNBQUFFLEVBQVUsV0FBQUQsRUFBWSxVQUFBRyxFQUFXLFdBQUFuRyxFQUFZLE1BQUErQixDQUN6RSxFQUFBc0UsRUFDSixLQUFLLGNBQWdCQSxFQUFLLE9BQzFCLE1BQU1qRyxFQUFVSixFQUFhRCxHQUFtQkMsRUFBWSxLQUFLLGFBQWEsRUFBSSxHQUM1RSxDQUFFLEtBQUFuRyxFQUFNLEtBQUFFLENBQUEsRUFBUyxNQUFNLEtBQUssY0FBYyxVQUFVLENBQ3hELGFBQWMsS0FBSyxjQUNuQixTQUFBd0IsRUFDQSxVQUFBRSxFQUNBLFFBQUFzSyxFQUNBLFdBQVkzRCxHQUFlLE9BQzNCLFdBQUE0RCxFQUNBLFNBQUFDLEVBQ0EsVUFBQUUsRUFDQSxRQUFBL0YsRUFDQSxNQUFBMkIsR0FDQ25JLENBQU8sRUFFTixHQUFBQyxJQUFTYixFQUFlLFFBQzFCLE1BQU8sQ0FBRSxLQUFBYSxDQUFLLEVBR1YsS0FBQSxDQUFFLE9BQUF5QixFQUFRLGNBQUEyTyxDQUFrQixFQUFBbFEsRUFrQjlCLEdBZkMsS0FBQSxnQkFBZ0IsbUJBQW1CaVEsRUFBZTFPLENBQU0sRUFHN0QsS0FBSyxhQUFlLElBQUlpSCxHQUN0QmpILEVBQ0FqQixFQUFvQixRQUNwQmtCLEVBQ0FFLEVBQ0F1TyxFQUNBQSxFQUNBLENBQUMsRUFDRCxLQUFLLE9BQUEsRUFJSHpPLElBQWF2QixFQUFlLE9BQVEsQ0FDdEMsTUFBTWtRLEVBQWlCLEtBQUssWUFBWW5RLEVBQU0sT0FBUUcsRUFBMkIsVUFBV04sQ0FBTyxFQUNuRyxLQUFLLGFBQWEsY0FBYzBJLEdBQW1CLFFBQVM0SCxDQUFjLENBQzVFLENBR0EsTUFBTUMsRUFBWSxDQUNoQixPQUFRSCxFQUNSLFVBQVc5UCxFQUEyQixRQUN0QyxZQUFhSyxFQUFpQixRQUM5QixXQUFBeUwsRUFDQSxTQUFBQyxFQUNBLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxFQUVoQixJQUFBbUUsRUFBZ0JyRSxFQUFRLElBQUksQ0FBQyxDQUFFLE9BQUF2TSxFQUFRLFdBQUF3TSxFQUFZLFNBQUFDLE1BQWdCLENBQ3JFLE9BQUF6TSxFQUNBLFVBQVdVLEVBQTJCLFFBQ3RDLFlBQWFLLEVBQWlCLFFBQzlCLFdBQUF5TCxFQUNBLFNBQUFDLEVBQ0EsYUFBYyxHQUNkLGlCQUFrQixFQUNsQixFQUFBLEVBRUVvRSxFQUFpQyxDQUFBLEVBQ3JDLE9BQUlKLElBQ2VJLEVBQUFKLEVBQWMsSUFBS3ZOLEdBQVMsQ0FDM0MsS0FBTSxDQUFFLFdBQUFzSixFQUFZLFNBQUFDLENBQVMsRUFBSW1FLEVBQWMsS0FBTTdRLEdBQVNBLEVBQUssU0FBV21ELEVBQUssTUFBTSxFQUNsRixNQUFBLENBQ0wsT0FBUUEsRUFBSyxPQUNiLFVBQVdBLEVBQUssY0FDaEIsWUFBYW5DLEVBQWlCLGlCQUM5QixXQUFBeUwsRUFDQSxTQUFBQyxFQUNBLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxDQUNwQixDQUNELEVBRURtRSxFQUFnQkEsRUFBYyxPQUFPLENBQUMsQ0FBRSxPQUFBNVEsQ0FBYSxJQUFBNlEsRUFBZ0IsTUFBTSxDQUFDLENBQUUsT0FBUUMsQ0FBQSxJQUFpQkEsSUFBZTlRLENBQU0sQ0FBQyxHQUcvSCxXQUFXLElBQU0sQ0FDVixLQUFBLGlCQUFpQjhCLEVBQVEsQ0FBQzZPLEVBQVcsR0FBR0MsRUFBZSxHQUFHQyxDQUFlLEVBQUd6USxDQUFPLENBQUEsQ0FDekYsRUFDTSxDQUFFLEtBQUFDLEVBQU0sS0FBQUUsRUFDakIsQ0FLQSxNQUFhLE9BQU9zTSxFQUFtQnpNLEVBQTZELE9BRTlGLEdBQUEsQ0FBQyxLQUFLLGFBQ0QsTUFBQSxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsS0FBTSxDQUFFLFFBQUErTSxFQUFTLFdBQUEvRixFQUFZLE1BQUErQixDQUFBLEVBQVVzRSxFQUNqQ2pHLEVBQVVKLEVBQWFELEdBQW1CQyxFQUFZLEtBQUssYUFBYSxFQUFJLEdBRTVFMUUsRUFBUyxLQUFLLGFBQWEsVUFBVSxFQUNyQyxDQUFFLEtBQUF6QixFQUFNLEtBQUFFLENBQUEsRUFBUyxNQUFNLEtBQUssY0FBYyxXQUFXLENBQ3pELE9BQUF1QixFQUNBLFFBQUF5SyxFQUNBLFFBQUEzRixFQUNBLE1BQUEyQixHQUNDbkksQ0FBTyxFQUNOLEdBQUFDLElBQVNiLEVBQWUsUUFBUyxDQUMvQixLQUFLLGFBQWEsWUFBWSxJQUFNZ0IsRUFBZSxTQUVoRCxLQUFBLGFBQWEsZUFBZUEsRUFBZSxLQUFLLEVBRXJELEtBQUssa0JBQWtCLEtBQUssYUFBYSxZQUFhQSxFQUFlLE1BQU9KLENBQU8sR0FJakYsSUFBQTJRLEVBQW9CeEUsRUFBUSxJQUFJLENBQUMsQ0FBRSxPQUFBdk0sRUFBUSxXQUFBd00sRUFBWSxTQUFBQyxNQUFnQixDQUN6RSxPQUFBek0sRUFDQSxVQUFXVSxFQUEyQixRQUN0QyxZQUFhSyxFQUFpQixRQUM5QixXQUFBeUwsRUFDQSxTQUFBQyxFQUNBLGFBQWMsR0FDZCxpQkFBa0IsRUFDbEIsRUFBQSxFQUVFdUUsRUFBcUMsQ0FBQSxFQUNyQ3pRLEVBQU0sZ0JBQ1J5USxHQUFxQjdCLEVBQUE1TyxFQUFNLGdCQUFOLFlBQUE0TyxFQUFxQixJQUFLak0sR0FBUyxDQUNoRCxLQUFBLENBQUUsV0FBQXNKLEVBQVksU0FBQUMsQ0FBYSxFQUFBc0UsRUFBa0IsS0FBTWhSLEdBQVNBLEVBQUssU0FBV21ELEVBQUssTUFBTSxFQUN0RixNQUFBLENBQ0wsT0FBUUEsRUFBSyxPQUNiLFVBQVdBLEVBQUssY0FDaEIsWUFBYW5DLEVBQWlCLGlCQUM5QixXQUFBeUwsRUFDQSxTQUFBQyxFQUNBLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxDQUNwQixHQUVGc0UsRUFBb0JBLEVBQWtCLE9BQU8sQ0FBQyxDQUFFLE9BQUEvUSxDQUFhLElBQUFnUixFQUFvQixNQUFNLENBQUMsQ0FBRSxPQUFRRixDQUFBLElBQWlCQSxJQUFlOVEsQ0FBTSxDQUFDLEdBR3RJLEtBQUEsaUJBQWlCOEIsRUFBUSxDQUFDLEdBQUdpUCxFQUFtQixHQUFHQyxDQUFrQixFQUFHNVEsQ0FBTyxDQUN0RixDQUNPLE1BQUEsQ0FBRSxLQUFBQyxFQUFNLEtBQUFFLEVBQ2pCLENBS08sY0FBY3VCLEVBQWdCMUIsRUFBaUIsQ0FFbkQsQ0FBQSxLQUFLLGFBQWMsR0FBRyxLQUFLLGFBQWEsRUFBRSxRQUFTaUksR0FBWSxDQUMxREEsR0FBV0EsRUFBUSxVQUFVLElBQU12RyxHQUNyQ3VHLEVBQVEsZUFBZSxFQUFFLFFBQVNtQyxHQUFZLEtBQUssV0FBVyxLQUFLLElBQUksRUFBRUEsRUFBU3BLLENBQU8sQ0FBQyxDQUM1RixDQUNELENBQ0gsQ0FNQSxNQUFhLE9BQU95TSxFQUEwQnpNLEVBQTBDLENBQ2hGLEtBQUEsQ0FDSixPQUFBMEIsRUFBUSxZQUFBK0IsRUFBYSxXQUFBMkMsQ0FDbkIsRUFBQXFHLEVBQ0VqRyxFQUFVSixFQUFhRCxHQUFtQkMsRUFBWSxLQUFLLGFBQWEsRUFBSSxHQUMzRSxPQUFBLEtBQUssY0FBYyxXQUFXLENBQ25DLE9BQUExRSxFQUNBLFVBQVcrQixFQUNYLFFBQUErQyxHQUNDeEcsQ0FBTyxDQUNaLENBTUEsTUFBYSxPQUFPeU0sRUFBbUJ6TSxFQUEwQyxDQUUzRSxHQUFBLENBQUMsS0FBSyxhQUNELE1BQUEsQ0FBRSxLQUFNWixFQUFlLGFBRzFCLEtBQUEsQ0FBRSxPQUFBc0MsQ0FBVyxFQUFBK0ssRUFDYixDQUFFLEtBQUF4TSxDQUFLLEVBQUksTUFBTSxLQUFLLGNBQWMsV0FBVyxDQUNuRCxPQUFBeUIsR0FDQzFCLENBQU8sRUFJTixPQURKLEtBQUssV0FBVyxLQUFLLGFBQWMsa0JBQUEsRUFBcUJBLENBQU8sRUFDM0RDLElBQVNiLEVBQWUsUUFDbkIsQ0FBRSxLQUFBYSxDQUFLLEdBRVgsS0FBQSxvQkFBb0J3TSxFQUFLLE9BQVF6TSxDQUFPLEVBQ3hDLEtBQUEsYUFBYSxtQkFBbUJTLEVBQW9CLFVBQVUsRUFFNUQsQ0FBRSxLQUFBUixDQUFLLEVBQ2hCLENBS0EsTUFBYSxTQUFTd00sRUFBcUJ6TSxFQUEwQyxDQUM3RSxNQUFBb1EsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsRUFFakQsS0FBSyxjQUFnQixLQUFLLFdBQVcsS0FBSyxhQUFjLG9CQUFxQnBRLENBQU8sRUFDcEYsS0FBTSxDQUFFLEtBQUFDLENBQUEsRUFBUyxNQUFNLEtBQUssY0FBYyxTQUFTLENBQUUsT0FBUXdNLEVBQUssTUFBTyxFQUFHek0sQ0FBTyxFQUMvRSxPQUFBQyxJQUFTYixFQUFlLFFBQ25CLENBQUUsS0FBQWEsQ0FBSyxHQUloQixLQUFLLGdCQUFnQixtQkFBbUJtUSxFQUFlM0QsRUFBSyxNQUFNLEVBRTdELEtBQUssYUFJSCxLQUFBLG9CQUFvQkEsRUFBSyxPQUFRek0sQ0FBTyxFQUY3QyxNQUFNLEtBQUssdUJBQXVCeU0sRUFBSyxPQUFRLEdBQU16TSxDQUFPLEVBS3ZELENBQUUsS0FBQUMsQ0FBSyxFQUNoQixDQUtBLE1BQWEsdUJBQXVCd00sRUFBK0J6TSxFQUF5RSxDQUV0SSxHQUFBLENBQUMsS0FBSyxhQUNELE1BQUEsQ0FBRSxLQUFNWixFQUFlLGFBR2hDLE1BQU1xTyxFQUFjLENBQ2xCLFVBQVdoQixFQUFLLFNBQUEsRUFFYixLQUFBLGFBQWEsbUJBQW1CQSxFQUFLLFNBQVMsRUFDbkQsTUFBTW9FLEVBQWdCN0UsS0FDaEIsQ0FBRSxLQUFBL0wsQ0FBSyxFQUFJLE1BQU0sS0FBSyxjQUFjLGFBQWEsQ0FDckQsY0FBQTRRLEVBQ0EsT0FBUSxLQUFLLGFBQWEsVUFBVSxFQUNwQyxVQUFXcEUsRUFBSyxVQUNoQixXQUFZbEUsRUFBVyxrQkFDdkIsT0FBUUQsRUFBYSxRQUNyQixZQUFBbUYsR0FDQ3pOLENBQU8sRUFDTixPQUFBQyxJQUFTYixFQUFlLFFBQ25CLENBQUUsS0FBQWEsQ0FBSyxFQUdULENBQUUsS0FBTWIsRUFBZSxRQUFTLEtBQU0sQ0FBRSxjQUFBeVIsR0FDakQsQ0FLQSxNQUFhLHdCQUF3QnBFLEVBQStCek0sRUFBMEMsQ0FFeEcsR0FBQSxDQUFDLEtBQUssYUFDRCxNQUFBLENBQUUsS0FBTVosRUFBZSxhQUcxQixNQUFBMFIsRUFBZSxLQUFLLGFBQWEsZ0JBQWdCLEVBQ3ZELE9BQUlyRSxFQUFLLFFBQ0YsS0FBQSxhQUFhLGdCQUFnQnFFLENBQWEsRUFDMUMsS0FBQSxhQUFhLG1CQUFtQixJQUFJLEdBRXBDLEtBQUssY0FBYyxhQUFhLENBQ3JDLGNBQWVyRSxFQUFLLGNBQ3BCLE9BQVEsS0FBSyxhQUFhLFVBQVUsRUFDcEMsV0FBWWxFLEVBQVcsa0JBQ3ZCLE9BQVFrRSxFQUFLLE1BQVFuRSxFQUFhLE9BQVNBLEVBQWEsUUFDdkR0SSxDQUFPLENBQ1osQ0FLQSxNQUFhLHNCQUFzQnlNLEVBQWtDek0sRUFBMEMsQ0FFekcsT0FBQyxLQUFLLGFBSUgsS0FBSyxjQUFjLGFBQWEsQ0FDckMsY0FBZXlNLEVBQUssY0FDcEIsT0FBUSxLQUFLLGFBQWEsVUFBVSxFQUNwQyxXQUFZbEUsRUFBVyxrQkFDdkIsT0FBUUQsRUFBYSxRQUNwQnRJLENBQU8sRUFSRCxDQUFFLEtBQU1aLEVBQWUsWUFTbEMsQ0FLQSxNQUFhLGVBQWVxTixFQUEyQnpNLEVBQThFLENBQzdILE1BQUFvUSxFQUFnQixLQUFLLFNBQVMsYUFBYSxFQUMzQyxDQUFFLEtBQUFuUSxFQUFNLEtBQUFFLENBQUEsRUFBUyxNQUFNLEtBQUssY0FBYyxZQUFZLENBQzFELE9BQVFpUSxFQUNSLFNBQVUzRCxFQUFLLFVBQ2YsTUFBT0EsRUFBSyxPQUNYek0sQ0FBTyxFQUNOLEdBQUFDLElBQVNiLEVBQWUsUUFDMUIsTUFBTyxDQUFFLEtBQUFhLENBQUssRUFFVixNQUFBOFEsRUFBbUM1USxFQUFNLFlBQVksSUFBSzJDLEdBQVN0QixHQUFhc0IsQ0FBSSxDQUFDLEVBRXBGLE1BQUEsQ0FDTCxLQUFNMUQsRUFBZSxRQUNyQixLQUFNLENBQ0osUUFBUyxHQUFRZSxHQUFBLE1BQUFBLEVBQU0sU0FDdkIsUUFBU0EsRUFBTSxRQUNmLEtBQU00USxDQUNSLENBQUEsQ0FFSixDQUtBLE1BQWEsY0FBY3ZFLEVBQW1CeE0sRUFBMEMsQ0FDaEYsTUFBQW9RLEVBQWdCLEtBQUssU0FBUyxhQUFhLEVBQ2pELE9BQU8sS0FBSyxjQUFjLGlCQUFpQkEsRUFBZTVELEVBQVN4TSxDQUFPLENBQzVFLENBS0EsTUFBYSx1QkFBdUJBLEVBQXlELENBQ3JGLEtBQUEsQ0FBRSxLQUFBQyxFQUFNLEtBQUFFLEdBQVMsTUFBTSxLQUFLLGNBQWMsdUJBQXVCSCxDQUFPLEVBQzFFLE9BQUFDLElBQVNiLEVBQWUsUUFDbkIsQ0FBRSxLQUFBYSxDQUFLLEVBRVQsQ0FBRSxLQUFBQSxFQUFNLEtBQU1FLEVBQU0sUUFBUyxDQUN0QyxDQUtBLE1BQWEsZ0JBQWdCdUIsRUFBZ0IxQixFQUFzRSxDQUNqSCxPQUFPLEtBQUssY0FBYyxnQkFBZ0IwQixFQUFRMUIsQ0FBTyxDQUMzRCxDQUtBLE1BQWEsZ0JBQWdCQSxFQUEyRSxDQUNoRyxNQUFBb1EsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsRUFDM0MsQ0FBRSxLQUFBblEsRUFBTSxLQUFNK1EsR0FBWSxNQUFNLEtBQUssY0FBYyxxQkFBcUJoUixDQUFPLEVBQ2pGLEdBQUFDLElBQVNiLEVBQWUsUUFDMUIsTUFBTyxDQUFFLEtBQUFhLENBQUssRUFHaEIsTUFBTWdSLEVBQU9ELEVBQVMsY0FBYyxJQUFLbE8sR0FBUyxDQUMxQyxLQUFBLENBQ0osT0FBQXBCLEVBQVEsU0FBQUMsRUFBVSxVQUFBRSxFQUFXLGNBQUFDLEVBQWUsWUFBQUMsRUFBYSxXQUFBQyxFQUFZLFFBQUFRLEVBQVMsa0JBQUEwTyxFQUFtQixXQUFBOUUsRUFBWSxTQUFBQyxFQUFVLFVBQUFuSyxFQUFXLFNBQUFJLENBQ2hJLEVBQUFRLEVBQ0VxTyxFQUFpQnJQLElBQWtCc08sRUFBaUJKLEdBQWdCLElBQU1BLEdBQWdCLEdBQzFGLENBQUUsZ0JBQUE5UCxFQUFrQmdDLENBQVUsRUFBSSxLQUFLLGtCQUFrQixvQkFBb0JSLEVBQVFRLEVBQVdsQyxDQUFPLEVBQ3RHLE1BQUEsQ0FDTCxPQUFBMEIsRUFDQSxTQUFBQyxFQUNBLGNBQUF3UCxFQUNBLFVBQUF0UCxFQUNBLGFBQWNDLEVBQ2QsWUFBQUMsRUFDQSxhQUFjQyxFQUNkLFVBQVdrUCxFQUNYLGVBQWdCaFAsRUFDaEIsYUFBYyxFQUNkLFNBQVUsS0FBSyxPQUFPLEtBQUssS0FBU2hDLEdBQW1CLEdBQUksRUFDM0QsY0FBZW9DLEVBQ2YsWUFBYSxFQUNiLGdCQUFpQkUsQ0FBQSxDQUNuQixDQUNELEVBRU0sTUFBQSxDQUNMLEtBQUF2QyxFQUNBLEtBQU1nUixDQUFBLENBRVYsQ0FLQSxNQUFhLGlCQUFpQmpSLEVBQTJDLENBQ3ZFLEtBQU0sQ0FBRSxLQUFBQyxDQUFLLEVBQUksTUFBTSxLQUFLLGNBQWMsZ0JBQWdCRCxDQUFPLEVBQzdELE9BQUFDLElBQVNiLEVBQWUsUUFDbkIsQ0FBRSxLQUFBYSxDQUFLLEVBRVQsQ0FBRSxLQUFBQSxDQUFLLENBQ2hCLENBS0EsTUFBYSxlQUFld00sRUFBZXpNLEVBQXFFLENBQ3hHLEtBQUEsQ0FBRSxLQUFBQyxFQUFNLEtBQUFFLENBQUssRUFBSSxNQUFNLEtBQUssY0FBYyxlQUFlc00sRUFBTXpNLENBQU8sRUFDeEUsR0FBQUMsSUFBU2IsRUFBZSxRQUMxQixNQUFPLENBQUUsS0FBQWEsQ0FBSyxFQUdWLEtBQUEsQ0FDSixPQUFBeUIsRUFBUSxjQUFBSSxFQUFlLFNBQUFILEVBQVUsVUFBQUUsRUFBVyxXQUFBRyxFQUFZLGlCQUFBMEwsRUFBa0IsVUFBQXhMLEVBQVcsU0FBQUUsRUFBVSxTQUFBRSxDQUM3RixFQUFBbkMsRUFDRWlSLEVBQWUxRCxFQUFpQixJQUFLNUssR0FBUyxDQUM1QyxLQUFBLENBQ0osT0FBQWxELEVBQVEsY0FBQXFDLEVBQWUsVUFBQU0sRUFBVyxXQUFBNkosRUFBWSxTQUFBQyxDQUM1QyxFQUFBdkosRUFDRyxNQUFBLENBQ0wsT0FBQWxELEVBQ0EsVUFBV3FDLEVBQ1gsWUFBYU0sRUFDYixXQUFBNkosRUFDQSxTQUFBQyxFQUNBLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxDQUNwQixDQUNELEVBQ00sTUFBQSxDQUNMLEtBQUFwTSxFQUNBLEtBQU0sQ0FDSixPQUFBeUIsRUFDQSxjQUFlSSxFQUNmLFNBQUFILEVBQ0EsVUFBQUUsRUFDQSxhQUFjRyxFQUNkLGlCQUFrQm9QLEVBQ2xCLFVBQUFsUCxFQUNBLFNBQUFFLEVBQ0EsU0FBQUUsQ0FDRixDQUFBLENBRUosQ0FFTyxlQUFlWixFQUEwQyxDQUN4RCxNQUFBMlAsRUFBZSxLQUFLLGNBQWMsS0FBTXBKLEdBQVlBLEdBQVdBLEVBQVEsVUFBVSxJQUFNdkcsQ0FBTSxFQUNuRyxPQUFPMlAsRUFBZSxJQUFJL1IsRUFBa0IrUixFQUFjLEtBQU0sS0FBSyxPQUFPLEVBQUksSUFDbEYsQ0FLTyxxQkFBZ0QsQ0FDOUMsT0FBQSxLQUFLLGFBQWUsSUFBSS9SLEVBQWtCLEtBQUssYUFBYyxLQUFNLEtBQUssT0FBTyxFQUFJLElBQzVGLENBS08sdUJBQXVCNEssRUFBNEIsUUFDbkQ2RSxFQUFBLEtBQUEsZUFBQSxNQUFBQSxFQUFjLG1CQUFtQjdFLEVBQ3hDLENBS08sdUJBQXVCRyxFQUE4QixRQUNyRDBFLEVBQUEsS0FBQSxlQUFBLE1BQUFBLEVBQWMsdUJBQXVCMUUsRUFDNUMsQ0FNTyxpQkFBaUIzSSxFQUFnQjJILEVBQXVCckosRUFBaUIsQ0FDekUsS0FBQSxRQUFRLEtBQUtYLEVBQW9CLG1DQUFvQyw4QkFBOEIsS0FBSyxVQUFVZ0ssQ0FBSyxDQUFDLEdBQUlySixDQUFPLEVBR3hJLE1BQU1pSSxFQUFVLENBQUMsS0FBSyxhQUFjLEdBQUcsS0FBSyxhQUFhLEVBQUUsS0FBTW5GLElBQVNBLEdBQUEsWUFBQUEsRUFBTSxlQUFnQnBCLENBQU0sRUFFaEc0SCxFQUFlLENBQUEsRUFDckIsR0FBSXJCLEVBQVMsQ0FDWCxNQUFNcUosRUFBV2pJLEVBQU0sSUFBS3ZHLEdBQVMsQ0FDbkMsTUFBTStHLEVBQWU1QixFQUFRLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBRSxPQUFBckksS0FBYUEsSUFBV2tELEVBQUssTUFBTSxFQUFFLENBQUMsR0FBSyxDQUFBLEVBQzFGeU8sRUFBU3pPLEVBQUssWUFBY3hDLEVBQTJCLEtBQ3ZELENBQUUsYUFBQVIsRUFBZSxHQUFPLGlCQUFBQyxFQUFtQixFQUFNLEVBQUl3UixFQUFTLENBQUUsYUFBYyxHQUFPLGlCQUFrQixFQUFBLEVBQVUxSCxFQUNoSCxNQUFBLENBQ0wsR0FBRy9HLEVBQ0gsYUFBQWhELEVBQ0EsaUJBQUFDLENBQUEsQ0FDRixDQUNELEVBRUR1SixFQUFhLEtBQUssR0FBR3JCLEVBQVEsZUFBZXFKLEVBQVV0UixDQUFPLENBQUMsQ0FBQSxNQUVqRHNKLEVBQUEsS0FBSyxHQUFHRCxDQUFLLEVBRzVCQyxFQUFhLE9BQVMsR0FBSyxLQUFLLG1CQUFtQjVILEVBQVE0SCxFQUFjdEosQ0FBTyxDQUNsRixDQUVPLG9CQUFvQkosRUFBZ0JpQyxFQUFnQ3VILEVBQWlCcEosRUFBaUIsUUFDM0crTyxFQUFBLEtBQUssZUFBTCxNQUFBQSxFQUFtQixvQkFBb0JuUCxFQUFRaUMsRUFBV3VILEVBQVFwSixFQUNwRSxDQUtBLE1BQWEsbUJBQW1CeU0sRUFBZXpNLEVBQXVGLENBQ3BJLE9BQU8sS0FBSyxrQkFBa0IsMEJBQTBCeU0sRUFBSyxPQUFRek0sQ0FBTyxDQUM5RSxDQUtBLE1BQWEsZUFBZXlNLEVBQXdCek0sRUFBMkMsQ0FDN0YsT0FBTyxLQUFLLGNBQWMsWUFBWXlNLEVBQU16TSxDQUFPLENBQ3JELENBS0EsTUFBYSxpQkFBaUJBLEVBQTBDLENBSXRFLEdBSDBCLENBQUMsS0FBSyxjQUMxQixLQUFLLGNBQWdCLEtBQUssYUFBYSxZQUFZLElBQU1JLEVBQWUsUUFDekUsS0FBSyxvQkFHRCxNQUFBLENBQUUsS0FBTWhCLEVBQWUsU0FFMUIsTUFBQW9TLEVBQU0sS0FBSyxNQUNYQyxFQUFZLEtBQUssa0JBQWtCLGtCQUFrQixFQUNyREMsRUFBa0IsS0FBSyxNQUFNRixFQUFNQyxDQUFTLEVBQzdDLEtBQUEsUUFBUSxLQUFLcFMsRUFBb0Isb0NBQXFDLFFBQVFtUyxDQUFHLFlBQVlDLENBQVMsc0JBQXNCQyxDQUFlLEdBQUkxUixDQUFPLEVBRTNKLEtBQUssb0JBQXNCLEdBRXJCLE1BQUEwQixFQUFTLEtBQUssYUFBYyxVQUFVLEVBQ3RDLENBQUUsS0FBQXpCLENBQUssRUFBSSxNQUFNLEtBQUssY0FBYyxZQUFZLENBQ3BELE9BQUF5QixFQUNBLFVBQVc2TixHQUFvQixZQUMvQixVQUFXLENBQUUsZ0JBQUFtQyxDQUFnQixFQUM3QixVQUFXLEtBQUssSUFBSSxHQUNuQjFSLENBQU8sRUFFVixZQUFLLFFBQVEsS0FBS1gsRUFBb0Isb0NBQXFDLFNBQVNZLENBQUksR0FBSUQsQ0FBTyxFQUU1RixDQUFFLEtBQUFDLENBQUssQ0FDaEIsQ0FNTyxrQkFBa0IwUixFQUEwQ2pRLEVBQWdCMUIsRUFBaUIsQ0FDNUYsTUFBQW9RLEVBQWdCLEtBQUssU0FBUyxhQUFhLEVBQ2pELEdBQUksS0FBSyxjQUFnQixLQUFLLGFBQWEsY0FBZ0IxTyxFQUFRLENBQ2pFLE1BQU0wUCxFQUFtQyxLQUFLLGFBQWEsY0FBYyxJQUFLdE8sR0FBUyxDQUNqRixHQUFBLENBQ0YsT0FBQWxELEVBQVEsVUFBQUMsRUFBVyxZQUFBNEQsRUFBYSxXQUFBMkksRUFBWSxTQUFBQyxDQUMxQyxFQUFBdkosRUFDSixPQUFJbEQsSUFBV3dRLElBQ0MzTSxFQUFBa08sR0FFVCxDQUNMLE9BQUEvUixFQUNBLGNBQWVVLEVBQTJCLE1BQzFDLFdBQVksS0FBSyxJQUFJLEVBQ3JCLFNBQVUsRUFDVixRQUFTLEVBQ1QsYUFBYyxLQUFLLGFBQWMsaUJBQWlCLEVBQ2xELFVBQVdtRCxFQUNYLFdBQUEySSxFQUNBLFNBQUFDLENBQUEsQ0FDRixDQUNELEVBQ0tsTSxFQUF3QixDQUM1QixPQUFRLEtBQUssYUFBYSxVQUFVLEVBQ3BDLFdBQVksS0FBSyxjQUFjLGFBQWEsRUFDNUMsV0FBWU0sRUFBb0IsTUFDaEMsU0FBVSxFQUNWLGlCQUFrQjJRLENBQUEsRUFFZixLQUFBLGNBQWNqUixFQUFNSCxDQUFPLENBQ2xDLENBQ0YsQ0FLTyxvQkFBb0JBLEVBQWlCLENBQ3JDLEtBQUEsa0JBQWtCLFFBQVFBLENBQU8sQ0FDeEMsQ0FFTyxrQkFBeUMsQ0FDdkMsTUFBQSxDQUNMLFVBQVcsS0FBSyxrQkFBa0Isa0JBQWtCLEVBQ3BELElBQUssS0FBSyxrQkFBa0IsT0FBTyxDQUFBLENBRXZDLENBS08sbUJBQW1CNFIsRUFBb0IsT0FDdEMsTUFBQS9LLEVBQVEsS0FBSyxjQUFjLFVBQVdvQixHQUFZQSxFQUFRLGNBQWdCMkosQ0FBVSxFQUMxRixLQUFLLGNBQWU3QyxFQUFBLEtBQUssY0FBYyxPQUFPbEksRUFBTyxDQUFDLElBQWxDLFlBQUFrSSxFQUFzQyxFQUM1RCxDQU9RLGlCQUFpQjdFLEVBQTJCLENBQzVDLE1BQUFsSyxFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLElBQUlvSyxFQUFrQixFQUNsQkYsSUFBVXdDLHFCQUFtQixjQUMzQixLQUFLLGNBQWdCLEtBQUssYUFBYSxnQkFBZ0IsSUFBTWpNLEVBQW9CLFNBRW5GMkosRUFBVUcsR0FBZ0IsSUFBTSxPQUM5QixLQUFLLFFBQVEsS0FBS2xMLEVBQW9CLGdDQUFpQyx1REFBd0RXLENBQU8sRUFDdEksS0FBSyxrQkFBa0JXLEVBQWlCLGdCQUFnQm9PLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLFlBQWMvTyxDQUFPLEdBQy9GaVEsRUFBYSxHQUdoQi9GLElBQVV3QyxxQkFBbUIsV0FDL0J0QyxHQUFXLGFBQWFBLENBQU8sQ0FFbkMsQ0FPUSxtQkFBbUIxSSxFQUFnQjdCLEVBQXVDRyxFQUFpQixDQUM1RixLQUFBLFFBQVEsS0FBS1gsRUFBb0IsNkJBQThCLHdCQUF3QnFDLENBQU0sZ0JBQWdCN0IsQ0FBUyxHQUFJRyxDQUFPLEVBQ3RJLE1BQU1pSSxFQUFVLENBQUMsS0FBSyxhQUFjLEdBQUcsS0FBSyxhQUFhLEVBQUUsS0FBTUEsR0FBWUEsR0FBV0EsRUFBUSxjQUFnQnZHLENBQU0sRUFDdEgsR0FBSSxDQUFDdUcsRUFBUyxDQUNaLEtBQUssUUFBUSxLQUFLNUksRUFBb0IsNkJBQThCLDhDQUE4Q3FDLENBQU0sR0FBSTFCLENBQU8sRUFDbkksTUFDRixDQUVNLE1BQUFvUSxFQUFnQixLQUFLLFNBQVMsYUFBYSxFQUVqRCxLQUFLLGNBQWMsQ0FDakIsT0FBQTFPLEVBQ0EsV0FBWSxLQUFLLGNBQWMsYUFBYSxFQUM1QyxXQUFZakIsRUFBb0IsTUFDaEMsU0FBVSxFQUNWLGlCQUFrQndILEVBQVEsWUFBYyxFQUFBLElBQUt0SSxHQUFTLENBQzlDLEtBQUEsQ0FDSixPQUFBQyxFQUFRLFdBQUF3TSxFQUFZLFNBQUFDLEVBQVUsVUFBQXdGLENBQzVCLEVBQUFsUyxFQUVBLElBQUE0QyxFQUNBTixFQUNKLE9BQUlyQyxJQUFXd1EsR0FDYjdOLEVBQVkxQyxJQUFjUyxFQUEyQixPQUFTSyxFQUFpQixPQUFTQSxFQUFpQixVQUN6R3NCLEVBQWdCcEMsSUFBY1MsRUFBMkIsT0FBU0EsRUFBMkIsT0FBU0EsRUFBMkIsWUFFaklpQyxFQUFZMUMsSUFBY1MsRUFBMkIsT0FBU0ssRUFBaUIsVUFBWUEsRUFBaUIsT0FDNUdzQixFQUFnQnBDLElBQWNTLEVBQTJCLE9BQVNBLEVBQTJCLFVBQVlBLEVBQTJCLFFBRy9ILENBQ0wsT0FBQVYsRUFDQSxjQUFBcUMsRUFDQSxXQUFZNFAsRUFBWUEsRUFBWSxFQUFJLEtBQUssSUFBSSxFQUNqRCxTQUFVLEVBQ1YsUUFBUyxFQUNULGFBQWM1SixFQUFRLFlBQVksRUFDbEMsVUFBQTFGLEVBQ0EsV0FBQTZKLEVBQ0EsU0FBQUMsQ0FBQSxDQUNGLENBQ0QsR0FDQXJNLENBQU8sQ0FDWixDQUtRLFlBQVkwQixFQUFnQjdCLEVBQXVDRyxFQUF5QixDQUU1RixNQUFBb0ssRUFBVUcsR0FBZ0IsSUFBTSxDQUMvQixLQUFBLG1CQUFtQjdJLEVBQVE3QixFQUFXRyxDQUFPLEVBRWxELEtBQUssY0FBYyxhQUFhLENBQUUsT0FBQTBCLEVBQVEsY0FBZTdCLENBQUEsRUFBYUcsQ0FBTyxHQUM1RWlRLEVBQWEsRUFFWCxZQUFBLFFBQVEsS0FBSzVRLEVBQW9CLGlDQUFrQyxXQUFXcUMsQ0FBTSxjQUFjMEksQ0FBTyxHQUFJcEssQ0FBTyxFQUNsSG9LLENBQ1QsQ0FLUSxXQUFXQSxFQUFpQnBLLEVBQWlCLENBQ25ELGFBQWFvSyxDQUFPLEVBQ3BCLEtBQUssUUFBUSxLQUFLL0ssRUFBb0IsZ0NBQWlDLFlBQVkrSyxDQUFPLEdBQUlwSyxDQUFPLENBQ3ZHLENBS1EsVUFBVUcsRUFBcUJpTixFQUFxQnBOLEVBQWlCLFdBQzNFLEtBQUssY0FBZ0JvTyxFQUFBQSxVQUNmLE1BQUFnQyxFQUFnQixLQUFLLFNBQVMsYUFBYSxFQUMzQyxDQUNKLE9BQUExTyxFQUFRLGFBQUFvUSxFQUFjLFNBQUFuUSxFQUFVLFVBQUFFLEVBQVcsaUJBQUE2TCxFQUFrQixXQUFBckwsRUFBWSxjQUFBUCxFQUFlLE1BQUFxRyxFQUFRLElBQzlGLEVBQUFoSSxFQUVBLEdBQUFrQyxJQUFlbUcsR0FBZSxPQUFRLENBRXhDLEtBQUssS0FBS2lELEVBQWMsb0JBQXFCLE9BQU8sT0FBT3RMLEVBQU0sQ0FDL0QsTUFBTyxLQUFLLFVBQVVBLENBQUksRUFDMUIsT0FBUXVMLEdBQXdCLFlBQ2hDLE1BQU8wQixFQUFhekIsRUFBdUIsV0FBYUEsRUFBdUIsY0FDaEYsQ0FBQSxDQUFDLEVBQ0YsTUFDRixDQUlBLEdBRGtCK0IsRUFBaUIsS0FBTTVLLEdBQVNBLEVBQUssU0FBV3NOLENBQWEsRUFDaEUsQ0FFUixLQUFBLGdCQUFnQixtQkFBbUJBLEVBQWUxTyxDQUFNLEVBRzdELE1BQU0yUCxFQUFlLElBQUkxSSxHQUN2QmpILEVBQ0FqQixFQUFvQixRQUNwQmtCLEVBQ0FFLEVBQ0FpUSxFQUNBQSxFQUNBLENBQUMsRUFDRCxLQUFLLE9BQUEsRUFHUCxLQUFLLGNBQWMsWUFBWSxDQUFFLE9BQUFwUSxHQUFVMUIsQ0FBTyxFQUtsRCxNQUFNK1IsRUFBaUIsS0FBSyxZQUFZclEsRUFBUXBCLEVBQTJCLE9BQVFOLENBQU8sRUFDN0VxUixFQUFBLGNBQWMzSSxHQUFtQixRQUFTcUosQ0FBYyxFQUVoRSxLQUFLLGNBS0gsS0FBQSxjQUFjLEtBQUtWLENBQVksRUFFL0IsS0FBQSxhQUFhLG1CQUFtQjVRLEVBQW9CLGFBQWEsR0FMdEUsS0FBSyxhQUFlNFEsRUFTdEIsTUFBTVcsRUFBa0IsSUFBSTFTLEVBQWtCK1IsRUFBYyxLQUFNLEtBQUssT0FBTyxFQUN6RSxLQUFBLHNCQUFzQixlQUFlVyxFQUFpQmhTLEVBQVMsS0FBSyxNQUFNbUksR0FBUyxJQUFJLEVBQUUsS0FBSyxFQUVuRyxNQUFNRCxFQUFla0YsRUFBYTJDLEdBQXVCLGdCQUFrQkEsR0FBdUIsb0JBQ2xHLEtBQUssS0FBS0csRUFBYSxpQkFBa0I4QixFQUFpQjlKLENBQVksRUFFaEUsTUFBQStKLEVBQThCdkUsRUFBaUIsSUFBSSxDQUFDLENBQ3hELE9BQUE5TixFQUFRLGNBQUFxQyxHQUFlLFVBQUFNLEVBQVcsV0FBQTZKLEVBQVksU0FBQUMsR0FBVSxXQUFBNkYsRUFBQSxLQUNuRCxDQUNMLE9BQUF0UyxFQUNBLFVBQVdxQyxHQUNYLFlBQWFNLEVBQ2IsV0FBQTZKLEVBQ0EsU0FBQUMsR0FDQSxVQUFXNkYsR0FDWCxhQUFjLEdBQ2QsaUJBQWtCLEVBQ2xCLEVBQUEsRUFFRyxLQUFBLGlCQUFpQnhRLEVBQVF1USxFQUFhalMsQ0FBTyxDQUFBLE1BRWxELEtBQUssS0FBS3lMLEVBQWMsb0JBQXFCLE9BQU8sT0FBT3RMLEVBQU0sQ0FDL0QsTUFBTyxLQUFLLFVBQVVBLENBQUksRUFDMUIsT0FBUXVMLEdBQXdCLFlBQ2hDLE1BQU8wQixFQUFhekIsRUFBdUIsV0FBYUEsRUFBdUIsY0FDaEYsQ0FBQSxDQUFDLEVBSUosTUFBTXdHLEVBQXFCekUsRUFBaUIsT0FBUTVLLEdBQVNBLEVBQUssU0FBV3NOLEdBQWlCdE4sRUFBSyxTQUFXZ1AsR0FBZ0JoUCxFQUFLLGdCQUFrQnhDLEVBQTJCLE9BQU8sRUFFbkwsR0FBQTZSLEVBQW1CLE9BQVMsRUFBRyxHQUU3QnBELEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLGlCQUFrQjNPLEVBQWUsVUFBVWdTLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLGVBQWdCMVEsSUFDbkcsS0FBSyxrQkFBa0IsS0FBSyxhQUFhLFlBQWF0QixFQUFlLE1BQU9KLENBQU8sR0FDOUVxUyxFQUFBLEtBQUEsZUFBQSxNQUFBQSxFQUFjLGVBQWVqUyxFQUFlLFFBR25ELE1BQU1rUyxFQUFpQyxDQUFBLEVBQ2pDQyxFQUE2QixDQUFBLEVBQ2hCSixFQUFBLFFBQVNyUCxHQUFTLENBQ25DLEtBQU0sQ0FBRSxPQUFBbEQsRUFBUSxjQUFBcUMsRUFBZSxVQUFBTSxDQUFBLEVBQWNPLEVBQzdDd1AsRUFBYyxLQUFLLENBQUUsT0FBQTVRLEVBQVEsT0FBQTlCLEVBQVEsVUFBV3FDLEVBQWUsRUFDL0RzUSxFQUFXLEtBQUssQ0FDZCxPQUFBM1MsRUFDQSxVQUFXcUMsRUFDWCxZQUFhTSxFQUNiLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxDQUNuQixDQUFBLENBQ0YsRUFDRCxLQUFLLHFCQUFxQitQLENBQWEsRUFDbEMsS0FBQSxpQkFBaUI1USxFQUFRNlEsRUFBWXZTLENBQU8sQ0FDbkQsQ0FDRixDQUtRLFVBQVVHLEVBQXFCcVMsRUFBeUN4UyxFQUFpQixDQUMzRixLQUFLLGNBRUZHLEVBQUEsUUFBUzJDLEdBQVMsQ0FDakJBLEVBQUssU0FBVyxLQUFLLGFBQWMsY0FDakNBLEVBQUssWUFBY3hDLEVBQTJCLFVBRWhELEtBQUssV0FBVyxLQUFLLGFBQWMsa0JBQUEsRUFBcUJOLENBQU8sRUFHL0QsS0FBSyxXQUFXLEtBQUssYUFBYyxrQkFBQSxFQUFxQkEsQ0FBTyxFQUVuRSxDQUNELENBRUwsQ0FLUSxVQUFVRyxFQUFxQkgsRUFBaUIsYUFDaEQsTUFBQXlTLEdBQWUxRCxFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixrQkFDbEMyRCxFQUFnQixDQUNwQmpTLEVBQW9CLFdBQ3BCQSxFQUFvQixPQUNwQkEsRUFBb0IsYUFBQSxFQUVsQixLQUFBMlIsRUFBQSxLQUFLLGVBQUwsWUFBQUEsRUFBbUIsaUJBQWtCaFMsRUFBZSxRQUNuRHFTLEdBQWdCQyxFQUFjLFNBQVNELENBQVksRUFFdEQsT0FHSSxNQUFBRSxFQUFnQixLQUFLLGFBQWMsaUJBQWlCLEVBQ3BEdkMsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsSUFLN0NpQyxFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixpQkFBa0JqUyxFQUFlLFFBQVV1UyxJQUFrQnZDLEdBQzNEalEsRUFBSyxPQUFRMkMsR0FBU0EsRUFBSyxhQUFlc04sQ0FBYSxHQUM1RCxLQUFLLEtBQUtGLEVBQWEsMEJBQTJCLEtBQUssc0JBQXVCLFlBQWFsUSxDQUFPLEdBR2pINFMsRUFBQSxLQUFBLGVBQUEsTUFBQUEsRUFBYyxtQkFBbUJuUyxFQUFvQixZQUcxRCxLQUFLLFdBQVcsS0FBSyxhQUFjLGtCQUFBLEVBQXFCVCxDQUFPLENBQ2pFLENBS0EsTUFBYyxjQUFjRyxFQUF1QkgsRUFBaUIsU0FJNUQsS0FBQSxDQUNKLFdBQUFnQyxFQUFZLFVBQUFFLEVBQVcsU0FBQUksRUFBVSxPQUFBWixDQUMvQixFQUFBdkIsRUFDSixHQUFJdUIsTUFBV3FOLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLGFBQ2hDLE9BU0UsR0FOSixLQUFLLGNBQWNyTixDQUFNLEVBQUksS0FBSyxjQUFjQSxDQUFNLEdBQUssR0FNdkQsQ0FBQyxLQUFLLGNBQWNBLENBQU0sRUFBRSx3QkFDM0JNLElBQWV2QixFQUFvQixPQUFRLENBQ3pDLEtBQUEsY0FBY2lCLENBQU0sRUFBRSx1QkFBeUIsR0FDOUMsS0FBQSxDQUFFLEtBQUF6QixFQUFNLGdCQUFBQyxDQUFvQixFQUFBLE1BQU0sS0FBSyxrQkFBa0Isb0JBQW9Cd0IsRUFBUVEsRUFBWWxDLENBQU8sRUFDMUdDLElBQVN1UCxFQUFvQixTQUMvQixLQUFLLHNCQUFzQix3QkFBd0IsQ0FDakQsT0FBQTlOLEVBQ0EsY0FBZXhCLEdBQ2RGLENBQU8sQ0FFZCxDQUdBLElBQUk2UyxFQUFVLEdBQ1IsTUFBQXpDLEVBQWdCLEtBQUssU0FBUyxhQUFhLEVBRzNDOUcsRUFBZW5KLEVBQUssaUJBQWlCLElBQUsyQyxJQUkvQixDQUNieEMsRUFBMkIsS0FDM0JBLEVBQTJCLFNBQzNCQSxFQUEyQixPQUMzQkEsRUFBMkIsVUFDM0JBLEVBQTJCLFNBQUEsRUFDM0IsU0FBU3dDLEVBQUssYUFBYSxHQUFLQSxFQUFLLFlBQWNuQyxFQUFpQixXQUN4RG1DLEVBQUssU0FBV3NOLElBQ2xCeUMsRUFBQSxJQUdMLENBQ0wsT0FBUS9QLEVBQUssT0FDYixVQUFXQSxFQUFLLGNBQ2hCLFlBQWFBLEVBQUssVUFDbEIsVUFBV0EsRUFBSyxXQUNoQixhQUFjLEdBQ2QsaUJBQWtCLEVBQUEsRUFFckIsRUFPRCxHQUxBd0csRUFBYSxPQUFTLEdBQUssS0FBSyxpQkFBaUI1SCxFQUFRNEgsRUFBY3RKLENBQU8sRUFLMUUsQ0FBQyxLQUFLLGNBQWdCLENBQUMsS0FBSyxjQUFjLE9BQzVDLE9BSUksS0FBQSxDQUNKLFdBQUEyQyxFQUFZLFdBQUFDLEVBQVksaUJBQUFDLENBQUEsRUFDdEJKLEdBQWdCdEMsQ0FBSSxFQUV4QndDLEVBQVcsT0FBUyxHQUFLLEtBQUssVUFBVUEsRUFBWXhDLEVBQUssV0FBWUgsQ0FBTyxFQUM1RTRDLEVBQVcsT0FBUyxHQUFLLEtBQUssVUFBVUEsRUFBWTVDLENBQU8sRUFFdkQ2QyxFQUFpQixPQUFTLEtBQUt1UCxFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixpQkFBa0JoUyxFQUFlLE9BQ3JGLEtBQUsscUJBQXFCeUMsQ0FBZ0IsR0FJeEMxQyxFQUFLLGFBQWVNLEVBQW9CLE9BQVNvUyxJQUM5QyxLQUFBLGFBQWExUyxFQUFNSCxFQUFTNlMsQ0FBTyxDQUU1QyxDQUtRLHlCQUF5QjFTLEVBQXVCSCxFQUFpQixXQUNqRSxNQUFBb1EsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsRUFDM0MsQ0FBRSxPQUFBMU8sRUFBUSxpQkFBQWdNLEVBQWtCLFdBQUExTCxDQUFBLEVBQWU3QixFQUMzQ21OLEVBQWNJLEVBQWlCLEtBQUssQ0FBQyxDQUFFLE9BQUE5TixLQUFhQSxJQUFXd1EsQ0FBYSxFQUVsRixHQUFJOUMsSUFBZ0IsS0FBSyxjQUFnQixLQUFLLGNBQWMsUUFBUyxDQUVuRSxLQUFNLENBQUUsT0FBQTFOLEVBQVEsY0FBQXFDLEVBQWUsV0FBQWlRLENBQUEsRUFBZTVFLEVBQzFDLEdBQUFyTCxJQUFrQjNCLEVBQTJCLFdBQVksQ0FDM0QsTUFBTXdTLEVBQVMsQ0FBQ3hTLEVBQTJCLE9BQVFBLEVBQTJCLFVBQVUsRUFLbEZ5UyxJQUFnQmhFLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLGVBQWdCck4sRUFDbkRzUixHQUFrQlgsR0FBQUQsRUFBQSxLQUFLLGVBQUwsWUFBQUEsRUFBbUIsY0FBYyxLQUFNdFAsR0FBU0EsRUFBSyxTQUFXc04sS0FBaEUsWUFBQWlDLEVBQWdGLFVBQzVFVSxHQUFpQkMsR0FBbUJGLEVBQU8sU0FBU0UsQ0FBZSxJQUV4RixLQUFBLGlCQUFpQnRSLEVBQVEsQ0FBQyxDQUM3QixPQUFBOUIsRUFDQSxVQUFXcUMsRUFDWCxZQUFhdEIsRUFBaUIsb0JBQzlCLFVBQVd1UixFQUNYLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxDQUNuQixFQUFHbFMsQ0FBTyxFQUVOLEtBQUEsYUFBYUcsRUFBTUgsRUFBUyxFQUFLLEVBRTFDLENBQ0YsQ0FDRixDQUtBLE1BQWMsYUFBYUcsRUFBeUJILEVBQWlCLE9BQzdELEtBQUEsQ0FDSixPQUFBMEIsRUFBUSxVQUFBdVIsRUFBVyxVQUFBQyxFQUFXLFVBQUFDLEVBQVcsV0FBQUMsQ0FDdkMsRUFBQWpULEVBQ0osR0FBSWdULElBQWM1RCxHQUFvQixlQUFpQjdOLE1BQVdxTixFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixhQUFhLENBQzFGLEtBQUEsQ0FBRSxlQUFBc0UsQ0FBbUIsRUFBQUgsRUFFckIsQ0FBRSxLQUFBalQsRUFBTSxnQkFBaUI0UCxDQUFxQixFQUFJLE1BQU0sS0FBSyxrQkFBa0Isb0JBQW9Cbk8sRUFBUTJSLEVBQWdCclQsQ0FBTyxFQUN4SSxLQUFLLFFBQVEsS0FBS1gsRUFBb0IseUNBQTBDLHlCQUF5QndRLENBQW9CLEdBQUk3UCxDQUFPLEVBQ3BJQyxJQUFTdVAsRUFBb0IsU0FDL0IsS0FBSyxzQkFBc0IsNkJBQTZCOU4sRUFBUW1PLEVBQXVCN1AsQ0FBTyxDQUVsRyxDQUNGLENBS1EsdUJBQXVCMEIsRUFBZ0J4QixFQUF5QjJQLEVBQThCN1AsRUFBaUIsU0FDakgrTyxFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixlQUFnQnJOLElBQ2hDLEtBQUEsc0JBQXNCLHdCQUF3QixDQUFFLE9BQUFBLEVBQWEsY0FBZXhCLEdBQXFCRixDQUFPLEVBQzdHLEtBQUssc0JBQXNCLDZCQUE2QjBCLEVBQVFtTyxFQUF1QjdQLENBQU8sRUFFbEcsQ0FLUSxtQkFBbUJHLEVBQTBCSCxFQUFpQixlQUM5RCxLQUFBLENBQ0osT0FBQTBCLEVBQVEsT0FBQThMLEVBQVEsWUFBQUMsRUFBYSxjQUFBb0QsRUFBZSxXQUFBeUMsQ0FDMUMsRUFBQW5ULEVBQ0UsQ0FBRSxVQUFBMEIsRUFBVyxPQUFBMFIsQ0FBVyxFQUFBOUYsRUFFeEIrRixHQUFnQnpFLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLFlBQ3pDLEdBQUlyTixJQUFXOFIsRUFBZSxDQUN2QixLQUFBLFFBQVEsS0FBS25VLEVBQW9CLHlDQUEwQywrQkFBK0JtVSxDQUFhLGlCQUFpQjlSLENBQU0sR0FBSTFCLENBQU8sRUFDOUosTUFDRixDQUNBLEtBQU0sQ0FBRSxjQUFleVQsRUFBWSxPQUFRQyxFQUFXLFVBQVdDLENBQWEsSUFBSXZCLEVBQUEsS0FBSyxlQUFMLFlBQUFBLEVBQW1CLHFCQUFzQixDQUFBLEVBQzNILEdBQUlxQixJQUFlNUMsR0FBaUI2QyxJQUFjbEcsR0FBVW1HLElBQWlCOVIsRUFBVyxDQUN0RixLQUFLLFFBQVEsS0FBS3hDLEVBQW9CLHlDQUEwQyx3QkFBeUJXLENBQU8sRUFDaEgsTUFDRixDQU9JLEdBTEMsS0FBQSxRQUFRLEtBQUtYLEVBQW9CLHlDQUEwQyxXQUFXbU8sQ0FBTSxhQUFhK0YsQ0FBTSxHQUFJdlQsQ0FBTyxHQUUvSHFTLEVBQUEsS0FBSyxlQUFMLE1BQUFBLEVBQW1CLGlCQUFpQixDQUFFLGNBQUF4QixFQUFlLE9BQUFyRCxFQUFRLFVBQUEzTCxJQUd6RDJMLElBQVdsRixFQUFhLFFBQzFCLEtBQUssMEJBQTBCLENBQzdCLGNBQUF1SSxFQUNBLE9BQVF5QyxFQUNSLFVBQUF6UixHQUNDN0IsQ0FBTyxNQUNMLENBQ0wsSUFBSTRULEVBQXdCLEtBQzVCLE9BQVFMLEVBQVEsQ0FDZCxLQUFLakwsRUFBYSxPQUNoQnNMLEVBQXdCbFQsRUFBZ0MseUJBQ3hELE1BQ0YsS0FBSzRILEVBQWEsT0FDaEJzTCxFQUF3QmxULEVBQWdDLHlCQUN4RGtTLEVBQUEsS0FBSyxlQUFMLE1BQUFBLEVBQW1CLGdCQUFnQixLQUFLLGFBQWMsb0JBQ2pEaUIsRUFBQSxLQUFBLGVBQUEsTUFBQUEsRUFBYyxtQkFBbUIsTUFDdEMsTUFDRixLQUFLdkwsRUFBYSxPQUNoQnNMLEVBQXdCbFQsRUFBZ0MseUJBQ3hELE1BQ0YsS0FBSzRILEVBQWEsUUFDaEJzTCxFQUF3QmxULEVBQWdDLDBCQUN4RCxLQUdKLENBRWdDQSxFQUFBa1QsQ0FBd0QsR0FDckYsS0FBSyw4QkFBOEIsQ0FDcEMsY0FBQS9DLEVBQ0EsT0FBUXlDLEVBQ1IsVUFBQXpSLENBQUEsRUFDQytSLEVBQTBENVQsQ0FBTyxDQUN0RSxDQUdJd04sSUFBV2xGLEVBQWEsUUFBVXpHLElBQWN0QixFQUFvQixPQUFTLENBQUNnVCxHQUNoRixLQUFLLDhCQUE4QixDQUNqQyxjQUFBMUMsRUFDQSxPQUFReUMsRUFDUixVQUFBelIsQ0FBQSxFQUNDbkIsRUFBZ0Msd0JBQXlCVixDQUFPLENBRXZFLENBS1Esa0JBQWtCRyxFQUFtQkgsRUFBaUIsQ0FDdEQsTUFBQStRLEVBQVV2UCxHQUFhckIsQ0FBSSxFQUM1QixLQUFBLHNCQUFzQixxQkFBcUI0USxFQUFTL1EsQ0FBTyxDQUNsRSxDQUtPLGFBQWFHLEVBQTZDSCxFQUFpQjhULEVBQXVCLENBQ2pHLEtBQUEsQ0FBRSxPQUFBcFMsQ0FBVyxFQUFBdkIsRUFDYmlRLEVBQWdCLEtBQUssU0FBUyxhQUFhLEVBR2pELEtBQUssZ0JBQWdCLHNCQUFzQkEsRUFBZSxDQUFDMU8sQ0FBTSxDQUFDLEVBRWxFLElBQUlxUyxFQUFnQixDQUFDLEtBQUssYUFBYyxHQUFHLEtBQUssYUFBYSxFQUFFLEtBQU05TCxHQUFZQSxHQUFXQSxFQUFRLGNBQWdCdkcsQ0FBTSxFQUMxSCxHQUFJLENBQUNxUyxFQUFlLENBQ2xCLEtBQUssUUFBUSxLQUFLMVUsRUFBb0Isc0NBQXVDLDhCQUE4QnFDLENBQU0sR0FBSTFCLENBQU8sRUFDNUgsTUFDRixDQUVBLEtBQUssUUFBUSxLQUFLWCxFQUFvQixzQ0FBdUMsV0FBV3FDLENBQU0sR0FBSTFCLENBQU8sRUFHckcsS0FBSyxjQUFnQixLQUFLLGFBQWEsY0FBZ0IwQixJQUN6RCxLQUFLLGFBQWEsZUFBaUIsRUFBQSxRQUFTMEksR0FBWSxLQUFLLFdBQVcsS0FBSyxJQUFJLEVBQUVBLEVBQVNwSyxDQUFPLENBQUMsRUFFaEcrVCxFQUFjLGdCQUFrQjNULEVBQWUsU0FDakQsS0FBSyxvQkFBc0IsSUFFdEIsT0FBQSxLQUFLLGNBQWNzQixDQUFNLEdBTWxDLEtBQUssS0FBS3dPLEVBQWEsd0JBQXlCeE8sRUFBUTFCLENBQU8sRUFNekQsTUFBQWdVLEVBQWNELEVBQWMsY0FBYyxLQUFNalIsR0FBU0EsRUFBSyxTQUFXc04sQ0FBYSxFQUN4RixJQUFBNkQsRUFDQUgsR0FBZ0IzVCxFQUFLLGFBQWUsS0FBSyxjQUFjLGlCQUN6RDhULEVBQWVGLEVBQWMsdUJBQTJCLEVBQUFDLEVBQWEsWUFBY3JULEVBQWlCLHFCQUd0RyxLQUFLLHNCQUFzQixZQUFZLElBQUlyQixFQUFrQnlVLEVBQWUsS0FBTSxLQUFLLE9BQU8sRUFBR0UsR0FBZ0JELEVBQWEsWUFBYWhVLENBQU8sRUFFbEosS0FBSyxlQUFlMEIsQ0FBTSxDQUM1QixDQUtRLGVBQWVBLEVBQWdCLE9BQ3JDLEdBQUlBLE1BQVdxTixFQUFBLEtBQUssZUFBTCxZQUFBQSxFQUFtQixhQUNoQyxLQUFLLGFBQWUsU0FDZixDQUNDLE1BQUFsSSxFQUFRLEtBQUssY0FBYyxVQUFXb0IsSUFBWUEsR0FBQSxZQUFBQSxFQUFTLGVBQWdCdkcsQ0FBTSxFQUNsRixLQUFBLGNBQWMsT0FBT21GLEVBQU8sQ0FBQyxDQUNwQyxDQUNGLENBS0EsTUFBYyx1QkFBdUJuRixFQUFnQndTLEVBQW1CLEdBQU9sVSxFQUFpQixDQUM5RixLQUFLLFFBQVEsS0FBS1gsRUFBb0IseUNBQTBDLFdBQVdxQyxDQUFNLEdBQUkxQixDQUFPLEVBQ3RHLEtBQUEsQ0FBRSxLQUFBQyxFQUFNLEtBQUFFLENBQUEsRUFBUyxNQUFNLEtBQUssZUFBZSxDQUFFLE9BQUF1QixHQUFVMUIsQ0FBTyxFQUNoRSxHQUFBQyxJQUFTYixFQUFlLFFBQVMsQ0FDbkMsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLHlDQUEwQyxZQUFZWSxDQUFJLEdBQUlELENBQU8sRUFDNUcsTUFDRixDQUVBLEtBQUssUUFBUSxLQUFLWCxFQUFvQix5Q0FBMEMsU0FBU1ksQ0FBSSxXQUFXLEtBQUssVUFBVUUsQ0FBSSxDQUFDLEdBQUlILENBQU8sRUFFakksS0FBQSxDQUNKLFNBQUEyQixFQUFVLFVBQUFFLEVBQVcsaUJBQUE2TCxFQUFrQixjQUFBaUYsQ0FDckMsRUFBQXhTLEVBR0osS0FBSyxhQUFlLElBQUl3SSxHQUN0QmpILEVBQ0FqQixFQUFvQixXQUNwQmtCLEVBQ0FFLEVBQ0E4USxFQUNBQSxFQUNBLENBQUMsRUFDRCxLQUFLLE9BQUEsRUFFSHVCLEdBQ0csS0FBQSxvQkFBb0J4UyxFQUFRMUIsQ0FBTyxFQUdyQyxLQUFBLGlCQUFpQjBCLEVBQVFnTSxFQUFrQjFOLENBQU8sQ0FDekQsQ0FPQSxNQUFjLG9CQUFvQjBCLEVBQWdCMUIsRUFBaUIsQ0FDakUsTUFBTWlJLEVBQVUsQ0FBQyxLQUFLLGFBQWMsR0FBRyxLQUFLLGFBQWEsRUFBRSxLQUFNbkYsSUFBU0EsR0FBQSxZQUFBQSxFQUFNLGVBQWdCcEIsQ0FBTSxFQUN0RyxHQUFJdUcsR0FBV0EsRUFBUSxZQUFZLElBQU03SCxFQUFlLE1BQU8sQ0FDN0QsS0FBSyxRQUFRLEtBQUtmLEVBQW9CLGdDQUFpQyxXQUFXcUMsQ0FBTSxHQUFJMUIsQ0FBTyxFQUNuRyxLQUFNLENBQUUsS0FBQUMsQ0FBQSxFQUFTLE1BQU0sS0FBSyxlQUFlLENBQ3pDLE9BQUF5QixFQUNBLFVBQVdmLEVBQWlCLGFBQzVCLFFBQVNtUCxHQUFZLFNBQ3BCOVAsQ0FBTyxFQUVOQyxJQUFTYixFQUFlLFFBQzFCLEtBQUssUUFBUSxLQUFLQyxFQUFvQixnQ0FBaUMsV0FBV3FDLENBQU0sR0FBSTFCLENBQU8sRUFFOUYsS0FBQSxRQUFRLEtBQUtYLEVBQW9CLGdDQUFpQyxXQUFXcUMsQ0FBTSxjQUFjekIsQ0FBSSxHQUFJRCxDQUFPLENBRXpILENBQ0YsQ0FHUSxtQkFBbUIwQixFQUFnQjJILEVBQXVCckosRUFBaUIsQ0FDM0UsTUFBQW9RLEVBQWdCLEtBQUssU0FBUyxhQUFhLEVBQzNDL0csRUFBQSxRQUFTMUosR0FBUyxDQUN0QixLQUFNLENBQUUsT0FBQUMsRUFBUSxVQUFBQyxFQUFXLFlBQUE0RCxDQUFBLEVBQWdCOUQsRUFDdkNDLElBQVd3USxHQUdmLEtBQUssc0JBQXNCLHlCQUF5QixDQUNsRCxPQUFBMU8sRUFDQSxPQUFBOUIsRUFDQSxVQUFBQyxFQUNBLE9BQVE0RCxHQUNQekQsQ0FBTyxDQUFBLENBQ1gsRUFNRHFKLEVBQU0sUUFBUSxDQUFDLENBQUUsT0FBQXpKLEVBQVEsWUFBQTZELEtBQWtCLENBQ3JDN0QsSUFBV3dRLEdBQWlCM00sSUFBZ0I5QyxFQUFpQixjQUMvRCxLQUFLLEtBQUt1UCxFQUFhLHdCQUF5QnhPLEVBQVExQixDQUFPLENBQ2pFLENBQ0QsQ0FDSCxDQUVRLHFCQUFxQmlOLEVBQXVCLENBQzdDQSxFQUFBLFFBQVNBLEdBQVMsT0FDZixLQUFBLENBQUUsT0FBQXJOLEVBQVEsT0FBQThCLENBQVd1TCxFQUFBQSxFQUNyQmtILEdBQWdCcEYsRUFBQSxLQUFLLG9CQUFvQixJQUF6QixZQUFBQSxFQUE0QixtQkFDbEQsS0FBSyxzQkFBc0Isb0JBQW9CLENBQUNuUCxDQUFNLEVBQUd1VSxFQUFnQnpTLENBQU0sQ0FBQSxDQUNoRixDQUNILENBRVEsMEJBQTBCdUwsRUFBNEJqTixFQUFpQixDQUM3RSxLQUFNLENBQUUsT0FBQUosRUFBUSxjQUFBaVIsRUFBZSxVQUFBaFAsQ0FBQSxFQUFjb0wsRUFDN0MsS0FBSyxzQkFBc0IsaUNBQWlDck4sRUFBUWlSLEVBQWVoUCxFQUFXN0IsQ0FBTyxDQUN2RyxDQUVRLDhCQUE4QmlOLEVBQTRCaE4sRUFBdUNELEVBQWlCLENBQ3BIQyxJQUFTUyxFQUFnQyx5QkFDM0MsS0FBSyxLQUFLd1AsRUFBYSw0QkFBNkJqRCxFQUFLLFVBQVdqTixDQUFPLEVBRTdFLEtBQUssc0JBQXNCLGdDQUFnQyxDQUN6RCxHQUFHaU4sRUFDSCxLQUFBaE4sR0FDQ0QsQ0FBTyxDQUNaLENBRVEsa0JBQWtCMEIsRUFBZ0JDLEVBQTBCM0IsRUFBaUIsQ0FDbkYsS0FBSyxzQkFBc0Isa0JBQWtCMkIsRUFBVUQsRUFBUTFCLENBQU8sQ0FDeEUsQ0FDRixFQXowQ0VOLEVBRFd3USxFQUNKLDBCQUFrQyx1QkFFekN4USxFQUhXd1EsRUFHSiw0QkFBb0MseUJBRTNDeFEsRUFMV3dRLEVBS0osOEJBQXNDLDJCQUU3Q3hRLEVBUFd3USxFQU9KLG1CQUEyQixnQkFQN0IsSUFBTWtFLEVBQU5sRSxFQ3BFSyxJQUFBbUUsSUFBQUEsSUFJVkEsRUFBQSxPQUFTLGVBSVRBLEVBQUEsT0FBUyxjQVJDQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQytETCxNQUFNQyxFQUFOLE1BQU1BLFVBQWtCMUwsRUFBQUEsWUFBYSxDQThEMUMsWUFDbUJiLEVBQ0E4RCxFQUNBQyxFQUNBck0sRUFDQUQsRUFDQTJRLEVBQ2pCLENBQ00sUUFwRER6USxFQUFBLG1CQUtDQSxFQUFBLG9CQUErQixDQUFBLEdBS2hDQSxFQUFBLGFBQTBCLE1BRXpCQSxFQUFBLGVBQWtCLElBRWxCQSxFQUFBLHVCQUVBQSxFQUFBLG9CQUE2QixDQUNuQyxXQUFZeUIsRUFBcUIsYUFBQSxVQUNqQyxVQUFXQyxFQUFvQixZQUFBLE1BQUEsR0FHekIxQixFQUFBLG9CQUE2QixDQUFBLEdBRTdCQSxFQUFBLGtCQUFzQixJQUt0QkEsRUFBQSw0QkFBZ0MsSUFLaENBLEVBQUEsNEJBQWdDLElBS2hDQSxFQUFBLG9CQUF1RixDQUFBLEdBRXZGQSxFQUFBLHFDQUE4RCxNQUU5REEsRUFBQSwwQkFBOEIsSUFHbkIsS0FBQSxTQUFBcUksRUFDQSxLQUFBLFNBQUE4RCxFQUNBLEtBQUEsVUFBQUMsRUFDQSxLQUFBLFFBQUFyTSxFQUNBLEtBQUEsWUFBQUQsRUFDQSxLQUFBLHNCQUFBMlEsRUFHakIsS0FBSyxXQUFhckUsR0FBQSxZQUFBQSxFQUFXLFVBQ3hCLEtBQUEsV0FBYUEsRUFBVSxXQUFhLEVBQzNDLENBRUEsZ0NBQWdDRyxFQUFpQyxDQUMvRCxLQUFLLDhCQUFnQ0EsQ0FDdkMsQ0FNQSxNQUFhLG9CQUFvQmpNLEVBQWdFLENBQ3pGLE1BQUF1VSxFQUFvQixLQUFLLHFCQUN6QixDQUFFLEtBQUF0VSxFQUFNLE1BQUF1VSxHQUFXRCxHQUFxQixDQUFDLEtBQUsscUJBQXdCLENBQUUsTUFBT0EsRUFBbUIsS0FBTW5WLEVBQWUsT0FBQSxFQUFZLE1BQU0sS0FBSyxrQkFBa0JZLENBQU8sRUFFekssT0FESixLQUFLLHFCQUF1QixHQUN4QkMsSUFBU2IsRUFBZSxRQUNuQixDQUFFLEtBQUFhLENBQUssRUFFVCxDQUNMLEtBQU1iLEVBQWUsUUFDckIsTUFBQW9WLENBQUEsQ0FFSixDQU1BLE1BQWEsd0JBQXdCeFUsRUFBZ0UsQ0FDN0YsTUFBQXlVLEVBQW9CLEtBQUsscUJBQ3pCLENBQUUsS0FBQXhVLEVBQU0sTUFBQXVVLEdBQVdDLEdBQXFCLENBQUMsS0FBSyxxQkFBd0IsQ0FBRSxNQUFPQSxFQUFtQixLQUFNclYsRUFBZSxPQUFBLEVBQVksTUFBTSxLQUFLLGtCQUFrQlksQ0FBTyxFQUV6SyxPQURKLEtBQUsscUJBQXVCLEdBQ3hCQyxJQUFTYixFQUFlLFFBQ25CLENBQUUsS0FBQWEsQ0FBSyxFQUdULENBQ0wsS0FBTWIsRUFBZSxRQUNyQixNQUFBb1YsQ0FBQSxDQUVKLENBTUEsTUFBYSxzQkFBc0IzUyxFQUFnQzdCLEVBQTBDLENBQzNHLEtBQUssZUFBaUI2QixFQUN0QixLQUFNLENBQUUsS0FBQTVCLENBQUssRUFBSSxNQUFNLEtBQUssd0JBQXdCRCxDQUFPLEVBQ3ZELEdBQUFDLElBQVNiLEVBQWUsUUFDMUIsTUFBTyxDQUFFLEtBQUFhLENBQUssRUFHWixHQUFBNEIsSUFBY3RCLEVBQW9CLFlBQWEsQ0FDakQsS0FBTSxDQUFFLEtBQUFOLEdBQVMsTUFBTSxLQUFLLG9CQUFvQkQsQ0FBTyxFQUNuREMsR0FBQUEsSUFBU2IsRUFBZSxRQUNuQixNQUFBLENBQUUsS0FBQWEsRUFFYixDQUVPLE1BQUEsQ0FBRSxLQUFNYixFQUFlLFFBQ2hDLENBRU8sZUFBZXNWLEVBQTJCLENBQy9DLEtBQUsscUJBQXVCLEdBQzVCLEtBQUssYUFBZUEsQ0FDdEIsQ0FFTyxlQUFlQyxFQUEyQixDQUMvQyxLQUFLLHFCQUF1QixHQUM1QixLQUFLLGFBQWVBLENBQ3RCLENBRU8saUJBQWlCM1UsRUFBaUIsQ0FDdkMsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLGtDQUFtQyxHQUFJVyxDQUFPLEVBQy9FLEtBQUEsYUFBYSxRQUFTd1UsR0FBVSxDQUNuQ0EsRUFBTSxRQUFRLENBQUEsQ0FDZixFQUNELEtBQUssYUFBYSxPQUFTLENBQzdCLENBRU8sd0JBQXdCcEwsRUFBaUJwSixFQUFpQixDQUczRCxPQUZKLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwyQ0FBNEMsV0FBVytKLENBQU0sR0FBSXBKLENBQU8sRUFFekd5RyxFQUFBQSxVQUFVMkMsQ0FBTSxHQUtyQixLQUFLLG1CQUFxQkEsRUFFckIsS0FBSyxPQUlVLEtBQUssTUFBTyxnQkFBZ0IsRUFBRSxPQUFRb0wsR0FBVUEsRUFBTSxhQUFBLENBQWMsRUFDNUUsUUFBU0EsR0FBVSxDQUN6QnBMLEVBQ0ZvTCxFQUFNLE9BQU8sRUFFYkEsRUFBTSxLQUFLLENBQ2IsQ0FDRCxFQUVELEtBQUssUUFBUSxLQUFLblYsRUFBb0IsMkNBQTRDLFVBQVdXLENBQU8sRUFDN0YsQ0FBRSxLQUFNWixFQUFlLFVBYnJCLENBQUUsS0FBTUEsRUFBZSxXQVA5QixLQUFLLFFBQVEsTUFBTUMsRUFBb0IsMkNBQTRDLGdEQUFnRCtKLENBQU0sRUFBRSxFQUNwSSxDQUFFLEtBQU1oSyxFQUFlLGFBb0JsQyxDQUVBLE1BQWEsYUFBYW9WLEVBQXFCLENBQzdDQSxFQUFNLFFBQVEsRUFDUixNQUFBM04sRUFBUSxLQUFLLGFBQWEsVUFBVytOLEdBQWVBLEVBQVcsV0FBVyxJQUFNSixFQUFNLFdBQVksQ0FBQSxFQUNuRyxLQUFBLGFBQWEsT0FBTzNOLEVBQU8sQ0FBQyxDQUNuQyxDQUtBLE1BQU0saUJBQWlCbkYsRUFBZ0IxQixFQUFpQixPQUN0RCxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsK0JBQWdDLFdBQVdxQyxDQUFNLEdBQUkxQixDQUFPLEVBRTlGLEdBQUEsQ0FDRSxHQUFBLENBQUMsS0FBSyxNQUFPLENBQ1QsS0FBQSxDQUFFLEtBQUFDLEVBQU0sS0FBQTRVLEdBQVMsTUFBTSxLQUFLLFlBQVluVCxFQUFRMUIsQ0FBTyxFQUN6RCxHQUFBQyxJQUFTYixFQUFlLFFBQVMsQ0FDbkMsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLCtCQUFnQyxjQUFjWSxDQUFJLEdBQUlELENBQU8sRUFDcEcsTUFDRixDQUVBLEtBQUssUUFBVTBCLEVBQ2YsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyxNQUFRbVQsRUFDYixNQUFNQyxJQUFjL0YsRUFBQSxLQUFLLFFBQUwsWUFBQUEsRUFBWSxxQkFBc0IsQ0FBQSxFQUNsRCtGLEVBQVksT0FBUyxHQUNsQixLQUFBLGtCQUFrQkEsRUFBWSxJQUFLbFYsSUFBWSxDQUFFLE9BQUE4QixFQUFRLE9BQUE5QixDQUFBLEVBQVMsRUFBR0ksQ0FBTyxDQUVyRixRQUNPK1UsRUFBTyxDQUNULEtBQUEsUUFBUSxNQUFNMVYsRUFBb0IsK0JBQWdDLGFBQWFxQyxDQUFNLGdCQUFpQnFULEVBQWdCLE9BQU8sR0FBSS9VLENBQU8sRUFDN0ksTUFDRixDQUdJLEdBQUEsQ0FDRSxHQUFBLEtBQUssYUFBYSxPQUFTLEVBQUcsQ0FDM0IsS0FBQSxLQUFLeUwsRUFBYyxlQUFlLEVBQ3ZDLE1BQU11SixFQUFZLEtBQUssV0FDbkIsS0FBSyxhQUFhLElBQUtSLEdBQVdBLEVBQU0sZUFBaUIsQ0FBRSxNQUFBQSxFQUFPLFVBQVcsRUFBUyxFQUFBQSxDQUFNLEVBQzVGLEtBQUssYUFDSCxDQUFFLEtBQUF2VSxDQUFLLEVBQUksTUFBTSxLQUFLLFFBQVErVSxFQUFXaFYsQ0FBTyxFQUNqRCxLQUFBLEtBQUt5TCxFQUFjLGFBQWN4TCxDQUFJLENBQUEsTUFFMUMsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLCtCQUFnQyx5Q0FBMENXLENBQU8sUUFFbEgrVSxFQUFPLENBQ1QsS0FBQSxRQUFRLE1BQU0xVixFQUFvQiwrQkFBZ0MsK0JBQStCcUMsQ0FBTSxnQkFBaUJxVCxFQUFnQixPQUFPLEdBQUkvVSxDQUFPLEVBQy9KLE1BQ0YsQ0FFSyxLQUFBLFFBQVEsS0FBS1gsRUFBb0IsK0JBQWdDLFNBQVNELEVBQWUsT0FBTyxHQUFJWSxDQUFPLENBQ2xILENBRUEsTUFBTSxhQUFhMEIsRUFBZ0IxQixFQUFpQixPQUNsRCxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsNkJBQThCLFdBQVdxQyxDQUFNLEdBQUkxQixDQUFPLEVBS2hHLEtBQUssaUJBQWlCQSxDQUFPLEVBRXZCLE1BQUFpVixHQUFnQmxHLEVBQUEsS0FBSyxRQUFMLFlBQUFBLEVBQVksWUFDOUIsR0FBQSxLQUFLLE9BQVNyTixJQUFXdVQsRUFBZSxDQUVwQyxLQUFBLENBQUUsS0FBQWhWLENBQVMsRUFBQSxNQUFNLEtBQUssV0FBVyxVQUFVLEtBQUssS0FBSyxFQUd2RCxHQURKLEtBQUssbUJBQW1CLEVBQ3BCQSxJQUFTOEssWUFBVSxRQUFTLENBQzlCLEtBQUssUUFBUSxNQUFNMUwsRUFBb0IsNkJBQThCLDJCQUEyQlksQ0FBSSxHQUFJRCxDQUFPLEVBQy9HLE1BQ0YsQ0FDQSxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsNkJBQThCLG9CQUFxQlcsQ0FBTyxDQUFBLE1BRWhHLEtBQUssUUFBUSxLQUFLWCxFQUFvQiw2QkFBOEIseUNBQTBDVyxDQUFPLENBRXpILENBS0EsTUFBTSxtQkFBZ0YsQ0FDOUUsTUFBQXdVLEVBQVEsS0FBSyxxQkFDbkIsT0FBS0EsRUFPRSxDQUFFLEtBRkksTUFBTUEsRUFBTSxPQUVWLE1BQUFBLEdBTk4sQ0FBRSxLQUFNcFYsRUFBZSxjQU9sQyxDQU1BLE1BQU0saUJBQWlCWSxFQUF1RCxDQUV0RSxNQUFBd1UsRUFBUSxLQUFLLHFCQUNuQixPQUFLQSxFQU9BQSxFQUFPLGVBUUwsQ0FBRSxLQURJLE1BQU1BLEVBQU8sUUFDWixFQVBMLENBQUUsS0FBTXBWLEVBQWUsU0FQdkIsQ0FBRSxLQUFNQSxFQUFlLGNBZWxDLENBS0EsTUFBTSxrQkFBa0JZLEVBQWtFLENBRXhGLE1BQU1rVixFQUErQixDQUFBLEVBRS9CQyxFQUE4QixDQUFBLEVBRTlCLENBQUUsS0FBQWxWLEVBQU0sTUFBQXVVLENBQVUsRUFBQSxNQUFNLEtBQUssV0FBVyx1QkFBdUJILEdBQWUsT0FBUSxLQUFLLFlBQVksRUFDekcsR0FBQXBVLElBQVM4SyxZQUFVLFFBQ3JCLE1BQU8sQ0FBRSxLQUFBOUssQ0FBSyxFQUdoQixLQUFNLENBQUUsV0FBQThELEVBQVksV0FBQUMsR0FBZSxLQUFLLGNBQ3ZDRCxHQUFjQyxJQUFld1EsRUFBTyxXQUFXeFEsRUFBYUQsQ0FBVyxFQUVwRSxJQUFBcVIsRUF5QkosR0F4QkEsS0FBSyxjQUFnQixLQUFLLGFBQWEsUUFBU1osR0FBVSxDQUNwREEsRUFBTSxnQkFFUkEsRUFBTSxRQUFRLEVBQ0tBLEVBQUFBLEdBRW5CVyxFQUFZLEtBQUtYLENBQUssQ0FDeEIsQ0FDRCxFQUdELEtBQUssYUFBZSxLQUFLLGFBQWEsT0FBUTFSLEdBQVNzUyxHQUFxQnRTLEVBQUssV0FBVyxJQUFNc1MsRUFBaUIsV0FBYSxDQUFBLEVBRWhJRixFQUFhLEtBQUtWLENBQU0sRUFHeEJXLEVBQVksS0FBS1gsQ0FBTSxFQUV2QixLQUFLLGFBQWVXLEVBR2YsS0FBQSxtQkFBbUJELEVBQWNsVixDQUFPLEVBR3pDLEtBQUssTUFBTyxDQUVSLEtBQUEsQ0FBRSxLQUFBQyxHQUFTLE1BQU0sS0FBSyxNQUFNLFFBQVFpVixDQUFZLEVBQ2xEalYsR0FBQUEsSUFBUzhLLFlBQVUsUUFDZCxNQUFBLENBQUUsS0FBQTlLLEVBRWIsQ0FFQSxNQUFPLENBQUUsS0FBTWIsRUFBZSxRQUFTLE1BQUFvVixDQUFNLENBQy9DLENBS0EsTUFBTSxtQkFBZ0YsQ0FDOUUsTUFBQUEsRUFBUSxLQUFLLHFCQUNuQixPQUFLQSxFQU9FLENBQUUsS0FGSSxNQUFNQSxFQUFNLE9BRVYsTUFBQUEsR0FOTixDQUFFLEtBQU1wVixFQUFlLGtCQU9sQyxDQUtBLE1BQU0sZ0JBQWdCeUMsRUFBZ0M3QixFQUFpQixDQU9qRSxHQU5KLEtBQUssUUFBUSxLQUFLWCxFQUFvQixpQ0FBa0MsY0FBY3dDLENBQVMsR0FBSTdCLENBQU8sRUFNdEc2QixJQUFjdEIsRUFBb0IsWUFBYSxDQUU3QyxJQUFBaVUsRUFBUSxLQUFLLHFCQUNqQixHQUFJLENBQUNBLEVBQU8sQ0FDSixLQUFBLENBQUUsS0FBQXZVLEVBQU0sTUFBT29WLENBQWEsRUFBQSxNQUFNLEtBQUssa0JBQWtCclYsQ0FBTyxFQUNsRUMsR0FBQUEsSUFBU2IsRUFBZSxRQUFTLENBQ25DLEtBQUssUUFBUSxNQUFNQyxFQUFvQixpQ0FBa0MsK0JBQStCWSxDQUFJLEdBQUlELENBQU8sRUFDdkgsTUFDRixDQUNRd1UsRUFBQWEsRUFDUixLQUFNLENBQUUsV0FBQXRSLEVBQVksV0FBQUMsR0FBZSxLQUFLLGNBQ3ZDRCxHQUFjQyxJQUFld1EsRUFBTyxXQUFXeFEsRUFBYUQsQ0FBVyxDQUMxRSxDQUVBLE1BQU1pUixFQUFZLEtBQUssV0FBYSxDQUFFLE1BQUFSLEVBQWUsVUFBVyxFQUFTLEVBQUFBLEVBQ25FLENBQUUsS0FBQXZVLENBQVMsRUFBQSxNQUFNLEtBQUssUUFBUSxDQUFDK1UsQ0FBUyxFQUFHaFYsQ0FBTyxFQUNwRCxHQUFBQyxJQUFTYixFQUFlLFFBQVMsQ0FDbkMsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLGlDQUFrQyxvQkFBb0JZLENBQUksR0FBSUQsQ0FBTyxFQUM1RyxNQUNGLENBQ0YsQ0FLSSxHQUFBNkIsSUFBY3RCLEVBQW9CLE1BQU8sQ0FFckMsTUFBQWlVLEVBQVEsS0FBSyxxQkFFbkIsR0FBSUEsRUFBTyxDQUVILEtBQUEsQ0FBRSxLQUFBdlUsQ0FBUyxFQUFBLE1BQU0sS0FBSyxNQUFPLFVBQVUsQ0FBQ3VVLENBQUssQ0FBQyxFQUNoRHZVLElBQVM4SyxZQUFVLFNBQ3JCLEtBQUssUUFBUSxNQUFNMUwsRUFBb0IsaUNBQWtDLHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBSWhILEtBQUssYUFBYXdVLENBQUssQ0FDekIsQ0FDRixDQUNBLEtBQUssUUFBUSxLQUFLblYsRUFBb0IsaUNBQWtDLFVBQVdXLENBQU8sQ0FDNUYsQ0FLQSxNQUFhLFlBQVkwQixFQUFnQjFCLEVBQXdGLENBQy9ILEtBQUssUUFBUSxLQUFLWCxFQUFvQiw2QkFBOEIsU0FBU3FDLENBQU0sR0FBSTFCLENBQU8sRUFDOUYsS0FBTSxDQUFFLEtBQUFDLEVBQU0sS0FBQTRVLEVBQU0sT0FBQVMsQ0FBTyxFQUFJLE1BQU10SyxFQUErQixDQUNsRSxRQUFTLEtBQUssV0FBVyxZQUFZLEtBQUssS0FBSyxVQUFVLEVBQ3pELE9BQVEsQ0FBQ3RKLEVBQVEsT0FBVyxPQUFXLEdBQU82VCxVQUFRLElBQUksQ0FBQSxDQUMzRCxFQUNHLE9BQUF0VixJQUFTOEssWUFBVSxTQUNoQixLQUFBLFFBQVEsTUFBTTFMLEVBQW9CLDZCQUE4QixXQUFXcUMsQ0FBTSxjQUFjekIsQ0FBSSxHQUFJRCxDQUFPLEVBQzlHLEtBQUEsaUJBQWlCVyxFQUFpQixjQUFlWCxDQUFPLEVBQ3RELENBQUUsS0FBQUMsQ0FBSyxJQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0IsNkJBQThCLFVBQVdXLENBQU8sRUFDdEYsS0FBSyxNQUFRNlUsRUFDUixLQUFBLGNBQWMsQ0FBRSxPQUFBblQsRUFBUSxPQUFRLEtBQUssU0FBUyxhQUFBLEdBQWtCMUIsQ0FBTyxFQUNwRXNWLEdBQUEsTUFBQUEsRUFBQSxRQUFVLEtBQUssc0JBQXNCQSxDQUFNLEVBRW5ELEtBQUssUUFBVTVULEVBQ1IsQ0FBRSxLQUFNdEMsRUFBZSxRQUFTLEtBQUF5VixFQUFNLE9BQUFTLENBQU8sRUFDdEQsQ0FLQSxNQUFhLGdCQUFnQkEsRUFBNEJ0VixFQUE0QyxDQVcvRixHQVZKLEtBQUssUUFBUSxLQUFLWCxFQUFvQix5QkFBMEIsS0FBSyxVQUFVLENBQzdFLE9BQVFpVyxFQUFPLElBQUt4UyxHQUFTLENBQ3JCLEtBQUEsQ0FBRSxNQUFBMFIsRUFBTyxRQUFBZ0IsQ0FBWSxFQUFBMVMsRUFDcEIsTUFBQSxDQUNMLFFBQVMwUixFQUFNLFdBQVcsRUFDMUIsUUFBQWdCLENBQUEsQ0FDRixDQUNELENBQUEsQ0FDRixFQUFHeFYsQ0FBTyxFQUVQLENBQUMsS0FBSyxNQUNELE1BQUEsQ0FBRSxLQUFNWixFQUFlLFNBR2hDLEtBQU0sQ0FBRSxLQUFBYSxHQUFTLE1BQU0rSyxFQUF1QixDQUM1QyxRQUFTLEtBQUssTUFBTyxVQUFVLEtBQUssS0FBSyxLQUFLLEVBQzlDLE9BQVEsQ0FBQ3NLLENBQU0sRUFDZixRQUFVclYsR0FBUyxDQUFDLENBQUEsQ0FDckIsRUFDRyxPQUFBQSxJQUFTOEssWUFBVSxTQUNoQixLQUFBLHNCQUFzQix3QkFBd0J1SyxFQUFRclYsQ0FBSSxFQUUxRCxLQUFBLGlCQUFpQlUsRUFBaUIsY0FBZVgsQ0FBTyxFQUU3RCxLQUFLLFFBQVEsTUFBTVgsRUFBb0IseUJBQTBCLGNBQWNZLENBQUksR0FBSUQsQ0FBTyxFQUN2RixDQUFFLEtBQUFDLENBQUssSUFHaEIsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLHlCQUEwQixVQUFXVyxDQUFPLEVBQzNFLENBQUUsS0FBTVosRUFBZSxTQUNoQyxDQUtBLE1BQWEsa0JBQWtCa1csRUFBeUJ0VixFQUE0QyxDQUs5RixHQUpKLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwyQkFBNEIsS0FBSyxVQUFVLENBQy9FLFNBQVVpVyxFQUFPLElBQUtkLEdBQVVBLEVBQU0sWUFBWSxDQUFBLENBQ25ELEVBQUd4VSxDQUFPLEVBRVAsQ0FBQyxLQUFLLE1BQ0QsTUFBQSxDQUFFLEtBQU1aLEVBQWUsU0FHaEMsS0FBTSxDQUFFLEtBQUFhLENBQUssRUFBSSxNQUFNLEtBQUssTUFBTyxZQUFZcVYsQ0FBTSxFQUNqRCxPQUFBclYsSUFBUzhLLFlBQVUsU0FDckIsS0FBSyxRQUFRLE1BQU0xTCxFQUFvQiwyQkFBNEIsY0FBY1ksQ0FBSSxHQUFJRCxDQUFPLEVBQ3pGLENBQUUsS0FBQUMsQ0FBSyxJQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0IsMkJBQTRCLFVBQVdXLENBQU8sRUFDN0UsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBRVEsb0JBQXFCLENBQzNCLEtBQUssTUFBUSxLQUNiLEtBQUssbUJBQXFCLEdBQzFCLEtBQUssYUFBZSxFQUN0QixDQUVBLGlCQUF3RCxDQUN0RCxNQUFNa1csRUFBK0MsQ0FBQSxFQUNqRCxPQUFDLEtBQUssT0FJTSxLQUFLLE1BQU0saUJBQWlCLEVBQ3BDLFFBQVMxVixHQUFtQixDQUNsQzBWLEVBQU8xVixDQUFNLEVBQUksS0FBSyxNQUFPLHdCQUF3QkEsQ0FBTSxDQUFBLENBQzVELEVBQ00wVixDQUNULENBRUEsZUFBZTFWLEVBQWdCaUMsRUFBZ0MsT0FDN0QsT0FBT2tOLEVBQUEsS0FBSyxRQUFMLFlBQUFBLEVBQVksd0JBQXdCblAsR0FBUSxLQUFNNFUsR0FBWTNTLElBQWN0QixFQUFvQixNQUFTaVUsRUFBTSxhQUFpQixFQUFBQSxFQUFNLGVBQy9JLENBTVEsa0JBQW1CLENBRXpCLEtBQUssTUFBTywwQkFBMEIsQ0FTcEMsVUFBVyxDQUFDaUIsRUFBbUJ2TCxJQUFxQyxDQUNsRSxLQUFLLFdBQVd1TCxFQUFVLEtBQUssTUFBTyxVQUFBLEVBQWF2TCxDQUFLLEVBQ3hELEtBQUssbUJBQW1CLENBQzFCLEVBRUEsV0FBYXRLLEdBQXFCLENBQzFCLE1BQUFxTixFQUFPck4sRUFBTyxJQUFLMFAsSUFBUSxDQUFFLE9BQVEsS0FBSyxRQUFTLE9BQVFBLENBQUEsRUFBSyxFQUNoRXRQLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFDdEMsS0FBQSxrQkFBa0JpTixFQUFNak4sQ0FBTyxDQUN0QyxFQUVBLFlBQWMwVixHQUFzQixDQUMxQkEsRUFBQSxRQUFTOVYsR0FBVyxDQUNuQixPQUFBLEtBQUssYUFBYUEsQ0FBTSxDQUFBLENBQ2hDLENBQ0gsRUFFQSxlQUFnQixLQUFLLHNCQUFzQixLQUFLLElBQUksRUFFcEQsaUJBQWtCLEtBQUssa0JBQWtCLEtBQUssSUFBSSxFQUVsRCxhQUFlNFUsR0FBeUIsQ0FDakMsS0FBQSxvQkFBb0IsQ0FBQ0EsQ0FBSyxDQUFDLENBQ2xDLEVBRUEsa0JBQW9CbUIsR0FBbUMsQ0FDckQsS0FBSyxtQkFBbUIsQ0FDdEIsV0FBWUEsRUFBVyxVQUFVLEVBQ2pDLE1BQU9BLEVBQVcsYUFBYSxFQUMvQixRQUFTQSxFQUFXLFdBQVcsQ0FBQSxDQUNoQyxDQUNILEVBRUEsa0JBQW9CQyxHQUFtQyxDQUNyRCxLQUFLLG1CQUFtQixDQUN0QixXQUFZQSxFQUFXLFVBQVUsRUFDakMsTUFBT0EsRUFBVyxhQUFhLEVBQy9CLFFBQVNBLEVBQVcsV0FBVyxDQUFBLENBQ2hDLENBQ0gsRUFDQSxvQ0FBcUMsS0FBSyxxQ0FBcUMsS0FBSyxJQUFJLENBQUEsQ0FDekYsRUFFRCxLQUFLLE1BQU8sdUJBQXVCLENBQ2pDLGNBQWUsS0FBSyxrQkFBa0IsS0FBSyxJQUFJLENBQUEsQ0FDaEQsRUFFSSxLQUFBLE1BQU8sbUJBQW9CQyxHQUF5QixDQUNsRCxLQUFBLHNCQUFzQix3QkFBd0JBLENBQW9CLENBQUEsQ0FDeEUsQ0FDSCxDQUVRLG1CQUFtQlAsRUFBd0J0VixFQUFpQixDQUM3RCxLQUFBLHNCQUFzQixxQkFBcUJzVixFQUFRdFYsQ0FBTyxDQUNqRSxDQUVRLG9CQUFvQnNWLEVBQXlCLENBQzlDLEtBQUEsc0JBQXNCLHFCQUFxQkEsQ0FBTSxFQUNqRCxLQUFBLEtBQUtoQixFQUFVLDZCQUE2QixDQUNuRCxDQUVRLFdBQVdtQixFQUFtQkssRUFBZ0I1TCxFQUFzQjZMLEVBQTZCLENBQ3ZHLEtBQUssUUFBUSxLQUFLMVcsRUFBb0IsZ0NBQWlDLFdBQVd5VyxDQUFNLGVBQWVMLENBQVEsWUFBWXZMLENBQUssZ0JBQWdCLEtBQUssVUFBVTZMLENBQVMsQ0FBQyxFQUFFLEVBQzNLLElBQUl0UyxFQUFnQzlDLEVBQWlCLGVBQ3JELEdBQUk4VSxFQUNGLEdBQUlNLEVBQ0Z0UyxFQUFjc1MsRUFBVSxtQkFFeEIsUUFBUTdMLEVBQU8sQ0FDYixLQUFLOEwsRUFBYSxhQUFBLFlBQ2hCdlMsRUFBYzlDLEVBQWlCLGlCQUMvQixNQUNGLEtBQUtxVixFQUFhLGFBQUEsV0FDaEJ2UyxFQUFjOUMsRUFBaUIsb0JBQy9CLE1BQ0YsS0FBS3FWLEVBQWEsYUFBQSxnQkFDaEJ2UyxFQUFjOUMsRUFBaUIsZUFDL0IsTUFDRixLQUFLcVYsRUFBYSxhQUFBLFVBQ2hCdlMsRUFBYzlDLEVBQWlCLE9BQy9CLE1BQ0YsS0FBS3FWLEVBQWEsYUFBQSwwQkFDaEJ2UyxFQUFjOUMsRUFBaUIsbUJBQy9CLEtBQ0osQ0FJSixLQUFLLEtBQUsyVCxFQUFVLHFCQUFzQjdRLEVBQWFxUyxDQUFNLENBQy9ELENBTVEsc0NBQXVDLENBQ3ZDLE1BQUE5VixFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLEtBQUssUUFBUSxLQUFLWCxFQUFvQixtREFBb0QsR0FBSVcsQ0FBTyxFQUNoRyxLQUFBLEtBQUtzVSxFQUFVLDRDQUE2Q3RVLENBQU8sQ0FDMUUsQ0FFQSxNQUFjLGNBQWNpTixFQUFtQmpOLEVBQWlCLENBQzlELEtBQUssS0FBS3NVLEVBQVUseUJBQTBCckgsRUFBSyxPQUFRak4sQ0FBTyxDQUNwRSxDQUVRLHNCQUFzQnNWLEVBQXlCLENBQy9DLE1BQUF0VixFQUFVLEtBQUssUUFBUSxjQUFjLEVBQ3RDLEtBQUEsc0JBQXNCc1YsRUFBUXRWLENBQU8sRUFDMUMsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHFDQUFzQyxLQUFLLFVBQVUsQ0FDekYsT0FBUSxLQUFLLFFBQ2IsU0FBVWlXLEVBQU8sSUFBS2QsR0FBVUEsRUFBTSxZQUFZLENBQUEsQ0FDbkQsRUFBR3hVLENBQU8sRUFFWCxNQUFNaVcsRUFBa0MsQ0FBQSxFQUNqQ1gsRUFBQSxRQUFTZCxHQUFVLE9BQ2xCLE1BQUE1VSxFQUFTNFUsRUFBTSxZQUlqQixHQUFBQSxFQUFNLGVBQ1J5QixFQUFjLEtBQUssQ0FBRSxNQUFBekIsRUFBTyxRQUFTLEVBQU8sQ0FBQSxFQUM1QyxLQUFLLHNCQUFzQiwrQkFBK0IsS0FBSyxRQUFTQSxDQUFLLFdBQ3BFekYsRUFBQSxLQUFLLGFBQWFuUCxDQUFNLElBQXhCLE1BQUFtUCxFQUEyQixVQUFXLENBQy9DLEtBQUssc0JBQXNCLDJCQUEyQixLQUFLLFFBQVN5RixDQUFLLEVBQ3pFLEtBQU0sQ0FBRSxPQUFBblEsQ0FBVyxFQUFBLEtBQUssYUFBYXpFLENBQU0sRUFDM0NxVyxFQUFjLEtBQUssQ0FBRSxNQUFBekIsRUFBTyxRQUFTblEsQ0FBUSxDQUFBLENBQy9DLENBQUEsQ0FDRCxFQUNENFIsRUFBYyxRQUFVLEtBQUssZ0JBQWdCQSxFQUFlalcsQ0FBTyxDQUNyRSxDQUVBLE1BQWMsa0JBQWtCc1YsRUFBeUIsQ0FDakQsTUFBQXRWLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFDdEMsS0FBQSxzQkFBc0JzVixFQUFRdFYsQ0FBTyxFQUMxQyxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsdUNBQXdDLEtBQUssVUFBVSxDQUMzRixPQUFRLEtBQUssUUFDYixTQUFVaVcsRUFBTyxJQUFLZCxHQUFVQSxFQUFNLFlBQVksQ0FBQSxDQUNuRCxFQUFHeFUsQ0FBTyxFQUVMLE1BQUEsS0FBSyxrQkFBa0JzVixFQUFRdFYsQ0FBTyxDQUM5QyxDQUVRLG1CQUFtQmlOLEVBQTRCLENBQy9DLE1BQUFqTixFQUFVLEtBQUssUUFBUSxjQUFjLEVBQ3RDLEtBQUEsUUFBUSxLQUFLWCxFQUFvQiwyQ0FBNEMsS0FBSyxVQUFVLENBQUUsS0FBQTROLEVBQU0sRUFBR2pOLENBQU8sRUFDbkgsTUFBTXdVLEVBQVEsS0FBSyxNQUFPLGVBQWV2SCxFQUFLLE9BQU8sRUFDckQsS0FBSyxzQkFBc0IsQ0FBQ3VILENBQU0sRUFBR3hVLENBQU8sRUFDNUMsS0FBSyxzQkFBc0IsK0JBQStCLEtBQUssUUFBU3dVLENBQU0sQ0FDaEYsQ0FFUSxtQkFBbUJ2SCxFQUE0QixDQUMvQyxNQUFBak4sRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUN0QyxLQUFBLFFBQVEsS0FBS1gsRUFBb0IsMkNBQTRDLEtBQUssVUFBVSxDQUFFLEtBQUE0TixFQUFNLEVBQUdqTixDQUFPLEVBQ25ILE1BQU13VSxFQUFRLEtBQUssTUFBTyxlQUFldkgsRUFBSyxPQUFPLEVBQ3JELEtBQUssc0JBQXNCLENBQUN1SCxDQUFNLEVBQUd4VSxDQUFPLEVBQzVDLEtBQUssc0JBQXNCLDJCQUEyQixLQUFLLFFBQVN3VSxDQUFNLENBQzVFLENBRVEsa0JBQWtCMEIsRUFBMkIsQ0FDN0MsS0FBQSxDQUFFLFFBQUFDLEVBQVMsVUFBQUMsQ0FBYyxFQUFBRixFQUN2QkMsRUFBQSxRQUFTclQsR0FBUyxPQUN4QixLQUFNLENBQUUsS0FBQXVULEVBQU0sZ0JBQUFDLEVBQWlCLElBQUFDLENBQUEsRUFBUXpULEVBQ25DLEtBQUssaUJBQW1CdkMsRUFBb0IsYUFBZThWLElBQVMsVUFHeEV0SCxFQUFBLEtBQUssZ0NBQUwsTUFBQUEsRUFBb0MsaUJBQWlCdUgsR0FBbUIsRUFBR0MsR0FBTyxFQUFDLENBQ3BGLEVBQ1NILEVBQUEsUUFBU3RULEdBQVMsT0FDcEIsS0FBQSxDQUNKLFFBQUEwVCxFQUFTLEtBQUFILEVBQU0sZ0JBQUFDLEVBQWlCLFFBQUFHLENBQzlCLEVBQUEzVCxFQUNKLEdBQUksS0FBSyxpQkFBbUJ2QyxFQUFvQixhQUFlOFYsSUFBUyxRQUN0RSxPQUVGLEtBQU0sQ0FBRSxPQUFBelcsQ0FBVyxFQUFBOFcsRUFBQSxPQUFPLGFBQWFGLENBQU8sRUFDeENyVyxFQUVGLENBQUEsRUFDSkEsRUFBS1AsQ0FBTSxFQUFJLENBQ2IsZUFBZ0IwVyxFQUNoQixRQUFTRyxDQUFBLEdBRU4xSCxFQUFBLEtBQUEsZ0NBQUEsTUFBQUEsRUFBK0Isb0JBQW9CNU8sRUFBSSxDQUM3RCxDQUNILENBS1EsaUJBQWlCc0QsRUFBK0J6RCxFQUFpQixDQUN2RSxLQUFLLEtBQUtzVSxFQUFVLDZCQUE4QjdRLEVBQWF6RCxDQUFPLENBQ3hFLENBRVEsa0JBQWtCaU4sRUFBcUJqTixFQUFpQixDQUM5RCxLQUFLLEtBQUtzVSxFQUFVLDBCQUEyQnJILEVBQU1qTixDQUFPLENBQzlELENBRVEsc0JBQXNCc1YsRUFBeUJ0VixFQUFpQixDQUN0RSxLQUFLLEtBQUtzVSxFQUFVLGtDQUFtQ2dCLEVBQVF0VixDQUFPLENBQ3hFLENBS0EsTUFBYyxrQkFBa0JBLEVBQXFFLE9BRy9GLEdBRkosS0FBSyxRQUFRLEtBQUtYLEVBQW9CLGtDQUFtQyxHQUFJVyxDQUFPLEdBRWhGK08sRUFBQSxLQUFLLGVBQUwsTUFBQUEsRUFBbUIsS0FBTWpNLEdBQVNBLEVBQUssYUFBQSxHQUN6QyxZQUFLLFFBQVEsS0FBS3pELEVBQW9CLGtDQUFtQyxVQUFXVyxDQUFPLEVBQ3BGLENBQUUsS0FBTVosRUFBZSxTQUcxQixLQUFBLENBQUUsS0FBQWEsRUFBTSxNQUFBdVUsQ0FBVSxFQUFBLE1BQU0sS0FBSyxXQUFXLDJCQUEyQkgsR0FBZSxPQUFRLEtBQUssWUFBWSxFQUM3RyxHQUFBcFUsSUFBUzhLLFlBQVUsUUFDckIsWUFBSyxRQUFRLE1BQU0xTCxFQUFvQixrQ0FBbUMsWUFBWVksQ0FBSSxHQUFJRCxDQUFPLEVBQzlGLENBQUUsS0FBQUMsQ0FBSyxFQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0Isa0NBQW1DLFVBQVdXLENBQU8sRUFFM0YsS0FBTSxDQUFFLFdBQUErRCxFQUFZLFdBQUFDLEdBQWUsS0FBSyxhQUN4QyxPQUFDRCxHQUFjQyxJQUFld1EsRUFBTyxXQUFXeFEsRUFBYUQsQ0FBVyxFQUduRSxLQUFBLGFBQWEsS0FBS3lRLENBQU0sRUFFN0IsS0FBSyxtQkFBbUIsQ0FBQ0EsQ0FBTSxFQUFHeFUsQ0FBTyxFQUNsQyxDQUFFLEtBQU1aLEVBQWUsUUFBUyxNQUFBb1YsQ0FBTSxDQUMvQyxDQUtBLE1BQWMsa0JBQWtCeFUsRUFBcUUsT0FHbkcsR0FGQSxLQUFLLFFBQVEsS0FBS1gsRUFBb0Isa0NBQW1DLEdBQUlXLENBQU8sR0FFaEYrTyxFQUFBLEtBQUssZUFBTCxNQUFBQSxFQUFtQixLQUFNak0sR0FBU0EsRUFBSyxnQkFBa0IsQ0FBQ0EsRUFBSyxZQUFhLEdBQzlFLFlBQUssUUFBUSxLQUFLekQsRUFBb0Isa0NBQW1DLFVBQVdXLENBQU8sRUFDcEYsQ0FBRSxLQUFNWixFQUFlLFNBRzFCLEtBQUEsQ0FBRSxLQUFBYSxFQUFNLE1BQUF1VSxDQUFVLEVBQUEsTUFBTSxLQUFLLFdBQVcsdUJBQXVCSCxHQUFlLE9BQVEsS0FBSyxZQUFZLEVBQ3pHLEdBQUFwVSxJQUFTOEssWUFBVSxRQUNyQixZQUFLLFFBQVEsTUFBTTFMLEVBQW9CLGtDQUFtQyxZQUFZWSxDQUFJLEdBQUlELENBQU8sRUFDOUYsQ0FBRSxLQUFBQyxDQUFLLEVBR2hCLEtBQUssUUFBUSxLQUFLWixFQUFvQixrQ0FBbUMsVUFBV1csQ0FBTyxFQUUzRixLQUFNLENBQUUsV0FBQStELEVBQVksV0FBQUMsR0FBZSxLQUFLLGFBQ3hDLE9BQUNELEdBQWNDLElBQWV3USxFQUFPLFdBQVd4USxFQUFhRCxDQUFXLEVBR25FLEtBQUEsYUFBYSxLQUFLeVEsQ0FBTSxFQUU3QixLQUFLLG1CQUFtQixDQUFDQSxDQUFNLEVBQUd4VSxDQUFPLEVBQ2xDLENBQUUsS0FBTVosRUFBZSxRQUFTLE1BQUFvVixDQUFNLENBQy9DLENBS08sb0JBQStDLENBQ2hELElBQUFtQyxFQUNKLE9BQUksS0FBSyxlQUNOLENBQUFBLENBQWUsRUFBSSxLQUFLLGFBQWEsT0FBUW5DLEdBQVVBLEVBQU0sYUFBQSxDQUFjLEdBRXZFbUMsQ0FDVCxDQUtPLG9CQUErQyxDQUNoRCxJQUFBQyxFQUNKLE9BQUksS0FBSyxlQUNOLENBQUFBLENBQWUsRUFBSSxLQUFLLGFBQWEsT0FBUXBDLEdBQVVBLEVBQU0sYUFBQSxDQUFjLEdBRXZFb0MsQ0FDVCxDQUtBLE1BQWEsUUFBUXRCLEVBQTBDdFYsRUFBMkMsQ0FDbkcsS0FBQSxRQUFRLEtBQUtYLEVBQW9CLHVCQUF3QixjQUFjaVcsRUFBTyxJQUFLeFMsR0FBV0EsYUFBZ0IrVCxlQUFnQi9ULEVBQUssV0FBQSxFQUFlQSxFQUFLLE1BQU0sWUFBYSxDQUFDLEdBQUk5QyxDQUFPLEVBRTNMLEtBQU0sQ0FBRSxLQUFBQyxHQUFTLE1BQU0rSyxFQUF1QixDQUM1QyxRQUFTLEtBQUssTUFBTyxRQUFRLEtBQUssS0FBSyxLQUFLLEVBQzVDLE9BQVEsQ0FBQ3NLLENBQU0sRUFDZixRQUFVclYsR0FBUyxDQUFDLENBQUEsQ0FDckIsRUFFRyxPQUFBQSxJQUFTOEssWUFBVSxTQUNoQixLQUFBLGlCQUFpQnBLLEVBQWlCLFlBQWFYLENBQU8sRUFDM0QsS0FBSyxRQUFRLE1BQU1YLEVBQW9CLHVCQUF3QixZQUFZWSxDQUFJLEdBQUlELENBQU8sRUFDbkYsQ0FBRSxLQUFBQyxDQUFLLElBR1gsS0FBQSxRQUFRLEtBQUtaLEVBQW9CLHVCQUF3QixTQUFTRCxFQUFlLE9BQU8sR0FBSVksQ0FBTyxFQUNqRyxDQUFFLEtBQU1aLEVBQWUsU0FDaEMsQ0FFTyxtQkFBb0IsQ0FDbkIsTUFBQW1WLEVBQW9CLEtBQUsscUJBQ3pCUyxFQUFZLEtBQUssV0FBYSxDQUFFLE1BQU9ULEVBQW9CLFVBQVcsRUFBUyxFQUFBQSxFQUNyRixPQUFPLEtBQUssTUFBTyxRQUFRLENBQUNTLENBQVMsQ0FBQyxDQUN4QyxDQUVBLGFBQWEvRCxFQUE0RWpSLEVBQWlCLENBQ3hHLE1BQU1pVyxFQUFrQyxDQUFBLEVBQ25DaEYsRUFBQSxRQUFTbk8sR0FBUyxDQUNyQixLQUFNLENBQUUsT0FBQWxELEVBQVEsYUFBQWtYLEVBQWMsT0FBQXpTLEVBQVMsSUFBVXZCLEVBYzdDLEdBYkMsS0FBQSxhQUFhbEQsQ0FBTSxFQUFJLENBQzFCLFVBQVdrWCxFQUNYLE9BQUF6UyxDQUFBLEVBS0V6RSxJQUFXLEtBQUssU0FBUyxhQUFBLEdBTXpCLENBQUMsS0FBSyxNQUNSLE9BR0ksTUFBQW1YLEdBRGUsS0FBSyxrQkFDT25YLENBQU0sR0FBSyxJQUFJLElBQUs0VSxJQUFXLENBQzlELE1BQUFBLEVBQ0EsUUFBU25RLENBQUEsRUFDVCxFQUFFLE9BQU8sQ0FBQyxDQUFFLE1BQUFtUSxDQUFZLElBQUEsQ0FBQ0EsRUFBTSxhQUFBLENBQWMsRUFDakN5QixFQUFBLEtBQUssR0FBR2MsQ0FBUyxDQUFBLENBQ2hDLEVBRUQsS0FBSyxRQUFRLEtBQUsxWCxFQUFvQiw4QkFBK0IsS0FBSyxVQUN4RSxDQUNFLFlBQWE0RSxHQUFxQixLQUFLLFlBQVksRUFDbkQsZ0JBQWlCZ1MsRUFBYyxJQUFJLENBQUMsQ0FBRSxNQUFBekIsS0FBWUEsRUFBTSxZQUFZLENBQ3RFLEdBQ0N4VSxDQUFPLEVBRVZpVyxFQUFjLFFBQVUsS0FBSyxnQkFBZ0JBLEVBQWVqVyxDQUFPLENBQ3JFLENBS0EsZ0JBQWdCMFYsRUFBbUIxVixFQUFpQixDQUNsRCxNQUFNZ1gsRUFBK0IsQ0FBQSxFQUM3QnRCLEVBQUEsUUFBUzlWLEdBQW1CLENBQ2xDLE1BQU0wVixFQUFTLEtBQUssZ0JBQWdCLEVBQUUxVixDQUFNLEVBQ3hDLEdBQUEwVixHQUFVQSxFQUFPLE9BQVEsQ0FDM0IsTUFBTUssRUFBYUwsRUFBTyxPQUFRZCxHQUFVQSxFQUFNLGNBQWMsRUFDaEVtQixFQUFXLFFBQVVxQixFQUFZLEtBQUtyQixFQUFXLENBQUMsQ0FBQyxDQUNyRCxDQUNPLE9BQUEsS0FBSyxhQUFhL1YsQ0FBTSxDQUFBLENBQ2hDLEVBRUQsS0FBSyxRQUFRLEtBQUtQLEVBQW9CLGlDQUFrQyxLQUFLLFVBQzNFLENBQ0UsWUFBYTRFLEdBQXFCLEtBQUssWUFBWSxFQUNuRCxZQUFhK1MsRUFBWSxJQUFLeEMsR0FBVUEsRUFBTSxZQUFZLENBQzVELEdBQ0N4VSxDQUFPLEVBRU5nWCxFQUFZLFFBQ1QsS0FBQSxrQkFBa0JBLEVBQWFoWCxDQUFPLENBRS9DLENBS0EsZ0JBQWlCLENBQ2YsT0FBTyxLQUFLLFlBQ2QsQ0FLQSxNQUFNLFVBQVVKLEVBQWdCaUMsRUFBZ0N1QyxFQUE2QnBFLEVBQWlCLENBQzVHLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwwQkFBMkIsV0FBV08sQ0FBTSxnQkFBZ0JpQyxDQUFTLGdCQUFnQnVDLEdBQUEsWUFBQUEsRUFBVyxRQUFRLEdBQUlwRSxDQUFPLEVBQ3pKLElBQUl3VSxFQUF3QixLQVc1QixHQVBJNVUsSUFBVyxLQUFLLFNBQVMsYUFBQSxFQUMzQjRVLEVBQVMzUyxJQUFjdEIsRUFBb0IsTUFBUyxLQUFLLG1CQUFtQixFQUFLLEtBQUsscUJBR3RGaVUsRUFBUSxLQUFLLGdCQUFnQixFQUFFNVUsQ0FBTSxFQUFFLE9BQVE0VSxHQUFXM1MsSUFBY3RCLEVBQW9CLE1BQVFpVSxFQUFNLGFBQWEsRUFBSUEsRUFBTSxhQUFlLENBQUEsRUFBRSxDQUFDLEVBR2pKLENBQUNBLEVBQ0UsWUFBQSxRQUFRLE1BQU1uVixFQUFvQiwwQkFBMkIsZUFBZUQsRUFBZSx1QkFBdUIsR0FBSVksQ0FBTyxFQUMzSCxDQUFFLEtBQU1aLEVBQWUseUJBRzVCLEdBQUEsQ0FDRixLQUFNLENBQUUsS0FBQWEsQ0FBQSxFQUFTdVUsRUFBTSxhQUFhLEVBQUksTUFBTUEsRUFBTSxLQUFLLEVBQUksTUFBTUEsRUFBTSxLQUFLcFEsQ0FBUyxFQU1uRixPQUZKb1EsRUFBTSxnQkFBa0IsQ0FBQyxLQUFLLG9CQUFzQkEsRUFBTSxPQUV0RHZVLElBQVM4SyxZQUFVLFNBQ3JCLEtBQUssUUFBUSxNQUFNMUwsRUFBb0IsMEJBQTJCLFlBQVlZLENBQUksR0FBSUQsQ0FBTyxFQUN0RixDQUFFLEtBQUFDLENBQUssSUFFaEIsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLDBCQUEyQixVQUFXVyxDQUFPLEVBQzVFLENBQUUsS0FBTVosRUFBZSxnQkFDdkIyVixFQUFZLENBQ2QsWUFBQSxRQUFRLE1BQU0xVixFQUFvQiwwQkFBMkIsWUFBWUQsRUFBZSxpQkFBaUIsY0FBYzJWLEVBQU0sT0FBTyxJQUFLL1UsQ0FBTyxFQUM5SSxDQUFFLEtBQU1aLEVBQWUsa0JBQ2hDLENBQ0YsQ0FDRixFQTc3QkVNLEVBRFc0VSxFQUNKLCtCQUF1Qyw0QkFFOUM1VSxFQUhXNFUsRUFHSiw4Q0FBc0QsMkNBRTdENVUsRUFMVzRVLEVBS0osMkJBQW1DLHdCQUUxQzVVLEVBUFc0VSxFQU9KLDRCQUFvQyx5QkFFM0M1VSxFQVRXNFUsRUFTSixnQ0FBd0MsNkJBRS9DNVUsRUFYVzRVLEVBV0osdUJBQStCLHVCQUV0QzVVLEVBYlc0VSxFQWFKLG9DQUE0QyxpQ0FiOUMsSUFBTTJDLEVBQU4zQyxFQzFDQSxNQUFNNEMsRUFBdUIsQ0FHbEMsWUFDbUJ6WCxFQUNqQixDQUpNQyxFQUFBLGtCQUdXLEtBQUEsUUFBQUQsQ0FHbkIsQ0FLTyxzQkFBc0J3TSxFQUFrQyxDQUM3RCxLQUFLLFVBQVlBLENBQ25CLENBUUEsTUFBYyxpQkFBaUJrTCxLQUE0Q0MsRUFBYyxPQUNqRixNQUFBQyxHQUFTdEksRUFBQSxLQUFLLFlBQUwsWUFBQUEsRUFBaUJvSSxHQUNoQyxHQUFLRSxFQUdELEdBQUEsQ0FDSSxNQUFBQSxFQUFPLEdBQUdELENBQUssUUFDZHJDLEVBQVksQ0FDbkIsS0FBSyxRQUFRLE1BQU0xVixFQUFvQix3Q0FBeUMsS0FBSyxVQUFVLENBQzdGLEtBQU0wVixFQUFNLEtBQ1osUUFBU0EsRUFBTSxPQUNoQixDQUFBLENBQUMsQ0FDSixDQUNGLENBRU8sZUFBZTlNLEVBQTRCakksRUFBaUJtSSxFQUFnQixDQUNqRixLQUFLLFFBQVEsS0FBSzlJLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVyxpQkFDWCxPQUFRNEksRUFBUSxVQUFVLENBQUEsQ0FDM0IsRUFBR2pJLENBQU8sRUFDTixLQUFBLGlCQUFpQixpQkFBa0JpSSxFQUFTRSxDQUFLLENBQ3hELENBRU8sb0JBQW9CbVAsRUFBMkJuRCxFQUF1QnpTLEVBQWdCLENBQzNGLEtBQUssUUFBUSxLQUFLckMsRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLHNCQUNYLGdCQUFBaVksRUFDQSxjQUFBbkQsRUFDQSxPQUFBelMsQ0FDRCxDQUFBLENBQUMsRUFDRixLQUFLLGlCQUFpQixzQkFBdUI0VixFQUFpQm5ELEVBQWdCelMsQ0FBTSxDQUN0RixDQUVPLGdCQUFnQnVHLEVBQTRCLENBQ2pELEtBQUssUUFBUSxLQUFLNUksRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLGtCQUNYLE9BQVE0SSxFQUFRLFVBQVUsQ0FDM0IsQ0FBQSxDQUFDLEVBQ0csS0FBQSxpQkFBaUIsa0JBQW1CQSxDQUFPLENBQ2xELENBRU8sa0JBQWtCdEcsRUFBMEJELEVBQWdCMUIsRUFBaUIsQ0FDbEYsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVyxvQkFDWCxPQUFBcUMsRUFDQSxTQUFBQyxDQUFBLENBQ0QsRUFBRzNCLENBQU8sRUFDTixLQUFBLGlCQUFpQixvQkFBcUIyQixFQUFVRCxDQUFNLENBQzdELENBS08seUJBQXlCdkIsRUFLN0JILEVBQWlCLENBQ1osS0FBQSxDQUNKLE9BQUEwQixFQUFRLE9BQUE5QixFQUFRLFVBQUFDLEVBQVcsT0FBQTBULENBQ3pCLEVBQUFwVCxFQUNKLEtBQUssUUFBUSxLQUFLZCxFQUFvQix3Q0FBeUMsS0FBSyxVQUFVLENBQzVGLFVBQVcsMkJBQ1gsT0FBQXFDLEVBQ0EsT0FBQTlCLEVBQ0EsVUFBQUMsRUFDQSxPQUFBMFQsQ0FBQSxDQUNELEVBQUd2VCxDQUFPLEVBQ1gsS0FBSyxpQkFBaUIsMkJBQTRCMEIsRUFBUTlCLEVBQVFDLEVBQVcwVCxDQUFNLENBQ3JGLENBRU8sWUFBWXRMLEVBQTRCc0wsRUFBMEJ2VCxFQUFpQixDQUN4RixLQUFLLFFBQVEsS0FBS1gsRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLGNBQ1gsT0FBUTRJLEVBQVEsVUFBVSxFQUMxQixZQUFhc0wsQ0FBQSxDQUNkLEVBQUd2VCxDQUFPLEVBQ04sS0FBQSxpQkFBaUIsY0FBZWlJLEVBQVNzTCxDQUFNLENBQ3RELENBRU8sMkJBQTJCN1IsRUFBZ0I4UyxFQUFzQixDQUN0RSxLQUFLLFFBQVEsS0FBS25WLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVyw2QkFDWCxPQUFBcUMsRUFDQSxRQUFTOFMsR0FBQSxZQUFBQSxFQUFPLGFBQ2hCLE9BQVFBLEdBQUEsWUFBQUEsRUFBTyxjQUNoQixDQUFBLENBQUMsRUFDSSxNQUFBNVUsRUFBUzRVLEdBQUEsWUFBQUEsRUFBTyxZQUN0QixLQUFLLGlCQUFpQiw2QkFBOEI5UyxFQUFROUIsRUFBUTRVLEdBQUEsWUFBQUEsRUFBTyxjQUFjLENBQzNGLENBRU8sK0JBQStCOVMsRUFBZ0I4UyxFQUFzQixDQUMxRSxLQUFLLFFBQVEsS0FBS25WLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVyxpQ0FDWCxPQUFBcUMsRUFDQSxRQUFTOFMsR0FBQSxZQUFBQSxFQUFPLGFBQ2hCLE9BQVFBLEdBQUEsWUFBQUEsRUFBTyxjQUNoQixDQUFBLENBQUMsRUFDSSxNQUFBNVUsRUFBUzRVLEdBQUEsWUFBQUEsRUFBTyxZQUN0QixLQUFLLGlCQUFpQixpQ0FBa0M5UyxFQUFROUIsRUFBUTRVLEdBQUEsWUFBQUEsRUFBTyxjQUFjLENBQy9GLENBRU8scUJBQXFCK0MsRUFBK0J2WCxFQUFpQixDQUMxRSxLQUFLLFFBQVEsS0FBS1gsRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLHVCQUNYLE9BQUFrWSxDQUFBLENBQ0QsRUFBR3ZYLENBQU8sRUFDTixLQUFBLGlCQUFpQix1QkFBd0J1WCxDQUFNLENBQ3RELENBRU8saUNBQWlDM1gsRUFBZ0JpUixFQUF1QmhQLEVBQWdDN0IsRUFBaUIsQ0FDOUgsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVyxtQ0FDWCxPQUFBTyxFQUNBLGNBQUFpUixDQUFBLENBQ0QsRUFBRzdRLENBQU8sRUFDWCxLQUFLLGlCQUFpQixtQ0FBb0NKLEVBQVFpUixFQUFlaFAsQ0FBUyxDQUM1RixDQUVPLGdDQUFnQ29MLEVBS3BDak4sRUFBaUIsQ0FDWixLQUFBLENBQ0osT0FBQUosRUFBUSxjQUFBaVIsRUFBZSxVQUFBaFAsRUFBVyxLQUFBNUIsQ0FDaEMsRUFBQWdOLEVBQ0osS0FBSyxRQUFRLEtBQUs1TixFQUFvQix3Q0FBeUMsS0FBSyxVQUFVLENBQzVGLFVBQVcsa0NBQ1gsT0FBQU8sRUFDQSxVQUFBaUMsQ0FBQSxDQUNELEVBQUc3QixDQUFPLEVBQ1gsS0FBSyxpQkFBaUIsa0NBQW1DLENBQ3ZELE9BQUFKLEVBQVEsY0FBQWlSLEVBQWUsVUFBQWhQLEVBQVcsS0FBQTVCLENBQUEsQ0FDbkMsQ0FDSCxDQUVPLHdCQUF3QmdOLEVBQWlEak4sRUFBaUIsQ0FDL0YsS0FBSyxRQUFRLEtBQUtYLEVBQW9CLHdDQUF5QyxLQUFLLFVBQVUsQ0FDNUYsVUFBVywwQkFDWCxLQUFBNE4sQ0FBQSxDQUNELEVBQUdqTixDQUFPLEVBQ04sS0FBQSxpQkFBaUIsMEJBQTJCaU4sQ0FBSSxDQUN2RCxDQUVPLDZCQUE2QnZMLEVBQWdCOFYsRUFBNEJ4WCxFQUFpQixDQUMvRixLQUFLLFFBQVEsS0FBS1gsRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLCtCQUNYLE9BQUFxQyxFQUNBLG1CQUFBOFYsQ0FBQSxDQUNELEVBQUd4WCxDQUFPLEVBQ04sS0FBQSxpQkFBaUIsK0JBQWdDMEIsRUFBUThWLENBQWtCLENBQ2xGLENBRU8scUJBQXFCbEMsRUFBbUJ0VixFQUFrQixDQUMvRCxLQUFLLFFBQVEsS0FBS1gsRUFBb0Isd0NBQXlDLEtBQUssVUFBVSxDQUM1RixVQUFXLHVCQUNYLFNBQVVpVyxFQUFPLElBQUtkLEdBQVVBLEVBQU0sWUFBWSxDQUFBLENBQ25ELEVBQUd4VSxDQUFPLEVBRUpzVixFQUFBLFFBQVNkLEdBQVUsQ0FDbEIsTUFBQTVVLEVBQVM0VSxFQUFNLFlBQ2YzUyxFQUFZMlMsRUFBTSxhQUFBLEVBQWlCalUsRUFBb0IsTUFBUUEsRUFBb0IsTUFDcEYsS0FBQSxpQkFBaUIsdUJBQXdCWCxFQUFRaUMsQ0FBUyxDQUFBLENBQ2hFLENBQ0gsQ0FFTyx3QkFBd0J5VCxFQUEwQnJWLEVBQWlCLENBQ3hFcVYsRUFBTyxRQUFRLENBQUMsQ0FBRSxNQUFBZCxLQUFZLENBQ3RCLE1BQUE1VSxFQUFTNFUsRUFBTSxZQUNoQixLQUFBLGlCQUFpQiwwQkFBMkI1VSxFQUFRSyxDQUFJLENBQUEsQ0FDOUQsQ0FDSCxDQUVPLHdCQUF3QjRWLEVBRzFCLENBQ0hBLEVBQXFCLFFBQVEsQ0FBQyxDQUFFLE1BQUFyQixFQUFPLFdBQUFpRCxLQUFpQixDQUNoRCxNQUFBN1gsRUFBUzRVLEVBQU0sWUFDaEIsS0FBQSxpQkFBaUIsMEJBQTJCNVUsRUFBUTZYLENBQVUsQ0FBQSxDQUNwRSxDQUNILENBQ0YsQ0NwT1ksSUFBQUMsSUFBQUEsSUFJVkEsRUFBQUEsRUFBQSxXQUFhLElBQWIsRUFBQSxhQUlBQSxFQUFBQSxFQUFBLE9BQVMsS0FBVCxFQUFBLFNBSUFBLEVBQUFBLEVBQUEsU0FBVyxLQUFYLEVBQUEsV0FJQUEsRUFBQUEsRUFBQSxpQkFBbUIsS0FBbkIsRUFBQSxtQkFJQUEsRUFBQUEsRUFBQSxlQUFpQixLQUFqQixFQUFBLGlCQUlBQSxFQUFBQSxFQUFBLGdCQUFrQixLQUFsQixFQUFBLGtCQUlBQSxFQUFBQSxFQUFBLGdCQUFrQixLQUFsQixFQUFBLGtCQUlBQSxFQUFBQSxFQUFBLHVCQUF5QixLQUF6QixFQUFBLHlCQUlBQSxFQUFBQSxFQUFBLGVBQWlCLEtBQWpCLEVBQUEsaUJBSUFBLEVBQUFBLEVBQUEsMEJBQTRCLEtBQTVCLEVBQUEsNEJBSUFBLEVBQUFBLEVBQUEscUJBQXVCLEtBQXZCLEVBQUEsdUJBSUFBLEVBQUFBLEVBQUEsa0JBQW9CLEtBQXBCLEVBQUEsb0JBSUFBLEVBQUFBLEVBQUEsa0JBQW9CLEtBQXBCLEVBQUEsb0JBSUFBLEVBQUFBLEVBQUEsb0NBQXNDLEtBQXRDLEVBQUEsc0NBSUFBLEVBQUFBLEVBQUEsa0JBQW9CLEtBQXBCLEVBQUEsb0JBSUFBLEVBQUFBLEVBQUEseUJBQTJCLEtBQTNCLEVBQUEsMkJBSUFBLEVBQUFBLEVBQUEsaUJBQW1CLEtBQW5CLEVBQUEsbUJBSUFBLEVBQUFBLEVBQUEsaUJBQW1CLEtBQW5CLEVBQUEsbUJBSUFBLEVBQUFBLEVBQUEsb0JBQXNCLEtBQXRCLEVBQUEsc0JBSUFBLEVBQUFBLEVBQUEsbUJBQXFCLEtBQXJCLEVBQUEscUJBSUFBLEVBQUFBLEVBQUEsa0JBQW9CLEtBQXBCLEVBQUEsb0JBSUFBLEVBQUFBLEVBQUEsc0JBQXdCLEtBQXhCLEVBQUEsd0JBSUNBLEVBQUFBLEVBQUEsc0JBQXdCLEtBQXhCLEVBQUEsd0JBNUZTQSxJQUFBQSxJQUFBLENBQUEsQ0FBQSxFQ0laLE1BQXFCQyxFQUFtQyxDQUd0RCxZQUNVbFksRUFDUixDQUpNQyxFQUFBLDBCQUF5QyxDQUFBLEdBR3ZDLEtBQUEsUUFBQUQsQ0FDUCxDQUtILGVBQWVvRixFQUFxQixDQUM5QixPQUFDa0MsRUFBQUEsU0FBU2xDLENBQVcsR0FJekIsS0FBSyxtQkFBbUIsWUFBY0EsRUFDL0IsT0FKTCxLQUFLLFFBQVEsTUFBTXhGLEVBQW9CLHFDQUFzQyxnREFBZ0R3RixDQUFXLEVBQUUsRUFDbkksS0FJWCxDQUtBLGtCQUFrQk8sRUFBd0IsQ0FDcEMsT0FBQzJCLEVBQUFBLFNBQVMzQixDQUFjLEdBSTVCLEtBQUssbUJBQW1CLGVBQWlCQSxFQUNsQyxPQUpMLEtBQUssUUFBUSxNQUFNL0YsRUFBb0IscUNBQXNDLG1EQUFtRCtGLENBQWMsRUFBRSxFQUN6SSxLQUlYLENBS0EsZUFBZU4sRUFBcUIsQ0FDOUIsT0FBQ2lDLEVBQUFBLFNBQVNqQyxDQUFXLEdBSXpCLEtBQUssbUJBQW1CLFlBQWNBLEVBQy9CLE9BSkwsS0FBSyxRQUFRLE1BQU16RixFQUFvQixxQ0FBc0MsZ0RBQWdEeUYsQ0FBVyxFQUFFLEVBQ25JLEtBSVgsQ0FLQSxjQUFjUSxFQUFvQixDQUM1QixPQUFDeUIsRUFBQUEsU0FBU3pCLENBQVUsR0FJeEIsS0FBSyxtQkFBbUIsV0FBYUEsRUFDOUIsT0FKTCxLQUFLLFFBQVEsTUFBTWpHLEVBQW9CLHFDQUFzQywrQ0FBK0NpRyxDQUFVLEVBQUUsRUFDakksS0FJWCxDQUtBLGdCQUFnQkQsRUFBZ0MsQ0FDMUMsT0FBQUEsSUFBaUIsT0FBU0EsSUFBaUIsVUFDN0MsS0FBSyxRQUFRLE1BQU1oRyxFQUFvQixxQ0FBc0Msc0RBQXNEZ0csQ0FBWSxFQUFFLEVBQzFJLE9BRVQsS0FBSyxtQkFBbUIsYUFBZUEsRUFDaEMsS0FDVCxDQUtBLGNBQWNFLEVBQW9CLENBQzVCLE9BQUN3QixFQUFBQSxTQUFTeEIsQ0FBVSxHQUl4QixLQUFLLG1CQUFtQixXQUFhQSxFQUM5QixPQUpMLEtBQUssUUFBUSxNQUFNbEcsRUFBb0IscUNBQXNDLCtDQUErQ2tHLENBQVUsRUFBRSxFQUNqSSxLQUlYLENBS0EsaUJBQWlCUixFQUF1QixDQUNsQyxPQUFDZ0MsRUFBQUEsU0FBU2hDLENBQWEsR0FJM0IsS0FBSyxtQkFBbUIsY0FBZ0JBLEVBQ2pDLE9BSkwsS0FBSyxRQUFRLE1BQU0xRixFQUFvQixxQ0FBc0Msa0RBQWtEMEYsQ0FBYSxFQUFFLEVBQ3ZJLEtBSVgsQ0FLQSxZQUFZQyxFQUFrQixDQUN4QixPQUFDK0IsRUFBQUEsU0FBUy9CLENBQVEsR0FJdEIsS0FBSyxtQkFBbUIsU0FBV0EsRUFDNUIsT0FKTCxLQUFLLFFBQVEsTUFBTTNGLEVBQW9CLHFDQUFzQyw2Q0FBNkMyRixDQUFRLEVBQUUsRUFDN0gsS0FJWCxDQUtBLGdCQUFnQlEsRUFBc0IsQ0FDaEMsT0FBQ3VCLEVBQUFBLFNBQVN2QixDQUFZLEdBSTFCLEtBQUssbUJBQW1CLGFBQWVBLEVBQ2hDLE9BSkwsS0FBSyxRQUFRLE1BQU1uRyxFQUFvQixxQ0FBc0MsaURBQWlEbUcsQ0FBWSxFQUFFLEVBQ3JJLEtBSVgsQ0FLQSxnQkFBZ0JQLEVBQXNCLENBQ2hDLE9BQUM4QixFQUFBQSxTQUFTOUIsQ0FBWSxHQUkxQixLQUFLLG1CQUFtQixhQUFlQSxFQUNoQyxPQUpMLEtBQUssUUFBUSxNQUFNNUYsRUFBb0IscUNBQXNDLGlEQUFpRDRGLENBQVksRUFBRSxFQUNySSxLQUlYLENBS0Esa0JBQWtCQyxFQUF3QixDQUNwQyxPQUFDNkIsRUFBQUEsU0FBUzdCLENBQWMsR0FJNUIsS0FBSyxtQkFBbUIsZUFBaUJBLEVBQ2xDLE9BSkwsS0FBSyxRQUFRLE1BQU03RixFQUFvQixxQ0FBc0MsbURBQW1ENkYsQ0FBYyxFQUFFLEVBQ3pJLEtBSVgsQ0FLQSxlQUFlQyxFQUFxQixDQUM5QixPQUFDNEIsRUFBQUEsU0FBUzVCLENBQVcsR0FJekIsS0FBSyxtQkFBbUIsWUFBY0EsRUFDL0IsT0FKTCxLQUFLLFFBQVEsTUFBTTlGLEVBQW9CLHFDQUFzQyxnREFBZ0Q4RixDQUFXLEVBQUUsRUFDbkksS0FJWCxDQU1BLG1CQUFtQk0sRUFBbUMsQ0FDaEQsT0FBQUEsSUFBb0IsT0FBU0EsSUFBb0IsVUFDbkQsS0FBSyxRQUFRLE1BQU1wRyxFQUFvQixxQ0FBc0MseURBQXlEb0csQ0FBZSxFQUFFLEVBQ2hKLE9BRVQsS0FBSyxtQkFBbUIsZ0JBQWtCQSxFQUNuQyxLQUNULENBS0EsaUJBQWlCQyxFQUF1QixDQUNsQyxPQUFDcUIsRUFBQUEsU0FBU3JCLENBQWEsR0FJM0IsS0FBSyxtQkFBbUIsY0FBZ0JBLEVBQ2pDLE9BSkwsS0FBSyxRQUFRLE1BQU1yRyxFQUFvQixxQ0FBc0Msa0RBQWtEcUcsQ0FBYSxFQUFFLEVBQ3ZJLEtBSVgsQ0FPQSxPQUE0QixDQUMxQixPQUFPLEtBQUssa0JBQ2QsQ0FDRixDQ3pMTyxNQUFNa1MsR0FBa0IsSUFBTSxLQ3lDOUIsTUFBTUMsRUFBaUIsQ0EyQzVCLFlBQ21COVAsRUFDQXRJLEVBQ0FvTSxFQUNBQyxFQUNqQixDQTVDTXBNLEVBQUEsb0JBQTZCLENBQ25DLFdBQVl5QixFQUFxQixhQUFBLFVBQ2pDLFVBQVdDLEVBQW9CLFlBQUEsTUFBQSxHQU16QjFCLEVBQUEsb0JBQTZCLENBQUEsR0FLN0JBLEVBQUEsNEJBS0FBLEVBQUEscUJBQXdCLElBS3hCQSxFQUFBLHVCQUFrQixJQUtsQkEsRUFBQSx5QkFBbUMsTUFFbkNBLEVBQUEsb0JBRUFBLEVBQUEsbUJBS1JBLEVBQUEsOEJBR21CLEtBQUEsU0FBQXFJLEVBQ0EsS0FBQSxRQUFBdEksRUFDQSxLQUFBLFNBQUFvTSxFQUNBLEtBQUEsVUFBQUMsRUFFWixLQUFBLHNCQUF3QixJQUFJb0wsR0FBdUJ6WCxDQUFPLEVBQy9ELEtBQUssb0JBQXNCLElBQUlxSSxHQUFxQixLQUFLLFFBQVMsS0FBSyxRQUFRLEVBRS9FLEtBQUssWUFBYyxJQUFJc00sRUFBYSxLQUFLLFNBQVUsS0FBSyxTQUFVLEtBQUssVUFBVyxLQUFLLFFBQVMsS0FBSyxxQkFBcUIsRUFFMUgsS0FBSyxXQUFhLElBQUk2QyxFQUFVLEtBQUssU0FBVSxLQUFLLFNBQVUsS0FBSyxVQUFXLEtBQUssUUFBUyxLQUFLLFlBQWEsS0FBSyxxQkFBcUIsRUFFbkksS0FBQSxXQUFXLEdBQUdBLEVBQVUsNkJBQThCLEtBQUssc0JBQXNCLEtBQUssSUFBSSxDQUFDLEVBQzNGLEtBQUEsV0FBVyxHQUFHQSxFQUFVLDRDQUE2QyxLQUFLLDZCQUE2QixLQUFLLElBQUksQ0FBQyxFQUNqSCxLQUFBLFdBQVcsR0FBR0EsRUFBVSx5QkFBMEIsS0FBSyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsRUFDbkYsS0FBQSxXQUFXLEdBQUdBLEVBQVUsMEJBQTJCLEtBQUssbUJBQW1CLEtBQUssSUFBSSxDQUFDLEVBQ3JGLEtBQUEsV0FBVyxHQUFHQSxFQUFVLDhCQUErQixLQUFLLHlCQUF5QixLQUFLLElBQUksQ0FBQyxFQUMvRixLQUFBLFdBQVcsR0FBR0EsRUFBVSxxQkFBc0IsS0FBSyxlQUFlLEtBQUssSUFBSSxDQUFDLEVBQzVFLEtBQUEsV0FBVyxHQUFHQSxFQUFVLGtDQUFtQyxLQUFLLGlDQUFpQyxLQUFLLElBQUksQ0FBQyxFQUszRyxLQUFBLFlBQVksR0FBRzdDLEVBQWEsMEJBQTJCLEtBQUssV0FBVyxpQkFBaUIsS0FBSyxLQUFLLFVBQVUsQ0FBQyxFQUk3RyxLQUFBLFlBQVksR0FBR0EsRUFBYSx3QkFBeUIsS0FBSyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsRUFJeEYsS0FBQSxZQUFZLEdBQUdBLEVBQWEsNEJBQTZCLEtBQUssV0FBVyxnQkFBZ0IsS0FBSyxLQUFLLFVBQVUsQ0FBQyxFQUluSCxLQUFLLFlBQVksR0FBR0EsRUFBYSxpQkFBa0IsQ0FBQzBELEVBQVk1UCxJQUFpQixDQUMvRSxLQUFLLG9CQUFvQixxQkFBcUJMLEVBQXdCLG9CQUFxQnpJLEVBQWUsUUFBUyxDQUFDLElBQUksS0FBUTBZLEVBQVksR0FBSTVQLENBQVksQ0FBQSxDQUM3SixDQUNILENBS1Esc0JBQXNCekUsRUFBK0J6RCxFQUFpQixDQUN0RSxNQUFBK1gsRUFBYyxLQUFLLFlBQVksb0JBQW9CLEVBQ3pELEdBQUlBLEVBQWEsQ0FDVCxNQUFBclcsRUFBU3FXLEVBQVksWUFDM0IsS0FBSyxZQUFZLGVBQWUsQ0FDOUIsT0FBQXJXLEVBQ0EsVUFBVytCLEVBQ1gsUUFBU3FNLEdBQVksU0FDcEI5UCxDQUFPLEVBQ0wsS0FBQSxvQkFBb0IscUJBQXFCNkgsRUFBd0IsdUJBQXdCekksRUFBZSxRQUFTLENBQUMsSUFBSSxLQUFRMlksQ0FBVyxFQUM5SSxLQUFLLGNBQWMsQ0FBRSxPQUFBclcsRUFBUSxZQUFBK0IsR0FBZXpELENBQU8sQ0FDckQsQ0FDRixDQUtRLDZCQUE2QkEsRUFBaUIsQ0FDOUMsTUFBQStYLEVBQWMsS0FBSyxZQUFZLG9CQUFvQixFQUNyREEsSUFFRixLQUFLLFlBQVksZUFBZSxDQUM5QixPQUFRQSxFQUFZLFVBQVUsRUFDOUIsVUFBV3BYLEVBQWlCLGVBQzVCLFFBQVNtUCxHQUFZLFNBQ3BCOVAsQ0FBTyxFQUNWLEtBQUssWUFBWSxrQkFBa0JXLEVBQWlCLGVBQWdCb1gsRUFBWSxZQUFhL1gsQ0FBTyxFQUV4RyxDQUtBLE1BQWMsa0JBQWtCMEIsRUFBZ0IxQixFQUFpQixDQUN6RCxNQUFBSixFQUFTLEtBQUssU0FBUyxhQUFhLEVBQ3BDcUksRUFBVSxLQUFLLFlBQVksb0JBQW9CLEVBQ2hELEtBQUEsc0JBQXNCLGdCQUFnQkEsQ0FBUSxFQUs3QyxNQUFBME4sRUFBYSxLQUFLLFdBQVcsbUJBQW1CLEVBQ2hEQyxFQUFhLEtBQUssV0FBVyxtQkFBbUIsRUFDaEQ5VixFQUFlNlYsRUFBYSxDQUFDQSxFQUFXLGVBQWlCLEdBQ3pENVYsRUFBbUI2VixFQUFhLENBQUNBLEVBQVcsZUFBaUIsR0FFbkUsS0FBSyxZQUFZLG9CQUFvQmhXLEVBQVFXLEVBQW9CLE1BQU9ULEVBQWNFLENBQU8sRUFDN0YsS0FBSyxZQUFZLG9CQUFvQkosRUFBUVcsRUFBb0IsTUFBT1IsRUFBa0JDLENBQU8sRUFFakcsTUFBTXVRLEVBQVksQ0FDaEIsQ0FDRSxPQUFBM1EsRUFDQSxVQUFXVSxFQUEyQixPQUN0QyxZQUFhSyxFQUFpQixPQUM5QixhQUFBYixFQUNBLGlCQUFBQyxDQUNGLENBQUEsRUFFRixLQUFLLFlBQVksaUJBQWlCMkIsRUFBUTZPLEVBQVd2USxDQUFPLEVBR3ZELEtBQUEsWUFBWSxvQkFBb0JBLENBQU8sQ0FDOUMsQ0FLUSxtQkFBbUJpTixFQUFxQmpOLEVBQWlCLE9BRS9ELElBQUkwQixFQUFTLEdBQ2IsTUFBTTZRLEVBQWF0RixFQUFLLElBQUtuSyxJQUMzQnBCLEVBQVNvQixFQUFLLE9BQ1AsQ0FDTCxPQUFRQSxFQUFLLE9BQ2IsVUFBV3hDLEVBQTJCLE9BQ3RDLFlBQWFLLEVBQWlCLE9BQzlCLGFBQWMsR0FDZCxpQkFBa0IsRUFBQSxFQUVyQixFQUNELEtBQUssWUFBWSxpQkFBaUJlLEVBQVE2USxFQUFZdlMsQ0FBTyxJQUd6RCtPLEVBQUEsS0FBSyxZQUFZLG9CQUFBLElBQWpCLFlBQUFBLEVBQXdDLGNBQWV0TyxFQUFvQixRQUN4RSxLQUFBLFlBQVksdUJBQXVCQSxFQUFvQixNQUFNLENBRXRFLENBS1EseUJBQXlCVCxFQUFpQixTQUM1QytPLEVBQUEsS0FBSyxZQUFZLG9CQUFBLElBQWpCLFlBQUFBLEVBQXdDLGNBQWV0TyxFQUFvQixRQUN4RSxLQUFBLFlBQVksdUJBQXVCQSxFQUFvQixNQUFNLEVBSS9ELEtBQUEsWUFBWSxpQkFBaUJULENBQU8sQ0FDM0MsQ0FLUSxlQUFleUQsRUFBK0JxUyxFQUFnQjlWLEVBQWlCLENBSWpGLEdBQUF5RCxJQUFnQjlDLEVBQWlCLGVBQWdCLENBQ25ELEtBQUssWUFBWSxrQkFBa0I4QyxFQUFhcVMsRUFBUTlWLENBQU8sRUFDL0QsTUFDRixDQUlNLE1BQUErWCxFQUFjLEtBQUssWUFBWSxvQkFBb0IsRUFDekQsR0FBSUEsRUFBYSxDQUNULE1BQUFyVyxFQUFTcVcsRUFBWSxZQUMzQixLQUFLLG9CQUFvQixxQkFBcUJsUSxFQUF3Qix1QkFBd0J6SSxFQUFlLFFBQVMsQ0FBQyxJQUFJLEtBQVEyWSxFQUFhLEtBQUssYUFBYSxFQUdsSyxLQUFLLFlBQVksZUFBZSxDQUM5QixPQUFBclcsRUFDQSxVQUFXK0IsRUFDWCxRQUFTcU0sR0FBWSxTQUNwQjlQLENBQU8sRUFHVixLQUFLLFlBQVksa0JBQWtCeUQsRUFBYXFTLEVBQVE5VixDQUFPLENBQ2pFLENBQ0YsQ0FLUSxpQ0FBaUNzVixFQUF5QnRWLEVBQWlCLENBQzFFc1YsRUFBQSxRQUFTZCxHQUFVLENBQ2xCLE1BQUE1VSxFQUFTNFUsRUFBTSxZQUNmM1MsRUFBWTJTLEVBQU0sYUFBQSxFQUFpQmpVLEVBQW9CLE1BQVFBLEVBQW9CLE1BQ3BGLEtBQUEsWUFBWSxvQkFBb0JYLEVBQVFpQyxFQUFXLENBQUMyUyxFQUFNLGVBQWdCeFUsQ0FBTyxDQUFBLENBQ3ZGLENBQ0gsQ0FLUSxvQkFBb0IwQixFQUFnQjFCLEVBQWlCLENBS3RELEtBQUssa0JBQ1IsS0FBSyxjQUFnQixJQUV2QixLQUFLLGdCQUFrQixHQUNsQixLQUFBLFdBQVcsYUFBYTBCLEVBQVExQixDQUFPLENBQzlDLENBT0EseUJBQXlCaU0sRUFBa0MsQ0FDekQsS0FBSyxRQUFRLEtBQUs1TSxFQUFvQix1Q0FBd0M0TSxFQUFXLE9BQU8sS0FBS0EsQ0FBUSxFQUFFLEtBQUssR0FBRyxFQUFJLElBQUksRUFDMUgsS0FBQSxzQkFBc0Isc0JBQXNCQSxDQUFRLENBQzNELENBU0Esd0JBQXdCQSxFQUFpQyxDQUN2RCxLQUFLLFFBQVEsS0FBSzVNLEVBQW9CLCtDQUFnRDRNLEVBQVcsT0FBTyxLQUFLQSxDQUFRLEVBQUUsS0FBSyxHQUFHLEVBQUksSUFBSSxFQUNsSSxLQUFBLFdBQVcsZ0NBQWdDQSxDQUFRLENBQzFELENBVUEsYUFBYWdGLEVBQThGLENBQ25HLE1BQUFqUixFQUFVLEtBQUssUUFBUSxjQUFjLEVBZXZDLEdBZEosS0FBSyxRQUFRLEtBQUtYLEVBQW9CLG1DQUFvQyxLQUFLLFVBQVUsQ0FDdkYsS0FBTTRSLEVBQUssSUFBS25PLEdBQVMsQ0FDdkIsS0FBTSxDQUFFLE9BQUFsRCxFQUFRLGFBQUFrWCxFQUFjLE9BQUF6UyxDQUFBLEVBQVd2QixFQUNsQyxNQUFBLENBQ0wsT0FBQWxELEVBQ0EsWUFBYWtYLEdBQUEsWUFBQUEsRUFBYyxTQUMzQixPQUFBelMsQ0FBQSxDQUNGLENBQ0QsQ0FBQSxDQUNGLEVBQUdyRSxDQUFPLEVBS1AsQ0FBQ2dZLEVBQUFBLGNBQWMvRyxDQUFJLEVBQ2hCLFlBQUEsUUFBUSxNQUFNNVIsRUFBb0IsbUNBQW9DLDZDQUE2QyxLQUFLLFVBQVU0UixDQUFJLENBQUMsR0FBSWpSLENBQU8sRUFDaEosQ0FBRSxLQUFNWixFQUFlLGFBR2hDLFFBQVN5SCxFQUFRLEVBQUdBLEVBQVFvSyxFQUFLLE9BQVFwSyxJQUFTLENBQzFDLE1BQUEvRCxFQUFPbU8sRUFBS3BLLENBQUssRUFDakIsQ0FBRSxPQUFBakgsRUFBUSxhQUFBa1gsQ0FBaUIsRUFBQWhVLEVBQzdCLEdBQUEsQ0FBQ21WLEVBQUFBLGVBQWVyWSxDQUFNLEVBQ3hCLFlBQUssUUFBUSxNQUFNUCxFQUFvQixtQ0FBb0MsZ0RBQWdETyxDQUFNLEdBQUlJLENBQU8sRUFDckksQ0FBRSxLQUFNWixFQUFlLGFBRzVCLEdBQUEsQ0FBQzJELEdBQXNCK1QsQ0FBWSxFQUNoQyxZQUFBLFFBQVEsTUFBTXpYLEVBQW9CLG1DQUFvQywwREFBMER5WCxhQUF3QixZQUFjQSxFQUFhLFNBQVdBLENBQVksR0FBSTlXLENBQU8sRUFDbk4sQ0FBRSxLQUFNWixFQUFlLFlBRWxDLENBRUEsWUFBSyxRQUFRLEtBQUtDLEVBQW9CLG1DQUFvQyxTQUFVVyxDQUFPLEVBQ3RGLEtBQUEsV0FBVyxhQUFhaVIsRUFBTWpSLENBQU8sRUFDbkMsQ0FBRSxLQUFNWixFQUFlLFFBQ2hDLENBU0EsZ0JBQWdCc1csRUFBcUMsQ0FDN0MsTUFBQTFWLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFRdkMsT0FQSixLQUFLLFFBQVEsS0FBS1gsRUFBb0Isc0NBQXVDLEtBQUssVUFBVSxDQUMxRixRQUFBcVcsQ0FBQSxDQUNELEVBQUcxVixDQUFPLEVBTVRnWSxFQUFjLGNBQUF0QyxDQUFPLEdBQ2xCQSxFQUFRLE1BQU85VixHQUFXcVksRUFBQSxlQUFlclksQ0FBTSxDQUFDLEdBTXJELEtBQUssUUFBUSxLQUFLUCxFQUFvQixzQ0FBdUMsU0FBVVcsQ0FBTyxFQUV6RixLQUFBLFdBQVcsZ0JBQWdCMFYsRUFBUzFWLENBQU8sRUFDekMsQ0FBRSxLQUFNWixFQUFlLFdBUHZCLEtBQUEsUUFBUSxNQUFNQyxFQUFvQixzQ0FBdUMsMEVBQTBFLEtBQUssVUFBVXFXLENBQU8sQ0FBQyxHQUFJMVYsQ0FBTyxFQUNuTCxDQUFFLEtBQU1aLEVBQWUsYUFPbEMsQ0FTQSxNQUFNLFVBQVVRLEVBQWdCaUMsRUFBMkQsQ0FDbkYsTUFBQTdCLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFTdkMsR0FSSixLQUFLLFFBQVEsS0FBS1gsRUFBb0IsK0JBQWdDLEtBQUssVUFBVSxDQUNuRixPQUFBTyxFQUNBLFVBQUFpQyxDQUFBLENBQ0QsRUFBRzdCLENBQU8sRUFLUCxDQUFDaVksRUFBQUEsZUFBZXJZLENBQU0sRUFDeEIsWUFBSyxRQUFRLE1BQU1QLEVBQW9CLCtCQUFnQyxnREFBZ0RPLENBQU0sR0FBSUksQ0FBTyxFQUNqSSxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsR0FBSTBILGNBQVl2RyxFQUFvQnNCLENBQVMsQ0FBQyxFQUM1QyxZQUFLLFFBQVEsTUFBTXhDLEVBQW9CLCtCQUFnQyw0Q0FBNEN3QyxDQUFTLEdBQUk3QixDQUFPLEVBQ2hJLENBQUUsS0FBTVosRUFBZSxhQU1oQyxHQUFJeUMsSUFBY3RCLEVBQW9CLE9BQVNYLElBQVcsS0FBSyxTQUFTLGVBQ3RFLFlBQUssUUFBUSxLQUFLUCxFQUFvQiwrQkFBZ0MsVUFBV1csQ0FBTyxFQUNqRixDQUFFLEtBQU1aLEVBQWUsU0FNMUIsS0FBQSxDQUFFLFVBQUFnRixDQUFjLEVBQUEsS0FBSyxXQUFXLGlCQUFpQnhFLENBQU0sR0FBSyxHQUNsRSxPQUFJaUMsSUFBY3RCLEVBQW9CLE9BQVMsQ0FBQzZELEdBQ3pDLEtBQUEsUUFBUSxNQUFNL0UsRUFBb0IsK0JBQWdDLFlBQVlELEVBQWUsa0JBQWtCLHVCQUF3QlksQ0FBTyxFQUM1SSxDQUFFLEtBQU1aLEVBQWUscUJBR3pCLEtBQUssV0FBVyxVQUFVUSxFQUFRaUMsRUFBV3VDLEVBQVdwRSxDQUFPLENBQ3hFLENBT0EsMEJBQWlELENBQ3hDLE9BQUEsSUFBSWtCLEdBQXFCLEtBQUssT0FBTyxDQUM5QyxDQU1BLGVBQWVnWCxFQUFxQyxDQUNsRCxLQUFLLFFBQVEsS0FBSzdZLEVBQW9CLHFDQUFzQyxLQUFLLFVBQVU2WSxDQUFHLENBQUMsRUFFekYsS0FBQSxDQUNKLFVBQUFDLEVBQVcsV0FBQTdXLEVBQVksV0FBQTBDLEVBQVksV0FBQUQsQ0FDakMsRUFBQW1VLEVBRUEsR0FBQSxDQUFDOVcsRUFBQUEsWUFBb0IrVyxDQUFTLEVBQ2hDLFlBQUssUUFBUSxNQUFNOVksRUFBb0IscUNBQXNDLDZDQUE2QzhZLENBQVMsRUFBRSxFQUM5SCxDQUFFLEtBQU0vWSxFQUFlLGFBRzVCLEdBQUEsQ0FBQytCLEVBQUFBLGFBQXFCRyxDQUFVLEVBQ2xDLFlBQUssUUFBUSxNQUFNakMsRUFBb0IscUNBQXNDLDhDQUE4Q2lDLENBQVUsRUFBRSxFQUNoSSxDQUFFLEtBQU1sQyxFQUFlLGFBR2hDLEtBQU0sQ0FBRSxLQUFBYSxFQUFNLFNBQUFtWSxDQUFBLEVBQWF0VSxHQUFnQkMsRUFBWUMsQ0FBVSxFQUM3RCxPQUFBL0QsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IscUNBQXNDK1ksQ0FBUSxFQUd2RixLQUFLLFFBQVEsS0FBSy9ZLEVBQW9CLHFDQUFzQyxTQUFTLEVBQ2hGLEtBQUEsYUFBZSxDQUFFLEdBQUc2WSxHQUNwQixLQUFBLFdBQVcsZUFBZSxLQUFLLFlBQVksRUFDekMsQ0FBRSxLQUFNOVksRUFBZSxRQUNoQyxDQU9BLDBCQUFpRCxDQUN4QyxPQUFBLElBQUl3QixHQUFxQixLQUFLLE9BQU8sQ0FDOUMsQ0FRQSxnQ0FBcUUsQ0FDNUQsT0FBQSxJQUFJK1csR0FBbUMsS0FBSyxPQUFPLENBQzVELENBTUEsZUFBZU8sRUFBcUMsQ0FDbEQsS0FBSyxRQUFRLEtBQUs3WSxFQUFvQixxQ0FBc0MsS0FBSyxVQUFVNlksQ0FBRyxDQUFDLEVBQy9GLEtBQU0sQ0FBRSxXQUFBalgsRUFBWSxXQUFBOEMsRUFBWSxXQUFBQyxDQUFBLEVBQWVrVSxFQUMvQyxHQUFJalgsR0FBYyxDQUFDRCxXQUFTQyxDQUFVLEVBQ3BDLFlBQUssUUFBUSxNQUFNNUIsRUFBb0IscUNBQXNDLG1EQUFtRDRCLENBQVUsRUFBRSxFQUNySSxDQUFFLEtBQU03QixFQUFlLGFBR2hDLEtBQU0sQ0FBRSxLQUFBYSxFQUFNLFNBQUFtWSxDQUFBLEVBQWF0VSxHQUFnQkMsRUFBWUMsQ0FBVSxFQUM3RCxPQUFBL0QsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IscUNBQXNDK1ksQ0FBUSxFQUd2RixLQUFLLFFBQVEsS0FBSy9ZLEVBQW9CLHFDQUFzQyxTQUFTLEVBRWhGLEtBQUEsYUFBZSxDQUFFLEdBQUc2WSxHQUNwQixLQUFBLFdBQVcsZUFBZSxLQUFLLFlBQVksRUFDekMsQ0FBRSxLQUFNOVksRUFBZSxRQUNoQyxDQVdBLE1BQU0sVUFBVXNXLEVBQW1CL1QsRUFBMkJ2QixFQUFlLE9BQVF5QixFQUFpQ3RCLEVBQW9CLFlBQWE2RixFQUFvQytCLEVBQTRELENBQ3JQLEtBQUssY0FBZ0JpRyxFQUFBQSxVQUNmLE1BQUFsTSxFQUFZLENBQUMsSUFBSSxLQUNqQmxDLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFHM0MsR0FGQSxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsK0JBQWdDLFlBQVlxVyxFQUFRLEtBQUssR0FBRyxDQUFDLGVBQWUvVCxDQUFRLGdCQUFnQkUsQ0FBUyxpQkFBaUJ1RSxDQUFVLFlBQVkrQixDQUFLLEdBQUluSSxDQUFPLEVBRXRNLEtBQUssU0FBUyxvQkFBb0IsSUFBTTBNLEVBQUFBLG1CQUFtQixVQUN4RCxZQUFBLFFBQVEsTUFBTXJOLEVBQW9CLCtCQUFnQyxZQUFZRCxFQUFlLG1CQUFtQixHQUFJWSxDQUFPLEVBQ3pILENBQUUsS0FBTVosRUFBZSxxQkFHMUIsTUFBQXVFLEVBQVcsS0FBSyxTQUFTLFlBQVksRUFDM0MsR0FBSSxDQUFDQSxHQUFZLENBQUNELEdBQXFCQyxDQUFRLEVBQ3hDLFlBQUEsUUFBUSxNQUFNdEUsRUFBb0IsK0JBQWdDLFlBQVlELEVBQWUsdUJBQXVCLEdBQUlZLENBQU8sRUFDN0gsQ0FBRSxLQUFNWixFQUFlLHlCQU01QixHQUFBLEVBQ0Y0WSxFQUFjLGNBQUF0QyxDQUFPLEdBQ2xCQSxFQUFRLE1BQU85VixHQUFXcVksRUFBQSxlQUFlclksQ0FBTSxDQUFDLEdBRTlDLFlBQUEsUUFBUSxNQUFNUCxFQUFvQiwrQkFBZ0MsMEVBQTBFLEtBQUssVUFBVXFXLENBQU8sQ0FBQyxHQUFJMVYsQ0FBTyxFQUM1SyxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsR0FBSTBILGNBQVkxRyxFQUFldUIsQ0FBUSxDQUFDLEVBQ3RDLFlBQUssUUFBUSxNQUFNdEMsRUFBb0IsK0JBQWdDLDJDQUEyQ3NDLENBQVEsR0FBSTNCLENBQU8sRUFDOUgsQ0FBRSxLQUFNWixFQUFlLGFBR2hDLEdBQUkwSCxjQUFZdkcsRUFBb0JzQixDQUFTLENBQUMsRUFDNUMsWUFBSyxRQUFRLE1BQU14QyxFQUFvQiwrQkFBZ0MsNENBQTRDd0MsQ0FBUyxHQUFJN0IsQ0FBTyxFQUNoSSxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsR0FBSWdILEVBQVksQ0FDUixNQUFBbUYsRUFBTTdFLEdBQW1CTixDQUFVLEVBQ3JDLEdBQUFtRixFQUFJLE9BQVNuTSxFQUFlLFFBQ3pCLFlBQUEsUUFBUSxNQUFNQyxFQUFvQiwrQkFBZ0MsMkNBQTJDa00sRUFBSSxRQUFRLEdBQUl2TCxDQUFPLEVBQ2xJLENBQUUsS0FBTVosRUFBZSxZQUVsQyxDQUVBLEdBQUkrSSxFQUFPLENBQ0wsR0FBQSxDQUFDcEIsRUFBQUEsU0FBU29CLENBQUssRUFDakIsWUFBSyxRQUFRLE1BQU05SSxFQUFvQiwrQkFBZ0Msd0NBQXdDOEksQ0FBSyxHQUFJbkksQ0FBTyxFQUN4SCxDQUFFLEtBQU1aLEVBQWUsYUFHNUIsR0FBQWlJLEdBQWNjLENBQUssRUFBSXlQLEdBQ3pCLFlBQUssUUFBUSxNQUFNdlksRUFBb0IsK0JBQWdDLHNDQUF1Q1csQ0FBTyxFQUM5RyxDQUFFLEtBQU1aLEVBQWUsWUFFbEMsQ0FLQSxHQUFJc1csRUFBUSxPQUFTLEdBQUsvVCxJQUFhdkIsRUFBZSxPQUMvQyxZQUFBLFFBQVEsTUFBTWYsRUFBb0IsK0JBQWdDLHVFQUF1RXFXLEVBQVEsS0FBSyxHQUFHLENBQUMsR0FBSTFWLENBQU8sRUFDbkssQ0FBRSxLQUFNWixFQUFlLGFBSTVCLEdBQUEsS0FBSyxZQUFZLHNCQUNkLFlBQUEsUUFBUSxNQUFNQyxFQUFvQiwrQkFBZ0MsWUFBWUQsRUFBZSxhQUFhLGtCQUFtQlksQ0FBTyxFQUNsSSxDQUFFLEtBQU1aLEVBQWUsZUFNMUIsS0FBQSxDQUFFLEtBQU1pWixDQUFtQixFQUFJLE1BQU0sS0FBSyxXQUFXLHNCQUFzQnhXLEVBQVc3QixDQUFPLEVBQy9GLEdBQUFxWSxJQUF1QmpaLEVBQWUsUUFDeEMsWUFBSyxRQUFRLE1BQU1DLEVBQW9CLCtCQUFnQyxtQ0FBbUNnWixDQUFrQixHQUFJclksQ0FBTyxFQUNoSSxDQUFFLEtBQU1xWSxHQUdqQixLQUFNLENBQUUsS0FBQXBZLEVBQU0sS0FBQUUsQ0FBQSxFQUFTLE1BQU0sS0FBSyxZQUFZLFVBQVUsQ0FDdEQsUUFBU3VWLEVBQVEsSUFBSzlWLElBQVksQ0FBRSxPQUFBQSxHQUFTLEVBQzdDLFNBQUErQixFQUNBLFVBQUFFLEVBQ0EsT0FBUSxLQUFLLGNBQ2IsV0FBQXVFLEVBQ0EsTUFBTyxLQUFLLFVBQVUsQ0FBRSxPQUFRLEtBQUssU0FBUyxlQUFnQixNQUFBK0IsRUFBTyxHQUNwRW5JLENBQU8sRUFJTixHQUZKLEtBQUssb0JBQW9CLHFCQUFxQjZILEVBQXdCLGtCQUFtQjVILEVBQU1pQyxFQUFXLEtBQU0sS0FBSyxjQUFlLEtBQU0sQ0FBRSxVQUFBTCxFQUFXLFNBQUFGLEVBQVUsUUFBUXhCLEdBQUEsWUFBQUEsRUFBTSxTQUFVLEdBQUksRUFFekxGLElBQVNiLEVBQWUsUUFDckIsWUFBQSxXQUFXLGlCQUFpQlksQ0FBTyxFQUN4QyxLQUFLLFFBQVEsTUFBTVgsRUFBb0IsK0JBQWdDLHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQ3JHLENBQUUsS0FBQUMsQ0FBSyxFQU1WLEtBQUEsQ0FBRSxPQUFBeUIsRUFBUSxhQUFBK0MsQ0FBaUIsRUFBQXRFLEVBQzdCLE9BQUEsS0FBSyxvQkFBc0JzRSxHQUN4QixLQUFBLFlBQVksY0FBYy9DLEVBQVExQixDQUFPLEVBQzlDLEtBQUssWUFBWSxPQUFPLENBQUUsT0FBQTBCLEdBQVUxQixDQUFPLEVBQzNDLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwrQkFBZ0MsT0FBT3FDLENBQU0sd0JBQXlCMUIsQ0FBTyxFQUM1RyxDQUFFLEtBQU1aLEVBQWUsV0FHNUJ1QyxJQUFhdkIsRUFBZSxPQUM5QixNQUFNLEtBQUssV0FBVyxpQkFBaUJzQixFQUFRMUIsQ0FBTyxFQUduRCxLQUFBLFFBQVEsS0FBS1gsRUFBb0IsK0JBQWdDLEtBQUssVUFBVSxDQUFFLEtBQUFjLEVBQU0sS0FBQUYsRUFBTSxFQUFHRCxDQUFPLEVBQ3RHLENBQUUsS0FBTVosRUFBZSxRQUFTLE9BQUFzQyxDQUFPLEVBQ2hELENBTUEsTUFBTSxjQUFjQSxFQUEyQyxDQUN2RCxNQUFBMUIsRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUczQyxHQUZBLEtBQUssUUFBUSxLQUFLWCxFQUFvQixvQ0FBcUMsV0FBV3FDLENBQU0sR0FBSTFCLENBQU8sRUFFbkcsS0FBSyxTQUFTLG9CQUFvQixJQUFNME0sRUFBQUEsbUJBQW1CLFVBQ3hELFlBQUEsUUFBUSxNQUFNck4sRUFBb0Isb0NBQXFDLFNBQVNELEVBQWUsbUJBQW1CLEdBQUlZLENBQU8sRUFDM0gsQ0FBRSxLQUFNWixFQUFlLHFCQUcxQixNQUFBdUUsRUFBVyxLQUFLLFNBQVMsWUFBWSxFQUMzQyxHQUFJLENBQUNBLEdBQVksQ0FBQ0QsR0FBcUJDLENBQVEsRUFDeEMsWUFBQSxRQUFRLE1BQU10RSxFQUFvQixvQ0FBcUMsU0FBU0QsRUFBZSx1QkFBdUIsR0FBSVksQ0FBTyxFQUMvSCxDQUFFLEtBQU1aLEVBQWUseUJBTTVCLEdBQUEsQ0FBQzZZLEVBQUFBLGVBQWV2VyxDQUFNLEVBQ3hCLFlBQUssUUFBUSxNQUFNckMsRUFBb0Isb0NBQXFDLGdEQUFnRHFDLENBQU0sR0FBSTFCLENBQU8sRUFDdEksQ0FBRSxLQUFNWixFQUFlLGFBR2hDLEtBQU0sQ0FBRSxLQUFNa1osRUFBZ0IsS0FBQW5ZLENBQVMsRUFBQSxNQUFNLEtBQUssWUFBWSxlQUFlLENBQUUsT0FBQXVCLENBQU8sRUFBRzFCLENBQU8sRUFDNUYsR0FBQXNZLElBQW1CbFosRUFBZSxRQUNwQyxZQUFLLFFBQVEsTUFBTUMsRUFBb0Isb0NBQXFDLDhCQUE4QmlaLENBQWMsR0FBSXRZLENBQU8sRUFDNUgsQ0FBRSxLQUFNc1ksR0FHWCxLQUFBLENBQUUsVUFBQXpXLENBQWMsRUFBQTFCLEVBRWhCNFgsRUFBYyxLQUFLLFlBQVksb0JBQW9CLEVBQ3pELEdBQUlBLEdBQWVBLEVBQVksVUFBVSxJQUFNclcsRUFDdEMsTUFBQSxDQUFFLEtBQU10QyxFQUFlLGVBTTFCLEtBQUEsQ0FBRSxLQUFNaVosQ0FBbUIsRUFBSSxNQUFNLEtBQUssV0FBVyxzQkFBc0J4VyxFQUFXN0IsQ0FBTyxFQUMvRixHQUFBcVksSUFBdUJqWixFQUFlLFFBQ3hDLFlBQUssUUFBUSxNQUFNQyxFQUFvQixvQ0FBcUMsbUNBQW1DZ1osQ0FBa0IsR0FBSXJZLENBQU8sRUFDckksQ0FBRSxLQUFNcVksR0FHakIsS0FBTSxDQUFFLEtBQUFwWSxDQUFLLEVBQUksTUFBTSxLQUFLLFlBQVksU0FBUyxDQUMvQyxPQUFBeUIsRUFDQSxVQUFBRyxHQUNDN0IsQ0FBTyxFQUNOLE9BQUFDLElBQVNiLEVBQWUsU0FDckIsS0FBQSxXQUFXLGlCQUFpQlksQ0FBTyxFQUN4QyxLQUFLLFFBQVEsTUFBTVgsRUFBb0Isb0NBQXFDLHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQzFHLENBQUUsS0FBQUMsQ0FBSyxJQUdYLEtBQUEsUUFBUSxLQUFLWixFQUFvQixvQ0FBcUMsU0FBU0QsRUFBZSxPQUFPLEdBQUlZLENBQU8sRUFDckgsTUFBTSxLQUFLLFdBQVcsaUJBQWlCMEIsRUFBUTFCLENBQU8sRUFDL0MsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBVUEsTUFBTSxPQUFPc1csRUFBbUJ0UCxFQUFvQytCLEVBQTZFLE9BQ3pJLE1BQUFuSSxFQUFVLEtBQUssUUFBUSxjQUFjLEVBTXZDLEdBTEosS0FBSyxRQUFRLEtBQUtYLEVBQW9CLDJCQUE0QixXQUFXcVcsRUFBUSxLQUFLLEdBQUcsQ0FBQyxpQkFBaUJ0UCxDQUFVLFlBQVkrQixDQUFLLEdBQUluSSxDQUFPLEVBS2pKLEVBQ0ZnWSxFQUFjLGNBQUF0QyxDQUFPLEdBQ2xCQSxFQUFRLE1BQU85VixHQUFXcVksRUFBQSxlQUFlclksQ0FBTSxDQUFDLEdBRTlDLFlBQUEsUUFBUSxNQUFNUCxFQUFvQiwyQkFBNEIsMEVBQTBFLEtBQUssVUFBVXFXLENBQU8sQ0FBQyxHQUFJMVYsQ0FBTyxFQUN4SyxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsR0FBSWdILEVBQVksQ0FDUixNQUFBbUYsRUFBTTdFLEdBQW1CTixDQUFVLEVBQ3JDLEdBQUFtRixFQUFJLE9BQVNuTSxFQUFlLFFBQ3pCLFlBQUEsUUFBUSxNQUFNQyxFQUFvQiwyQkFBNEIsMkNBQTJDa00sRUFBSSxRQUFRLEdBQUl2TCxDQUFPLEVBQzlILENBQUUsS0FBTVosRUFBZSxZQUVsQyxDQUVBLEdBQUkrSSxFQUFPLENBQ0wsR0FBQSxDQUFDcEIsRUFBQUEsU0FBU29CLENBQUssRUFDakIsWUFBSyxRQUFRLE1BQU05SSxFQUFvQiwyQkFBNEIsd0NBQXdDOEksQ0FBSyxHQUFJbkksQ0FBTyxFQUNwSCxDQUFFLEtBQU1aLEVBQWUsYUFHNUIsR0FBQWlJLEdBQWNjLENBQUssRUFBSXlQLEdBQ3pCLFlBQUssUUFBUSxNQUFNdlksRUFBb0IsMkJBQTRCLHNDQUF1Q1csQ0FBTyxFQUMxRyxDQUFFLEtBQU1aLEVBQWUsWUFFbEMsQ0FLQSxLQUFNLENBQUUsS0FBQWEsRUFBTSxLQUFBRSxDQUFBLEVBQVMsTUFBTSxLQUFLLFlBQVksT0FBTyxDQUNuRCxRQUFTdVYsRUFBUSxJQUFLOVYsSUFBWSxDQUNoQyxPQUFBQSxDQUFBLEVBQ0EsRUFDRixXQUFBd0csRUFDQSxNQUFPLEtBQUssVUFBVSxDQUFFLE9BQVEsS0FBSyxTQUFTLGVBQWdCLE1BQUErQixFQUFPLEdBQ3BFbkksQ0FBTyxFQUVOLEdBQUFDLElBQVNiLEVBQWUsUUFDMUIsWUFBSyxRQUFRLE1BQU1DLEVBQW9CLDJCQUE0QixzQkFBc0JZLENBQUksR0FBSUQsQ0FBTyxFQUNqRyxDQUFFLEtBQUFDLENBQUssRUFHaEIsTUFBTXNZLEVBQVksQ0FBQSxFQUNkLE9BQUF4SixFQUFBNU8sRUFBTSxnQkFBTixNQUFBNE8sRUFBcUIsUUFDdkJ3SixFQUFVLEtBQUssR0FBR3BZLEVBQU0sY0FBYyxJQUFLUixJQUFVLENBQ25ELE9BQVFBLEVBQUssT0FDYixNQUFPQSxFQUFLLGVBQ1osQ0FBQyxFQUdBLEtBQUEsUUFBUSxLQUFLTixFQUFvQiwyQkFBNEIsc0JBQXNCLEtBQUssVUFBVWtaLENBQVMsQ0FBQyxHQUFJdlksQ0FBTyxFQUNySCxDQUNMLEtBQU1aLEVBQWUsUUFDckIsVUFBQW1aLENBQUEsQ0FFSixDQU1BLE1BQU0sT0FBTzdXLEVBQTJDLENBQ2hELE1BQUFRLEVBQVksQ0FBQyxJQUFJLEtBQ2pCbEMsRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUczQyxHQUZBLEtBQUssUUFBUSxLQUFLWCxFQUFvQiwyQkFBNEIsV0FBV3FDLENBQU0sR0FBSTFCLENBQU8sRUFFMUYsS0FBSyxTQUFTLG9CQUFvQixJQUFNME0sRUFBQUEsbUJBQW1CLFVBQ3hELFlBQUEsUUFBUSxNQUFNck4sRUFBb0IsMkJBQTRCLFlBQVlELEVBQWUsbUJBQW1CLEdBQUlZLENBQU8sRUFDckgsQ0FBRSxLQUFNWixFQUFlLHFCQUcxQixNQUFBdUUsRUFBVyxLQUFLLFNBQVMsWUFBWSxFQUMzQyxHQUFJLENBQUNBLEdBQVksQ0FBQ0QsR0FBcUJDLENBQVEsRUFDeEMsWUFBQSxRQUFRLE1BQU10RSxFQUFvQiwyQkFBNEIsWUFBWUQsRUFBZSx1QkFBdUIsR0FBSVksQ0FBTyxFQUN6SCxDQUFFLEtBQU1aLEVBQWUseUJBTTVCLEdBQUEsQ0FBQzZZLEVBQUFBLGVBQWV2VyxDQUFNLEVBQ3hCLFlBQUssUUFBUSxNQUFNckMsRUFBb0IsMkJBQTRCLGdEQUFnRHFDLENBQU0sR0FBSTFCLENBQU8sRUFDN0gsQ0FBRSxLQUFNWixFQUFlLGFBTzFCLE1BQUEyWSxFQUFjLEtBQUssWUFBWSxvQkFBb0IsRUFDbkRTLEVBQWMsS0FBSyxZQUFZLGVBQWU5VyxDQUFNLEVBQ3RELEdBQUEsQ0FBQ3FXLEdBQWUsQ0FBQ1MsRUFDZCxZQUFBLFFBQVEsTUFBTW5aLEVBQW9CLDJCQUE0QixhQUFhRCxFQUFlLFdBQVcsc0JBQXVCWSxDQUFPLEVBQ2pJLENBQUUsS0FBTVosRUFBZSxhQVFoQyxHQUQ0QnNDLEtBQVc4VyxHQUFBLFlBQUFBLEVBQWEsYUFDM0IsQ0FDakIsS0FBQSxDQUFFLEtBQU1DLEdBQTBCLE1BQU0sS0FBSyxPQUFPVixFQUFhLFVBQUEsQ0FBVyxFQUM5RSxHQUFBVSxJQUEwQnJaLEVBQWUsUUFDM0MsWUFBSyxRQUFRLE1BQU1DLEVBQW9CLDJCQUE0QixrQ0FBa0NvWixDQUFxQixHQUFJelksQ0FBTyxFQUM5SCxDQUFFLEtBQU15WSxHQUVaLEtBQUEsWUFBWSxtQkFBbUIvVyxDQUFNLENBQzVDLENBS00sTUFBQUcsRUFBWWtXLEVBQWEsZUFDekIsQ0FBRSxLQUFNTSxDQUFtQixFQUFJLE1BQU0sS0FBSyxXQUFXLHNCQUFzQnhXLEVBQVc3QixDQUFPLEVBQy9GLEdBQUFxWSxJQUF1QmpaLEVBQWUsUUFDeEMsWUFBSyxRQUFRLE1BQU1DLEVBQW9CLDJCQUE0QixtQ0FBbUNnWixDQUFrQixHQUFJclksQ0FBTyxFQUM1SCxDQUFFLEtBQU1xWSxHQU1qQixLQUFNLENBQUUsS0FBQXBZLENBQUssRUFBSSxNQUFNLEtBQUssWUFBWSxPQUFPLENBQzdDLE9BQUF5QixHQUNDMUIsQ0FBTyxFQUlOLE9BRkosS0FBSyxvQkFBb0IscUJBQXFCNkgsRUFBd0IsbUJBQW9CNUgsRUFBTWlDLEVBQVc2VixDQUFZLEVBRW5IOVgsSUFBU2IsRUFBZSxTQUNyQixLQUFBLFdBQVcsaUJBQWlCWSxDQUFPLEVBQ3hDLEtBQUssUUFBUSxNQUFNWCxFQUFvQiwyQkFBNEIsc0JBQXNCWSxDQUFJLEdBQUlELENBQU8sRUFDakcsQ0FBRSxLQUFBQyxDQUFLLElBR2hCLEtBQUssUUFBUSxLQUFLWixFQUFvQiwyQkFBNEIsVUFBV1csQ0FBTyxFQUMvRSxLQUFBLFdBQVcsaUJBQWlCMEIsRUFBUTFCLENBQU8sRUFDekMsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBRUEsTUFBYyxjQUFjcU4sRUFBMEJ6TSxFQUFpQixPQUMvRCxLQUFBLENBQUUsT0FBQTBCLENBQVcsRUFBQStLLEVBRWQsS0FBQSxZQUFZLHVCQUF1QixFQUFJLEVBQ3ZDLEtBQUEsWUFBWSxjQUFjL0ssRUFBUTFCLENBQU8sRUFFeEMsS0FBQSxDQUFFLEtBQUFDLENBQVMsRUFBQSxNQUFNLEtBQUssWUFBWSxPQUFPd00sRUFBTXpNLENBQU8sRUFFeEQsT0FBQUMsSUFBU3lYLEdBQW9CLGVBQ3hCLENBQUUsS0FBTXRZLEVBQWUsVUFHNUJhLElBQVNiLEVBQWUsU0FBV3NDLE1BQVdxTixFQUFBLEtBQUssWUFBWSx3QkFBakIsWUFBQUEsRUFBd0MsY0FDeEYsTUFBTSxLQUFLLFdBQVcsYUFBYXJOLEVBQVExQixDQUFPLEVBRzdDLENBQUUsS0FBQUMsQ0FBSyxFQUNoQixDQVFBLE1BQU0sT0FBT3lCLEVBQWlCMEUsRUFBK0QsQ0FDckYsTUFBQWxFLEVBQVksQ0FBQyxJQUFJLEtBQ2pCbEMsRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUN0QyxLQUFBLFFBQVEsS0FBS1gsRUFBb0IsMkJBQTRCLFdBQVdxQyxDQUFNLGlCQUFpQjBFLENBQVUsR0FBSXBHLENBQU8sRUFFbkgsTUFBQStYLEVBQWMsS0FBSyxZQUFZLG9CQUFvQixFQUN6RCxHQUFJLENBQUNBLEVBQ0ksTUFBQSxDQUFFLEtBQU0zWSxFQUFlLGFBTWhDLEdBQUlzQyxHQUFVLENBQUNxRixXQUFTckYsQ0FBTSxFQUM1QixZQUFLLFFBQVEsTUFBTXJDLEVBQW9CLDJCQUE0Qiw4Q0FBOENxQyxDQUFNLEdBQUkxQixDQUFPLEVBQzNILENBQUUsS0FBTVosRUFBZSxhQUdoQyxHQUFJZ0gsRUFBWSxDQUNSLE1BQUFtRixFQUFNN0UsR0FBbUJOLENBQVUsRUFDckMsR0FBQW1GLEVBQUksT0FBU25NLEVBQWUsUUFDekIsWUFBQSxRQUFRLE1BQU1DLEVBQW9CLDJCQUE0QiwyQ0FBMkNrTSxFQUFJLFFBQVEsR0FBSXZMLENBQU8sRUFDOUgsQ0FBRSxLQUFNWixFQUFlLFlBRWxDLENBRU0sTUFBQXNaLEVBQW9CWCxFQUFZLFlBS2xDLEdBQUFyVyxHQUFVQSxJQUFXZ1gsR0FBcUIsQ0FBQyxLQUFLLFlBQVksZUFBZWhYLENBQU0sRUFDbkYsWUFBSyxRQUFRLE1BQU1yQyxFQUFvQiwyQkFBNEIseUNBQXlDcUMsQ0FBTSxHQUFJMUIsQ0FBTyxFQUN0SCxDQUFFLEtBQU1aLEVBQWUsaUJBR2hDLEtBQUssZ0JBQWtCLEdBRXZCLEtBQUssa0JBQW9Cc0MsR0FBVWdYLEVBRW5DLE1BQU1DLEVBRGMsS0FBSyxZQUFZLGVBQWUsS0FBSyxpQkFBaUIsR0FDckNaLEVBSy9CM0gsRUFBZ0IsS0FBSyxTQUFTLGFBQWEsRUFDM0N2USxFQUFZa1ksRUFBWSxZQUFZLEVBQUUsT0FBUWEsR0FBYUEsRUFBUyxTQUFXeEksQ0FBYSxFQUFFLENBQUMsRUFBRSxNQUNqRzVNLEVBQVcsQ0FBQ3VVLEVBQVksaUJBQWlCLEVBQUdBLEVBQVksa0JBQWtCLEVBQUUsU0FBUzNILENBQWEsRUFDbEczTSxFQUFjRixHQUFxQjFELEVBQVcyRCxDQUFRLEVBRXRELENBQUUsS0FBQXZELENBQUEsRUFBUyxNQUFNLEtBQUssY0FBYyxDQUN4QyxPQUFRLEtBQUssa0JBQ2IsWUFBQXdELEVBQ0EsV0FBQTJDLEdBQ0NwRyxDQUFPLEVBT04sT0FGQyxLQUFBLG9CQUFvQixxQkFBcUI2SCxFQUF3QixtQkFBb0I1SCxFQUFNaUMsRUFBV3lXLEVBQWdCLEtBQUssYUFBYSxFQUV6STFZLElBQVNiLEVBQWUsU0FDMUIsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLDJCQUE0Qix1QkFBdUJZLENBQUksR0FBSUQsQ0FBTyxFQUNsRyxDQUFFLEtBQUFDLENBQUssSUFHaEIsS0FBSyxrQkFBb0IsS0FDekIsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLDJCQUE0QixVQUFXVyxDQUFPLEVBQzdFLENBQUUsS0FBTVosRUFBZSxTQUNoQyxDQU9BLE1BQU0sdUJBQXVCeUMsRUFBbUYsQ0FDeEcsTUFBQTdCLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFHM0MsR0FGQSxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsOENBQStDLGNBQWN3QyxDQUFTLEdBQUk3QixDQUFPLEVBRW5IOEcsY0FBWXZHLEVBQW9Cc0IsQ0FBUyxDQUFDLEVBQzVDLFlBQUssUUFBUSxNQUFNeEMsRUFBb0IsOENBQStDLDRDQUE0Q3dDLENBQVMsR0FBSTdCLENBQU8sRUFDL0ksQ0FBRSxLQUFNWixFQUFlLGFBRzFCLE1BQUEyWSxFQUFjLEtBQUssd0JBQ25CYyxFQUFlZCxHQUFBLFlBQUFBLEVBQWEsZUFFbEMsR0FBSWxXLElBQWNnWCxFQUNYLFlBQUEsUUFBUSxNQUFNeFosRUFBb0IsOENBQStDLGVBQWVELEVBQWUsaUJBQWlCLEdBQUlZLENBQU8sRUFDekksQ0FBRSxLQUFNWixFQUFlLG1CQU1oQyxHQUFJLENBQUMsS0FBSyxZQUFZLHNCQUNmLFlBQUEsUUFBUSxNQUFNQyxFQUFvQiw4Q0FBK0MsZ0JBQWdCRCxFQUFlLFdBQVcsc0JBQXVCWSxDQUFPLEVBQ3ZKLENBQUUsS0FBTVosRUFBZSxhQU1oQyxNQUFNMFosRUFBWWYsR0FBQSxZQUFBQSxFQUFhLGNBQWMsT0FBUXBZLEdBQVNBLEVBQUssU0FBVyxLQUFLLFNBQVMsZ0JBQWdCLElBQUtBLEdBQVNBLEVBQUssUUFDekgsQ0FBRSxLQUFBTSxFQUFNLEtBQUFFLENBQUssRUFBSSxNQUFNLEtBQUssWUFBWSx1QkFBdUIsQ0FBRSxVQUFBMEIsRUFBVyxVQUFXaVgsR0FBYSxDQUFBLEdBQU05WSxDQUFPLEVBQ25ILE9BQUFDLElBQVNiLEVBQWUsU0FDMUIsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLDhDQUErQyxzQkFBc0JZLENBQUksR0FBSUQsQ0FBTyxFQUNwSCxDQUFFLEtBQUFDLENBQUssSUFHWCxLQUFBLFFBQVEsS0FBS1osRUFBb0IsOENBQStDLDBCQUEwQmMsRUFBTSxhQUFhLEdBQUlILENBQU8sRUFDdEksQ0FDTCxLQUFNWixFQUFlLFFBQ3JCLGNBQWVlLEVBQU0sYUFBQSxFQUV6QixDQU1BLE1BQU0sc0JBQXNCMFEsRUFBa0QsQ0FDdEUsTUFBQTdRLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFNdkMsR0FMSixLQUFLLFFBQVEsS0FBS1gsRUFBb0IsNkNBQThDLGtCQUFrQndSLENBQWEsR0FBSTdRLENBQU8sRUFLMUgsQ0FBQ2lZLEVBQUFBLGVBQWVwSCxDQUFhLEVBQy9CLFlBQUssUUFBUSxNQUFNeFIsRUFBb0IsNkNBQThDLHdEQUF3RHdSLENBQWEsR0FBSTdRLENBQU8sRUFDOUosQ0FBRSxLQUFNWixFQUFlLGFBTWhDLEdBQUksQ0FBQyxLQUFLLFlBQVksc0JBQ2YsWUFBQSxRQUFRLE1BQU1DLEVBQW9CLDZDQUE4QyxnQkFBZ0JELEVBQWUsV0FBVyxzQkFBdUJZLENBQU8sRUFDdEosQ0FBRSxLQUFNWixFQUFlLGFBTTFCLEtBQUEsQ0FBRSxLQUFBYSxHQUFTLE1BQU0sS0FBSyxZQUFZLHNCQUFzQixDQUFFLGNBQUE0USxHQUFpQjdRLENBQU8sRUFDcEYsT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IsNkNBQThDLHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQ25ILENBQUUsS0FBQUMsQ0FBSyxJQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0IsNkNBQThDLFVBQVdXLENBQU8sRUFDL0YsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBTUEsTUFBTSxxQkFBcUJ5UixFQUF1QmtJLEVBQTZDLENBQ3ZGLE1BQUEvWSxFQUFVLEtBQUssUUFBUSxjQUFjLEVBTXZDLEdBTEosS0FBSyxRQUFRLEtBQUtYLEVBQW9CLDRDQUE2QyxrQkFBa0J3UixDQUFhLEdBQUk3USxDQUFPLEVBS3pILENBQUNpWSxFQUFBQSxlQUFlcEgsQ0FBYSxFQUMvQixZQUFLLFFBQVEsTUFBTXhSLEVBQW9CLDRDQUE2Qyx3REFBd0R3UixDQUFhLEdBQUk3USxDQUFPLEVBQzdKLENBQUUsS0FBTVosRUFBZSxhQUU1QixHQUFBLENBQUNxSCxFQUFBQSxVQUFVc1MsQ0FBTyxFQUNwQixZQUFLLFFBQVEsTUFBTTFaLEVBQW9CLDRDQUE2QyxpREFBaUQwWixDQUFPLEdBQUkvWSxDQUFPLEVBQ2hKLENBQUUsS0FBTVosRUFBZSxhQU1oQyxHQUFJLENBQUMsS0FBSyxZQUFZLHNCQUNmLFlBQUEsUUFBUSxNQUFNQyxFQUFvQiw0Q0FBNkMsZ0JBQWdCRCxFQUFlLFdBQVcsc0JBQXVCWSxDQUFPLEVBQ3JKLENBQUUsS0FBTVosRUFBZSxhQUdoQyxLQUFNLENBQUUsS0FBQWEsQ0FBSyxFQUFJLE1BQU0sS0FBSyxZQUFZLHdCQUF3QixDQUM5RCxjQUFBNFEsRUFDQSxNQUFPa0ksR0FDTi9ZLENBQU8sRUFDTixPQUFBQyxJQUFTYixFQUFlLFNBQzFCLEtBQUssUUFBUSxNQUFNQyxFQUFvQiw0Q0FBNkMsaUJBQWlCWSxDQUFJLEdBQUlELENBQU8sRUFDN0csQ0FBRSxLQUFBQyxDQUFLLElBR2hCLEtBQUssUUFBUSxLQUFLWixFQUFvQiw0Q0FBNkMsVUFBV1csQ0FBTyxFQUM5RixDQUFFLEtBQU1aLEVBQWUsU0FDaEMsQ0FNQSx1QkFBa0QsQ0FDekMsT0FBQSxLQUFLLFlBQVkscUJBQzFCLENBTUEsTUFBTSxtQ0FBa0csQ0FDaEcsTUFBQVksRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUMzQyxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsMkRBQTRELEdBQUlXLENBQU8sRUFFdkcsS0FBQSxDQUFFLEtBQUFDLEVBQU0sS0FBQUUsR0FBUyxNQUFNLEtBQUssWUFBWSxnQkFBZ0JILENBQU8sRUFDakUsT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IsMkRBQTRELHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQ2pJLENBQUUsS0FBQUMsQ0FBSyxJQUdYLEtBQUEsUUFBUSxLQUFLWixFQUFvQiwyREFBNEQsa0JBQWtCLEtBQUssVUFBVWMsQ0FBSSxDQUFDLEdBQUlILENBQU8sRUFDNUksQ0FDTCxLQUFNWixFQUFlLFFBQ3JCLFFBQVNlLENBQUEsRUFFYixDQVVBLE1BQU0sZUFBZTZZLEVBQXdCQyxFQUFnRixDQUNySCxNQUFBalosRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUczQyxHQUZLLEtBQUEsUUFBUSxLQUFLWCxFQUFvQixxQ0FBc0MsbUJBQW1CMlosQ0FBYyxZQUFZQyxDQUFLLEdBQUlqWixDQUFPLEVBRXJJLEVBQUVnQixFQUFBQSxTQUFTZ1ksQ0FBYyxHQUFLQSxHQUFrQixHQUNsRCxZQUFLLFFBQVEsTUFBTTNaLEVBQW9CLHFDQUFzQywwREFBMEQyWixDQUFjLEdBQUloWixDQUFPLEVBQ3pKLENBQUUsS0FBTVosRUFBZSxhQUdoQyxHQUFJLEVBQUU0QixFQUFBQSxTQUFTaVksQ0FBSyxHQUFLQSxFQUFRLEdBQy9CLFlBQUssUUFBUSxNQUFNNVosRUFBb0IscUNBQXNDLGlEQUFpRDRaLENBQUssR0FBSWpaLENBQU8sRUFDdkksQ0FBRSxLQUFNWixFQUFlLGFBR2hDLEtBQU0sQ0FBRSxLQUFBYSxFQUFNLEtBQUFFLENBQUEsRUFBUyxNQUFNLEtBQUssWUFBWSxlQUFlLENBQzNELFVBQVc2WSxFQUNYLE1BQUFDLEdBQ0NqWixDQUFPLEVBQ04sT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0IscUNBQXNDLHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQzNHLENBQUUsS0FBQUMsQ0FBSyxJQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0IscUNBQXNDLFVBQVdXLENBQU8sRUFDdkYsQ0FDTCxLQUFNWixFQUFlLFFBQ3JCLE9BQVFlLENBQUEsRUFFWixDQU1BLE1BQU0sNEJBQTRCcU0sRUFBOEMsQ0FDeEUsTUFBQXhNLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFHdkMsR0FGQyxLQUFBLFFBQVEsS0FBS1gsRUFBb0Isa0RBQW1ELFlBQVltTixFQUFRLEtBQUssR0FBRyxDQUFDLEdBQUl4TSxDQUFPLEVBRTdILEVBQ0ZnWSxFQUFjLGNBQUF4TCxDQUFPLEdBQ2xCQSxFQUFRLE1BQU85SyxHQUFXdVcsRUFBQSxlQUFldlcsQ0FBTSxDQUFDLEdBRTlDLFlBQUEsUUFBUSxNQUFNckMsRUFBb0Isa0RBQW1ELDRFQUE0RSxLQUFLLFVBQVVtTixDQUFPLENBQUMsR0FBSXhNLENBQU8sRUFDak0sQ0FBRSxLQUFNWixFQUFlLGFBRzFCLEtBQUEsQ0FBRSxLQUFBYSxDQUFTLEVBQUEsTUFBTSxLQUFLLFlBQVksY0FBY3VNLEVBQVN4TSxDQUFPLEVBQ2xFLE9BQUFDLElBQVNiLEVBQWUsU0FDMUIsS0FBSyxRQUFRLE1BQU1DLEVBQW9CLGtEQUFtRCxzQkFBc0JZLENBQUksR0FBSUQsQ0FBTyxFQUN4SCxDQUFFLEtBQUFDLENBQUssSUFHaEIsS0FBSyxRQUFRLEtBQUtaLEVBQW9CLGtEQUFtRCxVQUFXVyxDQUFPLEVBQ3BHLENBQ0wsS0FBTVosRUFBZSxPQUFBLEVBRXpCLENBS0EsTUFBTSxnQ0FBNEQsQ0FDMUQsTUFBQVksRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUMzQyxLQUFLLFFBQVEsS0FBS1gsRUFBb0Isd0RBQXlELEdBQUlXLENBQU8sRUFFMUcsS0FBTSxDQUFFLEtBQUFDLENBQUssRUFBSSxNQUFNLEtBQUssWUFBWSxpQkFBaUJELENBQU8sRUFDNUQsT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0Isd0RBQXlELHNCQUFzQlksQ0FBSSxHQUFJRCxDQUFPLEVBQzlILENBQUUsS0FBQUMsQ0FBSyxJQUdoQixLQUFLLFFBQVEsS0FBS1osRUFBb0Isd0RBQXlELFVBQVdXLENBQU8sRUFDMUcsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBT0EsTUFBTSxhQUF5QyxPQUN2QyxNQUFBWSxFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLEtBQUssUUFBUSxLQUFLWCxFQUFvQixpQ0FBa0MsR0FBSVcsQ0FBTyxFQUs3RSxLQUFBLENBQUUsS0FBQUMsRUFBTSxNQUFBdVUsR0FBVSxNQUFNLEtBQUssV0FBVyxvQkFBb0J4VSxDQUFPLEVBQ3JFLEdBQUFDLElBQVNiLEVBQWUsUUFDMUIsWUFBSyxRQUFRLE1BQU1DLEVBQW9CLGlDQUFrQyxrQ0FBa0NZLENBQUksR0FBSUQsQ0FBTyxFQUNuSCxDQUFFLEtBQUFDLENBQUssRUFLWixHQUZDLEtBQUEsWUFBWSxvQkFBb0IsS0FBSyxTQUFTLGFBQWdCLEVBQUFNLEVBQW9CLE1BQU8sR0FBTVAsQ0FBTyxFQUV2RyxFQUFDd1UsR0FBQSxNQUFBQSxFQUFPLGtCQUFpQnpGLEVBQUEsS0FBSyxZQUFZLG9CQUFBLElBQWpCLFlBQUFBLEVBQXdDLGNBQWV0TyxFQUFvQixPQUFRLENBQzlHLEtBQU0sQ0FBRSxLQUFBUixHQUFTLE1BQU0sS0FBSyxXQUFXLG9CQUNuQ0EsT0FBQUEsSUFBUzhLLFlBQVUsU0FDckIsS0FBSyxRQUFRLE1BQU0xTCxFQUFvQixpQ0FBa0MsdUJBQXVCWSxDQUFJLEdBQUlELENBQU8sRUFDeEcsQ0FBRSxLQUFBQyxLQUVYLEtBQUssUUFBUSxLQUFLWixFQUFvQixpQ0FBa0MsVUFBV1csQ0FBTyxFQUNuRixDQUFFLEtBQU1aLEVBQWUsU0FDaEMsQ0FNTSxLQUFBLENBQUUsS0FBTThaLEdBQWUsTUFBTSxLQUFLLFdBQVcsaUJBQWlCbFosQ0FBTyxFQUMzRSxPQUFJa1osSUFBZW5PLEVBQUFBLFVBQVUsU0FBV21PLElBQWU5WixFQUFlLFNBQ3BFLEtBQUssUUFBUSxNQUFNQyxFQUFvQixpQ0FBa0Msc0JBQXNCNlosQ0FBVSxHQUFJbFosQ0FBTyxFQUM3RyxDQUFFLEtBQU1rWixLQUdqQixLQUFLLFFBQVEsS0FBSzdaLEVBQW9CLGlDQUFrQyxVQUFXVyxDQUFPLEVBQ25GLENBQUUsS0FBTVosRUFBZSxTQUNoQyxDQUtBLE1BQU0sWUFBd0MsQ0FDdEMsTUFBQVksRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUMzQyxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsZ0NBQWlDLEdBQUlXLENBQU8sRUFFbEYsS0FBTSxDQUFFLEtBQUFDLEVBQU0sTUFBQXVVLEdBQVUsTUFBTSxLQUFLLFdBQVcsb0JBRTlDLE9BQUl2VSxJQUFTYixFQUFlLFNBQVdhLElBQVM4SyxFQUFBQSxVQUFVLFNBQ3hELEtBQUssUUFBUSxNQUFNMUwsRUFBb0IsZ0NBQWlDLGVBQWVZLENBQUksR0FBSUQsQ0FBTyxFQUMvRixDQUFFLEtBQUFDLENBQUssSUFHWCxLQUFBLFdBQVcsYUFBYXVVLENBQU0sRUFDOUIsS0FBQSxZQUFZLG9CQUFvQixLQUFLLFNBQVMsYUFBZ0IsRUFBQWpVLEVBQW9CLE1BQU8sR0FBT1AsQ0FBTyxFQUM1RyxLQUFLLFFBQVEsS0FBS1gsRUFBb0IsZ0NBQWlDLFVBQVdXLENBQU8sRUFDbEYsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBUUEsTUFBTSxhQUFhbUMsRUFBNEMsQ0FDdkQsTUFBQXZCLEVBQVUsS0FBSyxRQUFRLGNBQWMsRUFHdkMsR0FGSixLQUFLLFFBQVEsS0FBS1gsRUFBb0Isa0NBQW1DLGFBQWFrQyxDQUFRLEdBQUl2QixDQUFPLEVBRXJHLENBQUNpWSxFQUFBQSxlQUFlMVcsQ0FBUSxFQUMxQixZQUFLLFFBQVEsTUFBTWxDLEVBQW9CLGtDQUFtQyxtREFBbURrQyxDQUFRLEdBQUl2QixDQUFPLEVBQ3pJLENBQUUsS0FBTVosRUFBZSxhQUcxQixNQUFBNkksRUFBVSxLQUFLLFlBQVksb0JBQW9CLEVBQ3JELEdBQUksQ0FBQ0EsRUFDRSxZQUFBLFFBQVEsTUFBTTVJLEVBQW9CLGtDQUFtQyxZQUFZRCxFQUFlLFdBQVcsR0FBSVksQ0FBTyxFQUNwSCxDQUFFLEtBQU1aLEVBQWUsYUFHaEMsR0FBSTZJLEVBQVEsaUJBQW1CMUgsRUFBb0IsTUFDNUMsWUFBQSxRQUFRLE1BQU1sQixFQUFvQixrQ0FBbUMsWUFBWUQsRUFBZSxjQUFjLEdBQUlZLENBQU8sRUFDdkgsQ0FBRSxLQUFNWixFQUFlLGdCQUdoQyxLQUFLLGFBQWEsU0FBV21DLEVBQ3hCLEtBQUEsV0FBVyxlQUFlLEtBQUssWUFBWSxFQUVoRCxLQUFNLENBQUUsS0FBQXRCLENBQUssRUFBSSxNQUFNLEtBQUssV0FBVyxrQkFBa0JELENBQU8sRUFDNUQsT0FBQUMsSUFBU2IsRUFBZSxTQUMxQixLQUFLLFFBQVEsTUFBTUMsRUFBb0Isa0NBQW1DLDZDQUE2Q1ksQ0FBSSxHQUFJRCxDQUFPLEVBQy9ILENBQUUsS0FBQUMsQ0FBSyxJQUVoQixLQUFLLFFBQVEsS0FBS1osRUFBb0Isa0NBQW1DLFVBQVdXLENBQU8sRUFDcEYsQ0FBRSxLQUFNWixFQUFlLFNBQ2hDLENBTUEsTUFBTSxpQkFBNkMsQ0FDM0MsTUFBQVksRUFBVSxLQUFLLFFBQVEsY0FBYyxFQUMzQyxLQUFLLFFBQVEsS0FBS1gsRUFBb0IscUNBQXNDLEdBQUlXLENBQU8sRUFFakYsS0FBQSxDQUFFLEtBQUFDLEVBQU0sTUFBQXVVLEdBQVUsTUFBTSxLQUFLLFdBQVcsd0JBQXdCeFUsQ0FBTyxFQUN6RSxHQUFBQyxJQUFTYixFQUFlLFFBQzFCLFlBQUssUUFBUSxNQUFNQyxFQUFvQixxQ0FBc0MsNkNBQTZDWSxDQUFJLEdBQUlELENBQU8sRUFDbEksQ0FBRSxLQUFBQyxDQUFLLEVBS1osR0FGQyxLQUFBLFlBQVksb0JBQW9CLEtBQUssU0FBUyxhQUFnQixFQUFBTSxFQUFvQixNQUFPLEdBQU1QLENBQU8sRUFFdkcsQ0FBQ3dVLEVBQU8sZUFDVixZQUFLLFFBQVEsS0FBS25WLEVBQW9CLHFDQUFzQyxVQUFXVyxDQUFPLEVBQ3ZGLENBQUUsS0FBTVosRUFBZSxTQUcxQixNQUFBOFosRUFBYSxNQUFNMUUsRUFBTyxTQUM1QixPQUFBMEUsSUFBZW5PLFlBQVUsU0FDM0IsS0FBSyxRQUFRLE1BQU0xTCxFQUFvQixxQ0FBc0Msc0JBQXNCWSxDQUFJLEdBQUlELENBQU8sRUFDM0csQ0FDTCxLQUFNa1osQ0FBQSxJQUlWLEtBQUssUUFBUSxLQUFLN1osRUFBb0IscUNBQXNDLFVBQVdXLENBQU8sRUFDdkYsQ0FDTCxLQUFNWixFQUFlLE9BQUEsRUFFekIsQ0FNQSxNQUFNLGdCQUE0QyxDQUMxQyxNQUFBWSxFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLEtBQUssUUFBUSxLQUFLWCxFQUFvQixvQ0FBcUMsR0FBSVcsQ0FBTyxFQUV0RixLQUFNLENBQUUsS0FBQUMsRUFBTSxNQUFBdVUsR0FBVSxNQUFNLEtBQUssV0FBVyxvQkFDOUMsT0FBSXZVLElBQVNiLEVBQWUsU0FBV2EsSUFBUzhLLEVBQUFBLFVBQVUsU0FDeEQsS0FBSyxRQUFRLE1BQU0xTCxFQUFvQixvQ0FBcUMsc0JBQXNCWSxDQUFJLEdBQUlELENBQU8sRUFDMUcsQ0FBRSxLQUFBQyxDQUFLLElBR1gsS0FBQSxZQUFZLG9CQUFvQixLQUFLLFNBQVMsYUFBZ0IsRUFBQU0sRUFBb0IsTUFBTyxHQUFPUCxDQUFPLEVBRTVHLEtBQUssUUFBUSxLQUFLWCxFQUFvQixvQ0FBcUMsVUFBV1csQ0FBTyxFQUN0RixDQUFFLEtBQU1aLEVBQWUsU0FDaEMsQ0FLQSxxQkFBK0IsQ0FDdkIsTUFBQW9WLEVBQVEsS0FBSyxXQUFXLG1CQUFtQixFQUNqRCxNQUFPLENBQUMsQ0FBQ0EsR0FBUyxDQUFDQSxFQUFNLGFBQWEsQ0FDeEMsQ0FNQSxNQUFNLHdCQUF3QnBMLEVBQTRDLENBQ2xFLE1BQUFwSixFQUFVLEtBQUssUUFBUSxjQUFjLEVBQzNDLE9BQU8sS0FBSyxXQUFXLHdCQUF3Qm9KLEVBQVFwSixDQUFPLENBQ2hFLENBTUEsWUFBcUIsQ0FDWixNQUFBLE9BQ1QsQ0FLQSxNQUFNLFlBQWEsQ0FFVixPQURTLE1BQU1tWixTQUFPLFlBRS9CLENBS0EsTUFBTSxnQkFBaUIsQ0FFZCxPQURhLE1BQU1BLFNBQU8sZ0JBRW5DLENBQ0YsQ0MxMkNhLE1BQUFDLEdBQW9CM00sR0FDMUJBLEVBR0E0TSxFQUFBQSxTQUFTNU0sQ0FBSSxFQUlMLE9BQU8sS0FBS0EsQ0FBSSxFQUVuQixTQUFTLFdBQVcsRUFHekI0TSxFQUFBLFNBQVM1TSxFQUFLLFNBQVMsRUFJckIsQ0FBRSxRQUFTLElBSFQsQ0FBRSxRQUFTLEdBQU8sSUFBSywrREFBb0UsRUFIM0YsQ0FBRSxRQUFTLEdBQU8sS0FBTXJOLEVBQWUsc0JBQXVCLEVBTjlELENBQUUsUUFBUyxHQUFPLElBQUssMENBQTJDLEVBSGxFLENBQUUsUUFBUyxHQUFPLElBQUssNkNBQThDLEVDQTFFa2EsR0FBbUUsQ0FDdkUsSUFBSyxhQUNMLE9BQU9DLEVBQW1CLENBRXhCLE9BRGNDLEVBQUFBLGNBQUEsSUFBSSxtQkFBb0IsT0FBVyxFQUM1Q0EsRUFBQSxjQUFjLFlBQVksT0FBMkIsRUFLbkQsSUFKRyxRQUFBLE1BQU0sK0JBQStCQSxnQkFBYyxVQUFVLE1BQU0scUVBQThGLEVBQ2xLLEdBSVgsRUFDQSxNQUFNQyxFQUF3QkYsRUFBbUI1TSxFQUE4QyxDQUV2RixNQUFBK00sRUFBY04sR0FBaUJ6TSxDQUFPLEVBQ3hDLEdBQUEsQ0FBQytNLEVBQVksUUFDZixNQUFNLElBQUksTUFBTSxnQ0FBZ0NBLEVBQVksR0FBRyxFQUFFLEVBSW5FLE1BQU1DLEVBQWVGLEVBQVEsYUFBYSxjQUFlLEtBQUssRUFFeERHLEVBQWM5UyxFQUFZLFlBQUE2RixFQUFRLGNBQWMsRUFBSWtOLE9BQUssS0FBT2xOLEVBQVEsZUFDOUUsT0FBQWdOLEVBQWEsZUFBZUMsQ0FBWSxFQUN4Q0QsRUFBYSxLQUFLdGEsRUFBb0IsbUNBQW9DLDJFQUE0RCxFQUUvSCxJQUFJd1ksR0FBaUI0QixFQUFTRSxFQUFjSixFQUFTNU0sQ0FBTyxDQUNyRSxDQUNGIn0=