TimeTrex/interface/html5/dist/my_account-request-RequestViewController.bundle.js

1 line
125 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["my_account-request-RequestViewController"],{926:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"RequestViewController\": () => (/* binding */ RequestViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass RequestViewController extends RequestViewCommonController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#request_view_container',\n\n\t\t\ttype_array: null,\n\t\t\trequest_type_array: null,\n\t\t\tstatus_array: null,\n\n\t\t\tapi_request_schedule: null,\n\t\t\tauthorization_api: null,\n\t\t\tschedule_api: null,\n\t\t\thierarchy_type_id: false,\n\n\t\t\tpunch_tag_api: null,\n\t\t\tdefault_punch_tag: [],\n\t\t\tprevious_punch_tag_selection: [],\n\n\t\t\toverlapping_shift_data: {},\n\n\t\t\tmessages: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options);\n\t\tthis.edit_view_tpl = 'RequestEditView.html';\n\t\tthis.permission_id = 'request';\n\t\tthis.viewId = 'Request';\n\t\tthis.script_name = 'RequestView';\n\t\tthis.table_name_key = 'request';\n\t\tthis.context_menu_name = $.i18n._( 'Requests' );\n\t\tthis.navigation_label = $.i18n._( 'Request' );\n\t\tthis.api = TTAPI.APIRequest;\n\t\tthis.api_absence_policy = TTAPI.APIAbsencePolicy;\n\t\tthis.api_schedule = TTAPI.APISchedule;\n\t\tthis.message_control_api = TTAPI.APIMessageControl;\n\n\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\tthis.api_request_schedule = TTAPI.APIRequestSchedule;\n\t\t\tthis.schedule_api = TTAPI.APISchedule;\n\t\t}\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\tthis.job_api = TTAPI.APIJob;\n\t\t\tthis.job_item_api = TTAPI.APIJobItem;\n\t\t\tthis.punch_tag_api = TTAPI.APIPunchTag;\n\t\t}\n\n\t\tthis.authorization_api = TTAPI.APIAuthorization;\n\n\t\tthis.initPermission();\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\t// override allows a callback after initOptions when run as sub view (from EmployeeViewController)\n\tinitOptions( callBack ) {\n\n\t\tvar options = [\n\t\t\t{ option_name: 'status' },\n\t\t\t{ option_name: 'type' }\n\t\t];\n\n\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\toptions.push( { option_name: 'overlap_type', api: TTAPI.APIRequestSchedule } );\n\t\t}\n\n\t\tthis.initDropDownOptions( options, function( result ) {\n\n\t\t\tif ( callBack ) {\n\t\t\t\tcallBack( result ); // First to initialize drop down options, and then to initialize edit view UI.\n\t\t\t}\n\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar tab_model = {\n\t\t\t'tab_request': { 'label': $.i18n._( 'Message' ) },\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\t//This hides the audit tab as this view is always used for creating/replying to an existing request.\n\t\t//For some reason removing 'tab_audit' from the model above results in a blank tab appearing.\n\t\tvar tab_audit_label = this.edit_view.find( 'a[ref=tab_audit]' );\n\t\ttab_audit_label.css( 'display', 'none' );\n\n\t\t//Tab 0 start\n\n\t\tvar tab_request = this.edit_view_tab.find( '#tab_request' );\n\t\tvar tab_request_column1 = tab_request.find( '.first-column' );\n\t\tvar tab_request_column2 = tab_request.find( '.second-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab_request_column1 );\n\n\t\t// Subject\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'subject', width: 359 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Subject' ), form_item_input, tab_request_column1, '' );\n\n\t\t// Body\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\n\t\tform_item_input.TTextArea( { field: 'body', width: 600, height: 400 } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Body' ), form_item_input, tab_request_column1, '', null, null, true );\n\n\t\ttab_request_column2.css( 'display', 'none' );\n\t}\n\n\tbuildAddViewUI() {\n\t\tsuper.buildEditViewUI();\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_request': { 'label': $.i18n._( 'Request' ), 'is_multi_column': true },\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\t//This hides the audit tab as this view is always used for creating/replying to an existing request.\n\t\t//For some reason removing 'tab_audit' from the model above results in a blank tab appearing.\n\t\tvar tab_audit_label = this.edit_view.find( 'a[ref=tab_audit]' );\n\t\ttab_audit_label.css( 'display', 'none' );\n\n\t\t//Tab 0 start\n\t\tvar tab_request = this.edit_view_tab.find( '#tab_request' );\n\t\tvar tab_request_column1 = tab_request.find( '.first-column' );\n\t\tvar tab_request_column2 = tab_request.find( '.second-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab_request_column1 );\n\t\tthis.edit_view_tabs[0].push( tab_request_column2 );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\n\n\t\t// Employee\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'full_name' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_request_column1, '' );\n\n\t\t// Type\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'type_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_request_column1 );\n\n\t\t// Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'date_stamp' } );\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + $.i18n._( '(Use the first or only date affected by this request)' ) + '</span>' );\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_request_column1, '', widgetContainer );\n\n\t\tif ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {\n\t\t\t//Working Status\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\tform_item_input.TComboBox( { field: 'request_schedule_status_id', set_empty: false } );\n\t\t\tform_item_input.setSourceData( { 10: 'Working', 20: 'Absent' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_request_column1 );\n\n\t\t\t//Absence Policy\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIAbsencePolicy,\n\t\t\t\tcustomSearchFilter: function() {\n\t\t\t\t\treturn { filter_data: { user_id: LocalCacheData.getLoginUser().id } };\n\t\t\t\t},\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_absences',\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'absence_policy_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Absence Policy' ), form_item_input, tab_request_column1 );\n\n\t\t\t//Available Balance\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'available_balance' } );\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box available-balance-h-box\\'></div>' );\n\t\t\tthis.available_balance_info = $( '<span class=\"available-balance-info tticon tticon-info_black_24dp\"></span>' );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\twidgetContainer.append( this.available_balance_info );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Available Balance' ), form_item_input, tab_request_column1, '', widgetContainer, true );\n\n\t\t\t//Start Date\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\t\tform_item_input.TDatePicker( { field: 'start_date' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_request_column1, '' );\n\n\t\t\t//End Date\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\t\tform_item_input.TDatePicker( { field: 'end_date' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_request_column1, '' );\n\n\t\t\t// Effective Days\n\t\t\tvar form_item_sun_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sun_checkbox.TCheckbox( { field: 'sun' } );\n\n\t\t\tvar form_item_mon_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_mon_checkbox.TCheckbox( { field: 'mon' } );\n\n\t\t\tvar form_item_tue_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_tue_checkbox.TCheckbox( { field: 'tue' } );\n\n\t\t\tvar form_item_wed_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_wed_checkbox.TCheckbox( { field: 'wed' } );\n\n\t\t\tvar form_item_thu_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_thu_checkbox.TCheckbox( { field: 'thu' } );\n\n\t\t\tvar form_item_fri_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_fri_checkbox.TCheckbox( { field: 'fri' } );\n\n\t\t\tvar form_item_sat_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sat_checkbox.TCheckbox( { field: 'sat' } );\n\n\t\t\twidgetContainer = $( '<div></div>' );\n\n\t\t\tvar sun = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Sun' ) + ' <br> ' + ' </span>' );\n\t\t\tvar mon = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Mon' ) + ' <br> ' + ' </span>' );\n\t\t\tvar tue = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Tue' ) + ' <br> ' + ' </span>' );\n\t\t\tvar wed = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Wed' ) + ' <br> ' + ' </span>' );\n\t\t\tvar thu = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Thu' ) + ' <br> ' + ' </span>' );\n\t\t\tvar fri = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Fri' ) + ' <br> ' + ' </span>' );\n\t\t\tvar sat = $( '<span class=\\'widget-top-label\\'> ' + $.i18n._( 'Sat' ) + ' <br> ' + ' </span>' );\n\n\t\t\tsun.append( form_item_sun_checkbox );\n\t\t\tmon.append( form_item_mon_checkbox );\n\t\t\ttue.append( form_item_tue_checkbox );\n\t\t\twed.append( form_item_wed_checkbox );\n\t\t\tthu.append( form_item_thu_checkbox );\n\t\t\tfri.append( form_item_fri_checkbox );\n\t\t\tsat.append( form_item_sat_checkbox );\n\n\t\t\twidgetContainer.append( sun );\n\t\t\twidgetContainer.append( mon );\n\t\t\twidgetContainer.append( tue );\n\t\t\twidgetContainer.append( wed );\n\t\t\twidgetContainer.append( thu );\n\t\t\twidgetContainer.append( fri );\n\t\t\twidgetContainer.append( sat );\n\n\t\t\twidgetContainer.addClass( 'request_edit_view_effective_days' );\n\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Effective Days' ), [form_item_sun_checkbox, form_item_mon_checkbox, form_item_tue_checkbox, form_item_wed_checkbox, form_item_thu_checkbox, form_item_fri_checkbox, form_item_sat_checkbox], tab_request_column1, '', widgetContainer, false, true );\n\n\t\t\t//Start time\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'start_time' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'In' ), form_item_input, tab_request_column1 );\n\n\t\t\t//End time\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'end_time' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Out' ), form_item_input, tab_request_column1 );\n\n\t\t\t// Total\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'total_time' } );\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\tlabel = $( '<span class=\\'widget-right-label\\' id=\\'total_info\\'></span>' );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\twidgetContainer.append( label );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Total' ), form_item_input, tab_request_column1, '', widgetContainer );\n\n\t\t\tif ( ( Global.getProductEdition() >= 15 ) && this.overlappingShiftUIValidate() == true ) {\n\t\t\t\t//Override / Split shift\n\t\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'overlap_type_id', set_empty: false } );\n\t\t\t\tform_item_input.setSourceData( this.overlap_type_array );\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box overlapping-shift-h-box\\'></div>' );\n\t\t\t\tthis.overlapping_shift_info = $( '<span style=\"position: relative; top: -3px; left: 3px;\" id=\"overlapping-shift-total\"></span><span id=\"overlapping-shift-icon\" class=\"overlapping-shift-info tticon tticon-info_black_24dp\"></span>' );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( this.overlapping_shift_info );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Overlapping Shift(s)' ), form_item_input, tab_request_column1, '', widgetContainer, true );\n\t\t\t}\n\n\t\t\t//Schedule Policy\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_schedule',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'schedule_policy_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Schedule Policy' ), form_item_input, tab_request_column1 );\n\n\t\t\t//branch\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'branch_id'\n\t\t\t} );\n\t\t\tif ( this.show_branch_ui ) {\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_request_column1 );\n\t\t\t}\n\n\t\t\t//Dept\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'department_id'\n\t\t\t} );\n\n\t\t\tif ( this.show_department_ui ) {\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_request_column1 );\n\t\t\t}\n\n\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t//Job\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'job_id',\n\t\t\t\t\tadded_items: [\n\t\t\t\t\t\t{ value: '-1', label: Global.default_item },\n\t\t\t\t\t\t{ value: '-2', label: Global.selected_item }\n\t\t\t\t\t]\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( job_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_job_ui ) {\n\t\t\t\t\t//invalid permissions\n\t\t\t\t\tthis.detachElement( 'job_id' );\n\t\t\t\t}\n\t\t\t\t//Job Item\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'job_item_id',\n\t\t\t\t\tadded_items: [\n\t\t\t\t\t\t{ value: '-1', label: Global.default_item },\n\t\t\t\t\t\t{ value: '-2', label: Global.selected_item }\n\t\t\t\t\t]\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( job_item_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_job_item_ui ) {\n\t\t\t\t\t//invalid permissions\n\t\t\t\t\tthis.detachElement( 'job_item_id' );\n\t\t\t\t}\n\n\t\t\t\t//Punch Tag\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\t\tallow_multiple_selection: true,\n\t\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_empty: true,\n\t\t\t\t\tsetRealValueCallBack: ( ( punch_tags ) => {\n\t\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'punch_tag_id'\n\t\t\t\t} );\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tpunch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );\n\t\t\t\tpunch_tag_coder.addClass( 'job-coder' );\n\n\t\t\t\twidgetContainer.append( punch_tag_coder );\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), [form_item_input, punch_tag_coder], tab_request_column1, '', widgetContainer, true );\n\n\t\t\t\tif ( !this.show_punch_tag_ui ) {\n\t\t\t\t\t//invalid permissions\n\t\t\t\t\tthis.detachElement( 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Message\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'message', width: 400, height: 300 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Reason / Message' ), form_item_input, tab_request_column1, '', null, null, true );\n\n\t\t//hide initially hidden fields.\n\t\t//tab_request_column2.css( 'display', 'none' );\n\t\tif ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {\n\t\t\tthis.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t\tthis.hideAdvancedFields();\n\t\t}\n\n\t\tthis.onTypeChanged();\n\t\tthis.onWorkingStatusChanged();\n\t}\n\n\tbuildSearchFields() {\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Type' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'type_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Start Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'start_date',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'End Date' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'end_date',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.DATE_PICKER\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Created By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'created_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Updated By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'updated_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['default'],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'New' ),\n\t\t\t\t\tid: 'add',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-add_black_24dp',\n\t\t\t\t\tshow_on_right_click: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View' ),\n\t\t\t\t\tid: 'view',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-visibility_black_24dp',\n\t\t\t\t\tshow_on_right_click: true,\n\t\t\t\t\tsort_order: 1010\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Reply' ),\n\t\t\t\t\tid: 'edit',\n\t\t\t\t\tvue_icon: 'tticon tticon-reply_black_24dp'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Send' ),\n\t\t\t\t\tid: 'send',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-send_black_24dp'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Delete' ),\n\t\t\t\t\tid: 'delete_icon',\n\t\t\t\t\taction_group: 'delete',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-delete_black_24dp',\n\t\t\t\t\tshow_on_right_click: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Delete & Next' ),\n\t\t\t\t\tid: 'delete_and_next',\n\t\t\t\t\taction_group: 'delete',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tvue_icon: 'tticon tticon-delete_black_24dp'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Cancel' ),\n\t\t\t\t\tid: 'cancel',\n\t\t\t\t\tgroup: 'editor',\n\t\t\t\t\tsort_order: 1990\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Jump To' ),\n\t\t\t\t\tid: 'jump_to_header',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\taction_group_header: true,\n\t\t\t\t\tpermission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers.\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'TimeSheet' ),\n\t\t\t\t\tid: 'timesheet',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Schedule' ),\n\t\t\t\t\tid: 'schedule',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Export' ),\n\t\t\t\t\tid: 'export_excel',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\tvue_icon: 'tticon tticon-file_upload_black_24dp',\n\t\t\t\t\tsort_order: 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Edit Employee' ),\n\t\t\t\t\tid: 'edit_employee',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t},\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tsetCurrentEditRecordData( current_edit_record ) {\n\t\tvar $this = this;\n\t\tif ( current_edit_record ) {\n\t\t\tthis.current_edit_record = current_edit_record;\n\t\t}\n\n\t\tif ( !this.current_edit_record ) {\n\t\t\tthis.current_edit_record = {};\n\t\t}\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tif ( !this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'full_name':\n\t\t\t\t\t\tif ( this.is_add ) {\n\t\t\t\t\t\t\twidget.setValue( LocalCacheData.loginUser.first_name + ' ' + LocalCacheData.loginUser.last_name );\n\t\t\t\t\t\t} else if ( this.is_viewing ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record['first_name'] + ' ' + this.current_edit_record['last_name'] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'subject':\n\t\t\t\t\t\t// Error: Uncaught TypeError: Cannot read property '0' of null in /interface/html5/#!m=Request&a=view&id=13185&tab=Request line 505\n\t\t\t\t\t\tif ( this.is_edit && this.messages ) {\n\t\t\t\t\t\t\twidget.setValue( 'Re: ' + this.messages[0].subject );\n\t\t\t\t\t\t} else if ( this.is_viewing ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'punch_tag_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t\tthis.previous_punch_tag_selection = this.current_edit_record[key];\n\n\t\t\t\t\t\t\tvar punch_tag_widget = widget;\n\t\t\t\t\t\t\tTTPromise.wait( null, null, function() {\n\t\t\t\t\t\t\t\t//Update default args for punch tags AComboBox last as they rely on data from job, job item and related fields.\n\t\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\t\targs.filter_data = $this.getPunchTagFilterData();\n\t\t\t\t\t\t\t\tpunch_tag_widget.setDefaultArgs( args );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\n\t\t//a new request comes from the current user.\n\t\tif ( this.is_add ) {\n\t\t\tthis.current_edit_record.user_id = LocalCacheData.loginUser.id;\n\t\t}\n\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewDataDone() {\n\t\tvar $this = this;\n\t\tsuper.setEditViewDataDone();\n\t\tif ( this.is_viewing ) {\n\n\t\t} else {\n\t\t\tif ( Global.isSet( $this.messages ) ) {\n\t\t\t\t$this.messages = null;\n\t\t\t}\n\t\t}\n\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t$this.getOverlappingShifts();\n\t\t}\n\t}\n\n\tinitViewingView() {\n\t\tsuper.initViewingView();\n\t\tif ( this.edit_view_ui_dic.message ) {\n\t\t\tthis.edit_view_ui_dic.message.parents( '.edit-view-form-item-div' ).hide();\n\t\t}\n\t\tif ( Global.getProductEdition() >= 15 && ( this.edit_view_ui_dic.type_id == 30 || this.edit_view_ui_dic.type_id == 40 ) ) {\n\t\t\tvar dow = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\t\t\tvar one_selected = false;\n\t\t\tfor ( var key in this.current_edit_record ) {\n\t\t\t\tif ( dow.indexOf( key ) > -1 ) {\n\t\t\t\t\tfor ( var i = 0; i < 7; i++ ) {\n\t\t\t\t\t\tif ( this.current_edit_record[key] !== 0 && this.current_edit_record[key] !== false ) {\n\t\t\t\t\t\t\tone_selected = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( one_selected ) {\n\t\t\t\t\t\tthis.edit_view_ui_dic['sun'].parents( '.edit-view-form-item-div' ).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.edit_view_ui_dic['sun'].parents( '.edit-view-form-item-div' ).hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetURL() {\n\n\t\tif ( LocalCacheData.current_doing_context_action === 'edit' ) {\n\t\t\tLocalCacheData.current_doing_context_action = '';\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.setURL();\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'send':\n\t\t\t\tthis.setDefaultMenuSendIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length, 'user' );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'send':\n\t\t\t\tthis.setEditMenuSaveIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setEditMenuNavEditIcon( context_btn, 'user' );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetDefaultMenuCancelIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !this.sub_view_mode && !this.is_viewing ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuExportIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( this.edit_only_mode || this.is_viewing || this.is_edit || this.is_add ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else if ( grid_selected_length == 0 || this.grid == undefined ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuAddIcon( context_btn, pId ) {\n\t\tsuper.setEditMenuAddIcon( context_btn, pId );\n\n\t\tif ( this.is_edit || this.is_add ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuDeleteAndNextIcon( context_btn, pId ) {\n\t\tif ( this.is_edit || this.is_add ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuNavViewIcon( context_btn, pId ) {\n\t\tif ( this.is_edit || this.is_add ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuDeleteIcon( context_btn, pId ) {\n\t\tif ( this.is_edit || this.is_add ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tonTypeChanged( arg ) {\n\t\tif ( this.current_edit_record && Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) && ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) ) { //schedule adjustment || absence selected\n\n\t\t\tif ( this.edit_view_ui_dic.date_stamp ) {\n\t\t\t\tthis.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t}\n\t\t\tif ( this.current_edit_record.date_stamp != undefined && this.current_edit_record.start_date == '' ) {\n\t\t\t\tthis.edit_view_ui_dic.start_date.setValue( this.current_edit_record.date_stamp );\n\t\t\t\tthis.current_edit_record.start_date = this.current_edit_record.date_stamp;\n\t\t\t}\n\t\t\tif ( this.current_edit_record.date_stamp != undefined && this.current_edit_record.end_date == '' ) {\n\t\t\t\tthis.edit_view_ui_dic.end_date.setValue( this.current_edit_record.date_stamp );\n\t\t\t\tthis.current_edit_record.end_date = this.current_edit_record.date_stamp;\n\t\t\t}\n\t\t\tthis.showAdvancedFields( false ); //Don't update schedule total time as it will be done lower down in setRequestFormDefaultData();\n\n\t\t\tif ( this.edit_view_ui_dic.type_id.getValue() == 30 ) {\n\t\t\t\tthis.edit_view_ui_dic.request_schedule_status_id.setValue( 20 );\n\t\t\t} else if ( this.edit_view_ui_dic.type_id.getValue() == 40 ) {\n\t\t\t\tthis.edit_view_ui_dic.request_schedule_status_id.setValue( 10 );\n\t\t\t}\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.request_schedule_status_id = this.edit_view_ui_dic.request_schedule_status_id.getValue(); //arg is passed on setRequestFormDefaultData() below, so make sure it matches the UI here.\n\t\t\t}\n\n\t\t\tthis.onWorkingStatusChanged();\n\n\t\t\tvar $this = this;\n\t\t\tthis.setRequestFormDefaultData( arg, function() {\n\t\t\t\t$this.getAvailableBalance();\n\t\t\t\t$this.setCurrentEditRecordData( $this.current_edit_record );\n\t\t\t\t$this.getScheduleTotalTime();\n\t\t\t} );\n\t\t} else {\n\n\t\t\tthis.hideAdvancedFields();\n\t\t\tif ( this.edit_view_ui_dic.date_stamp ) {\n\t\t\t\tthis.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).show();\n\t\t\t}\n\t\t\tthis.onWorkingStatusChanged();\n\t\t}\n\t}\n\n\tsetRequestFormDefaultData( data, callback_function ) {\n\t\tif ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) && ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) ) {\n\t\t\tif ( data == undefined ) {\n\t\t\t\tvar $this = this;\n\t\t\t\tthis.enable_validation = false;\n\t\t\t\tthis.setUIWidgetFieldsToCurrentEditRecord();\n\t\t\t\tvar filter = this.uniformVariable( this.buildDataForAPI( this.current_edit_record ) );\n\n\t\t\t\tthis.api_request_schedule.getRequestScheduleDefaultData( filter, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tdata = res.getResult();\n\t\t\t\t\t\tdata.request_schedule_status_id = data.status_id;\n\t\t\t\t\t\tdata.date_stamp = data.start_date;\n\n\t\t\t\t\t\t//force = true is required to set the current_edit_record and populate edit_view_ui_dic\n\t\t\t\t\t\t$this.setDefaultData( data, true );\n\t\t\t\t\t\tif ( callback_function ) {\n\t\t\t\t\t\t\tcallback_function();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdata.date_stamp = data.start_date;\n\t\t\t\tdata = this.buildDataFromAPI( data );\n\t\t\t\t//force = true is required to set the current_edit_record and populate edit_view_ui_dic\n\t\t\t\tthis.setDefaultData( data, true );\n\t\t\t\tif ( callback_function ) {\n\t\t\t\t\tcallback_function();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tonAvailableBalanceChange() {\n\t\tif ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {\n\t\t\tif ( this.edit_view_ui_dic && this.edit_view_ui_dic.absence_policy_id && this.edit_view_ui_dic.request_schedule_status_id.getValue() == 20 && this.edit_view_ui_dic.absence_policy_id.getValue() != TTUUID.zero_id ) {\n\t\t\t\tthis.getAvailableBalance();\n\t\t\t} else if ( this.edit_view_ui_dic && this.edit_view_ui_dic.available_balance ) {\n\t\t\t\tthis.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();\n\t\t\t}\n\t\t}\n\t}\n\n\t//post hook for onSaveResult\n\tonSaveDone( result ) {\n\t\tvar retval;\n\t\tif ( this.is_edit ) {\n\t\t\tthis.onViewClick( this.current_edit_record.id );\n\t\t\tretval = false;\n\t\t} else {\n\t\t\tretval = true;\n\t\t}\n\t\t$().TFeedback( {\n\t\t\tsource: 'Send'\n\t\t} );\n\t\t//If request was added from the TimeSheet view, refresh the TimeSheet.\n\t\tif ( LocalCacheData.current_open_primary_controller && LocalCacheData.current_open_primary_controller.viewId === 'TimeSheet' ) {\n\t\t\tLocalCacheData.current_open_primary_controller.search();\n\t\t}\n\t\treturn retval;\n\t}\n\n\tuniformVariable( records ) {\n\t\tif ( typeof records === 'object' ) {\n\t\t\trecords.user_id = LocalCacheData.loginUser.id;\n\t\t\trecords.first_name = LocalCacheData.loginUser.first_name;\n\t\t\trecords.last_name = LocalCacheData.loginUser.last_name;\n\t\t}\n\n\t\tif ( this.is_add ) {\n\t\t\trecords = this.buildDataForAPI( records );\n\t\t} else if ( this.is_edit ) {\n\t\t\tvar msg = this.uniformMessageVariable( records );\n\n\t\t\tif ( records && records.request_schedule ) {\n\t\t\t\tmsg.request_schedule = records.request_schedule;\n\t\t\t}\n\n\t\t\treturn msg;\n\t\t}\n\n\t\treturn records;\n\t}\n\n\tonSaveClick( ignoreWarning ) {\n\t\tvar $this = this;\n\t\tLocalCacheData.current_doing_context_action = 'save';\n\t\tif ( !Global.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\n\t\tfor ( var key in $this.current_edit_record ) {\n\t\t\tif ( $this.edit_view_ui_dic[key] != undefined ) {\n\t\t\t\t$this.current_edit_record[key] = $this.edit_view_ui_dic[key].getValue();\n\t\t\t}\n\t\t}\n\n\t\tif ( this.is_add ) {\n\t\t\t// //format data as expected by API\n\t\t\trecord = this.uniformVariable( $this.current_edit_record );\n\n\t\t\tthis.api['set' + this.api.key_name]( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.onSaveResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else if ( this.is_edit ) {\n\t\t\tvar record = {};\n\t\t\tthis.is_add = false;\n\t\t\tthis.setCurrentEditRecordData();\n\t\t\trecord = this.uniformVariable( this.current_edit_record );\n\t\t\tEmbeddedMessage.reply( [record], ignoreWarning, function( result ) {\n\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\tvar id = $this.current_edit_record.id;\n\t\t\t\t\t\t//see #2224 - Unable to get property 'find' of undefined\n\t\t\t\t\t\t$this.removeEditView();\n\t\t\t\t\t\t$this.onViewClick( id );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.setErrorTips( result );\n\t\t\t\t\t\t$this.setErrorMenu();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tsearch( set_default_menu, page_action, page_number, callBack ) {\n\t\tthis.refresh_id = null;\n\t\tsuper.search( set_default_menu, page_action, page_number, callBack );\n\t}\n\n\tsetEditMenuEditIcon( context_btn ) {\n\t\tif ( !this.editPermissionValidate( 'request' ) || this.edit_only_mode || this.is_mass_editing ) {\n\t\t\t//Not shown in edit only mode or mass edit. Mass edit should only show mass edit (need to set that part in mass edit icon).\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t\tif ( !this.is_viewing || !this.editOwnerOrChildPermissionValidate( 'request' ) ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuEditIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.editPermissionValidate( 'request' ) || this.edit_only_mode || ( !this.is_edit || !this.is_viewing ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuScheduleIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !PermissionManager.checkTopLevelPermission( 'Schedule' ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length === 1 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuSendIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !this.addPermissionValidate( pId ) || this.edit_only_mode || ( !this.is_edit || !this.is_viewing ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.editChildPermissionValidate( 'user' ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length === 1 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'timesheet':\n\t\t\tcase 'schedule':\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.onNavigationClick( id );\n\t\t\t\tbreak;\n\t\t\tcase 'send':\n\t\t\t\tthis.onSaveClick();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetEditViewWidgetsMode() {\n\t\tvar did_clean = false;\n\t\tfor ( var key in this.edit_view_ui_dic ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\twidget.css( 'opacity', 1 );\n\t\t\tvar column = widget.parent().parent().parent();\n\t\t\tif ( !column.hasClass( 'v-box' ) ) {\n\t\t\t\tif ( !did_clean ) {\n\t\t\t\t\tdid_clean = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.is_viewing ) {\n\t\t\t\tif ( Global.isSet( widget.setEnabled ) ) {\n\t\t\t\t\twidget.setEnabled( false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( Global.isSet( widget.setEnabled ) ) {\n\t\t\t\t\twidget.setEnabled( true );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tthis.current_edit_record[key] = c_value;\n\t\tvar needs_callback = false;\n\n\t\tswitch ( key ) {\n\t\t\tcase 'job_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tif ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( target.getSelectItems() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );\n\t\t\t\t\t}\n\t\t\t\t\t$this.previous_punch_tag_selection = c_value;\n\t\t\t\t\t//Reset source data to make sure correct punch tags are always shown.\n\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_id'].setSourceData( null );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'user_id':\n\t\t\tcase 'branch_id':\n\t\t\tcase 'department_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_quick_search':\n\t\t\tcase 'job_item_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onJobQuickSearch( key, c_value, 'job_id', 'job_item_id' );\n\t\t\t\t\tTTPromise.wait( 'BaseViewController', 'onJobQuickSearch', function() {\n\t\t\t\t\t\t$this.setPunchTagValuesWhenCriteriaChanged( $this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );\n\n\t\t\t\t\t//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'type_id':\n\t\t\t\t// Set absence_policy_id to zero id to prevent available balance field showing when switching to a none absence request type.\n\t\t\t\t// Also prevents available balance sometimes showing the wrong value due to mismatch in select menu and current_edit_record.\n\t\t\t\tif ( this.edit_view_ui_dic.absence_policy_id && ( this.current_edit_record.type_id === 30 || this.current_edit_record.type_id === 40 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic.absence_policy_id.setValue( TTUUID.zero_id );\n\t\t\t\t\tthis.current_edit_record.absence_policy_id = TTUUID.zero_id;\n\t\t\t\t}\n\t\t\t\tdoNotValidate = true;\n\t\t\t\tthis.onTypeChanged();\n\t\t\t\tbreak;\n\t\t\tcase 'overlap_type_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\tthis.getOverlappingShifts();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'date_stamp':\n\t\t\t\tthis.onDateStampChanged();\n\t\t\t\tbreak;\n\t\t\tcase 'request_schedule_status_id':\n\t\t\t\tthis.onWorkingStatusChanged();\n\t\t\t\tbreak;\n\t\t\tcase 'start_date':\n\t\t\t\tthis.current_edit_record.start_date = this.edit_view_ui_dic.start_date.getValue();\n\t\t\t\tthis.current_edit_record.date_stamp = this.edit_view_ui_dic.start_date.getValue();\n\t\t\t\tthis.onStartDateChanged();\n\t\t\t\tthis.setRequestFormDefaultData( null, function() {\n\t\t\t\t\tfinishFormItemChange();\n\t\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\t\t$this.getOverlappingShifts();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tneeds_callback = true;\n\t\t\t\tbreak;\n\t\t\tcase 'end_date':\n\t\t\t\tthis.current_edit_record.end_date = this.edit_view_ui_dic.end_date.getValue();\n\t\t\t\tthis.setRequestFormDefaultData( null, function() {\n\t\t\t\t\tfinishFormItemChange();\n\t\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\t\t$this.getOverlappingShifts();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tneeds_callback = true;\n\t\t\t\tbreak;\n\t\t\tcase 'start_time':\n\t\t\tcase 'end_time':\n\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\tthis.getOverlappingShifts();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'sun':\n\t\t\tcase 'mon':\n\t\t\tcase 'tue':\n\t\t\tcase 'wed':\n\t\t\tcase 'thu':\n\t\t\tcase 'fri':\n\t\t\tcase 'sat':\n\t\t\t\tthis.getScheduleTotalTime();\n\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\tthis.getOverlappingShifts();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'schedule_policy_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\t$this.getOverlappingShifts();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase'absence_policy_id':\n\t\t\t\tthis.selected_absence_policy_record = this.edit_view_ui_dic.absence_policy_id.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 'is_replace_with_open_shift':\n\t\t\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\t\t\tthis.getOverlappingShifts();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( !needs_callback ) {\n\t\t\tfinishFormItemChange();\n\t\t}\n\n\t\tfunction finishFormItemChange() {\n\t\t\tif ( key === 'date_stamp' ||\n\t\t\t\tkey === 'start_date_stamps' ||\n\t\t\t\tkey === 'start_date' ||\n\t\t\t\tkey === 'end_date' ||\n\t\t\t\tkey === 'start_date_stamp' ||\n\t\t\t\tkey === 'start_time' ||\n\t\t\t\tkey === 'end_time' ||\n\t\t\t\tkey === 'schedule_policy_id' ||\n\t\t\t\tkey === 'absence_policy_id' ) {\n\n\t\t\t\tif ( $this.current_edit_record['date_stamp'] !== '' &&\n\t\t\t\t\t$this.current_edit_record['start_time'] !== '' &&\n\t\t\t\t\t$this.current_edit_record['end_time'] !== '' ) {\n\n\t\t\t\t\t$this.getScheduleTotalTime();\n\t\t\t\t} else {\n\t\t\t\t\t$this.onAvailableBalanceChange();\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( !doNotValidate ) {\n\t\t\t\t$this.validate();\n\t\t\t}\n\t\t\t$this.setEditMenu();\n\t\t}\n\t}\n\n\tvalidate() {\n\t\tvar $this = this;\n\t\tvar record = this.current_edit_record;\n\t\trecord = this.uniformVariable( record );\n\t\tvar api = this.message_control_api;\n\t\tif ( this.is_add ) {\n\t\t\trecord = this.buildDataForAPI( record );\n\t\t\tapi = this.api;\n\t\t}\n\n\t\tapi['validate' + api.key_name]( record, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t$this.validateResult( result );\n\t\t\t}\n\t\t} );\n\t}\n\n\tonAddClick( data ) {\n\t\tTTPromise.add( 'Request', 'add' );\n\t\tTTPromise.wait();\n\t\tvar $this = this;\n\t\tif ( this.edit_view ) {\n\t\t\tthis.removeEditView();\n\t\t}\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tthis.openEditView();\n\t\tthis.buildAddViewUI();\n\t\t//Error: Uncaught TypeError: undefined is not a function in /interface/html5/views/BaseViewController.js?v=8.0.0-20141117-111140 line 897\n\t\tif ( $this.api && typeof $this.api['get' + $this.api.key_name + 'DefaultData'] === 'function' ) {\n\t\t\t$this.api['get' + $this.api.key_name + 'DefaultData']( {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\tif ( data ) {\n\t\t\t\t\t\t//data passed should overwrite the default data from the API.\n\t\t\t\t\t\tresult = $.extend( {}, result.getResult(), data );\n\t\t\t\t\t}\n\t\t\t\t\t$this.onAddResult( result );\n\t\t\t\t\t$this.onDateStampChanged();\n\t\t\t\t\tif ( result.type_id ) {\n\t\t\t\t\t\t$this.onTypeChanged( result );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.getScheduleTotalTime(); //This is called as part of onTypeChanged(), so it doesn't need to be done twice.\n\t\t\t\t\t}\n\n\t\t\t\t\tTTPromise.resolve( 'Request', 'add' );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t//To be called only by external scripts creating requests (timesheet and schedule at this time)\n\topenAddView( data_array ) {\n\t\tthis.sub_view_mode = true;\n\t\tthis.edit_only_mode = true;\n\t\tvar $this = this;\n\t\tthis.initOptions( function() {\n\t\t\t$this.onAddClick( data_array );\n\t\t} );\n\t}\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTI2LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFPO0FBQ1AsMkJBQTJCO0FBQzNCLEVBQUUsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCOztBQUU3QjtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixDQUFDO0FBQzVCLDBCQUEwQixDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSyx1QkFBdUI7QUFDNUIsS0FBSztBQUNMOztBQUVBO0FBQ0EsbUJBQW1CLDZEQUE2RDtBQUNoRjs7QUFFQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixTQUFTLENBQUMsc0JBQXNCO0FBQ3BEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdDQUFnQywrQkFBK0I7QUFDL0QsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUEsK0JBQStCLHlDQUF5Qzs7QUFFeEUsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLFNBQVMsQ0FBQywrQ0FBK0M7QUFDN0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQixxQkFBcUI7QUFDaEQsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSwrQkFBK0IscUNBQXFDO0FBQ3BFO0FBQ0EsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxpQ0FBaUMsc0JBQXNCO0FBQ3ZELG9CQUFvQixDQUFDO0FBQ3JCLFVBQVUsQ0FBQywyQ0FBMkMsQ0FBQztBQUN2RDtBQUNBO0FBQ0EsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0Q7QUFDeEYsb0NBQW9DLDhCQUE4QjtBQUNsRSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZUFBZTtBQUM3QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQSw0QkFBNEIsNkJBQTZCO0FBQ3pELHFCQUFxQixDQUFDO0FBQ3RCLGlDQUFpQyxDQUFDO0FBQ2xDO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBLGtDQUFrQyxzQkFBc0I7QUFDeEQsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQSxrQ0FBa0Msb0JBQW9CO0FBQ3RELDhCQUE4QixDQUFDOztBQUUvQjtBQUNBO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXREO0FBQ0EsdUNBQXVDLGVBQWU7O0FBRXRELHFCQUFxQixDQUFDOztBQUV0QixhQUFhLENBQUMseUNBQXlDLENBQUM7QUFDeEQsYUFBYSxDQUFDLHlDQUF5QyxDQUFDO0FBQ3hELGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztBQUN4RCxhQUFhLENBQUMseUNBQXlDLENBQUM7QUFDeEQsYUFBYSxDQUFDLHlDQUF5QyxDQUFDO0FBQ3hELGFBQWEsQ0FBQyx5Q0FBeUMsQ0FBQztBQUN4RCxhQUFhLENBQUMseUNBQXlDLENBQUM7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDhCQUE4QixDQUFDOztBQUUvQjtBQUNBO0FBQ0Esa0NBQWtDLHNCQUFzQjtBQUN4RCw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBLGtDQUFrQyxvQkFBb0I7QUFDdEQsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQSw0QkFBNEIsc0JBQXNCO0FBQ2xELHFCQUFxQixDQUFDO0FBQ3RCLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDZDQUE2QztBQUM5RTtBQUNBLHNCQUFzQixDQUFDO0FBQ3ZCLGtDQUFrQyxDQUFDLG9DQUFvQyxXQUFXLFVBQVU7QUFDNUY7QUFDQTtBQUNBLCtCQUErQixDQUFDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsK0JBQStCLENBQUM7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLCtCQUErQixDQUFDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQVEseUNBQXlDO0FBQ2pELFFBQVE7QUFDUjtBQUNBLE1BQU07O0FBRU4sc0JBQXNCLENBQUM7O0FBRXZCO0FBQ0EsNEJBQTRCLHVEQUF1RDtBQUNuRjs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLENBQUM7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQVEseUNBQXlDO0FBQ2pELFFBQVE7QUFDUjtBQUNBLE1BQU07O0FBRU4sc0JBQXNCLENBQUM7O0FBRXZCO0FBQ0EsaUNBQWlDLDREQUE0RDtBQUM3Rjs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLENBQUM7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNOztBQUVOLHNCQUFzQixDQUFDOztBQUV2QjtBQUNBLGtDQUFrQyw2REFBNkQ7QUFDL0Y7O0FBRUE7QUFDQTtBQUNBLCtCQUErQixDQUFDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQiw0Q0FBNEM7QUFDM0UsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMk5BQTJOOztBQUUzTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0c7QUFDbEc7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFLENBQUM7QUFDSDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsQ0FBQyxXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1Asb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL215X2FjY291bnQvcmVxdWVzdC9SZXF1ZXN0Vmlld0NvbnRyb2xsZXIuanM/ODdmMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgUmVxdWVzdFZpZXdDb250cm9sbGVyIGV4dGVuZHMgUmVxdWVzdFZpZXdDb21tb25Db250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHRlbDogJyNyZXF1ZXN0X3ZpZXdfY29udGFpbmVyJyxcblxuXHRcdFx0dHlwZV9hcnJheTogbnVsbCxcblx0XHRcdHJlcXVlc3RfdHlwZV9hcnJheTogbnVsbCxcblx0XHRcdHN0YXR1c19hcnJheTogbnVsbCxcblxuXHRcdFx0YXBpX3JlcXVlc3Rfc2NoZWR1bGU6IG51bGwsXG5cdFx0XHRhdXRob3JpemF0aW9uX2FwaTogbnVsbCxcblx0XHRcdHNjaGVkdWxlX2FwaTogbnVsbCxcblx0XHRcdGhpZXJhcmNoeV90eXBlX2lkOiBmYWxzZSxcblxuXHRcdFx0cHVuY2hfdGFnX2FwaTogbnVsbCxcblx0XHRcdGRlZmF1bHRfcHVuY2hfdGFnOiBbXSxcblx0XHRcdHByZXZpb3VzX3B1bmNoX3RhZ19zZWxlY3Rpb246IFtdLFxuXG5cdFx0XHRvdmVybGFwcGluZ19zaGlmdF9kYXRhOiB7fSxcblxuXHRcdFx0bWVzc2FnZXM6IG51bGxcblx0XHR9ICk7XG5cblx0XHRzdXBlciggb3B0aW9ucyApO1xuXHR9XG5cblx0aW5pdCggb3B0aW9ucyApIHtcblx0XHQvL3RoaXMuX3N1cGVyKCdpbml0aWFsaXplJywgb3B0aW9ucyk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1JlcXVlc3RFZGl0Vmlldy5odG1sJztcblx0XHR0aGlzLnBlcm1pc3Npb25faWQgPSAncmVxdWVzdCc7XG5cdFx0dGhpcy52aWV3SWQgPSAnUmVxdWVzdCc7XG5cdFx0dGhpcy5zY3JpcHRfbmFtZSA9ICdSZXF1ZXN0Vmlldyc7XG5cdFx0dGhpcy50YWJsZV9uYW1lX2tleSA9ICdyZXF1ZXN0Jztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdSZXF1ZXN0cycgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ1JlcXVlc3QnICk7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElSZXF1ZXN0O1xuXHRcdHRoaXMuYXBpX2Fic2VuY2VfcG9saWN5ID0gVFRBUEkuQVBJQWJzZW5jZVBvbGljeTtcblx0XHR0aGlzLmFwaV9zY2hlZHVsZSA9IFRUQVBJLkFQSVNjaGVkdWxlO1xuXHRcdHRoaXMubWVzc2FnZV9jb250cm9sX2FwaSA9IFRUQVBJLkFQSU1lc3NhZ2VDb250cm9sO1xuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkgKSB7XG5cdFx0XHR0aGlzLmFwaV9yZXF1ZXN0X3NjaGVkdWxlID0gVFRBUEkuQVBJUmVxdWVzdFNjaGVkdWxlO1xuXHRcdFx0dGhpcy5zY2hlZHVsZV9hcGkgPSBUVEFQSS5BUElTY2hlZHVsZTtcblx0XHR9XG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHR0aGlzLmpvYl9hcGkgPSBUVEFQSS5BUElKb2I7XG5cdFx0XHR0aGlzLmpvYl9pdGVtX2FwaSA9IFRUQVBJLkFQSUpvYkl0ZW07XG5cdFx0XHR0aGlzLnB1bmNoX3RhZ19hcGkgPSBUVEFQSS5BUElQdW5jaFRhZztcblx0XHR9XG5cblx0XHR0aGlzLmF1dGhvcml6YXRpb25fYXBpID0gVFRBUEkuQVBJQXV0aG9yaXphdGlvbjtcblxuXHRcdHRoaXMuaW5pdFBlcm1pc3Npb24oKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSgpO1xuXG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9XG5cblx0Ly8gb3ZlcnJpZGUgYWxsb3dzIGEgY2FsbGJhY2sgYWZ0ZXIgaW5pdE9wdGlvbnMgd2hlbiBydW4gYXMgc3ViIHZpZXcgKGZyb20gRW1wbG95ZWVWaWV3Q29udHJvbGxlcilcblx0aW5pdE9wdGlvbnMoIGNhbGxCYWNrICkge1xuXG5cdFx0dmFyIG9wdGlvbnMgPSBbXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc3RhdHVzJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3R5cGUnIH1cblx0XHRdO1xuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkgKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goIHsgb3B0aW9uX25hbWU6ICdvdmVybGFwX3R5cGUnLCBhcGk6IFRUQVBJLkFQSVJlcXVlc3RTY2hlZHVsZSB9ICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0RHJvcERvd25PcHRpb25zKCBvcHRpb25zLCBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRpZiAoIGNhbGxCYWNrICkge1xuXHRcdFx0XHRjYWxsQmFjayggcmVzdWx0ICk7IC8vIEZpcnN0IHRvIGluaXRpYWxpemUgZHJvcCBkb3duIG9wdGlvbnMsIGFuZCB0aGVuIHRvIGluaXRpYWxpemUgZWRpdCB2aWV3IFVJLlxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXHR9XG5cblx0YnVpbGRFZGl0Vmlld1VJKCkge1xuXHRcdHN1cGVyLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXG5cdFx0dmFyIHRhYl9tb2RlbCA9IHtcblx0XHRcdCd0YWJfcmVxdWVzdCc6IHsgJ2xhYmVsJzogJC5pMThuLl8oICdNZXNzYWdlJyApIH0sXG5cdFx0XHQndGFiX2F1ZGl0JzogdHJ1ZSxcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0Ly9UaGlzIGhpZGVzIHRoZSBhdWRpdCB0YWIgYXMgdGhpcyB2aWV3IGlzIGFsd2F5cyB1c2VkIGZvciBjcmVhdGluZy9yZXBseWluZyB0byBhbiBleGlzdGluZyByZXF1ZXN0LlxuXHRcdC8vRm9yIHNvbWUgcmVhc29uIHJlbW92aW5nICd0YWJfYXVkaXQnIGZyb20gdGhlIG1vZGVsIGFib3ZlIHJlc3VsdHMgaW4gYSBibGFuayB0YWIgYXBwZWFyaW5nLlxuXHRcdHZhciB0YWJfYXVkaXRfbGFiZWwgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnYVtyZWY9dGFiX2F1ZGl0XScgKTtcblx0XHR0YWJfYXVkaXRfbGFiZWwuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXG5cdFx0Ly9UYWIgMCBzdGFydFxuXG5cdFx0dmFyIHRhYl9yZXF1ZXN0ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcXVlc3QnICk7XG5cdFx0dmFyIHRhYl9yZXF1ZXN0X2NvbHVtbjEgPSB0YWJfcmVxdWVzdC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR2YXIgdGFiX3JlcXVlc3RfY29sdW1uMiA9IHRhYl9yZXF1ZXN0LmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblxuXHRcdC8vIFN1YmplY3Rcblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMzU5IH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N1YmplY3QnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycgKTtcblxuXHRcdC8vIEJvZHlcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfQVJFQSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0QXJlYSggeyBmaWVsZDogJ2JvZHknLCB3aWR0aDogNjAwLCBoZWlnaHQ6IDQwMCB9ICk7XG5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0JvZHknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIG51bGwsIG51bGwsIHRydWUgKTtcblxuXHRcdHRhYl9yZXF1ZXN0X2NvbHVtbjIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHR9XG5cblx0YnVpbGRBZGRWaWV3VUkoKSB7XG5cdFx0c3VwZXIuYnVpbGRFZGl0Vmlld1VJKCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX3JlcXVlc3QnOiB7ICdsYWJlbCc6ICQuaTE4bi5fKCAnUmVxdWVzdCcgKSwgJ2lzX211bHRpX2NvbHVtbic6IHRydWUgfSxcblx0XHRcdCd0YWJfYXVkaXQnOiB0cnVlLFxuXHRcdH07XG5cdFx0dGhpcy5zZXRUYWJNb2RlbCggdGFiX21vZGVsICk7XG5cblx0XHQvL1RoaXMgaGlkZXMgdGhlIGF1ZGl0IHRhYiBhcyB0aGlzIHZpZXcgaXMgYWx3YXlzIHVzZWQgZm9yIGNyZWF0aW5nL3JlcGx5aW5nIHRvIGFuIGV4aXN0aW5nIHJlcXVlc3QuXG5cdFx0Ly9Gb3Igc29tZSByZWFzb24gcmVtb3ZpbmcgJ3RhYl9hdWRpdCcgZnJvbSB0aGUgbW9kZWwgYWJvdmUgcmVzdWx0cyBpbiBhIGJsYW5rIHRhYiBhcHBlYXJpbmcuXG5cdFx0dmFyIHRhYl9hdWRpdF9sYWJlbCA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICdhW3JlZj10YWJfYXVkaXRdJyApO1xuXHRcdHRhYl9hdWRpdF9sYWJlbC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cdFx0dmFyIHRhYl9yZXF1ZXN0ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcXVlc3QnICk7XG5cdFx0dmFyIHRhYl9yZXF1ZXN0X2NvbHVtbjEgPSB0YWJfcmVxdWVzdC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR2YXIgdGFiX3JlcXVlc3RfY29sdW1uMiA9IHRhYl9yZXF1ZXN0LmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9yZXF1ZXN0X2NvbHVtbjIgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ7XG5cdFx0dmFyIHdpZGdldENvbnRhaW5lcjtcblx0XHR2YXIgbGFiZWw7XG5cblx0XHQvLyBFbXBsb3llZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2Z1bGxfbmFtZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycgKTtcblxuXHRcdC8vIFR5cGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICd0eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnR5cGVfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1R5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSApO1xuXG5cdFx0Ly8gRGF0ZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdkYXRlX3N0YW1wJyB9ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJyhVc2UgdGhlIGZpcnN0IG9yIG9ubHkgZGF0ZSBhZmZlY3RlZCBieSB0aGlzIHJlcXVlc3QpJyApICsgJzwvc3Bhbj4nICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciApO1xuXG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSAmJiBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3JlcXVlc3QnLCAnYWRkX2FkdmFuY2VkJyApICkge1xuXHRcdFx0Ly9Xb3JraW5nIFN0YXR1c1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdyZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCcsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIHsgMTA6ICdXb3JraW5nJywgMjA6ICdBYnNlbnQnIH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhdHVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblxuXHRcdFx0Ly9BYnNlbmNlIFBvbGljeVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUFic2VuY2VQb2xpY3ksXG5cdFx0XHRcdGN1c3RvbVNlYXJjaEZpbHRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgZmlsdGVyX2RhdGE6IHsgdXNlcl9pZDogTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyKCkuaWQgfSB9O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9hYnNlbmNlcycsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdhYnNlbmNlX3BvbGljeV9pZCdcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQWJzZW5jZSBQb2xpY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSApO1xuXG5cdFx0XHQvL0F2YWlsYWJsZSBCYWxhbmNlXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2F2YWlsYWJsZV9iYWxhbmNlJyB9ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3ggYXZhaWxhYmxlLWJhbGFuY2UtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdFx0dGhpcy5hdmFpbGFibGVfYmFsYW5jZV9pbmZvID0gJCggJzxzcGFuIGNsYXNzPVwiYXZhaWxhYmxlLWJhbGFuY2UtaW5mbyB0dGljb24gdHRpY29uLWluZm9fYmxhY2tfMjRkcFwiPjwvc3Bhbj4nICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHRoaXMuYXZhaWxhYmxlX2JhbGFuY2VfaW5mbyApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBdmFpbGFibGUgQmFsYW5jZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdC8vU3RhcnQgRGF0ZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnc3RhcnRfZGF0ZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGFydCBEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEsICcnICk7XG5cblx0XHRcdC8vRW5kICBEYXRlXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdlbmRfZGF0ZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbmQgRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0XHQvLyBFZmZlY3RpdmUgRGF5c1xuXHRcdFx0dmFyIGZvcm1faXRlbV9zdW5fY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fc3VuX2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3N1bicgfSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtX21vbl9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV9tb25fY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAnbW9uJyB9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW1fdHVlX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3R1ZV9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICd0dWUnIH0gKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbV93ZWRfY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fd2VkX2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3dlZCcgfSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtX3RodV9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV90aHVfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAndGh1JyB9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW1fZnJpX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX2ZyaV9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdmcmknIH0gKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbV9zYXRfY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fc2F0X2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3NhdCcgfSApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdj48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBzdW4gPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXRvcC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnU3VuJyApICsgJyA8YnI+ICcgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHR2YXIgbW9uID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC10b3AtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ01vbicgKSArICcgPGJyPiAnICsgJyA8L3NwYW4+JyApO1xuXHRcdFx0dmFyIHR1ZSA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtdG9wLWxhYmVsXFwnPiAnICsgJC5pMThuLl8oICdUdWUnICkgKyAnIDxicj4gJyArICcgPC9zcGFuPicgKTtcblx0XHRcdHZhciB3ZWQgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXRvcC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnV2VkJyApICsgJyA8YnI+ICcgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHR2YXIgdGh1ID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC10b3AtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ1RodScgKSArICcgPGJyPiAnICsgJyA8L3NwYW4+JyApO1xuXHRcdFx0dmFyIGZyaSA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtdG9wLWxhYmVsXFwnPiAnICsgJC5pMThuLl8oICdGcmknICkgKyAnIDxicj4gJyArICcgPC9zcGFuPicgKTtcblx0XHRcdHZhciBzYXQgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXRvcC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnU2F0JyApICsgJyA8YnI+ICcgKyAnIDwvc3Bhbj4nICk7XG5cblx0XHRcdHN1bi5hcHBlbmQoIGZvcm1faXRlbV9zdW5fY2hlY2tib3ggKTtcblx0XHRcdG1vbi5hcHBlbmQoIGZvcm1faXRlbV9tb25fY2hlY2tib3ggKTtcblx0XHRcdHR1ZS5hcHBlbmQoIGZvcm1faXRlbV90dWVfY2hlY2tib3ggKTtcblx0XHRcdHdlZC5hcHBlbmQoIGZvcm1faXRlbV93ZWRfY2hlY2tib3ggKTtcblx0XHRcdHRodS5hcHBlbmQoIGZvcm1faXRlbV90aHVfY2hlY2tib3ggKTtcblx0XHRcdGZyaS5hcHBlbmQoIGZvcm1faXRlbV9mcmlfY2hlY2tib3ggKTtcblx0XHRcdHNhdC5hcHBlbmQoIGZvcm1faXRlbV9zYXRfY2hlY2tib3ggKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggc3VuICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBtb24gKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHR1ZSApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggd2VkICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB0aHUgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZyaSApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggc2F0ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hZGRDbGFzcyggJ3JlcXVlc3RfZWRpdF92aWV3X2VmZmVjdGl2ZV9kYXlzJyApO1xuXG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VmZmVjdGl2ZSBEYXlzJyApLCBbZm9ybV9pdGVtX3N1bl9jaGVja2JveCwgZm9ybV9pdGVtX21vbl9jaGVja2JveCwgZm9ybV9pdGVtX3R1ZV9jaGVja2JveCwgZm9ybV9pdGVtX3dlZF9jaGVja2JveCwgZm9ybV9pdGVtX3RodV9jaGVja2JveCwgZm9ybV9pdGVtX2ZyaV9jaGVja2JveCwgZm9ybV9pdGVtX3NhdF9jaGVja2JveF0sIHRhYl9yZXF1ZXN0X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIGZhbHNlLCB0cnVlICk7XG5cblx0XHRcdC8vU3RhcnQgdGltZVxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5USU1FX1BJQ0tFUiApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUaW1lUGlja2VyKCB7IGZpZWxkOiAnc3RhcnRfdGltZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdJbicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHRcdC8vRW5kICB0aW1lXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRpbWVQaWNrZXIoIHsgZmllbGQ6ICdlbmRfdGltZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdPdXQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSApO1xuXG5cdFx0XHQvLyBUb3RhbFxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICd0b3RhbF90aW1lJyB9ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdFx0bGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnIGlkPVxcJ3RvdGFsX2luZm9cXCc+PC9zcGFuPicgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVG90YWwnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciApO1xuXG5cdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSAmJiB0aGlzLm92ZXJsYXBwaW5nU2hpZnRVSVZhbGlkYXRlKCkgPT0gdHJ1ZSApIHtcblx0XHRcdFx0Ly9PdmVycmlkZSAvIFNwbGl0IHNoaWZ0XG5cdFx0XHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnb3ZlcmxhcF90eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCB0aGlzLm92ZXJsYXBfdHlwZV9hcnJheSApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3ggb3ZlcmxhcHBpbmctc2hpZnQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdFx0XHR0aGlzLm92ZXJsYXBwaW5nX3NoaWZ0X2luZm8gPSAkKCAnPHNwYW4gc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IHRvcDogLTNweDsgbGVmdDogM3B4O1wiIGlkPVwib3ZlcmxhcHBpbmctc2hpZnQtdG90YWxcIj48L3NwYW4+PHNwYW4gaWQ9XCJvdmVybGFwcGluZy1zaGlmdC1pY29uXCIgY2xhc3M9XCJvdmVybGFwcGluZy1zaGlmdC1pbmZvIHR0aWNvbiB0dGljb24taW5mb19ibGFja18yNGRwXCI+PC9zcGFuPicgKTtcblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHRoaXMub3ZlcmxhcHBpbmdfc2hpZnRfaW5mbyApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ092ZXJsYXBwaW5nIFNoaWZ0KHMpJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9TY2hlZHVsZSBQb2xpY3lcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZVBvbGljeSxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfc2NoZWR1bGUnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdzY2hlZHVsZV9wb2xpY3lfaWQnXG5cdFx0XHR9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1NjaGVkdWxlIFBvbGljeScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cblx0XHRcdC8vYnJhbmNoXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9icmFuY2gnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdicmFuY2hfaWQnXG5cdFx0XHR9ICk7XG5cdFx0XHRpZiAoIHRoaXMuc2hvd19icmFuY2hfdWkgKSB7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQnJhbmNoJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9yZXF1ZXN0X2NvbHVtbjEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9EZXB0XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJRGVwYXJ0bWVudCxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2RlcGFydG1lbnRfaWQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdGlmICggdGhpcy5zaG93X2RlcGFydG1lbnRfdWkgKSB7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVwYXJ0bWVudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVxdWVzdF9jb2x1bW4xICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHQvL0pvYlxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJSm9iLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iJyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0XHRqb2JfY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICksXG5cdFx0XHRcdFx0ZmllbGQ6ICdqb2JfaWQnLFxuXHRcdFx0XHRcdGFkZGVkX2l0ZW1zOiBbXG5cdFx0XHRcdFx0XHR7IHZhbHVlOiAnLTEnLCBsYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbSB9LFxuXHRcdFx0XHRcdFx0eyB2YWx1ZTogJy0yJywgbGFiZWw6IEdsb2JhbC5zZWxlY3RlZF9pdGVtIH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRcdHZhciBqb2JfY29kZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0am9iX2NvZGVyLlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdqb2JfcXVpY2tfc2VhcmNoJywgZGlzYWJsZV9rZXl1cF9ldmVudDogdHJ1ZSB9ICk7XG5cdFx0XHRcdGpvYl9jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBqb2JfY29kZXIgKTtcblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iJyApLCBbZm9ybV9pdGVtX2lucHV0LCBqb2JfY29kZXJdLCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCAhdGhpcy5zaG93X2pvYl91aSApIHtcblx0XHRcdFx0XHQvL2ludmFsaWQgcGVybWlzc2lvbnNcblx0XHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdqb2JfaWQnICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9Kb2IgSXRlbVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJSm9iSXRlbSxcblx0XHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYl9pdGVtJyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0XHRqb2JfaXRlbV9jb2Rlci5zZXRWYWx1ZSggdmFsLm1hbnVhbF9pZCApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSxcblx0XHRcdFx0XHRmaWVsZDogJ2pvYl9pdGVtX2lkJyxcblx0XHRcdFx0XHRhZGRlZF9pdGVtczogW1xuXHRcdFx0XHRcdFx0eyB2YWx1ZTogJy0xJywgbGFiZWw6IEdsb2JhbC5kZWZhdWx0X2l0ZW0gfSxcblx0XHRcdFx0XHRcdHsgdmFsdWU6ICctMicsIGxhYmVsOiBHbG9iYWwuc2VsZWN0ZWRfaXRlbSB9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgam9iX2l0ZW1fY29kZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0am9iX2l0ZW1fY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0XHRqb2JfaXRlbV9jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBqb2JfaXRlbV9jb2RlciApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYXNrJyApLCBbZm9ybV9pdGVtX2lucHV0LCBqb2JfaXRlbV9jb2Rlcl0sIHRhYl9yZXF1ZXN0X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpZiAoICF0aGlzLnNob3dfam9iX2l0ZW1fdWkgKSB7XG5cdFx0XHRcdFx0Ly9pbnZhbGlkIHBlcm1pc3Npb25zXG5cdFx0XHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnam9iX2l0ZW1faWQnICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1B1bmNoIFRhZ1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUHVuY2hUYWcsXG5cdFx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3B1bmNoX3RhZycsXG5cdFx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCAoIHB1bmNoX3RhZ3MgKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIHB1bmNoX3RhZ3MgKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdRdWlja1NlYXJjaE1hbnVhbElkcyggcHVuY2hfdGFncyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSxcblx0XHRcdFx0XHRmaWVsZDogJ3B1bmNoX3RhZ19pZCdcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIHB1bmNoX3RhZ19jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRwdW5jaF90YWdfY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnLCBkaXNhYmxlX2tleXVwX2V2ZW50OiB0cnVlIH0gKTtcblx0XHRcdFx0cHVuY2hfdGFnX2NvZGVyLmFkZENsYXNzKCAnam9iLWNvZGVyJyApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHB1bmNoX3RhZ19jb2RlciApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYWdzJyApLCBbZm9ybV9pdGVtX2lucHV0LCBwdW5jaF90YWdfY29kZXJdLCB0YWJfcmVxdWVzdF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCAhdGhpcy5zaG93X3B1bmNoX3RhZ191aSApIHtcblx0XHRcdFx0XHQvL2ludmFsaWQgcGVybWlzc2lvbnNcblx0XHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdwdW5jaF90YWdfaWQnICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNZXNzYWdlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0FSRUEgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRBcmVhKCB7IGZpZWxkOiAnbWVzc2FnZScsIHdpZHRoOiA0MDAsIGhlaWdodDogMzAwIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1JlYXNvbiAvIE1lc3NhZ2UnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlcXVlc3RfY29sdW1uMSwgJycsIG51bGwsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vaGlkZSBpbml0aWFsbHkgaGlkZGVuIGZpZWxkcy5cblx0XHQvL3RhYl9yZXF1ZXN0X2NvbHVtbjIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgJiYgUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoICdyZXF1ZXN0JywgJ2FkZF9hZHZhbmNlZCcgKSApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdHRoaXMuaGlkZUFkdmFuY2VkRmllbGRzKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5vblR5cGVDaGFuZ2VkKCk7XG5cdFx0dGhpcy5vbldvcmtpbmdTdGF0dXNDaGFuZ2VkKCk7XG5cdH1cblxuXHRidWlsZFNlYXJjaEZpZWxkcygpIHtcblx0XHRzdXBlci5idWlsZFNlYXJjaEZpZWxkcygpO1xuXHRcdHRoaXMuc2VhcmNoX2ZpZWxkcyA9IFtcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VtcGxveWVlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAndXNlcl9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUeXBlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAndHlwZV9pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU3RhcnQgRGF0ZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3N0YXJ0X2RhdGUnLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbmQgRGF0ZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ2VuZF9kYXRlJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUlxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU3RhdHVzJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnc3RhdHVzX2lkJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDcmVhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnY3JlYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdVcGRhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAndXBkYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9IClcblx0XHRdO1xuXHR9XG5cblx0Z2V0Q3VzdG9tQ29udGV4dE1lbnVNb2RlbCgpIHtcblx0XHR2YXIgY29udGV4dF9tZW51X21vZGVsID0ge1xuXHRcdFx0ZXhjbHVkZTogWydkZWZhdWx0J10sXG5cdFx0XHRpbmNsdWRlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdOZXcnICksXG5cdFx0XHRcdFx0aWQ6ICdhZGQnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tYWRkX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3JyApLFxuXHRcdFx0XHRcdGlkOiAndmlldycsXG5cdFx0XHRcdFx0Z3JvdXA6ICdlZGl0b3InLFxuXHRcdFx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi12aXNpYmlsaXR5X2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0XHRcdFx0c29ydF9vcmRlcjogMTAxMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUmVwbHknICksXG5cdFx0XHRcdFx0aWQ6ICdlZGl0Jyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tcmVwbHlfYmxhY2tfMjRkcCdcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NlbmQnICksXG5cdFx0XHRcdFx0aWQ6ICdzZW5kJyxcblx0XHRcdFx0XHRncm91cDogJ2VkaXRvcicsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXNlbmRfYmxhY2tfMjRkcCdcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlbGV0ZScgKSxcblx0XHRcdFx0XHRpZDogJ2RlbGV0ZV9pY29uJyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdkZWxldGUnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tZGVsZXRlX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdEZWxldGUgJiBOZXh0JyApLFxuXHRcdFx0XHRcdGlkOiAnZGVsZXRlX2FuZF9uZXh0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdkZWxldGUnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tZGVsZXRlX2JsYWNrXzI0ZHAnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDYW5jZWwnICksXG5cdFx0XHRcdFx0aWQ6ICdjYW5jZWwnLFxuXHRcdFx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdFx0XHRzb3J0X29yZGVyOiAxOTkwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdKdW1wIFRvJyApLFxuXHRcdFx0XHRcdGlkOiAnanVtcF90b19oZWFkZXInLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwX2hlYWRlcjogdHJ1ZSxcblx0XHRcdFx0XHRwZXJtaXNzaW9uX3Jlc3VsdDogZmFsc2UgLy8gdG8gaGlkZSBpdCBpbiBsZWdhY3kgY29udGV4dCBtZW51IGFuZCBhdm9pZCBlcnJvcnMgaW4gbGVnYWN5IHBhcnNlcnMuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUaW1lU2hlZXQnICksXG5cdFx0XHRcdFx0aWQ6ICd0aW1lc2hlZXQnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU2NoZWR1bGUnICksXG5cdFx0XHRcdFx0aWQ6ICdzY2hlZHVsZScsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRncm91cDogJ25hdmlnYXRpb24nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFeHBvcnQnICksXG5cdFx0XHRcdFx0aWQ6ICdleHBvcnRfZXhjZWwnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLWZpbGVfdXBsb2FkX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNvcnRfb3JkZXI6IDEwMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRWRpdCBFbXBsb3llZScgKSxcblx0XHRcdFx0XHRpZDogJ2VkaXRfZW1wbG95ZWUnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRzZXRDdXJyZW50RWRpdFJlY29yZERhdGEoIGN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIGN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSBjdXJyZW50X2VkaXRfcmVjb3JkO1xuXHRcdH1cblxuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHt9O1xuXHRcdH1cblx0XHQvL1NldCBjdXJyZW50IGVkaXQgcmVjb3JkIGRhdGEgdG8gYWxsIHdpZGdldHNcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldCApICkge1xuXHRcdFx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRcdFx0Y2FzZSAnZnVsbF9uYW1lJzpcblx0XHRcdFx0XHRcdGlmICggdGhpcy5pc19hZGQgKSB7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggTG9jYWxDYWNoZURhdGEubG9naW5Vc2VyLmZpcnN0X25hbWUgKyAnICcgKyBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIubGFzdF9uYW1lICk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydmaXJzdF9uYW1lJ10gKyAnICcgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2xhc3RfbmFtZSddICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdWJqZWN0Jzpcblx0XHRcdFx0XHRcdC8vIEVycm9yOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICcwJyBvZiBudWxsIGluIC9pbnRlcmZhY2UvaHRtbDUvIyFtPVJlcXVlc3QmYT12aWV3JmlkPTEzMTg1JnRhYj1SZXF1ZXN0IGxpbmUgNTA1XG5cdFx0XHRcdFx0XHRpZiAoIHRoaXMuaXNfZWRpdCAmJiB0aGlzLm1lc3NhZ2VzICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoICdSZTogJyArIHRoaXMubWVzc2FnZXNbMF0uc3ViamVjdCApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwdW5jaF90YWdfaWQnOlxuXHRcdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5wcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV07XG5cblx0XHRcdFx0XHRcdFx0dmFyIHB1bmNoX3RhZ193aWRnZXQgPSB3aWRnZXQ7XG5cdFx0XHRcdFx0XHRcdFRUUHJvbWlzZS53YWl0KCBudWxsLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHQvL1VwZGF0ZSBkZWZhdWx0IGFyZ3MgZm9yIHB1bmNoIHRhZ3MgQUNvbWJvQm94IGxhc3QgYXMgdGhleSByZWx5IG9uIGRhdGEgZnJvbSBqb2IsIGpvYiBpdGVtIGFuZCByZWxhdGVkIGZpZWxkcy5cblx0XHRcdFx0XHRcdFx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSAkdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKTtcblx0XHRcdFx0XHRcdFx0XHRwdW5jaF90YWdfd2lkZ2V0LnNldERlZmF1bHRBcmdzKCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0VUlEYXRhVG9DdXJyZW50RWRpdFJlY29yZCgpO1xuXG5cdFx0Ly9hIG5ldyByZXF1ZXN0IGNvbWVzIGZyb20gdGhlIGN1cnJlbnQgdXNlci5cblx0XHRpZiAoIHRoaXMuaXNfYWRkICkge1xuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQgPSBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIuaWQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdH1cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdGlmICggdGhpcy5pc192aWV3aW5nICkge1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCAkdGhpcy5tZXNzYWdlcyApICkge1xuXHRcdFx0XHQkdGhpcy5tZXNzYWdlcyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0JHRoaXMuZ2V0T3ZlcmxhcHBpbmdTaGlmdHMoKTtcblx0XHR9XG5cdH1cblxuXHRpbml0Vmlld2luZ1ZpZXcoKSB7XG5cdFx0c3VwZXIuaW5pdFZpZXdpbmdWaWV3KCk7XG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMubWVzc2FnZSApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5tZXNzYWdlLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdH1cblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICYmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnR5cGVfaWQgPT0gMzAgfHwgdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnR5cGVfaWQgPT0gNDAgKSApIHtcblx0XHRcdHZhciBkb3cgPSBbJ3N1bicsICdtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCddO1xuXHRcdFx0dmFyIG9uZV9zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRcdGlmICggZG93LmluZGV4T2YoIGtleSApID4gLTEgKSB7XG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNzsgaSsrICkge1xuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSAhPT0gMCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSAhPT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdG9uZV9zZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggb25lX3NlbGVjdGVkICkge1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydzdW4nXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLnNob3coKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydzdW4nXS5wYXJlbnRzKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tZGl2JyApLmhpZGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzZXRVUkwoKSB7XG5cblx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPT09ICdlZGl0JyApIHtcblx0XHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzdXBlci5zZXRVUkwoKTtcblx0fVxuXG5cdHNldEN1c3RvbURlZmF1bHRNZW51SWNvbiggaWQsIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3NlbmQnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51U2VuZEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVWaWV3SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCAncHVuY2gnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgJ3NjaGVkdWxlJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2VkaXRfZW1wbG95ZWUnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51RWRpdEVtcGxveWVlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCAndXNlcicgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q3VzdG9tRWRpdE1lbnVJY29uKCBpZCwgY29udGV4dF9idG4gKSB7XG5cdFx0c3dpdGNoICggaWQgKSB7XG5cdFx0XHRjYXNlICdzZW5kJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudVNhdmVJY29uKCBjb250ZXh0X2J0biApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVOYXZWaWV3SWNvbiggY29udGV4dF9idG4sICdwdW5jaCcgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzY2hlZHVsZSc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVOYXZWaWV3SWNvbiggY29udGV4dF9idG4sICdzY2hlZHVsZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudU5hdkVkaXRJY29uKCBjb250ZXh0X2J0biwgJ3VzZXInICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51Q2FuY2VsSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKSB7XG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICYmICF0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUV4cG9ydEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgcElkICkge1xuXHRcdGlmICggdGhpcy5lZGl0X29ubHlfbW9kZSB8fCB0aGlzLmlzX3ZpZXdpbmcgfHwgdGhpcy5pc19lZGl0IHx8IHRoaXMuaXNfYWRkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2UgaWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA9PSAwIHx8IHRoaXMuZ3JpZCA9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51QWRkSWNvbiggY29udGV4dF9idG4sIHBJZCApIHtcblx0XHRzdXBlci5zZXRFZGl0TWVudUFkZEljb24oIGNvbnRleHRfYnRuLCBwSWQgKTtcblxuXHRcdGlmICggdGhpcy5pc19lZGl0IHx8IHRoaXMuaXNfYWRkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudURlbGV0ZUFuZE5leHRJY29uKCBjb250ZXh0X2J0biwgcElkICkge1xuXHRcdGlmICggdGhpcy5pc19lZGl0IHx8IHRoaXMuaXNfYWRkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudU5hdlZpZXdJY29uKCBjb250ZXh0X2J0biwgcElkICkge1xuXHRcdGlmICggdGhpcy5pc19lZGl0IHx8IHRoaXMuaXNfYWRkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudURlbGV0ZUljb24oIGNvbnRleHRfYnRuLCBwSWQgKSB7XG5cdFx0aWYgKCB0aGlzLmlzX2VkaXQgfHwgdGhpcy5pc19hZGQgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdG9uVHlwZUNoYW5nZWQoIGFyZyApIHtcblx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCAmJiBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSAmJiBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggJ3JlcXVlc3QnLCAnYWRkX2FkdmFuY2VkJyApICYmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMzAgfHwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gNDAgKSApIHsgLy9zY2hlZHVsZSBhZGp1c3RtZW50IHx8IGFic2VuY2Ugc2VsZWN0ZWRcblxuXHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuZGF0ZV9zdGFtcCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRhdGVfc3RhbXAucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kYXRlX3N0YW1wICE9IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZSA9PSAnJyApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnN0YXJ0X2RhdGUuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kYXRlX3N0YW1wICk7XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kYXRlX3N0YW1wICE9IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZW5kX2RhdGUgPT0gJycgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5lbmRfZGF0ZS5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXAgKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmVuZF9kYXRlID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXA7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnNob3dBZHZhbmNlZEZpZWxkcyggZmFsc2UgKTsgLy9Eb24ndCB1cGRhdGUgc2NoZWR1bGUgdG90YWwgdGltZSBhcyBpdCB3aWxsIGJlIGRvbmUgbG93ZXIgZG93biBpbiBzZXRSZXF1ZXN0Rm9ybURlZmF1bHREYXRhKCk7XG5cblx0XHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnR5cGVfaWQuZ2V0VmFsdWUoKSA9PSAzMCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkLnNldFZhbHVlKCAyMCApO1xuXHRcdFx0fSBlbHNlIGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnR5cGVfaWQuZ2V0VmFsdWUoKSA9PSA0MCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkLnNldFZhbHVlKCAxMCApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGFyZyApIHtcblx0XHRcdFx0YXJnLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkLmdldFZhbHVlKCk7IC8vYXJnIGlzIHBhc3NlZCBvbiBzZXRSZXF1ZXN0Rm9ybURlZmF1bHREYXRhKCkgYmVsb3csIHNvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBVSSBoZXJlLlxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm9uV29ya2luZ1N0YXR1c0NoYW5nZWQoKTtcblxuXHRcdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRcdHRoaXMuc2V0UmVxdWVzdEZvcm1EZWZhdWx0RGF0YSggYXJnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMuZ2V0QXZhaWxhYmxlQmFsYW5jZSgpO1xuXHRcdFx0XHQkdGhpcy5zZXRDdXJyZW50RWRpdFJlY29yZERhdGEoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblx0XHRcdFx0JHRoaXMuZ2V0U2NoZWR1bGVUb3RhbFRpbWUoKTtcblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmhpZGVBZHZhbmNlZEZpZWxkcygpO1xuXHRcdFx0aWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuZGF0ZV9zdGFtcCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRhdGVfc3RhbXAucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5zaG93KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm9uV29ya2luZ1N0YXR1c0NoYW5nZWQoKTtcblx0XHR9XG5cdH1cblxuXHRzZXRSZXF1ZXN0Rm9ybURlZmF1bHREYXRhKCBkYXRhLCBjYWxsYmFja19mdW5jdGlvbiApIHtcblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICYmIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncmVxdWVzdCcsICdhZGRfYWR2YW5jZWQnICkgJiYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAzMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSA0MCApICkge1xuXHRcdFx0aWYgKCBkYXRhID09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRcdFx0dGhpcy5lbmFibGVfdmFsaWRhdGlvbiA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLnNldFVJV2lkZ2V0RmllbGRzVG9DdXJyZW50RWRpdFJlY29yZCgpO1xuXHRcdFx0XHR2YXIgZmlsdGVyID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHRoaXMuYnVpbGREYXRhRm9yQVBJKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSApO1xuXG5cdFx0XHRcdHRoaXMuYXBpX3JlcXVlc3Rfc2NoZWR1bGUuZ2V0UmVxdWVzdFNjaGVkdWxlRGVmYXVsdERhdGEoIGZpbHRlciwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXG5cdFx0XHRcdFx0XHRkYXRhID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0ZGF0YS5yZXF1ZXN0X3NjaGVkdWxlX3N0YXR1c19pZCA9IGRhdGEuc3RhdHVzX2lkO1xuXHRcdFx0XHRcdFx0ZGF0YS5kYXRlX3N0YW1wID0gZGF0YS5zdGFydF9kYXRlO1xuXG5cdFx0XHRcdFx0XHQvL2ZvcmNlID0gdHJ1ZSBpcyByZXF1aXJlZCB0byBzZXQgdGhlIGN1cnJlbnRfZWRpdF9yZWNvcmQgYW5kIHBvcHVsYXRlIGVkaXRfdmlld191aV9kaWNcblx0XHRcdFx0XHRcdCR0aGlzLnNldERlZmF1bHREYXRhKCBkYXRhLCB0cnVlICk7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrX2Z1bmN0aW9uICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFja19mdW5jdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YS5kYXRlX3N0YW1wID0gZGF0YS5zdGFydF9kYXRlO1xuXHRcdFx0XHRkYXRhID0gdGhpcy5idWlsZERhdGFGcm9tQVBJKCBkYXRhICk7XG5cdFx0XHRcdC8vZm9yY2UgPSB0cnVlIGlzIHJlcXVpcmVkIHRvIHNldCB0aGUgY3VycmVudF9lZGl0X3JlY29yZCBhbmQgcG9wdWxhdGUgZWRpdF92aWV3X3VpX2RpY1xuXHRcdFx0XHR0aGlzLnNldERlZmF1bHREYXRhKCBkYXRhLCB0cnVlICk7XG5cdFx0XHRcdGlmICggY2FsbGJhY2tfZnVuY3Rpb24gKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2tfZnVuY3Rpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG9uQXZhaWxhYmxlQmFsYW5jZUNoYW5nZSgpIHtcblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICYmIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAncmVxdWVzdCcsICdhZGRfYWR2YW5jZWQnICkgKSB7XG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYyAmJiB0aGlzLmVkaXRfdmlld191aV9kaWMuYWJzZW5jZV9wb2xpY3lfaWQgJiYgdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnJlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkLmdldFZhbHVlKCkgPT0gMjAgJiYgdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmFic2VuY2VfcG9saWN5X2lkLmdldFZhbHVlKCkgIT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXZhaWxhYmxlQmFsYW5jZSgpO1xuXHRcdFx0fSBlbHNlIGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljICYmIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdmFpbGFibGVfYmFsYW5jZSApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmF2YWlsYWJsZV9iYWxhbmNlLnBhcmVudHMoICcuZWRpdC12aWV3LWZvcm0taXRlbS1kaXYnICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vcG9zdCBob29rIGZvciBvblNhdmVSZXN1bHRcblx0b25TYXZlRG9uZSggcmVzdWx0ICkge1xuXHRcdHZhciByZXR2YWw7XG5cdFx0aWYgKCB0aGlzLmlzX2VkaXQgKSB7XG5cdFx0XHR0aGlzLm9uVmlld0NsaWNrKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKTtcblx0XHRcdHJldHZhbCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR2YWwgPSB0cnVlO1xuXHRcdH1cblx0XHQkKCkuVEZlZWRiYWNrKCB7XG5cdFx0XHRzb3VyY2U6ICdTZW5kJ1xuXHRcdH0gKTtcblx0XHQvL0lmIHJlcXVlc3Qgd2FzIGFkZGVkIGZyb20gdGhlIFRpbWVTaGVldCB2aWV3LCByZWZyZXNoIHRoZSBUaW1lU2hlZXQuXG5cdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fcHJpbWFyeV9jb250cm9sbGVyICYmIExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfb3Blbl9wcmltYXJ5X2NvbnRyb2xsZXIudmlld0lkID09PSAnVGltZVNoZWV0JyApIHtcblx0XHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfb3Blbl9wcmltYXJ5X2NvbnRyb2xsZXIuc2VhcmNoKCk7XG5cdFx0fVxuXHRcdHJldHVybiByZXR2YWw7XG5cdH1cblxuXHR1bmlmb3JtVmFyaWFibGUoIHJlY29yZHMgKSB7XG5cdFx0aWYgKCB0eXBlb2YgcmVjb3JkcyA9PT0gJ29iamVjdCcgKSB7XG5cdFx0XHRyZWNvcmRzLnVzZXJfaWQgPSBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIuaWQ7XG5cdFx0XHRyZWNvcmRzLmZpcnN0X25hbWUgPSBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIuZmlyc3RfbmFtZTtcblx0XHRcdHJlY29yZHMubGFzdF9uYW1lID0gTG9jYWxDYWNoZURhdGEubG9naW5Vc2VyLmxhc3RfbmFtZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaXNfYWRkICkge1xuXHRcdFx0cmVjb3JkcyA9IHRoaXMuYnVpbGREYXRhRm9yQVBJKCByZWNvcmRzICk7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0dmFyIG1zZyA9IHRoaXMudW5pZm9ybU1lc3NhZ2VWYXJpYWJsZSggcmVjb3JkcyApO1xuXG5cdFx0XHRpZiAoIHJlY29yZHMgJiYgcmVjb3Jkcy5yZXF1ZXN0X3NjaGVkdWxlICkge1xuXHRcdFx0XHRtc2cucmVxdWVzdF9zY2hlZHVsZSA9IHJlY29yZHMucmVxdWVzdF9zY2hlZHVsZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1zZztcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVjb3Jkcztcblx0fVxuXG5cdG9uU2F2ZUNsaWNrKCBpZ25vcmVXYXJuaW5nICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdzYXZlJztcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIGlnbm9yZVdhcm5pbmcgKSApIHtcblx0XHRcdGlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKCB2YXIga2V5IGluICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRpZiAoICR0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XSAhPSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9ICR0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS5nZXRWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc19hZGQgKSB7XG5cdFx0XHQvLyAvL2Zvcm1hdCBkYXRhIGFzIGV4cGVjdGVkIGJ5IEFQSVxuXHRcdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblxuXHRcdFx0dGhpcy5hcGlbJ3NldCcgKyB0aGlzLmFwaS5rZXlfbmFtZV0oIHJlY29yZCwgZmFsc2UsIGlnbm9yZVdhcm5pbmcsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25TYXZlUmVzdWx0KCByZXN1bHQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuaXNfZWRpdCApIHtcblx0XHRcdHZhciByZWNvcmQgPSB7fTtcblx0XHRcdHRoaXMuaXNfYWRkID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpO1xuXHRcdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApO1xuXHRcdFx0RW1iZWRkZWRNZXNzYWdlLnJlcGx5KCBbcmVjb3JkXSwgaWdub3JlV2FybmluZywgZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXHRcdFx0XHRcdFx0Ly9zZWUgIzIyMjQgLSBVbmFibGUgdG8gZ2V0IHByb3BlcnR5ICdmaW5kJyBvZiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdCR0aGlzLnJlbW92ZUVkaXRWaWV3KCk7XG5cdFx0XHRcdFx0XHQkdGhpcy5vblZpZXdDbGljayggaWQgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblx0XHRcdFx0XHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRzZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKSB7XG5cdFx0dGhpcy5yZWZyZXNoX2lkID0gbnVsbDtcblx0XHRzdXBlci5zZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKTtcblx0fVxuXG5cdHNldEVkaXRNZW51RWRpdEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggIXRoaXMuZWRpdFBlcm1pc3Npb25WYWxpZGF0ZSggJ3JlcXVlc3QnICkgfHwgdGhpcy5lZGl0X29ubHlfbW9kZSB8fCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdC8vTm90IHNob3duIGluIGVkaXQgb25seSBtb2RlIG9yIG1hc3MgZWRpdC4gTWFzcyBlZGl0IHNob3VsZCBvbmx5IHNob3cgbWFzcyBlZGl0IChuZWVkIHRvIHNldCB0aGF0IHBhcnQgaW4gbWFzcyBlZGl0IGljb24pLlxuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cblx0XHRpZiAoICF0aGlzLmlzX3ZpZXdpbmcgfHwgIXRoaXMuZWRpdE93bmVyT3JDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSggJ3JlcXVlc3QnICkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51RWRpdEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoICF0aGlzLmVkaXRQZXJtaXNzaW9uVmFsaWRhdGUoICdyZXF1ZXN0JyApIHx8IHRoaXMuZWRpdF9vbmx5X21vZGUgfHwgKCAhdGhpcy5pc19lZGl0IHx8ICF0aGlzLmlzX3ZpZXdpbmcgKSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51U2NoZWR1bGVJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICFQZXJtaXNzaW9uTWFuYWdlci5jaGVja1RvcExldmVsUGVybWlzc2lvbiggJ1NjaGVkdWxlJyApIHx8IHRoaXMuZWRpdF9vbmx5X21vZGUgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXG5cdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA9PT0gMSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudVNlbmRJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBJZCApIHtcblx0XHRpZiAoICF0aGlzLmFkZFBlcm1pc3Npb25WYWxpZGF0ZSggcElkICkgfHwgdGhpcy5lZGl0X29ubHlfbW9kZSB8fCAoICF0aGlzLmlzX2VkaXQgfHwgIXRoaXMuaXNfdmlld2luZyApICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUVkaXRFbXBsb3llZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoICF0aGlzLmVkaXRDaGlsZFBlcm1pc3Npb25WYWxpZGF0ZSggJ3VzZXInICkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXG5cdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA9PT0gMSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRvbkN1c3RvbUNvbnRleHRDbGljayggaWQgKSB7XG5cdFx0c3dpdGNoICggaWQgKSB7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdHRoaXMub25OYXZpZ2F0aW9uQ2xpY2soIGlkICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2VuZCc6XG5cdFx0XHRcdHRoaXMub25TYXZlQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdFZpZXdXaWRnZXRzTW9kZSgpIHtcblx0XHR2YXIgZGlkX2NsZWFuID0gZmFsc2U7XG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmVkaXRfdmlld191aV9kaWMgKSB7XG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHR3aWRnZXQuY3NzKCAnb3BhY2l0eScsIDEgKTtcblx0XHRcdHZhciBjb2x1bW4gPSB3aWRnZXQucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7XG5cdFx0XHRpZiAoICFjb2x1bW4uaGFzQ2xhc3MoICd2LWJveCcgKSApIHtcblx0XHRcdFx0aWYgKCAhZGlkX2NsZWFuICkge1xuXHRcdFx0XHRcdGRpZF9jbGVhbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0LnNldEVuYWJsZWQgKSApIHtcblx0XHRcdFx0XHR3aWRnZXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldC5zZXRFbmFibGVkICkgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0LnNldEVuYWJsZWQoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHR0aGlzLnNldElzQ2hhbmdlZCggdGFyZ2V0ICk7XG5cdFx0dGhpcy5zZXRNYXNzRWRpdGluZ0ZpZWxkc1doZW5Gb3JtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHR2YXIga2V5ID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dmFyIGNfdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IGNfdmFsdWU7XG5cdFx0dmFyIG5lZWRzX2NhbGxiYWNrID0gZmFsc2U7XG5cblx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRjYXNlICdqb2JfaWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9xdWlja19zZWFyY2gnXS5zZXRWYWx1ZSggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkgPyAoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA/IHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA6ICcnICkgOiAnJyApO1xuXHRcdFx0XHRcdHRoaXMuc2V0Sm9iSXRlbVZhbHVlV2hlbkpvYkNoYW5nZWQoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLCAnam9iX2l0ZW1faWQnICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfaXRlbV9xdWlja19zZWFyY2gnXS5zZXRWYWx1ZSggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkgPyAoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA/IHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA6ICcnICkgOiAnJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snam9iX2l0ZW1fcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3B1bmNoX3RhZ19pZCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdGlmICggY192YWx1ZSAhPT0gVFRVVUlELnplcm9faWQgJiYgY192YWx1ZSAhPT0gZmFsc2UgJiYgY192YWx1ZS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1F1aWNrU2VhcmNoTWFudWFsSWRzKCB0YXJnZXQuZ2V0U2VsZWN0SXRlbXMoKSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnXS5zZXRWYWx1ZSggJycgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHRoaXMucHJldmlvdXNfcHVuY2hfdGFnX3NlbGVjdGlvbiA9IGNfdmFsdWU7XG5cdFx0XHRcdFx0Ly9SZXNldCBzb3VyY2UgZGF0YSB0byBtYWtlIHN1cmUgY29ycmVjdCBwdW5jaCB0YWdzIGFyZSBhbHdheXMgc2hvd24uXG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydwdW5jaF90YWdfaWQnXS5zZXRTb3VyY2VEYXRhKCBudWxsICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyX2lkJzpcblx0XHRcdGNhc2UgJ2JyYW5jaF9pZCc6XG5cdFx0XHRjYXNlICdkZXBhcnRtZW50X2lkJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1ZhbHVlc1doZW5Dcml0ZXJpYUNoYW5nZWQoIHRoaXMuZ2V0UHVuY2hUYWdGaWx0ZXJEYXRhKCksICdwdW5jaF90YWdfaWQnICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfcXVpY2tfc2VhcmNoJzpcblx0XHRcdGNhc2UgJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMub25Kb2JRdWlja1NlYXJjaCgga2V5LCBjX3ZhbHVlLCAnam9iX2lkJywgJ2pvYl9pdGVtX2lkJyApO1xuXHRcdFx0XHRcdFRUUHJvbWlzZS53YWl0KCAnQmFzZVZpZXdDb250cm9sbGVyJywgJ29uSm9iUXVpY2tTZWFyY2gnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggJHRoaXMuZ2V0UHVuY2hUYWdGaWx0ZXJEYXRhKCksICdwdW5jaF90YWdfaWQnICk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMub25QdW5jaFRhZ1F1aWNrU2VhcmNoKCBjX3ZhbHVlLCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXG5cdFx0XHRcdFx0Ly9Eb24ndCB2YWxpZGF0ZSBpbW1lZGlhdGVseSBhcyBvbkpvYlF1aWNrU2VhcmNoIGlzIGRvaW5nIGFzeW5jIEFQSSBjYWxscywgYW5kIGl0IHdvdWxkIGNhdXNlIGEgZ3VhcmFudGVlZCB2YWxpZGF0aW9uIGZhaWx1cmUuXG5cdFx0XHRcdFx0ZG9Ob3RWYWxpZGF0ZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0eXBlX2lkJzpcblx0XHRcdFx0Ly8gU2V0IGFic2VuY2VfcG9saWN5X2lkIHRvIHplcm8gaWQgdG8gcHJldmVudCBhdmFpbGFibGUgYmFsYW5jZSBmaWVsZCBzaG93aW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgbm9uZSBhYnNlbmNlIHJlcXVlc3QgdHlwZS5cblx0XHRcdFx0Ly8gQWxzbyBwcmV2ZW50cyBhdmFpbGFibGUgYmFsYW5jZSBzb21ldGltZXMgc2hvd2luZyB0aGUgd3JvbmcgdmFsdWUgZHVlIHRvIG1pc21hdGNoIGluIHNlbGVjdCBtZW51IGFuZCBjdXJyZW50X2VkaXRfcmVjb3JkLlxuXHRcdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hYnNlbmNlX3BvbGljeV9pZCAmJiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09PSAzMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PT0gNDAgKSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuYWJzZW5jZV9wb2xpY3lfaWQuc2V0VmFsdWUoIFRUVVVJRC56ZXJvX2lkICk7XG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFic2VuY2VfcG9saWN5X2lkID0gVFRVVUlELnplcm9faWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZG9Ob3RWYWxpZGF0ZSA9IHRydWU7XG5cdFx0XHRcdHRoaXMub25UeXBlQ2hhbmdlZCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ292ZXJsYXBfdHlwZV9pZCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0T3ZlcmxhcHBpbmdTaGlmdHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RhdGVfc3RhbXAnOlxuXHRcdFx0XHR0aGlzLm9uRGF0ZVN0YW1wQ2hhbmdlZCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlcXVlc3Rfc2NoZWR1bGVfc3RhdHVzX2lkJzpcblx0XHRcdFx0dGhpcy5vbldvcmtpbmdTdGF0dXNDaGFuZ2VkKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3RhcnRfZGF0ZSc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnN0YXJ0X2RhdGUuZ2V0VmFsdWUoKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXAgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuc3RhcnRfZGF0ZS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR0aGlzLm9uU3RhcnREYXRlQ2hhbmdlZCgpO1xuXHRcdFx0XHR0aGlzLnNldFJlcXVlc3RGb3JtRGVmYXVsdERhdGEoIG51bGwsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGZpbmlzaEZvcm1JdGVtQ2hhbmdlKCk7XG5cdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5nZXRPdmVybGFwcGluZ1NoaWZ0cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRuZWVkc19jYWxsYmFjayA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZW5kX2RhdGUnOlxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZW5kX2RhdGUgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuZW5kX2RhdGUuZ2V0VmFsdWUoKTtcblx0XHRcdFx0dGhpcy5zZXRSZXF1ZXN0Rm9ybURlZmF1bHREYXRhKCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRmaW5pc2hGb3JtSXRlbUNoYW5nZSgpO1xuXHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuZ2V0T3ZlcmxhcHBpbmdTaGlmdHMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0bmVlZHNfY2FsbGJhY2sgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3N0YXJ0X3RpbWUnOlxuXHRcdFx0Y2FzZSAnZW5kX3RpbWUnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSApIHtcblx0XHRcdFx0XHR0aGlzLmdldE92ZXJsYXBwaW5nU2hpZnRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzdW4nOlxuXHRcdFx0Y2FzZSAnbW9uJzpcblx0XHRcdGNhc2UgJ3R1ZSc6XG5cdFx0XHRjYXNlICd3ZWQnOlxuXHRcdFx0Y2FzZSAndGh1Jzpcblx0XHRcdGNhc2UgJ2ZyaSc6XG5cdFx0XHRjYXNlICdzYXQnOlxuXHRcdFx0XHR0aGlzLmdldFNjaGVkdWxlVG90YWxUaW1lKCk7XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0T3ZlcmxhcHBpbmdTaGlmdHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NjaGVkdWxlX3BvbGljeV9pZCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0XHRcdCR0aGlzLmdldE92ZXJsYXBwaW5nU2hpZnRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlJ2Fic2VuY2VfcG9saWN5X2lkJzpcblx0XHRcdFx0dGhpcy5zZWxlY3RlZF9hYnNlbmNlX3BvbGljeV9yZWNvcmQgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuYWJzZW5jZV9wb2xpY3lfaWQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdpc19yZXBsYWNlX3dpdGhfb3Blbl9zaGlmdCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0T3ZlcmxhcHBpbmdTaGlmdHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoICFuZWVkc19jYWxsYmFjayApIHtcblx0XHRcdGZpbmlzaEZvcm1JdGVtQ2hhbmdlKCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZmluaXNoRm9ybUl0ZW1DaGFuZ2UoKSB7XG5cdFx0XHRpZiAoIGtleSA9PT0gJ2RhdGVfc3RhbXAnIHx8XG5cdFx0XHRcdGtleSA9PT0gJ3N0YXJ0X2RhdGVfc3RhbXBzJyB8fFxuXHRcdFx0XHRrZXkgPT09ICdzdGFydF9kYXRlJyB8fFxuXHRcdFx0XHRrZXkgPT09ICdlbmRfZGF0ZScgfHxcblx0XHRcdFx0a2V5ID09PSAnc3RhcnRfZGF0ZV9zdGFtcCcgfHxcblx0XHRcdFx0a2V5ID09PSAnc3RhcnRfdGltZScgfHxcblx0XHRcdFx0a2V5ID09PSAnZW5kX3RpbWUnIHx8XG5cdFx0XHRcdGtleSA9PT0gJ3NjaGVkdWxlX3BvbGljeV9pZCcgfHxcblx0XHRcdFx0a2V5ID09PSAnYWJzZW5jZV9wb2xpY3lfaWQnICkge1xuXG5cdFx0XHRcdGlmICggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZGF0ZV9zdGFtcCddICE9PSAnJyAmJlxuXHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3N0YXJ0X3RpbWUnXSAhPT0gJycgJiZcblx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydlbmRfdGltZSddICE9PSAnJyApIHtcblxuXHRcdFx0XHRcdCR0aGlzLmdldFNjaGVkdWxlVG90YWxUaW1lKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMub25BdmFpbGFibGVCYWxhbmNlQ2hhbmdlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0XHQkdGhpcy52YWxpZGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0JHRoaXMuc2V0RWRpdE1lbnUoKTtcblx0XHR9XG5cdH1cblxuXHR2YWxpZGF0ZSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciByZWNvcmQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQ7XG5cdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHJlY29yZCApO1xuXHRcdHZhciBhcGkgPSB0aGlzLm1lc3NhZ2VfY29udHJvbF9hcGk7XG5cdFx0aWYgKCB0aGlzLmlzX2FkZCApIHtcblx0XHRcdHJlY29yZCA9IHRoaXMuYnVpbGREYXRhRm9yQVBJKCByZWNvcmQgKTtcblx0XHRcdGFwaSA9IHRoaXMuYXBpO1xuXHRcdH1cblxuXHRcdGFwaVsndmFsaWRhdGUnICsgYXBpLmtleV9uYW1lXSggcmVjb3JkLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0JHRoaXMudmFsaWRhdGVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdG9uQWRkQ2xpY2soIGRhdGEgKSB7XG5cdFx0VFRQcm9taXNlLmFkZCggJ1JlcXVlc3QnLCAnYWRkJyApO1xuXHRcdFRUUHJvbWlzZS53YWl0KCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0dGhpcy5yZW1vdmVFZGl0VmlldygpO1xuXHRcdH1cblx0XHR0aGlzLnNldEN1cnJlbnRFZGl0Vmlld1N0YXRlKCAnbmV3JyApO1xuXHRcdHRoaXMub3BlbkVkaXRWaWV3KCk7XG5cdFx0dGhpcy5idWlsZEFkZFZpZXdVSSgpO1xuXHRcdC8vRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBhIGZ1bmN0aW9uIGluIC9pbnRlcmZhY2UvaHRtbDUvdmlld3MvQmFzZVZpZXdDb250cm9sbGVyLmpzP3Y9OC4wLjAtMjAxNDExMTctMTExMTQwIGxpbmUgODk3XG5cdFx0aWYgKCAkdGhpcy5hcGkgJiYgdHlwZW9mICR0aGlzLmFwaVsnZ2V0JyArICR0aGlzLmFwaS5rZXlfbmFtZSArICdEZWZhdWx0RGF0YSddID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0JHRoaXMuYXBpWydnZXQnICsgJHRoaXMuYXBpLmtleV9uYW1lICsgJ0RlZmF1bHREYXRhJ10oIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRcdFx0Ly9kYXRhIHBhc3NlZCBzaG91bGQgb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGRhdGEgZnJvbSB0aGUgQVBJLlxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gJC5leHRlbmQoIHt9LCByZXN1bHQuZ2V0UmVzdWx0KCksIGRhdGEgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHRoaXMub25BZGRSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHRcdCR0aGlzLm9uRGF0ZVN0YW1wQ2hhbmdlZCgpO1xuXHRcdFx0XHRcdGlmICggcmVzdWx0LnR5cGVfaWQgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5vblR5cGVDaGFuZ2VkKCByZXN1bHQgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRoaXMuZ2V0U2NoZWR1bGVUb3RhbFRpbWUoKTsgLy9UaGlzIGlzIGNhbGxlZCBhcyBwYXJ0IG9mIG9uVHlwZUNoYW5nZWQoKSwgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIGRvbmUgdHdpY2UuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0VFRQcm9taXNlLnJlc29sdmUoICdSZXF1ZXN0JywgJ2FkZCcgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdC8vVG8gYmUgY2FsbGVkIG9ubHkgYnkgZXh0ZXJuYWwgc2NyaXB0cyBjcmVhdGluZyByZXF1ZXN0cyAodGltZXNoZWV0IGFuZCBzY2hlZHVsZSBhdCB0aGlzIHRpbWUpXG5cdG9wZW5BZGRWaWV3KCBkYXRhX2FycmF5ICkge1xuXHRcdHRoaXMuc3ViX3ZpZXdfbW9kZSA9IHRydWU7XG5cdFx0dGhpcy5lZGl0X29ubHlfbW9kZSA9IHRydWU7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLmluaXRPcHRpb25zKCBmdW5jdGlvbigpIHtcblx0XHRcdCR0aGlzLm9uQWRkQ2xpY2soIGRhdGFfYXJyYXkgKTtcblx0XHR9ICk7XG5cdH1cbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///926\n")}}]);