TimeTrex/interface/html5/dist/company-geo_fence-GEOFenceViewController.bundle.js

1 line
61 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["company-geo_fence-GEOFenceViewController","leaflet-timetrex"],{7191:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"GEOFenceViewController\": () => (/* binding */ GEOFenceViewController)\n/* harmony export */ });\n/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5243);\n/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1787);\n/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet_draw__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _global_widgets_color_picker_TColorPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3161);\n/* harmony import */ var _framework_leaflet_leaflet_timetrex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6889);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n// CSS\n\n\n\n// JS\n\n\n\n\n// Note: If markers are ever used in GeoFence Editor/Viewer, then see image fix in leaflet-timetrex. https://github.com/Leaflet/Leaflet/issues/4968\n\nclass GEOFenceViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#geo_fence_view_container',\n\n\t\t\t// _required_files: {\n\t\t\t// \t15: ['leaflet-timetrex', 'TColorPicker']\n\t\t\t// },\n\t\t\ttype_array: null,\n\n\t\t\tcompany_api: null,\n\t\t\tdrawControl: null,\n\t\t\tbounds: null,\n\t\t\tdrawnItems: null,\n\t\t\tsearch_key_delay: 0,\n\t\t\tstart_coordinates: null,\n\t\t\tmap_html_id: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit() {\n\t\t//this._super('initialize' );\n\t\tthis.edit_view_tpl = 'GEOFenceEditView.html';\n\t\tthis.permission_id = 'geo_fence';\n\t\tthis.viewId = 'GEOFence';\n\t\tthis.script_name = 'GEOFenceView';\n\t\tthis.table_name_key = 'geo_fence';\n\t\tthis.context_menu_name = $.i18n._( 'GEO Fence' );\n\t\tthis.navigation_label = $.i18n._( 'GEO Fence' );\n\t\tthis.api = TTAPI.APIGEOFence;\n\t\tthis.company_api = TTAPI.APICompany;\n\n\t\tif ( this.map ) {\n\t\t\tdelete ( this.map );\n\t\t}\n\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\t\tthis.initData();\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\tgroups: {\n\t\t\t\tmap: {\n\t\t\t\t\tlabel: $.i18n._( 'Map' ),\n\t\t\t\t\tid: this.viewId + 'Navigation'\n\t\t\t\t}\n\t\t\t},\n\t\t\texclude: ['export_excel', 'mass_edit'],\n\t\t\tinclude: [{\n\t\t\t\tlabel: $.i18n._( 'Map' ),\n\t\t\t\tid: 'map',\n\t\t\t\tmenu_align: 'right',\n\t\t\t\tgroup: 'map',\n\t\t\t\tvue_icon: 'tticon tticon-map_black_24dp',\n\t\t\t\tsort_order: 8000,\n\t\t\t}]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'map':\n\t\t\t\tthis.onMapClick();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonSaveAndContinueClick() {\n\t\tsuper.onSaveAndContinueClick();\n\t}\n\n\tonMapClick() {\n\t\t// only trigger map load in specific product editions.\n\t\tif ( ( Global.getProductEdition() >= 15 ) ) {\n\t\t\tvar geo_fences;\n\t\t\tif ( this.edit_view ) {\n\t\t\t\tgeo_fences = [this.current_edit_record];\n\t\t\t} else if ( this.getGridSelectIdArray().length > 0 ) {\n\t\t\t\tgeo_fences = this.getSelectedItems();\n\t\t\t} else {\n\t\t\t\tgeo_fences = this.grid.getGridParam( 'data' );\n\t\t\t}\n\t\t\t// Currently not doing pre-processing for geofences, handling this directly in MapViewController\n\t\t\t// var processed_data_for_map = TTMapLib.TTConvertMapData.processBasicFromGenericViewController(geo_fences);\n\t\t\tIndexViewController.openEditView( this, 'Map', geo_fences );\n\t\t}\n\t}\n\n\tonAddClick() {\n\t\tTTPromise.add( 'init', 'init' );\n\t\tsuper.onAddClick();\n\n\t\tvar $this = this;\n\t\tTTPromise.wait( 'init', 'init', function() {\n\n\t\t\t// Clear the old record to prevent duplication on inserting an empty geofence record. See #2131\n\t\t\t$this._selectedShape = false;\n\t\t\t$this.current_edit_record = {};\n\t\t\tfor ( var key in $this.edit_view_ui_dic ) {\n\t\t\t\t$this.edit_view_ui_dic[key].setValue( '' );\n\t\t\t}\n\n\t\t\tif ( !$this.map_control ) {\n\t\t\t\t$this._initLeafletMap();\n\t\t\t}\n\n\t\t\t$this.map_control.setView( $this.start_coordinates, 10 );\n\t\t} );\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\t\tvar column_filter = {};\n\t\tcolumn_filter.is_owner = true;\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.is_child = true;\n\t\tcolumn_filter.in_use = true;\n\t\tcolumn_filter.first_name = true;\n\t\tcolumn_filter.last_name = true;\n\t\tcolumn_filter.geo_circle = true;\n\t\tcolumn_filter.geo_color = true;\n\t\tcolumn_filter.geo_polygon = true;\n\t\tcolumn_filter.geo_type_id = true;\n\n\t\t// Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tvar display_columns = [];\n\t\tif ( this.grid ) {\n\t\t\tdisplay_columns = this.grid.getGridParam( 'colModel' );\n\t\t}\n\t\t//Fixed possible exception -- Error: Unable to get property 'length' of undefined or null reference in /interface/html5/views/BaseViewController.js?v=7.4.3-20140924-090129 line 5031\n\t\tif ( display_columns ) {\n\t\t\tvar len = display_columns.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar column_info = display_columns[i];\n\t\t\t\tcolumn_filter[column_info.name] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_geo_fence': {\n\t\t\t\t'label': $.i18n._( 'GEO Fence' ),\n\t\t\t\t'html_template': this.getGeoFenceTabHtml()\n\t\t\t},\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tvar form_item_input;\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIGEOFence,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_geo_fence',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//Tab 0 start\n\n\t\tvar tab_geo_fence = this.edit_view_tab.find( '#tab_geo_fence' );\n\n\t\tvar tab_geo_fence_column1 = tab_geo_fence.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_geo_fence_column1 );\n\n\t\t// Name\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'name', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_geo_fence_column1 );\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t//Color\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COLOR_PICKER );\n\t\tform_item_input.TColorPicker( { field: 'geo_color' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Color' ), form_item_input, tab_geo_fence_column1 );\n\n\t\t// Description\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'description', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_geo_fence_column1 );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\tthis._initLeafletMap();\n\t}\n\n\t_initLeafletMap() {\n\t\tthis.neeed_save_punches_dic = {};\n\t\tthis.layers = [];\n\t\tthis.line_layers = [];\n\t\tthis.circle_layers = [];\n\t\tthis.directions_displays = [];\n\t\tthis.info_panel_dic = {};\n\t\tthis.geo_layers = [];\n\t\t//init map\n\n\t\tif ( !this.map_control || this.map_control == undefined || $( '#tab_geo_fence:visible #map_container div.google-map' )[0] == undefined ) {\n\n\t\t\tvar layers;\n\t\t\tvar map_layers;\n\t\t\tif ( APIGlobal.pre_login_data.map_provider && APIGlobal.pre_login_data.map_provider == 'mapbox' ) {\n\t\t\t\tvar osmUrl = 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}';\n\t\t\t\tvar osmAttrib = '© <a href=\"https://www.mapbox.com/about/maps/\">Mapbox</a> © <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> <strong><a href=\"https://www.mapbox.com/map-feedback/\" target=\"_blank\">Improve this map</a></strong>';\n\n\t\t\t\tlayers = [ leaflet__WEBPACK_IMPORTED_MODULE_0___default().tileLayer( osmUrl, { attribution: osmAttrib, tileSize: 512, maxZoom: 18, zoomOffset: -1, id: 'mapbox/streets-v11', accessToken: APIGlobal.pre_login_data.map_api_key }), ]; //Street Maps\n\t\t\t\tmap_layers = { 'Streets': layers[0], 'Satellite': leaflet__WEBPACK_IMPORTED_MODULE_0___default().tileLayer( osmUrl, { attribution: osmAttrib, tileSize: 512, maxZoom: 18, zoomOffset: -1, id: 'mapbox/satellite-streets-v11', accessToken: APIGlobal.pre_login_data.map_api_key }) }; //Street+Satellite\n\t\t\t} else {\n\t\t\t\tvar osmUrl = APIGlobal.pre_login_data.map_tile_url + '/{z}/{x}/{y}.png?tt_key=' + APIGlobal.pre_login_data.registration_key;\n\t\t\t\tvar osmAttrib = 'Map data by ©<a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>.';\n\n\t\t\t\tlayers = [ new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().TileLayer)( osmUrl, { minZoom: 3, maxZoom: 18, attribution: osmAttrib, noWrap: true } ) ];\n\t\t\t}\n\n\t\t\t//Avoid map is already initialized js exception by dynamically attaching the map element.\n\t\t\t// if (this.map_html_id && $('#' + this.map_html_id).length > 0) {\n\t\t\t// \t$( '#tab_geo_fence:visible #map_container #' + this.map_html_id ).off();\n\t\t\t// \tDebug.Text('Removed Lmap id: ' + this.map_html_id, 'GEOFenceViewController.js', 'GEOFenceViewController', '_initLeafletMap', 10);\n\t\t\t// }\n\n\t\t\tthis.map_html_id = 'map_' + ( new Date() ).getTime();\n\t\t\tDebug.Text( 'New Lmap id: ' + this.map_html_id, 'GEOFenceViewController.js', 'GEOFenceViewController', '_initLeafletMap', 10 );\n\n\t\t\t//append the map element, use then to ensure it's complete before initiallizing the map.\n\t\t\t$( '#tab_geo_fence:visible #map_container' ).html( '<div id=\"' + this.map_html_id + '\" class=\"google-map\"></div>' );\n\t\t\tthis.map_control = leaflet__WEBPACK_IMPORTED_MODULE_0___default().map( this.map_html_id, { layers: layers, minZoom: 2 } );\n\n\t\t\tDebug.Arr( this.map_control, 'Lmap var', 'GEOFenceViewController.js', 'GEOFenceViewController', '_initLeafletMap', 10 );\n\n\t\t\tif ( map_layers ) { //Add any Street/Satellite layers to the map if they are specified.\n\t\t\t\tleaflet__WEBPACK_IMPORTED_MODULE_0___default().control.layers( map_layers ).addTo( this.map_control );\n\t\t\t}\n\t\t}\n\n\t\tlayers[0].on( 'load', function() {\n\t\t\tTTPromise.resolve( 'Map', 'render' );\n\t\t} );\n\n\t\t//this.map_control.addLayer( layers[0] );\n\n\t\tthis.start_coordinates = this.startMapCoordinates();\n\n\t\tthis.map_control.setView( this.start_coordinates, 10 );\n\n\t\tthis.drawnItems = new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().FeatureGroup)();\n\t\tthis.drawnItems.do_not_clear = true;\n\t\tthis.map_control.addLayer( this.drawnItems );\n\n\t\tthis.drawControl = new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().Control.Draw)( {\n\t\t\tedit: {\n\t\t\t\tfeatureGroup: this.drawnItems,\n\t\t\t\tedit: false,\n\t\t\t\tremove: false\n\t\t\t},\n\t\t\tdraw: {\n\t\t\t\tpolygon: {\n\t\t\t\t\tshapeOptions: { color: '#0F820F' }\n\t\t\t\t},\n\t\t\t\tcircle: {\n\t\t\t\t\tshapeOptions: { color: '#0F820F' }\n\t\t\t\t},\n\t\t\t\tpolyline: false,\n\t\t\t\trectangle: false,\n\t\t\t\tmarker: false,\n\t\t\t\tcirclemarker: false\n\t\t\t}\n\t\t} );\n\n\t\tthis.map_control.addControl( this.drawControl );\n\n\t\tvar $this = this;\n\t\tthis.map_control.on( (leaflet__WEBPACK_IMPORTED_MODULE_0___default().Draw.Event.DRAWSTART), function( e ) {\n\t\t\t$this.removeAllLayers();\n\t\t} );\n\n\t\tthis.map_control.on( (leaflet__WEBPACK_IMPORTED_MODULE_0___default().Draw.Event.CREATED), function( e ) {\n\t\t\tvar type = e.layerType,\n\t\t\t\tnew_layer = e.layer;\n\t\t\tnew_layer.editable = true;\n\t\t\tnew_layer.removable = true;\n\n\t\t\t$this.removeAllLayers();\n\t\t\t$this._selectedShape = new_layer;\n\t\t\t$this.drawnItems.addLayer( new_layer );\n\t\t\tnew_layer.editing.enable();\n\t\t\t$this.is_changed = true;\n\t\t\t$this.setEditMenu();\n\t\t\t$this.validate();\n\t\t} );\n\n\t\tthis._initSearchBox();\n\t}\n\n\t_onShapeUpdate( e ) {\n\t\tvar edit_layer = e.target;\n\t\tedit_layer.editable = true;\n\t\tedit_layer.removable = true;\n\t\tthis._selectedShape = edit_layer;\n\t\tthis.drawnItems.addLayer( edit_layer );\n\t\tedit_layer.editing.enable();\n\t\tthis.is_changed = true;\n\t\tthis.setEditMenu();\n\t}\n\n\tremoveAllLayers() {\n\t\tfor ( var layer in this.drawnItems._layers ) {\n\t\t\tif ( this.drawnItems._layers[layer].removable == true ) {\n\t\t\t\ttry { //try needed for intermittent low-level non-blocking error when users navigate faster than leaflet can draw\n\t\t\t\t\tthis.drawnItems.removeLayer( this.drawnItems._layers[layer] );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tDebug.Text( e.message, 'GeoFenceController.js', 'GeoFenceController', 'GeoFenceController', 10 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tsuper.onFormItemChange( target, doNotValidate );\n\t\tvar key = target.getField();\n\t\tif ( key == 'geo_color' ) {\n\t\t\tthis.drawControl.options.draw.polygon.shapeOptions.color = this.edit_view_ui_dic[key].val();\n\t\t\tthis.drawControl.options.draw.circle.shapeOptions.color = this.edit_view_ui_dic[key].val();\n\n\t\t\tfor ( var layer in this.drawnItems._layers ) {\n\t\t\t\tif ( this.drawnItems._layers[layer].is_search_marker === undefined ) { // Only change the colours for layers that are not a search marker. Otherwise this will result in an error when changing colours after a search.\n\t\t\t\t\tthis.drawnItems._layers[layer].setStyle( {\n\t\t\t\t\t\tfillColor: this.edit_view_ui_dic[key].val(),\n\t\t\t\t\t\tcolor: this.edit_view_ui_dic[key].val()\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t_initSearchBox() {\n\t\tvar $this = this;\n\t\t$( '#pac-input' ).bind( 'focus', function( e ) {\n\t\t\t$( this ).select();\n\t\t} );\n\n\t\t$( '#pac-input' ).bind( 'keyup', function( e ) {\n\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\t$( '#suggestion-box div' ).first().click();\n\t\t\t} else {\n\t\t\t\t$this.search_key_delay = parseInt( Date.now() );\n\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\tif ( parseInt( Date.now() ) - $this.search_key_delay >= 250 ) {\n\t\t\t\t\t\t$this.stop_suggestions = false;\n\t\t\t\t\t\t_framework_leaflet_leaflet_timetrex__WEBPACK_IMPORTED_MODULE_3__.TTMapHelper.searchSuggest( $this, true );\n\t\t\t\t\t}\n\t\t\t\t}, 300 );\n\t\t\t}\n\t\t} );\n\t}\n\n\tsaveLayout() {\n\t\tvar $this = this;\n\t\tthis.user_generic_data_api.setUserGenericData( this.select_layout, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\tif ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t\t\t$this.select_layout.id = result_data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tcenterMap() {\n\t\tthis.map_control.panTo( this.start_coordinates );\n\t}\n\n\tuniformVariable( record ) {\n\t\trecord.geo_circle = false;\n\t\trecord.geo_type_id = 10; // default to circle prevent \"Incorrect GEO type\" exception triggered.\n\t\trecord.map_level = false;\n\t\tif ( this._selectedShape && this._selectedShape._radius != undefined ) {\n\t\t\trecord.geo_circle = {};\n\t\t\trecord.geo_circle.center = [this._selectedShape.getLatLng().lat, this._selectedShape.getLatLng().lng];\n\t\t\trecord.geo_circle.radius = this._selectedShape._mRadius;\n\t\t\trecord.geo_type_id = 20;\n\t\t\trecord.map_level = this.map_control.getZoom();\n\t\t} else if ( this._selectedShape ) {\n\t\t\tvar latlngs = this._selectedShape.getLatLngs()[0]; //getPaths().getAt( 0 ).getArray();\n\t\t\tvar array = [];\n\t\t\tfor ( var i = 0; i < latlngs.length; i++ ) {\n\t\t\t\tarray.push( [latlngs[i].lat, latlngs[i].lng] );\n\t\t\t}\n\t\t\trecord.geo_polygon = array;\n\t\t\trecord.geo_type_id = 10;\n\t\t\trecord.map_level = this.map_control.getZoom();\n\t\t}\n\t\treturn record;\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\t\tthis.user_generic_data_api.getUserGenericData( { filter_data: { script: 'MapView', deleted: false } }, {\n\t\t\tonResult: function( results ) {\n\t\t\t\tvar result_data = results.getResult();\n\t\t\t\tif ( result_data && result_data.length > 0 ) {\n\t\t\t\t\t$this.select_layout = result_data[0];\n\t\t\t\t} else {\n\t\t\t\t\t$this.select_layout = {\n\t\t\t\t\t\tscript: 'MapView',\n\t\t\t\t\t\tis_default: false,\n\t\t\t\t\t\tname: Global.default_item,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tmarker_connection_type: 'LINE'\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t//Set current edit record data to all widgets\n\t\t\t\t//$this._selectedShape && $this._deleteSelectShape();\n\t\t\t\tfor ( var key in $this.current_edit_record ) {\n\t\t\t\t\tif ( !$this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tvar widget = $this.edit_view_ui_dic[key];\n\t\t\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\t\t\tswitch ( key ) {\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\twidget.setValue( $this.current_edit_record[key] );\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( $this.drawnItems ) {\n\t\t\t\t\t$this.removeAllLayers();\n\t\t\t\t}\n\n\t\t\t\t$this.bounds = new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().LatLngBounds)();\n\t\t\t\tif ( $this.current_edit_record.geo_type_id == 20 && $this.current_edit_record.geo_circle ) {\n\t\t\t\t\t$this._drawCircle( $this.current_edit_record.geo_circle );\n\t\t\t\t} else if ( $this.current_edit_record.geo_type_id == 10 && $this.current_edit_record.geo_polygon ) {\n\t\t\t\t\t$this._drawPolygon( $this.current_edit_record.geo_polygon );\n\t\t\t\t} else {\n\t\t\t\t\t$this.centerMap();\n\t\t\t\t}\n\n\t\t\t\t$this.current_edit_record.map_level = $this.map_control.getZoom();\n\n\t\t\t\t$this.collectUIDataToCurrentEditRecord();\n\t\t\t\t$this.setEditViewDataDone();\n\t\t\t}\n\t\t} );\n\t}\n\n\t_drawCircle( geo_circle ) {\n\t\tDebug.Text( 'drawing circle', 'GEOFenceViewController.js', 'GEOFenceViewController', '_drawCircle', 10 );\n\t\tvar layer = new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().Circle)( [parseFloat( geo_circle.center[0] ), parseFloat( geo_circle.center[1] )], parseFloat( geo_circle.radius ), {\n\t\t\tstroke: true,\n\t\t\tfill: true,\n\t\t\topacity: 0.8,\n\t\t\tweight: 2,\n\t\t\tcolor: this.current_edit_record.geo_color ? '#' + this.current_edit_record.geo_color : '#0F820F',\n\t\t\tfillOpacity: 0.25,\n\t\t\tfillColor: this.current_edit_record.geo_color ? '#' + this.current_edit_record.geo_color : '#0F820F'\n\t\t} );\n\t\tlayer.removable = true;\n\t\tlayer.addTo( this.drawnItems );//.bindPopup(this.current_edit_record.name,{closeButton:false, className:'polypopup'}).openPopup();\n\n\t\tif ( this.is_edit ) {\n\t\t\tlayer.editing.enable();\n\t\t} else {\n\t\t\tlayer.editing.disable();\n\t\t}\n\n\t\tthis.map_control.fitBounds( layer.getBounds(), { padding: [20, 20] } );\n\t\tthis.geo_layers.push( layer );\n\t\tvar $this = this;\n\n\t\tlayer.on( 'edit', function( e ) {\n\t\t\t$this._onShapeUpdate( e );\n\t\t} );\n\t}\n\n\t_drawPolygon( triangleCoords ) {\n\t\tDebug.Text( 'drawing polygon', 'GEOFenceViewController.js', 'GEOFenceViewController', '_drawPolygon', 10 );\n\t\tvar latlngs = _.map( triangleCoords, function( item ) {\n\t\t\treturn { lat: parseFloat( item[0] ), lng: parseFloat( item[1] ) };\n\t\t} );\n\n\t\tvar layer = new (leaflet__WEBPACK_IMPORTED_MODULE_0___default().Polygon)( triangleCoords, {\n\t\t\tstroke: true,\n\t\t\tfill: true,\n\t\t\topacity: 0.8,\n\t\t\tweight: 2,\n\t\t\tcolor: this.current_edit_record.geo_color ? '#' + this.current_edit_record.geo_color : '#0F820F',\n\t\t\tfillOpacity: 0.25,\n\t\t\tfillColor: this.current_edit_record.geo_color ? '#' + this.current_edit_record.geo_color : '#0F820F'\n\t\t} );\n\t\tlayer.removable = true;\n\n\t\tif ( this.is_edit ) {\n\t\t\tlayer.editing.enable();\n\t\t} else {\n\t\t\tlayer.editing.disable();\n\t\t}\n\n\t\tlayer.addTo( this.drawnItems );//.bindPopup(this.current_edit_record.name,{closeButton:false, className:'polypopup'}).openPopup();\n\n\t\tthis.map_control.fitBounds( layer.getBounds(), { padding: [20, 20] } );\n\t\tthis.geo_layers.push( layer );\n\t\tvar $this = this;\n\n\t\tlayer.on( 'edit', function( e ) {\n\t\t\t$this._onShapeUpdate( e );\n\t\t} );\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'name',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\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\tscript_name: 'EmployeeView',\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\tscript_name: 'EmployeeView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\n\t\t];\n\t}\n\n\tsetEditMenuMapIcon( context_btn ) {\n\n\t\tif ( Global.getProductEdition() <= 10 ) {\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\tsetDefaultMenuMapIcon( context_btn, grid_selected_length ) {\n\t\tif ( Global.getProductEdition() <= 10 ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length > 0 ) {\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\tsetEditViewDataDone() {\n\t\tthis.is_edit = true;\n\t\tsuper.setEditViewDataDone();\n\t\tvar $this = this;\n\t\tTTPromise.wait( null, null, function() {\n\t\t\t//set the color of the polygon at the start\n\t\t\tif ( $this.edit_view_ui_dic.geo_color ) {\n\t\t\t\t$this.drawControl.options.draw.polygon.shapeOptions.color = $this.edit_view_ui_dic.geo_color.val();\n\t\t\t\t$this.drawControl.options.draw.circle.shapeOptions.color = $this.edit_view_ui_dic.geo_color.val();\n\t\t\t}\n\n\t\t} );\n\t}\n\n\tonSaveAndContinue( ignoreWarning ) {\n\t\tthis.removeAllLayers();\n\t\tsuper.onSaveAndContinue();\n\t}\n\n\tsetNavigation() {\n\n\t\tvar $this = this;\n\n\t\t//Error: Unable to get value of the property 'getGridParam': object is null or undefined in /interface/html5/views/BaseViewController.js?v=8.0.0-20141230-103725 line 2575\n\t\tif ( !this.grid ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.navigation.setPossibleDisplayColumns( this.buildDisplayColumnsByColumnModel( this.grid.grid.getGridParam( 'colModel' ) ),\n\t\t\tthis.buildDisplayColumns( this.default_display_columns ) );\n\n\t\tthis.navigation.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\n\t\t\tvar key = target.getField();\n\t\t\tvar next_select_item_id = target.getValue();\n\n\t\t\tif ( !next_select_item_id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( next_select_item_id !== $this.current_edit_record.id ) {\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tTTPromise.add( 'Map', 'render' );\n\t\t\t\tif ( $this.is_viewing ) {\n\t\t\t\t\t$this.onViewClick( next_select_item_id ); //Dont refresh UI\n\t\t\t\t} else {\n\t\t\t\t\t$this.onEditClick( next_select_item_id ); //Dont refresh UI\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t//wait for map to render and prevent js exception from moving too fast.\n\t\t\tTTPromise.wait( 'Map', 'render', function() {\n\t\t\t\t$this.setNavigationArrowsEnabled();\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tgetGeoFenceTabHtml() {\n\t\treturn `<div id=\"tab_geo_fence\" class=\"edit-view-tab-outside\" style=\"height: 85%\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_geo_fence_content_div\">\n\t\t\t\t\t\t<div class=\"first-column full-width-column\"></div>\n\t\t\t\t\t\t<input id=\"pac-input\" class=\"controls\" type=\"text\" placeholder=\"Address Search\" autocomplete=\"new-password\"> \x3c!-- Use 'new-password' as it disables auto-complete when 'off' does not --\x3e\n\t\t\t\t\t\t<div id=\"suggestion-box\"></div>\n\t\t\t\t\t\t<div id=\"map_container\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzE5MS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNrQztBQUNVOztBQUU1QztBQUN3QjtBQUNGO0FBQzhCO0FBQ2U7QUFDbkU7O0FBRU87QUFDUCwyQkFBMkI7QUFDM0IsRUFBRSxDQUFDO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixDQUFDO0FBQzVCLDBCQUEwQixDQUFDO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsQ0FBQztBQUNkO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsZ0NBQWdDLCtCQUErQjtBQUMvRCw2QkFBNkIsQ0FBQztBQUM5Qjs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDLHFCQUFxQjtBQUN2RCw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTs7QUFFQSxnQ0FBZ0Msc0NBQXNDO0FBQ3RFLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2REFBNkQsQ0FBQzs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxZQUFZO0FBQ3BHOztBQUVBLGVBQWUsd0RBQVcsWUFBWSxpSkFBaUosTUFBTTtBQUM3TCxtQkFBbUIsbUNBQW1DLHdEQUFXLFlBQVksMkpBQTJKLEtBQUs7QUFDN08sS0FBSztBQUNMLDREQUE0RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDdEU7O0FBRUEsbUJBQW1CLDBEQUFXLFlBQVksZ0VBQWdFO0FBQzFHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUcsQ0FBQztBQUNKLHNCQUFzQixrREFBSyxzQkFBc0IsNkJBQTZCOztBQUU5RTs7QUFFQSx1QkFBdUI7QUFDdkIsSUFBSSw2REFBZ0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjs7QUFFQTs7QUFFQTs7QUFFQSx3QkFBd0IsNkRBQWM7QUFDdEM7QUFDQTs7QUFFQSx5QkFBeUIsNkRBQWM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixLQUFLO0FBQ0w7QUFDQSxxQkFBcUI7QUFDckIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0EsdUJBQXVCLHFFQUFzQjtBQUM3QztBQUNBLElBQUk7O0FBRUosdUJBQXVCLG1FQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFLENBQUM7QUFDSCxHQUFHLENBQUM7QUFDSixJQUFJOztBQUVKLEVBQUUsQ0FBQztBQUNIO0FBQ0EsSUFBSSxDQUFDO0FBQ0wsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwwRkFBeUI7QUFDL0I7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixzREFBc0Q7QUFDdEQ7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1EQUFtRCxlQUFlLHFDQUFxQztBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1Qiw2REFBYztBQUNyQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsdURBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxpQ0FBaUMsNENBQTRDLHlDQUF5Qzs7QUFFdEg7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLG1EQUFtRCxvQkFBb0I7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsQ0FBQztBQUNqQixZQUFZO0FBQ1osSUFBSTs7QUFFSixrQkFBa0Isd0RBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlDQUFpQyw0Q0FBNEMseUNBQXlDOztBQUV0SCxtREFBbUQsb0JBQW9CO0FBQ3ZFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxNQUFNO0FBQ04sK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3MvY29tcGFueS9nZW9fZmVuY2UvR0VPRmVuY2VWaWV3Q29udHJvbGxlci5qcz8zYzNlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENTU1xuaW1wb3J0ICdsZWFmbGV0L2Rpc3QvbGVhZmxldC5jc3MnO1xuaW1wb3J0ICdsZWFmbGV0LWRyYXcvZGlzdC9sZWFmbGV0LmRyYXcuY3NzJztcblxuLy8gSlNcbmltcG9ydCBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0ICdsZWFmbGV0LWRyYXcnO1xuaW1wb3J0ICdAL2dsb2JhbC93aWRnZXRzL2NvbG9yLXBpY2tlci9UQ29sb3JQaWNrZXInO1xuaW1wb3J0IHsgVFRNYXBIZWxwZXIgfSBmcm9tICdAL2ZyYW1ld29yay9sZWFmbGV0L2xlYWZsZXQtdGltZXRyZXgnO1xuLy8gTm90ZTogSWYgbWFya2VycyBhcmUgZXZlciB1c2VkIGluIEdlb0ZlbmNlIEVkaXRvci9WaWV3ZXIsIHRoZW4gc2VlIGltYWdlIGZpeCBpbiBsZWFmbGV0LXRpbWV0cmV4LiBodHRwczovL2dpdGh1Yi5jb20vTGVhZmxldC9MZWFmbGV0L2lzc3Vlcy80OTY4XG5cbmV4cG9ydCBjbGFzcyBHRU9GZW5jZVZpZXdDb250cm9sbGVyIGV4dGVuZHMgQmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHRlbDogJyNnZW9fZmVuY2Vfdmlld19jb250YWluZXInLFxuXG5cdFx0XHQvLyBfcmVxdWlyZWRfZmlsZXM6IHtcblx0XHRcdC8vIFx0MTU6IFsnbGVhZmxldC10aW1ldHJleCcsICdUQ29sb3JQaWNrZXInXVxuXHRcdFx0Ly8gfSxcblx0XHRcdHR5cGVfYXJyYXk6IG51bGwsXG5cblx0XHRcdGNvbXBhbnlfYXBpOiBudWxsLFxuXHRcdFx0ZHJhd0NvbnRyb2w6IG51bGwsXG5cdFx0XHRib3VuZHM6IG51bGwsXG5cdFx0XHRkcmF3bkl0ZW1zOiBudWxsLFxuXHRcdFx0c2VhcmNoX2tleV9kZWxheTogMCxcblx0XHRcdHN0YXJ0X2Nvb3JkaW5hdGVzOiBudWxsLFxuXHRcdFx0bWFwX2h0bWxfaWQ6IG51bGxcblx0XHR9ICk7XG5cblx0XHRzdXBlciggb3B0aW9ucyApO1xuXHR9XG5cblx0aW5pdCgpIHtcblx0XHQvL3RoaXMuX3N1cGVyKCdpbml0aWFsaXplJyApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RwbCA9ICdHRU9GZW5jZUVkaXRWaWV3Lmh0bWwnO1xuXHRcdHRoaXMucGVybWlzc2lvbl9pZCA9ICdnZW9fZmVuY2UnO1xuXHRcdHRoaXMudmlld0lkID0gJ0dFT0ZlbmNlJztcblx0XHR0aGlzLnNjcmlwdF9uYW1lID0gJ0dFT0ZlbmNlVmlldyc7XG5cdFx0dGhpcy50YWJsZV9uYW1lX2tleSA9ICdnZW9fZmVuY2UnO1xuXHRcdHRoaXMuY29udGV4dF9tZW51X25hbWUgPSAkLmkxOG4uXyggJ0dFTyBGZW5jZScgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ0dFTyBGZW5jZScgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSUdFT0ZlbmNlO1xuXHRcdHRoaXMuY29tcGFueV9hcGkgPSBUVEFQSS5BUElDb21wYW55O1xuXG5cdFx0aWYgKCB0aGlzLm1hcCApIHtcblx0XHRcdGRlbGV0ZSAoIHRoaXMubWFwICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTtcblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRncm91cHM6IHtcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnTWFwJyApLFxuXHRcdFx0XHRcdGlkOiB0aGlzLnZpZXdJZCArICdOYXZpZ2F0aW9uJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZXhjbHVkZTogWydleHBvcnRfZXhjZWwnLCAnbWFzc19lZGl0J10sXG5cdFx0XHRpbmNsdWRlOiBbe1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdNYXAnICksXG5cdFx0XHRcdGlkOiAnbWFwJyxcblx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0Z3JvdXA6ICdtYXAnLFxuXHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tbWFwX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRzb3J0X29yZGVyOiA4MDAwLFxuXHRcdFx0fV1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIGNvbnRleHRfbWVudV9tb2RlbDtcblx0fVxuXG5cdG9uQ3VzdG9tQ29udGV4dENsaWNrKCBpZCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ21hcCc6XG5cdFx0XHRcdHRoaXMub25NYXBDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRvblNhdmVBbmRDb250aW51ZUNsaWNrKCkge1xuXHRcdHN1cGVyLm9uU2F2ZUFuZENvbnRpbnVlQ2xpY2soKTtcblx0fVxuXG5cdG9uTWFwQ2xpY2soKSB7XG5cdFx0Ly8gb25seSB0cmlnZ2VyIG1hcCBsb2FkIGluIHNwZWNpZmljIHByb2R1Y3QgZWRpdGlvbnMuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkgKSB7XG5cdFx0XHR2YXIgZ2VvX2ZlbmNlcztcblx0XHRcdGlmICggdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdFx0XHRcdGdlb19mZW5jZXMgPSBbdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkXTtcblx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRnZW9fZmVuY2VzID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRnZW9fZmVuY2VzID0gdGhpcy5ncmlkLmdldEdyaWRQYXJhbSggJ2RhdGEnICk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDdXJyZW50bHkgbm90IGRvaW5nIHByZS1wcm9jZXNzaW5nIGZvciBnZW9mZW5jZXMsIGhhbmRsaW5nIHRoaXMgZGlyZWN0bHkgaW4gTWFwVmlld0NvbnRyb2xsZXJcblx0XHRcdC8vIHZhciBwcm9jZXNzZWRfZGF0YV9mb3JfbWFwID0gVFRNYXBMaWIuVFRDb252ZXJ0TWFwRGF0YS5wcm9jZXNzQmFzaWNGcm9tR2VuZXJpY1ZpZXdDb250cm9sbGVyKGdlb19mZW5jZXMpO1xuXHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5vcGVuRWRpdFZpZXcoIHRoaXMsICdNYXAnLCBnZW9fZmVuY2VzICk7XG5cdFx0fVxuXHR9XG5cblx0b25BZGRDbGljaygpIHtcblx0XHRUVFByb21pc2UuYWRkKCAnaW5pdCcsICdpbml0JyApO1xuXHRcdHN1cGVyLm9uQWRkQ2xpY2soKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0VFRQcm9taXNlLndhaXQoICdpbml0JywgJ2luaXQnLCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2xlYXIgdGhlIG9sZCByZWNvcmQgdG8gcHJldmVudCBkdXBsaWNhdGlvbiBvbiBpbnNlcnRpbmcgYW4gZW1wdHkgZ2VvZmVuY2UgcmVjb3JkLiBTZWUgIzIxMzFcblx0XHRcdCR0aGlzLl9zZWxlY3RlZFNoYXBlID0gZmFsc2U7XG5cdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0ge307XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluICR0aGlzLmVkaXRfdmlld191aV9kaWMgKSB7XG5cdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS5zZXRWYWx1ZSggJycgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhJHRoaXMubWFwX2NvbnRyb2wgKSB7XG5cdFx0XHRcdCR0aGlzLl9pbml0TGVhZmxldE1hcCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5tYXBfY29udHJvbC5zZXRWaWV3KCAkdGhpcy5zdGFydF9jb29yZGluYXRlcywgMTAgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCkge1xuXHRcdHZhciBjb2x1bW5fZmlsdGVyID0ge307XG5cdFx0Y29sdW1uX2ZpbHRlci5pc19vd25lciA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5pZCA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5pc19jaGlsZCA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5pbl91c2UgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZmlyc3RfbmFtZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5sYXN0X25hbWUgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZ2VvX2NpcmNsZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5nZW9fY29sb3IgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZ2VvX3BvbHlnb24gPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZ2VvX3R5cGVfaWQgPSB0cnVlO1xuXG5cdFx0Ly8gRXJyb3I6IFVuYWJsZSB0byBnZXQgcHJvcGVydHkgJ2dldEdyaWRQYXJhbScgb2YgdW5kZWZpbmVkIG9yIG51bGwgcmVmZXJlbmNlXG5cdFx0dmFyIGRpc3BsYXlfY29sdW1ucyA9IFtdO1xuXHRcdGlmICggdGhpcy5ncmlkICkge1xuXHRcdFx0ZGlzcGxheV9jb2x1bW5zID0gdGhpcy5ncmlkLmdldEdyaWRQYXJhbSggJ2NvbE1vZGVsJyApO1xuXHRcdH1cblx0XHQvL0ZpeGVkIHBvc3NpYmxlIGV4Y2VwdGlvbiAtLSBFcnJvcjogVW5hYmxlIHRvIGdldCBwcm9wZXJ0eSAnbGVuZ3RoJyBvZiB1bmRlZmluZWQgb3IgbnVsbCByZWZlcmVuY2UgaW4gL2ludGVyZmFjZS9odG1sNS92aWV3cy9CYXNlVmlld0NvbnRyb2xsZXIuanM/dj03LjQuMy0yMDE0MDkyNC0wOTAxMjkgbGluZSA1MDMxXG5cdFx0aWYgKCBkaXNwbGF5X2NvbHVtbnMgKSB7XG5cdFx0XHR2YXIgbGVuID0gZGlzcGxheV9jb2x1bW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdHZhciBjb2x1bW5faW5mbyA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblx0XHRcdFx0Y29sdW1uX2ZpbHRlcltjb2x1bW5faW5mby5uYW1lXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbl9maWx0ZXI7XG5cdH1cblxuXHRidWlsZEVkaXRWaWV3VUkoKSB7XG5cblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHRhYl9tb2RlbCA9IHtcblx0XHRcdCd0YWJfZ2VvX2ZlbmNlJzoge1xuXHRcdFx0XHQnbGFiZWwnOiAkLmkxOG4uXyggJ0dFTyBGZW5jZScgKSxcblx0XHRcdFx0J2h0bWxfdGVtcGxhdGUnOiB0aGlzLmdldEdlb0ZlbmNlVGFiSHRtbCgpXG5cdFx0XHR9LFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUdFT0ZlbmNlLFxuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2dlb19mZW5jZScsXG5cdFx0XHRuYXZpZ2F0aW9uX21vZGU6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR0aGlzLnNldE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfZ2VvX2ZlbmNlID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2dlb19mZW5jZScgKTtcblxuXHRcdHZhciB0YWJfZ2VvX2ZlbmNlX2NvbHVtbjEgPSB0YWJfZ2VvX2ZlbmNlLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXSA9IFtdO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXS5wdXNoKCB0YWJfZ2VvX2ZlbmNlX2NvbHVtbjEgKTtcblxuXHRcdC8vIE5hbWVcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6ICcxMDAlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9nZW9fZmVuY2VfY29sdW1uMSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5wYXJlbnQoKS53aWR0aCggJzQ1JScgKTtcblxuXHRcdC8vQ29sb3Jcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTE9SX1BJQ0tFUiApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29sb3JQaWNrZXIoIHsgZmllbGQ6ICdnZW9fY29sb3InIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NvbG9yJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9nZW9fZmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gRGVzY3JpcHRpb25cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCB3aWR0aDogJzEwMCUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Rlc2NyaXB0aW9uJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9nZW9fZmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXG5cdFx0dGhpcy5faW5pdExlYWZsZXRNYXAoKTtcblx0fVxuXG5cdF9pbml0TGVhZmxldE1hcCgpIHtcblx0XHR0aGlzLm5lZWVkX3NhdmVfcHVuY2hlc19kaWMgPSB7fTtcblx0XHR0aGlzLmxheWVycyA9IFtdO1xuXHRcdHRoaXMubGluZV9sYXllcnMgPSBbXTtcblx0XHR0aGlzLmNpcmNsZV9sYXllcnMgPSBbXTtcblx0XHR0aGlzLmRpcmVjdGlvbnNfZGlzcGxheXMgPSBbXTtcblx0XHR0aGlzLmluZm9fcGFuZWxfZGljID0ge307XG5cdFx0dGhpcy5nZW9fbGF5ZXJzID0gW107XG5cdFx0Ly9pbml0IG1hcFxuXG5cdFx0aWYgKCAhdGhpcy5tYXBfY29udHJvbCB8fCB0aGlzLm1hcF9jb250cm9sID09IHVuZGVmaW5lZCB8fCAkKCAnI3RhYl9nZW9fZmVuY2U6dmlzaWJsZSAjbWFwX2NvbnRhaW5lciBkaXYuZ29vZ2xlLW1hcCcgKVswXSA9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsYXllcnM7XG5cdFx0XHR2YXIgbWFwX2xheWVycztcblx0XHRcdGlmICggQVBJR2xvYmFsLnByZV9sb2dpbl9kYXRhLm1hcF9wcm92aWRlciAmJiBBUElHbG9iYWwucHJlX2xvZ2luX2RhdGEubWFwX3Byb3ZpZGVyID09ICdtYXBib3gnICkge1xuXHRcdFx0XHR2YXIgb3NtVXJsID0gJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxL3tpZH0vdGlsZXMve3p9L3t4fS97eX0/YWNjZXNzX3Rva2VuPXthY2Nlc3NUb2tlbn0nO1xuXHRcdFx0XHR2YXIgb3NtQXR0cmliID0gJ8KpIDxhIGhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL2Fib3V0L21hcHMvXCI+TWFwYm94PC9hPiDCqSA8YSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiA8c3Ryb25nPjxhIGhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay9cIiB0YXJnZXQ9XCJfYmxhbmtcIj5JbXByb3ZlIHRoaXMgbWFwPC9hPjwvc3Ryb25nPic7XG5cblx0XHRcdFx0bGF5ZXJzID0gWyBMLnRpbGVMYXllciggb3NtVXJsLCB7IGF0dHJpYnV0aW9uOiBvc21BdHRyaWIsIHRpbGVTaXplOiA1MTIsIG1heFpvb206IDE4LCB6b29tT2Zmc2V0OiAtMSwgaWQ6ICdtYXBib3gvc3RyZWV0cy12MTEnLCBhY2Nlc3NUb2tlbjogQVBJR2xvYmFsLnByZV9sb2dpbl9kYXRhLm1hcF9hcGlfa2V5IH0pLCBdOyAvL1N0cmVldCBNYXBzXG5cdFx0XHRcdG1hcF9sYXllcnMgPSB7ICdTdHJlZXRzJzogbGF5ZXJzWzBdLCAnU2F0ZWxsaXRlJzogTC50aWxlTGF5ZXIoIG9zbVVybCwgeyBhdHRyaWJ1dGlvbjogb3NtQXR0cmliLCB0aWxlU2l6ZTogNTEyLCBtYXhab29tOiAxOCwgem9vbU9mZnNldDogLTEsIGlkOiAnbWFwYm94L3NhdGVsbGl0ZS1zdHJlZXRzLXYxMScsIGFjY2Vzc1Rva2VuOiBBUElHbG9iYWwucHJlX2xvZ2luX2RhdGEubWFwX2FwaV9rZXkgfSkgfTsgLy9TdHJlZXQrU2F0ZWxsaXRlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgb3NtVXJsID0gQVBJR2xvYmFsLnByZV9sb2dpbl9kYXRhLm1hcF90aWxlX3VybCArICcve3p9L3t4fS97eX0ucG5nP3R0X2tleT0nICsgQVBJR2xvYmFsLnByZV9sb2dpbl9kYXRhLnJlZ2lzdHJhdGlvbl9rZXk7XG5cdFx0XHRcdHZhciBvc21BdHRyaWIgPSAnTWFwIGRhdGEgYnkgwqk8YSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPi4nO1xuXG5cdFx0XHRcdGxheWVycyA9IFsgbmV3IEwuVGlsZUxheWVyKCBvc21VcmwsIHsgbWluWm9vbTogMywgbWF4Wm9vbTogMTgsIGF0dHJpYnV0aW9uOiBvc21BdHRyaWIsIG5vV3JhcDogdHJ1ZSB9ICkgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly9Bdm9pZCBtYXAgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBqcyBleGNlcHRpb24gYnkgZHluYW1pY2FsbHkgYXR0YWNoaW5nIHRoZSBtYXAgZWxlbWVudC5cblx0XHRcdC8vIGlmICh0aGlzLm1hcF9odG1sX2lkICYmICQoJyMnICsgdGhpcy5tYXBfaHRtbF9pZCkubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gXHQkKCAnI3RhYl9nZW9fZmVuY2U6dmlzaWJsZSAjbWFwX2NvbnRhaW5lciAjJyArIHRoaXMubWFwX2h0bWxfaWQgKS5vZmYoKTtcblx0XHRcdC8vIFx0RGVidWcuVGV4dCgnUmVtb3ZlZCBMbWFwIGlkOiAnICsgdGhpcy5tYXBfaHRtbF9pZCwgJ0dFT0ZlbmNlVmlld0NvbnRyb2xsZXIuanMnLCAnR0VPRmVuY2VWaWV3Q29udHJvbGxlcicsICdfaW5pdExlYWZsZXRNYXAnLCAxMCk7XG5cdFx0XHQvLyB9XG5cblx0XHRcdHRoaXMubWFwX2h0bWxfaWQgPSAnbWFwXycgKyAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCk7XG5cdFx0XHREZWJ1Zy5UZXh0KCAnTmV3IExtYXAgaWQ6ICcgKyB0aGlzLm1hcF9odG1sX2lkLCAnR0VPRmVuY2VWaWV3Q29udHJvbGxlci5qcycsICdHRU9GZW5jZVZpZXdDb250cm9sbGVyJywgJ19pbml0TGVhZmxldE1hcCcsIDEwICk7XG5cblx0XHRcdC8vYXBwZW5kIHRoZSBtYXAgZWxlbWVudCwgdXNlIHRoZW4gdG8gZW5zdXJlIGl0J3MgY29tcGxldGUgYmVmb3JlIGluaXRpYWxsaXppbmcgdGhlIG1hcC5cblx0XHRcdCQoICcjdGFiX2dlb19mZW5jZTp2aXNpYmxlICNtYXBfY29udGFpbmVyJyApLmh0bWwoICc8ZGl2IGlkPVwiJyArIHRoaXMubWFwX2h0bWxfaWQgKyAnXCIgY2xhc3M9XCJnb29nbGUtbWFwXCI+PC9kaXY+JyApO1xuXHRcdFx0dGhpcy5tYXBfY29udHJvbCA9IEwubWFwKCB0aGlzLm1hcF9odG1sX2lkLCB7IGxheWVyczogbGF5ZXJzLCBtaW5ab29tOiAyIH0gKTtcblxuXHRcdFx0RGVidWcuQXJyKCB0aGlzLm1hcF9jb250cm9sLCAnTG1hcCB2YXInLCAnR0VPRmVuY2VWaWV3Q29udHJvbGxlci5qcycsICdHRU9GZW5jZVZpZXdDb250cm9sbGVyJywgJ19pbml0TGVhZmxldE1hcCcsIDEwICk7XG5cblx0XHRcdGlmICggbWFwX2xheWVycyApIHsgLy9BZGQgYW55IFN0cmVldC9TYXRlbGxpdGUgbGF5ZXJzIHRvIHRoZSBtYXAgaWYgdGhleSBhcmUgc3BlY2lmaWVkLlxuXHRcdFx0XHRMLmNvbnRyb2wubGF5ZXJzKCBtYXBfbGF5ZXJzICkuYWRkVG8oIHRoaXMubWFwX2NvbnRyb2wgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsYXllcnNbMF0ub24oICdsb2FkJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRUVFByb21pc2UucmVzb2x2ZSggJ01hcCcsICdyZW5kZXInICk7XG5cdFx0fSApO1xuXG5cdFx0Ly90aGlzLm1hcF9jb250cm9sLmFkZExheWVyKCBsYXllcnNbMF0gKTtcblxuXHRcdHRoaXMuc3RhcnRfY29vcmRpbmF0ZXMgPSB0aGlzLnN0YXJ0TWFwQ29vcmRpbmF0ZXMoKTtcblxuXHRcdHRoaXMubWFwX2NvbnRyb2wuc2V0VmlldyggdGhpcy5zdGFydF9jb29yZGluYXRlcywgMTAgKTtcblxuXHRcdHRoaXMuZHJhd25JdGVtcyA9IG5ldyBMLkZlYXR1cmVHcm91cCgpO1xuXHRcdHRoaXMuZHJhd25JdGVtcy5kb19ub3RfY2xlYXIgPSB0cnVlO1xuXHRcdHRoaXMubWFwX2NvbnRyb2wuYWRkTGF5ZXIoIHRoaXMuZHJhd25JdGVtcyApO1xuXG5cdFx0dGhpcy5kcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdygge1xuXHRcdFx0ZWRpdDoge1xuXHRcdFx0XHRmZWF0dXJlR3JvdXA6IHRoaXMuZHJhd25JdGVtcyxcblx0XHRcdFx0ZWRpdDogZmFsc2UsXG5cdFx0XHRcdHJlbW92ZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRkcmF3OiB7XG5cdFx0XHRcdHBvbHlnb246IHtcblx0XHRcdFx0XHRzaGFwZU9wdGlvbnM6IHsgY29sb3I6ICcjMEY4MjBGJyB9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNpcmNsZToge1xuXHRcdFx0XHRcdHNoYXBlT3B0aW9uczogeyBjb2xvcjogJyMwRjgyMEYnIH1cblx0XHRcdFx0fSxcblx0XHRcdFx0cG9seWxpbmU6IGZhbHNlLFxuXHRcdFx0XHRyZWN0YW5nbGU6IGZhbHNlLFxuXHRcdFx0XHRtYXJrZXI6IGZhbHNlLFxuXHRcdFx0XHRjaXJjbGVtYXJrZXI6IGZhbHNlXG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0dGhpcy5tYXBfY29udHJvbC5hZGRDb250cm9sKCB0aGlzLmRyYXdDb250cm9sICk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMubWFwX2NvbnRyb2wub24oIEwuRHJhdy5FdmVudC5EUkFXU1RBUlQsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0JHRoaXMucmVtb3ZlQWxsTGF5ZXJzKCk7XG5cdFx0fSApO1xuXG5cdFx0dGhpcy5tYXBfY29udHJvbC5vbiggTC5EcmF3LkV2ZW50LkNSRUFURUQsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0dmFyIHR5cGUgPSBlLmxheWVyVHlwZSxcblx0XHRcdFx0bmV3X2xheWVyID0gZS5sYXllcjtcblx0XHRcdG5ld19sYXllci5lZGl0YWJsZSA9IHRydWU7XG5cdFx0XHRuZXdfbGF5ZXIucmVtb3ZhYmxlID0gdHJ1ZTtcblxuXHRcdFx0JHRoaXMucmVtb3ZlQWxsTGF5ZXJzKCk7XG5cdFx0XHQkdGhpcy5fc2VsZWN0ZWRTaGFwZSA9IG5ld19sYXllcjtcblx0XHRcdCR0aGlzLmRyYXduSXRlbXMuYWRkTGF5ZXIoIG5ld19sYXllciApO1xuXHRcdFx0bmV3X2xheWVyLmVkaXRpbmcuZW5hYmxlKCk7XG5cdFx0XHQkdGhpcy5pc19jaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdCR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0XHQkdGhpcy52YWxpZGF0ZSgpO1xuXHRcdH0gKTtcblxuXHRcdHRoaXMuX2luaXRTZWFyY2hCb3goKTtcblx0fVxuXG5cdF9vblNoYXBlVXBkYXRlKCBlICkge1xuXHRcdHZhciBlZGl0X2xheWVyID0gZS50YXJnZXQ7XG5cdFx0ZWRpdF9sYXllci5lZGl0YWJsZSA9IHRydWU7XG5cdFx0ZWRpdF9sYXllci5yZW1vdmFibGUgPSB0cnVlO1xuXHRcdHRoaXMuX3NlbGVjdGVkU2hhcGUgPSBlZGl0X2xheWVyO1xuXHRcdHRoaXMuZHJhd25JdGVtcy5hZGRMYXllciggZWRpdF9sYXllciApO1xuXHRcdGVkaXRfbGF5ZXIuZWRpdGluZy5lbmFibGUoKTtcblx0XHR0aGlzLmlzX2NoYW5nZWQgPSB0cnVlO1xuXHRcdHRoaXMuc2V0RWRpdE1lbnUoKTtcblx0fVxuXG5cdHJlbW92ZUFsbExheWVycygpIHtcblx0XHRmb3IgKCB2YXIgbGF5ZXIgaW4gdGhpcy5kcmF3bkl0ZW1zLl9sYXllcnMgKSB7XG5cdFx0XHRpZiAoIHRoaXMuZHJhd25JdGVtcy5fbGF5ZXJzW2xheWVyXS5yZW1vdmFibGUgPT0gdHJ1ZSApIHtcblx0XHRcdFx0dHJ5IHsgLy90cnkgbmVlZGVkIGZvciBpbnRlcm1pdHRlbnQgbG93LWxldmVsIG5vbi1ibG9ja2luZyBlcnJvciB3aGVuIHVzZXJzIG5hdmlnYXRlIGZhc3RlciB0aGFuIGxlYWZsZXQgY2FuIGRyYXdcblx0XHRcdFx0XHR0aGlzLmRyYXduSXRlbXMucmVtb3ZlTGF5ZXIoIHRoaXMuZHJhd25JdGVtcy5fbGF5ZXJzW2xheWVyXSApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHREZWJ1Zy5UZXh0KCBlLm1lc3NhZ2UsICdHZW9GZW5jZUNvbnRyb2xsZXIuanMnLCAnR2VvRmVuY2VDb250cm9sbGVyJywgJ0dlb0ZlbmNlQ29udHJvbGxlcicsIDEwICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0c3VwZXIub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICk7XG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdGlmICgga2V5ID09ICdnZW9fY29sb3InICkge1xuXHRcdFx0dGhpcy5kcmF3Q29udHJvbC5vcHRpb25zLmRyYXcucG9seWdvbi5zaGFwZU9wdGlvbnMuY29sb3IgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS52YWwoKTtcblx0XHRcdHRoaXMuZHJhd0NvbnRyb2wub3B0aW9ucy5kcmF3LmNpcmNsZS5zaGFwZU9wdGlvbnMuY29sb3IgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS52YWwoKTtcblxuXHRcdFx0Zm9yICggdmFyIGxheWVyIGluIHRoaXMuZHJhd25JdGVtcy5fbGF5ZXJzICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuZHJhd25JdGVtcy5fbGF5ZXJzW2xheWVyXS5pc19zZWFyY2hfbWFya2VyID09PSB1bmRlZmluZWQgKSB7IC8vIE9ubHkgY2hhbmdlIHRoZSBjb2xvdXJzIGZvciBsYXllcnMgdGhhdCBhcmUgbm90IGEgc2VhcmNoIG1hcmtlci4gT3RoZXJ3aXNlIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igd2hlbiBjaGFuZ2luZyBjb2xvdXJzIGFmdGVyIGEgc2VhcmNoLlxuXHRcdFx0XHRcdHRoaXMuZHJhd25JdGVtcy5fbGF5ZXJzW2xheWVyXS5zZXRTdHlsZSgge1xuXHRcdFx0XHRcdFx0ZmlsbENvbG9yOiB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS52YWwoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS52YWwoKVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9pbml0U2VhcmNoQm94KCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0JCggJyNwYWMtaW5wdXQnICkuYmluZCggJ2ZvY3VzJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHQkKCB0aGlzICkuc2VsZWN0KCk7XG5cdFx0fSApO1xuXG5cdFx0JCggJyNwYWMtaW5wdXQnICkuYmluZCggJ2tleXVwJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRpZiAoIGUua2V5Q29kZSA9PSAxMyApIHtcblx0XHRcdFx0JCggJyNzdWdnZXN0aW9uLWJveCBkaXYnICkuZmlyc3QoKS5jbGljaygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuc2VhcmNoX2tleV9kZWxheSA9IHBhcnNlSW50KCBEYXRlLm5vdygpICk7XG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHBhcnNlSW50KCBEYXRlLm5vdygpICkgLSAkdGhpcy5zZWFyY2hfa2V5X2RlbGF5ID49IDI1MCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnN0b3Bfc3VnZ2VzdGlvbnMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFRUTWFwSGVscGVyLnNlYXJjaFN1Z2dlc3QoICR0aGlzLCB0cnVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCAzMDAgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRzYXZlTGF5b3V0KCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy51c2VyX2dlbmVyaWNfZGF0YV9hcGkuc2V0VXNlckdlbmVyaWNEYXRhKCB0aGlzLnNlbGVjdF9sYXlvdXQsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdGlmICggVFRVVUlELmlzVVVJRCggcmVzdWx0X2RhdGEgKSAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQuemVyb19pZCAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2VsZWN0X2xheW91dC5pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGNlbnRlck1hcCgpIHtcblx0XHR0aGlzLm1hcF9jb250cm9sLnBhblRvKCB0aGlzLnN0YXJ0X2Nvb3JkaW5hdGVzICk7XG5cdH1cblxuXHR1bmlmb3JtVmFyaWFibGUoIHJlY29yZCApIHtcblx0XHRyZWNvcmQuZ2VvX2NpcmNsZSA9IGZhbHNlO1xuXHRcdHJlY29yZC5nZW9fdHlwZV9pZCA9IDEwOyAvLyBkZWZhdWx0IHRvIGNpcmNsZSBwcmV2ZW50IFwiSW5jb3JyZWN0IEdFTyB0eXBlXCIgZXhjZXB0aW9uIHRyaWdnZXJlZC5cblx0XHRyZWNvcmQubWFwX2xldmVsID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLl9zZWxlY3RlZFNoYXBlICYmIHRoaXMuX3NlbGVjdGVkU2hhcGUuX3JhZGl1cyAhPSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZWNvcmQuZ2VvX2NpcmNsZSA9IHt9O1xuXHRcdFx0cmVjb3JkLmdlb19jaXJjbGUuY2VudGVyID0gW3RoaXMuX3NlbGVjdGVkU2hhcGUuZ2V0TGF0TG5nKCkubGF0LCB0aGlzLl9zZWxlY3RlZFNoYXBlLmdldExhdExuZygpLmxuZ107XG5cdFx0XHRyZWNvcmQuZ2VvX2NpcmNsZS5yYWRpdXMgPSB0aGlzLl9zZWxlY3RlZFNoYXBlLl9tUmFkaXVzO1xuXHRcdFx0cmVjb3JkLmdlb190eXBlX2lkID0gMjA7XG5cdFx0XHRyZWNvcmQubWFwX2xldmVsID0gdGhpcy5tYXBfY29udHJvbC5nZXRab29tKCk7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5fc2VsZWN0ZWRTaGFwZSApIHtcblx0XHRcdHZhciBsYXRsbmdzID0gdGhpcy5fc2VsZWN0ZWRTaGFwZS5nZXRMYXRMbmdzKClbMF07IC8vZ2V0UGF0aHMoKS5nZXRBdCggMCApLmdldEFycmF5KCk7XG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxhdGxuZ3MubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGFycmF5LnB1c2goIFtsYXRsbmdzW2ldLmxhdCwgbGF0bG5nc1tpXS5sbmddICk7XG5cdFx0XHR9XG5cdFx0XHRyZWNvcmQuZ2VvX3BvbHlnb24gPSBhcnJheTtcblx0XHRcdHJlY29yZC5nZW9fdHlwZV9pZCA9IDEwO1xuXHRcdFx0cmVjb3JkLm1hcF9sZXZlbCA9IHRoaXMubWFwX2NvbnRyb2wuZ2V0Wm9vbSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVjb3JkO1xuXHR9XG5cblx0c2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy51c2VyX2dlbmVyaWNfZGF0YV9hcGkuZ2V0VXNlckdlbmVyaWNEYXRhKCB7IGZpbHRlcl9kYXRhOiB7IHNjcmlwdDogJ01hcFZpZXcnLCBkZWxldGVkOiBmYWxzZSB9IH0sIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0cy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0aWYgKCByZXN1bHRfZGF0YSAmJiByZXN1bHRfZGF0YS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdCR0aGlzLnNlbGVjdF9sYXlvdXQgPSByZXN1bHRfZGF0YVswXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkdGhpcy5zZWxlY3RfbGF5b3V0ID0ge1xuXHRcdFx0XHRcdFx0c2NyaXB0OiAnTWFwVmlldycsXG5cdFx0XHRcdFx0XHRpc19kZWZhdWx0OiBmYWxzZSxcblx0XHRcdFx0XHRcdG5hbWU6IEdsb2JhbC5kZWZhdWx0X2l0ZW0sXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcl9jb25uZWN0aW9uX3R5cGU6ICdMSU5FJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9TZXQgY3VycmVudCBlZGl0IHJlY29yZCBkYXRhIHRvIGFsbCB3aWRnZXRzXG5cdFx0XHRcdC8vJHRoaXMuX3NlbGVjdGVkU2hhcGUgJiYgJHRoaXMuX2RlbGV0ZVNlbGVjdFNoYXBlKCk7XG5cdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdFx0XHRpZiAoICEkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgd2lkZ2V0ID0gJHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQgKSApIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggJHRoaXMuZHJhd25JdGVtcyApIHtcblx0XHRcdFx0XHQkdGhpcy5yZW1vdmVBbGxMYXllcnMoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLmJvdW5kcyA9IG5ldyBMLkxhdExuZ0JvdW5kcygpO1xuXHRcdFx0XHRpZiAoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZ2VvX3R5cGVfaWQgPT0gMjAgJiYgJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fY2lyY2xlICkge1xuXHRcdFx0XHRcdCR0aGlzLl9kcmF3Q2lyY2xlKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmdlb19jaXJjbGUgKTtcblx0XHRcdFx0fSBlbHNlIGlmICggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fdHlwZV9pZCA9PSAxMCAmJiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmdlb19wb2x5Z29uICkge1xuXHRcdFx0XHRcdCR0aGlzLl9kcmF3UG9seWdvbiggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fcG9seWdvbiApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCR0aGlzLmNlbnRlck1hcCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tYXBfbGV2ZWwgPSAkdGhpcy5tYXBfY29udHJvbC5nZXRab29tKCk7XG5cblx0XHRcdFx0JHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHRcdFx0JHRoaXMuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdF9kcmF3Q2lyY2xlKCBnZW9fY2lyY2xlICkge1xuXHRcdERlYnVnLlRleHQoICdkcmF3aW5nIGNpcmNsZScsICdHRU9GZW5jZVZpZXdDb250cm9sbGVyLmpzJywgJ0dFT0ZlbmNlVmlld0NvbnRyb2xsZXInLCAnX2RyYXdDaXJjbGUnLCAxMCApO1xuXHRcdHZhciBsYXllciA9IG5ldyBMLkNpcmNsZSggW3BhcnNlRmxvYXQoIGdlb19jaXJjbGUuY2VudGVyWzBdICksIHBhcnNlRmxvYXQoIGdlb19jaXJjbGUuY2VudGVyWzFdICldLCBwYXJzZUZsb2F0KCBnZW9fY2lyY2xlLnJhZGl1cyApLCB7XG5cdFx0XHRzdHJva2U6IHRydWUsXG5cdFx0XHRmaWxsOiB0cnVlLFxuXHRcdFx0b3BhY2l0eTogMC44LFxuXHRcdFx0d2VpZ2h0OiAyLFxuXHRcdFx0Y29sb3I6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fY29sb3IgPyAnIycgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZ2VvX2NvbG9yIDogJyMwRjgyMEYnLFxuXHRcdFx0ZmlsbE9wYWNpdHk6IDAuMjUsXG5cdFx0XHRmaWxsQ29sb3I6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fY29sb3IgPyAnIycgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZ2VvX2NvbG9yIDogJyMwRjgyMEYnXG5cdFx0fSApO1xuXHRcdGxheWVyLnJlbW92YWJsZSA9IHRydWU7XG5cdFx0bGF5ZXIuYWRkVG8oIHRoaXMuZHJhd25JdGVtcyApOy8vLmJpbmRQb3B1cCh0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubmFtZSx7Y2xvc2VCdXR0b246ZmFsc2UsIGNsYXNzTmFtZToncG9seXBvcHVwJ30pLm9wZW5Qb3B1cCgpO1xuXG5cdFx0aWYgKCB0aGlzLmlzX2VkaXQgKSB7XG5cdFx0XHRsYXllci5lZGl0aW5nLmVuYWJsZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsYXllci5lZGl0aW5nLmRpc2FibGUoKTtcblx0XHR9XG5cblx0XHR0aGlzLm1hcF9jb250cm9sLmZpdEJvdW5kcyggbGF5ZXIuZ2V0Qm91bmRzKCksIHsgcGFkZGluZzogWzIwLCAyMF0gfSApO1xuXHRcdHRoaXMuZ2VvX2xheWVycy5wdXNoKCBsYXllciApO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRsYXllci5vbiggJ2VkaXQnLCBmdW5jdGlvbiggZSApIHtcblx0XHRcdCR0aGlzLl9vblNoYXBlVXBkYXRlKCBlICk7XG5cdFx0fSApO1xuXHR9XG5cblx0X2RyYXdQb2x5Z29uKCB0cmlhbmdsZUNvb3JkcyApIHtcblx0XHREZWJ1Zy5UZXh0KCAnZHJhd2luZyBwb2x5Z29uJywgJ0dFT0ZlbmNlVmlld0NvbnRyb2xsZXIuanMnLCAnR0VPRmVuY2VWaWV3Q29udHJvbGxlcicsICdfZHJhd1BvbHlnb24nLCAxMCApO1xuXHRcdHZhciBsYXRsbmdzID0gXy5tYXAoIHRyaWFuZ2xlQ29vcmRzLCBmdW5jdGlvbiggaXRlbSApIHtcblx0XHRcdHJldHVybiB7IGxhdDogcGFyc2VGbG9hdCggaXRlbVswXSApLCBsbmc6IHBhcnNlRmxvYXQoIGl0ZW1bMV0gKSB9O1xuXHRcdH0gKTtcblxuXHRcdHZhciBsYXllciA9IG5ldyBMLlBvbHlnb24oIHRyaWFuZ2xlQ29vcmRzLCB7XG5cdFx0XHRzdHJva2U6IHRydWUsXG5cdFx0XHRmaWxsOiB0cnVlLFxuXHRcdFx0b3BhY2l0eTogMC44LFxuXHRcdFx0d2VpZ2h0OiAyLFxuXHRcdFx0Y29sb3I6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fY29sb3IgPyAnIycgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZ2VvX2NvbG9yIDogJyMwRjgyMEYnLFxuXHRcdFx0ZmlsbE9wYWNpdHk6IDAuMjUsXG5cdFx0XHRmaWxsQ29sb3I6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5nZW9fY29sb3IgPyAnIycgKyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZ2VvX2NvbG9yIDogJyMwRjgyMEYnXG5cdFx0fSApO1xuXHRcdGxheWVyLnJlbW92YWJsZSA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuaXNfZWRpdCApIHtcblx0XHRcdGxheWVyLmVkaXRpbmcuZW5hYmxlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxheWVyLmVkaXRpbmcuZGlzYWJsZSgpO1xuXHRcdH1cblxuXHRcdGxheWVyLmFkZFRvKCB0aGlzLmRyYXduSXRlbXMgKTsvLy5iaW5kUG9wdXAodGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm5hbWUse2Nsb3NlQnV0dG9uOmZhbHNlLCBjbGFzc05hbWU6J3BvbHlwb3B1cCd9KS5vcGVuUG9wdXAoKTtcblxuXHRcdHRoaXMubWFwX2NvbnRyb2wuZml0Qm91bmRzKCBsYXllci5nZXRCb3VuZHMoKSwgeyBwYWRkaW5nOiBbMjAsIDIwXSB9ICk7XG5cdFx0dGhpcy5nZW9fbGF5ZXJzLnB1c2goIGxheWVyICk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGxheWVyLm9uKCAnZWRpdCcsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0JHRoaXMuX29uU2hhcGVVcGRhdGUoIGUgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRidWlsZFNlYXJjaEZpZWxkcygpIHtcblxuXHRcdHN1cGVyLmJ1aWxkU2VhcmNoRmllbGRzKCk7XG5cdFx0dGhpcy5zZWFyY2hfZmllbGRzID0gW1xuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnTmFtZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVRcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0NyZWF0ZWQgQnknICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdjcmVhdGVkX2J5Jyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0c2NyaXB0X25hbWU6ICdFbXBsb3llZVZpZXcnLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdVcGRhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAndXBkYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdHNjcmlwdF9uYW1lOiAnRW1wbG95ZWVWaWV3Jyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApXG5cblx0XHRdO1xuXHR9XG5cblx0c2V0RWRpdE1lbnVNYXBJY29uKCBjb250ZXh0X2J0biApIHtcblxuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPD0gMTAgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudU1hcEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpIDw9IDEwICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblxuXHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPiAwICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0dGhpcy5pc19lZGl0ID0gdHJ1ZTtcblx0XHRzdXBlci5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRUVFByb21pc2Uud2FpdCggbnVsbCwgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3NldCB0aGUgY29sb3Igb2YgdGhlIHBvbHlnb24gYXQgdGhlIHN0YXJ0XG5cdFx0XHRpZiAoICR0aGlzLmVkaXRfdmlld191aV9kaWMuZ2VvX2NvbG9yICkge1xuXHRcdFx0XHQkdGhpcy5kcmF3Q29udHJvbC5vcHRpb25zLmRyYXcucG9seWdvbi5zaGFwZU9wdGlvbnMuY29sb3IgPSAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmdlb19jb2xvci52YWwoKTtcblx0XHRcdFx0JHRoaXMuZHJhd0NvbnRyb2wub3B0aW9ucy5kcmF3LmNpcmNsZS5zaGFwZU9wdGlvbnMuY29sb3IgPSAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmdlb19jb2xvci52YWwoKTtcblx0XHRcdH1cblxuXHRcdH0gKTtcblx0fVxuXG5cdG9uU2F2ZUFuZENvbnRpbnVlKCBpZ25vcmVXYXJuaW5nICkge1xuXHRcdHRoaXMucmVtb3ZlQWxsTGF5ZXJzKCk7XG5cdFx0c3VwZXIub25TYXZlQW5kQ29udGludWUoKTtcblx0fVxuXG5cdHNldE5hdmlnYXRpb24oKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0Ly9FcnJvcjogVW5hYmxlIHRvIGdldCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgJ2dldEdyaWRQYXJhbSc6IG9iamVjdCBpcyBudWxsIG9yIHVuZGVmaW5lZCBpbiAvaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL0Jhc2VWaWV3Q29udHJvbGxlci5qcz92PTguMC4wLTIwMTQxMjMwLTEwMzcyNSBsaW5lIDI1NzVcblx0XHRpZiAoICF0aGlzLmdyaWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLnNldFBvc3NpYmxlRGlzcGxheUNvbHVtbnMoIHRoaXMuYnVpbGREaXNwbGF5Q29sdW1uc0J5Q29sdW1uTW9kZWwoIHRoaXMuZ3JpZC5ncmlkLmdldEdyaWRQYXJhbSggJ2NvbE1vZGVsJyApICksXG5cdFx0XHR0aGlzLmJ1aWxkRGlzcGxheUNvbHVtbnMoIHRoaXMuZGVmYXVsdF9kaXNwbGF5X2NvbHVtbnMgKSApO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cblx0XHRcdHZhciBrZXkgPSB0YXJnZXQuZ2V0RmllbGQoKTtcblx0XHRcdHZhciBuZXh0X3NlbGVjdF9pdGVtX2lkID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHRcdGlmICggIW5leHRfc2VsZWN0X2l0ZW1faWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBuZXh0X3NlbGVjdF9pdGVtX2lkICE9PSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdFx0XHRUVFByb21pc2UuYWRkKCAnTWFwJywgJ3JlbmRlcicgKTtcblx0XHRcdFx0aWYgKCAkdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uVmlld0NsaWNrKCBuZXh0X3NlbGVjdF9pdGVtX2lkICk7IC8vRG9udCByZWZyZXNoIFVJXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMub25FZGl0Q2xpY2soIG5leHRfc2VsZWN0X2l0ZW1faWQgKTsgLy9Eb250IHJlZnJlc2ggVUlcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvL3dhaXQgZm9yIG1hcCB0byByZW5kZXIgYW5kIHByZXZlbnQganMgZXhjZXB0aW9uIGZyb20gbW92aW5nIHRvbyBmYXN0LlxuXHRcdFx0VFRQcm9taXNlLndhaXQoICdNYXAnLCAncmVuZGVyJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNldE5hdmlnYXRpb25BcnJvd3NFbmFibGVkKCk7XG5cdFx0XHR9ICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdGdldEdlb0ZlbmNlVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYDxkaXYgaWQ9XCJ0YWJfZ2VvX2ZlbmNlXCIgY2xhc3M9XCJlZGl0LXZpZXctdGFiLW91dHNpZGVcIiBzdHlsZT1cImhlaWdodDogODUlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9nZW9fZmVuY2VfY29udGVudF9kaXZcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmaXJzdC1jb2x1bW4gZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxpbnB1dCBpZD1cInBhYy1pbnB1dFwiIGNsYXNzPVwiY29udHJvbHNcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQWRkcmVzcyBTZWFyY2hcIiBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIj4gPCEtLSBVc2UgJ25ldy1wYXNzd29yZCcgYXMgaXQgZGlzYWJsZXMgYXV0by1jb21wbGV0ZSB3aGVuICdvZmYnIGRvZXMgbm90IC0tPlxuXHRcdFx0XHRcdFx0PGRpdiBpZD1cInN1Z2dlc3Rpb24tYm94XCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWFwX2NvbnRhaW5lclwiPjwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5gO1xuXHR9XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7191\n")}}]);