kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
807 lines (764 loc) • 88.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.toggleSplitMapUpdater = exports.toggleSidePanelUpdater = exports.toggleSidePanelCloseButtonUpdater = exports.togglePanelListViewUpdater = exports.toggleModalUpdater = exports.toggleMapControlUpdater = exports.startExportingImageUpdater = exports.showExportDropdownUpdater = exports.showDatasetTableUpdater = exports.setUserMapboxAccessTokenUpdater = exports.setMapControlVisibilityUpdater = exports.setMapControlSettingsUpdater = exports.setLocaleUpdater = exports.setLoadingIndicatorUpdater = exports.setExportSelectedDatasetUpdater = exports.setExportMapHTMLModeUpdater = exports.setExportMapFormatUpdater = exports.setExportImageSettingUpdater = exports.setExportImageErrorUpdater = exports.setExportImageDataUriUpdater = exports.setExportFilteredUpdater = exports.setExportDataUpdater = exports.setExportDataTypeUpdater = exports.removeNotificationUpdater = exports.openDeleteModalUpdater = exports.loadFilesUpdater = exports.loadFilesSuccessUpdater = exports.loadFilesErrUpdater = exports.initUiStateUpdater = exports.hideExportDropdownUpdater = exports.cleanupExportImageUpdater = exports.addNotificationUpdater = exports.INITIAL_UI_STATE = exports.DEFAULT_NOTIFICATIONS = exports.DEFAULT_MODAL = exports.DEFAULT_MAP_CONTROLS = exports.DEFAULT_LOAD_FILES = exports.DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_IMAGE = exports.DEFAULT_EXPORT_HTML = exports.DEFAULT_EXPORT_DATA = exports.DEFAULT_ACTIVE_SIDE_PANEL = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _constants = require("@kepler.gl/constants");
var _localization = require("@kepler.gl/localization");
var _utils = require("@kepler.gl/utils");
var _composerHelpers = require("./composer-helpers");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var DEFAULT_ACTIVE_SIDE_PANEL = exports.DEFAULT_ACTIVE_SIDE_PANEL = 'layer';
var DEFAULT_MODAL = exports.DEFAULT_MODAL = _constants.ADD_DATA_ID;
/**
* Updaters for `uiState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
*
* @public
* @example
*
* import keplerGlReducer, {uiStateUpdaters} from 'kepler.gl/reducers';
* // Root Reducer
* const reducers = combineReducers({
* keplerGl: keplerGlReducer,
* app: appReducer
* });
*
* const composedReducer = (state, action) => {
* switch (action.type) {
* // click button to close side panel
* case 'CLICK_BUTTON':
* return {
* ...state,
* keplerGl: {
* ...state.keplerGl,
* foo: {
* ...state.keplerGl.foo,
* uiState: uiStateUpdaters.toggleSidePanelUpdater(
* uiState, {payload: null}
* )
* }
* }
* };
* }
* return reducers(state, action);
* };
*
* export default composedReducer;
*/
/* eslint-disable @typescript-eslint/no-unused-vars */
// @ts-ignore
var uiStateUpdaters = null;
/* eslint-enable @typescript-eslint/no-unused-vars */
var DEFAULT_MAP_CONTROLS_FEATURES = {
show: true,
active: false,
disableClose: false,
// defines which map index users are interacting with (through map controls)
activeMapIndex: 0
};
var DEFAULT_MAP_LEGEND_CONTROL = _objectSpread(_objectSpread({}, DEFAULT_MAP_CONTROLS_FEATURES), {}, {
disableEdit: false
});
/**
* A list of map control visibility and whether is it active.
* @memberof uiStateUpdaters
* @constant
* @property visibleLayers Default: `{show: true, active: false}`
* @property mapLegend Default: `{show: true, active: false}`
* @property toggle3d Default: `{show: true}`
* @property splitMap Default: `{show: true}`
* @property mapDraw Default: `{show: true, active: false}`
* @property mapLocale Default: `{show: false, active: false}`
* @public
*/
var DEFAULT_MAP_CONTROLS = exports.DEFAULT_MAP_CONTROLS = Object.keys(_constants.MAP_CONTROLS).reduce(function (_final, current) {
return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, current, current === _constants.MAP_CONTROLS.mapLegend ? DEFAULT_MAP_LEGEND_CONTROL : DEFAULT_MAP_CONTROLS_FEATURES));
}, {});
/**
* Default image export config
* @memberof uiStateUpdaters
* @constant
* @property ratio Default: `'SCREEN'`,
* @property resolution Default: `'ONE_X'`,
* @property legend Default: `false`,
* @property mapH Default: 0,
* @property mapW Default: 0,
* @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
* @property imageDataUri Default: `''`,
* @property exporting Default: `false`
* @property error Default: `false`
* @property escapeXhtmlForWebpack Default: `true`
* @public
*/
var DEFAULT_EXPORT_IMAGE = exports.DEFAULT_EXPORT_IMAGE = {
// user options
ratio: _constants.EXPORT_IMG_RATIOS.SCREEN,
resolution: _constants.RESOLUTIONS.ONE_X,
legend: false,
mapH: 0,
mapW: 0,
imageSize: {
zoomOffset: 0,
scale: 1,
imageW: 0,
imageH: 0
},
// when this is set to true, the mock map viewport will move to the center of data
center: false,
// exporting state
imageDataUri: '',
// exporting: used to attach plot-container to dom
exporting: false,
// processing: used as loading indicator when export image is being produced
processing: false,
error: false,
// whether to apply fix for uglify error in dom-to-image (should be true for webpack builds)
escapeXhtmlForWebpack: true
};
var DEFAULT_LOAD_FILES = exports.DEFAULT_LOAD_FILES = {
fileLoading: false
};
/**
* Default initial `exportData` settings
* @memberof uiStateUpdaters
* @constant
* @property selectedDataset Default: `''`,
* @property dataType Default: `'csv'`,
* @property filtered Default: `true`,
* @public
*/
var DEFAULT_EXPORT_DATA = exports.DEFAULT_EXPORT_DATA = {
selectedDataset: '',
dataType: _constants.EXPORT_DATA_TYPE.CSV,
filtered: true
};
/**
* @constant
*/
var DEFAULT_NOTIFICATIONS = exports.DEFAULT_NOTIFICATIONS = [];
/**
* @constant
* @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
* @property userMapboxToken - Default: '', mapbox token provided by user through input field
* @property mode - Default: 'READ', read only or editable
* @public
*/
var DEFAULT_EXPORT_HTML = exports.DEFAULT_EXPORT_HTML = {
exportMapboxAccessToken: null,
userMapboxToken: '',
mode: _constants.EXPORT_HTML_MAP_MODES.READ
};
/**
* @constant
* @property hasData - Default: 'true',
* @public
*/
var DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_JSON = {
hasData: true
};
/**
* Export Map Config
* @constant
* @property HTML - Default: 'DEFAULT_EXPORT_HTML',
* @property JSON - Default: 'DEFAULT_EXPORT_JSON',
* @property format - Default: 'HTML',
* @public
*/
var DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, DEFAULT_EXPORT_HTML), _constants.EXPORT_MAP_FORMATS.JSON, DEFAULT_EXPORT_JSON), "format", _constants.EXPORT_MAP_FORMATS.HTML);
/**
* Default initial `uiState`
* @memberof uiStateUpdaters
* @constant
* @property readOnly Default: `false`
* @property activeSidePanel Default: `'layer'`
* @property currentModal Default: `'addData'`
* @property datasetKeyToRemove Default: `null`
* @property visibleDropdown Default: `null`
* @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
* @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
* @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
* @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
* @property notifications Default: `[]`
* @property notifications Default: `[]`
* @property loadFiles
* @property isSidePanelCloseButtonVisible Default: `true`
* @public
*/
var INITIAL_UI_STATE = exports.INITIAL_UI_STATE = {
readOnly: false,
activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
currentModal: DEFAULT_MODAL,
datasetKeyToRemove: null,
visibleDropdown: null,
// export image modal ui
exportImage: DEFAULT_EXPORT_IMAGE,
// export data modal ui
exportData: DEFAULT_EXPORT_DATA,
// html export
exportMap: DEFAULT_EXPORT_MAP,
// map control panels
mapControls: DEFAULT_MAP_CONTROLS,
// ui notifications
notifications: DEFAULT_NOTIFICATIONS,
// load files
loadFiles: DEFAULT_LOAD_FILES,
// Locale of the UI
locale: _localization.LOCALE_CODES.en,
layerPanelListView: 'list',
filterPanelListView: 'list',
isSidePanelCloseButtonVisible: true
};
/* Updaters */
/**
* @memberof uiStateUpdaters
*/
var initUiStateUpdater = exports.initUiStateUpdater = function initUiStateUpdater(state, action) {
return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
};
/**
* Toggle active side panel
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
* @returns nextState
* @public
*/
var toggleSidePanelUpdater = exports.toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
var id = _ref.payload;
return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
activeSidePanel: id
});
};
/**
* Show and hide modal dialog
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @paramaction.payload id of modal to be shown, null to hide modals. One of:
* - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
* - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
* - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
* - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
* - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
* - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
* @returns nextState
* @public
*/
var toggleModalUpdater = exports.toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
var id = _ref2.payload;
return _objectSpread(_objectSpread({}, state), {}, {
currentModal: id
});
};
/**
* Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
* @memberof uiStateUpdaters
* @public
*/
var showExportDropdownUpdater = exports.showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
var id = _ref3.payload;
return _objectSpread(_objectSpread({}, state), {}, {
visibleDropdown: id
});
};
/**
* Hide side panel header dropdown, activated by clicking the share link on top of the side panel
* @memberof uiStateUpdaters
* @public
*/
var hideExportDropdownUpdater = exports.hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
visibleDropdown: null
});
};
/**
* Toggle side panel close button on top left of the side panel
* @memberof uiStateUpdaters
* @public
*/
var toggleSidePanelCloseButtonUpdater = exports.toggleSidePanelCloseButtonUpdater = function toggleSidePanelCloseButtonUpdater(state, _ref4) {
var show = _ref4.payload.show;
return _objectSpread(_objectSpread({}, state), {}, {
isSidePanelCloseButtonVisible: show
});
};
/**
* Toggle active map control panel
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action action
* @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
* @returns nextState
* @public
*/
var toggleMapControlUpdater = exports.toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref5) {
var _state$mapControls$pa;
var _ref5$payload = _ref5.payload,
panelId = _ref5$payload.panelId,
_ref5$payload$index = _ref5$payload.index,
index = _ref5$payload$index === void 0 ? 0 : _ref5$payload$index;
var updatedState = state;
// The effect panel and ai assistant panel can not be active at the same time
// so we need to deactivate the other panel when one is activated
var panelToDeactivate = panelId === _constants.MAP_CONTROLS.effect ? _constants.MAP_CONTROLS.aiAssistant : panelId === _constants.MAP_CONTROLS.aiAssistant ? _constants.MAP_CONTROLS.effect : null;
// If we need to deactivate a competing panel and it's currently active
if (panelToDeactivate && (_state$mapControls$pa = state.mapControls[panelToDeactivate]) !== null && _state$mapControls$pa !== void 0 && _state$mapControls$pa.active) {
updatedState = _objectSpread(_objectSpread({}, state), {}, {
mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelToDeactivate, _objectSpread(_objectSpread({}, updatedState.mapControls[panelToDeactivate]), {}, {
active: false
})))
});
}
return _objectSpread(_objectSpread({}, updatedState), {}, {
mapControls: _objectSpread(_objectSpread({}, updatedState.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, updatedState.mapControls[panelId]), {}, {
active: !updatedState.mapControls[panelId].active,
activeMapIndex: index
})))
});
};
/**
* Toggle map control visibility
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action action
* @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
* @returns nextState
* @public
*/
var setMapControlVisibilityUpdater = exports.setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
var _state$mapControls;
var _ref6$payload = _ref6.payload,
panelId = _ref6$payload.panelId,
show = _ref6$payload.show;
if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
return state;
}
return _objectSpread(_objectSpread({}, state), {}, {
mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
show: Boolean(show)
})))
});
};
/**
* Toggle map control settings
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action action
* @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
* @returns nextState
* @public
*/
var setMapControlSettingsUpdater = exports.setMapControlSettingsUpdater = function setMapControlSettingsUpdater(state, _ref7) {
var _state$mapControls2;
var _ref7$payload = _ref7.payload,
panelId = _ref7$payload.panelId,
settings = _ref7$payload.settings;
var mapControl = (_state$mapControls2 = state.mapControls) === null || _state$mapControls2 === void 0 ? void 0 : _state$mapControls2[panelId];
if (!mapControl) {
return state;
}
return _objectSpread(_objectSpread({}, state), {}, {
mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, mapControl), {}, {
settings: _objectSpread(_objectSpread({}, mapControl.settings), settings)
})))
});
};
/**
* Toggle active map control panel
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload dataset id
* @returns nextState
* @public
*/
var openDeleteModalUpdater = exports.openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref8) {
var datasetKeyToRemove = _ref8.payload;
return _objectSpread(_objectSpread({}, state), {}, {
currentModal: _constants.DELETE_DATA_ID,
datasetKeyToRemove: datasetKeyToRemove
});
};
/**
* Set `exportImage.legend` to `true` or `false`
* @memberof uiStateUpdaters
* @param state `uiState`
* @returns nextState
* @public
*/
var setExportImageSettingUpdater = exports.setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref9) {
var newSetting = _ref9.payload;
var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
return _objectSpread(_objectSpread({}, state), {}, {
exportImage: _objectSpread(_objectSpread({}, updated), {}, {
// @ts-expect-error
// TODO: calculateExportImageSize does not return imageSize.zoomOffset,
// do we need take this value from current state, or return defaul value = 0
imageSize: imageSize
})
});
};
/**
* Set `exportImage.setExportImageDataUri` to a image dataUri
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload export image data uri
* @returns nextState
* @public
*/
var setExportImageDataUriUpdater = exports.setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref10) {
var dataUri = _ref10.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
processing: false,
imageDataUri: dataUri
})
});
};
/**
* @memberof uiStateUpdaters
* @public
*/
var setExportImageErrorUpdater = exports.setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref11) {
var error = _ref11.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
processing: false,
error: error
})
});
};
/**
* Delete cached export image
* @memberof uiStateUpdaters
* @public
*/
var cleanupExportImageUpdater = exports.cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
exporting: false,
imageDataUri: '',
error: false,
processing: false,
center: false
})
});
};
/**
* Start image exporting flow
* @memberof uiStateUpdaters
* @param state
* @param options
* @returns {UiState}
* @public
*/
var startExportingImageUpdater = exports.startExportingImageUpdater = function startExportingImageUpdater(state, _ref12) {
var _ref12$payload = _ref12.payload,
options = _ref12$payload === void 0 ? {} : _ref12$payload;
var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
exporting: true
});
return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
};
/**
* Set selected dataset for export
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload dataset id
* @returns nextState
* @public
*/
var setExportSelectedDatasetUpdater = exports.setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref13) {
var dataset = _ref13.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
selectedDataset: dataset
})
});
};
/**
* Set data format for exporting data
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload one of `'text/csv'`
* @returns nextState
* @public
*/
var setExportDataTypeUpdater = exports.setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref14) {
var dataType = _ref14.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
dataType: dataType
})
});
};
/**
* Whether to export filtered data, `true` or `false`
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload
* @returns nextState
* @public
*/
var setExportFilteredUpdater = exports.setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref15) {
var filtered = _ref15.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
filtered: filtered
})
});
};
/**
* Whether to including data in map config, toggle between `true` or `false`
* @memberof uiStateUpdaters
* @param state `uiState`
* @returns nextState
* @public
*/
var setExportDataUpdater = exports.setExportDataUpdater = function setExportDataUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
})))
});
};
/**
* whether to export a mapbox access to HTML single page
* @param state - `uiState`
* @param action
* @param action.payload
* @returns nextState
* @public
*/
var setUserMapboxAccessTokenUpdater = exports.setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref16) {
var userMapboxToken = _ref16.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
userMapboxToken: userMapboxToken
})))
});
};
/**
* Sets the export map format
* @param state - `uiState`
* @param action
* @param action.payload format to use to export the map into
* @return nextState
*/
var setExportMapFormatUpdater = exports.setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref17) {
var format = _ref17.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
// @ts-expect-error
format: format
})
});
};
/**
* Set the export html map mode
* @param state - `uiState`
* @param action
* @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
* @return nextState
*/
var setExportMapHTMLModeUpdater = exports.setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref18) {
var mode = _ref18.payload;
return _objectSpread(_objectSpread({}, state), {}, {
exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
mode: mode
})))
});
};
/**
* Adds a new notification.
* Updates a notification in case of matching ids.
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload Params of a notification
* @returns nextState
* @public
*/
var addNotificationUpdater = exports.addNotificationUpdater = function addNotificationUpdater(state, _ref19) {
var payload = _ref19.payload;
var oldNotifications = state.notifications || [];
// @ts-expect-error
var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
return n.id === payloadId;
}) : null;
var notifications;
if (notificationToUpdate) {
notifications = oldNotifications.map(function (n) {
return n.id === payloadId ? (0, _utils.createNotification)(_objectSpread(_objectSpread({}, payload), {}, {
count: n.count + 1
})) : n;
});
} else {
notifications = [].concat((0, _toConsumableArray2["default"])(oldNotifications), [(0, _utils.createNotification)(payload)]);
}
return _objectSpread(_objectSpread({}, state), {}, {
notifications: notifications
});
};
/**
* Remove a notification
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload id of the notification to be removed
* @returns nextState
* @public
*/
var removeNotificationUpdater = exports.removeNotificationUpdater = function removeNotificationUpdater(state, _ref20) {
var id = _ref20.payload;
return _objectSpread(_objectSpread({}, state), {}, {
notifications: state.notifications.filter(function (n) {
return n.id !== id;
})
});
};
/**
* Fired when file loading begin
* @memberof uiStateUpdaters
* @param state `uiState`
* @returns nextState
* @public
*/
var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
fileLoading: true
})
});
};
/**
* Handles loading file success and set fileLoading property to false
* @memberof uiStateUpdaters
* @param state `uiState`
* @returns nextState
*/
var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
fileLoading: false
})
});
};
/**
* Handles load file error and set fileLoading property to false
* @memberof uiStateUpdaters
* @param state
* @param action
* @param action.error
* @returns nextState
* @public
*/
var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref21) {
var error = _ref21.error;
return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
fileLoading: false
})
}), {
payload: (0, _utils.errorNotification)({
message: (error || {}).message || 'Failed to upload files',
topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
})
});
};
/**
* Handles toggle map split and reset all map control index to 0
* @memberof uiStateUpdaters
* @param state
* @returns nextState
* @public
*/
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
return _objectSpread(_objectSpread({}, state), {}, {
mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
activeMapIndex: 0
})));
}, {})
});
};
/**
* Toggle modal data
* @memberof uiStateUpdaters
* @param state
* @returns nextState
* @public
*/
var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state) {
return toggleModalUpdater(state, {
payload: _constants.DATA_TABLE_ID
});
};
/**
* Set the locale of the UI
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload
* @param action.payload.locale locale
* @returns nextState
* @public
*/
var setLocaleUpdater = exports.setLocaleUpdater = function setLocaleUpdater(state, _ref22) {
var locale = _ref22.payload.locale;
return _objectSpread(_objectSpread({}, state), {}, {
locale: locale
});
};
/**
* Toggle layer panel list view
* @memberof uiStateUpdaters
* @param state `uiState`
* @param action
* @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
* @returns nextState
* @public
*/
var togglePanelListViewUpdater = exports.togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref23) {
var _ref23$payload = _ref23.payload,
panelId = _ref23$payload.panelId,
listView = _ref23$payload.listView;
var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
if (!stateProp || state[stateProp] === listView) {
return state;
}
return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, stateProp, listView));
};
/**
* Update state of the loading indicator.
* @memberof uiStateUpdaters
* @param state uiState
* @param action
* @param action.payload Payload with change of number of active loading actions.
* @returns nextState
* @public
*/
var setLoadingIndicatorUpdater = exports.setLoadingIndicatorUpdater = function setLoadingIndicatorUpdater(state, _ref24) {
var change = _ref24.payload.change;
var loadingIndicatorValue = state.loadingIndicatorValue;
if (!loadingIndicatorValue) {
loadingIndicatorValue = 0;
}
return _objectSpread(_objectSpread({}, state), {}, {
loadingIndicatorValue: Math.max(loadingIndicatorValue + change, 0)
});
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9sb2NhbGl6YXRpb24iLCJfdXRpbHMiLCJfY29tcG9zZXJIZWxwZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiZXhwb3J0cyIsIkRFRkFVTFRfTU9EQUwiLCJBRERfREFUQV9JRCIsInVpU3RhdGVVcGRhdGVycyIsIkRFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTIiwic2hvdyIsImFjdGl2ZSIsImRpc2FibGVDbG9zZSIsImFjdGl2ZU1hcEluZGV4IiwiREVGQVVMVF9NQVBfTEVHRU5EX0NPTlRST0wiLCJkaXNhYmxlRWRpdCIsIkRFRkFVTFRfTUFQX0NPTlRST0xTIiwiTUFQX0NPTlRST0xTIiwicmVkdWNlIiwiZmluYWwiLCJjdXJyZW50IiwibWFwTGVnZW5kIiwiREVGQVVMVF9FWFBPUlRfSU1BR0UiLCJyYXRpbyIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiU0NSRUVOIiwicmVzb2x1dGlvbiIsIlJFU09MVVRJT05TIiwiT05FX1giLCJsZWdlbmQiLCJtYXBIIiwibWFwVyIsImltYWdlU2l6ZSIsInpvb21PZmZzZXQiLCJzY2FsZSIsImltYWdlVyIsImltYWdlSCIsImNlbnRlciIsImltYWdlRGF0YVVyaSIsImV4cG9ydGluZyIsInByb2Nlc3NpbmciLCJlcnJvciIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsIkRFRkFVTFRfTE9BRF9GSUxFUyIsImZpbGVMb2FkaW5nIiwiREVGQVVMVF9FWFBPUlRfREFUQSIsInNlbGVjdGVkRGF0YXNldCIsImRhdGFUeXBlIiwiRVhQT1JUX0RBVEFfVFlQRSIsIkNTViIsImZpbHRlcmVkIiwiREVGQVVMVF9OT1RJRklDQVRJT05TIiwiREVGQVVMVF9FWFBPUlRfSFRNTCIsImV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIiwidXNlck1hcGJveFRva2VuIiwibW9kZSIsIkVYUE9SVF9IVE1MX01BUF9NT0RFUyIsIlJFQUQiLCJERUZBVUxUX0VYUE9SVF9KU09OIiwiaGFzRGF0YSIsIkRFRkFVTFRfRVhQT1JUX01BUCIsIkVYUE9SVF9NQVBfRk9STUFUUyIsIkhUTUwiLCJKU09OIiwiSU5JVElBTF9VSV9TVEFURSIsInJlYWRPbmx5IiwiYWN0aXZlU2lkZVBhbmVsIiwiY3VycmVudE1vZGFsIiwiZGF0YXNldEtleVRvUmVtb3ZlIiwidmlzaWJsZURyb3Bkb3duIiwiZXhwb3J0SW1hZ2UiLCJleHBvcnREYXRhIiwiZXhwb3J0TWFwIiwibWFwQ29udHJvbHMiLCJub3RpZmljYXRpb25zIiwibG9hZEZpbGVzIiwibG9jYWxlIiwiTE9DQUxFX0NPREVTIiwiZW4iLCJsYXllclBhbmVsTGlzdFZpZXciLCJmaWx0ZXJQYW5lbExpc3RWaWV3IiwiaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGUiLCJpbml0VWlTdGF0ZVVwZGF0ZXIiLCJzdGF0ZSIsImFjdGlvbiIsInBheWxvYWQiLCJpbml0aWFsVWlTdGF0ZSIsInRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIiLCJfcmVmIiwiaWQiLCJ0b2dnbGVNb2RhbFVwZGF0ZXIiLCJfcmVmMiIsInNob3dFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJfcmVmMyIsImhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJ0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIiLCJfcmVmNCIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwiX3JlZjUiLCJfc3RhdGUkbWFwQ29udHJvbHMkcGEiLCJfcmVmNSRwYXlsb2FkIiwicGFuZWxJZCIsIl9yZWY1JHBheWxvYWQkaW5kZXgiLCJpbmRleCIsInVwZGF0ZWRTdGF0ZSIsInBhbmVsVG9EZWFjdGl2YXRlIiwiZWZmZWN0IiwiYWlBc3Npc3RhbnQiLCJzZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXIiLCJfcmVmNiIsIl9zdGF0ZSRtYXBDb250cm9scyIsIl9yZWY2JHBheWxvYWQiLCJCb29sZWFuIiwic2V0TWFwQ29udHJvbFNldHRpbmdzVXBkYXRlciIsIl9yZWY3IiwiX3N0YXRlJG1hcENvbnRyb2xzMiIsIl9yZWY3JHBheWxvYWQiLCJzZXR0aW5ncyIsIm1hcENvbnRyb2wiLCJvcGVuRGVsZXRlTW9kYWxVcGRhdGVyIiwiX3JlZjgiLCJERUxFVEVfREFUQV9JRCIsInNldEV4cG9ydEltYWdlU2V0dGluZ1VwZGF0ZXIiLCJfcmVmOSIsIm5ld1NldHRpbmciLCJ1cGRhdGVkIiwiY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplIiwic2V0RXhwb3J0SW1hZ2VEYXRhVXJpVXBkYXRlciIsIl9yZWYxMCIsImRhdGFVcmkiLCJzZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlciIsIl9yZWYxMSIsImNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIiLCJzdGFydEV4cG9ydGluZ0ltYWdlVXBkYXRlciIsIl9yZWYxMiIsIl9yZWYxMiRwYXlsb2FkIiwib3B0aW9ucyIsImltYWdlU2V0dGluZ3MiLCJjb21wb3NlXyIsImFwcGx5XyIsInBheWxvYWRfIiwic2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciIsIl9yZWYxMyIsImRhdGFzZXQiLCJzZXRFeHBvcnREYXRhVHlwZVVwZGF0ZXIiLCJfcmVmMTQiLCJzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIiLCJfcmVmMTUiLCJzZXRFeHBvcnREYXRhVXBkYXRlciIsInNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIiLCJfcmVmMTYiLCJzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyIiwiX3JlZjE3IiwiZm9ybWF0Iiwic2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyIiwiX3JlZjE4IiwiYWRkTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYxOSIsIm9sZE5vdGlmaWNhdGlvbnMiLCJwYXlsb2FkSWQiLCJub3RpZmljYXRpb25Ub1VwZGF0ZSIsImZpbmQiLCJuIiwibWFwIiwiY3JlYXRlTm90aWZpY2F0aW9uIiwiY291bnQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlciIsIl9yZWYyMCIsImxvYWRGaWxlc1VwZGF0ZXIiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjEiLCJlcnJvck5vdGlmaWNhdGlvbiIsIm1lc3NhZ2UiLCJ0b3BpYyIsIkRFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyIsImdsb2JhbCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsInNob3dEYXRhc2V0VGFibGVVcGRhdGVyIiwiREFUQV9UQUJMRV9JRCIsInNldExvY2FsZVVwZGF0ZXIiLCJfcmVmMjIiLCJ0b2dnbGVQYW5lbExpc3RWaWV3VXBkYXRlciIsIl9yZWYyMyIsIl9yZWYyMyRwYXlsb2FkIiwibGlzdFZpZXciLCJzdGF0ZVByb3AiLCJzZXRMb2FkaW5nSW5kaWNhdG9yVXBkYXRlciIsIl9yZWYyNCIsImNoYW5nZSIsImxvYWRpbmdJbmRpY2F0b3JWYWx1ZSIsIk1hdGgiLCJtYXgiXSwic291cmNlcyI6WyIuLi9zcmMvdWktc3RhdGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyxcbiAgREVMRVRFX0RBVEFfSUQsXG4gIEVYUE9SVF9EQVRBX1RZUEUsXG4gIEVYUE9SVF9IVE1MX01BUF9NT0RFUyxcbiAgRVhQT1JUX0lNR19SQVRJT1MsXG4gIEVYUE9SVF9NQVBfRk9STUFUUyxcbiAgUkVTT0xVVElPTlMsXG4gIE1BUF9DT05UUk9MUyxcbiAgRXhwb3J0SW1hZ2Vcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0NBTEVfQ09ERVN9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7Y3JlYXRlTm90aWZpY2F0aW9uLCBlcnJvck5vdGlmaWNhdGlvbiwgY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5XywgY29tcG9zZV99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uLFxuICBVSVN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0SHRtbCxcbiAgRXhwb3J0SnNvbixcbiAgRXhwb3J0TWFwLFxuICBNYXBDb250cm9sSXRlbSxcbiAgTWFwQ29udHJvbHMsXG4gIFVpU3RhdGVcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMID0gJ2xheWVyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREFMID0gQUREX0RBVEFfSUQ7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB1aVN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt1aVN0YXRlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gY2xvc2Ugc2lkZSBwYW5lbFxuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIHVpU3RhdGU6IHVpU3RhdGVVcGRhdGVycy50b2dnbGVTaWRlUGFuZWxVcGRhdGVyKFxuICogICAgICAgICAgICAgICB1aVN0YXRlLCB7cGF5bG9hZDogbnVsbH1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHVpU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5jb25zdCBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFUzogTWFwQ29udHJvbEl0ZW0gPSB7XG4gIHNob3c6IHRydWUsXG4gIGFjdGl2ZTogZmFsc2UsXG4gIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gIC8vIGRlZmluZXMgd2hpY2ggbWFwIGluZGV4IHVzZXJzIGFyZSBpbnRlcmFjdGluZyB3aXRoICh0aHJvdWdoIG1hcCBjb250cm9scylcbiAgYWN0aXZlTWFwSW5kZXg6IDBcbn07XG5cbmNvbnN0IERFRkFVTFRfTUFQX0xFR0VORF9DT05UUk9MID0ge1xuICAuLi5ERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFUyxcbiAgZGlzYWJsZUVkaXQ6IGZhbHNlXG59O1xuLyoqXG4gKiBBIGxpc3Qgb2YgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eSBhbmQgd2hldGhlciBpcyBpdCBhY3RpdmUuXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSB2aXNpYmxlTGF5ZXJzIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwTGVnZW5kIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgdG9nZ2xlM2QgRGVmYXVsdDogYHtzaG93OiB0cnVlfWBcbiAqIEBwcm9wZXJ0eSBzcGxpdE1hcCBEZWZhdWx0OiBge3Nob3c6IHRydWV9YFxuICogQHByb3BlcnR5IG1hcERyYXcgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSBtYXBMb2NhbGUgRGVmYXVsdDogYHtzaG93OiBmYWxzZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BUF9DT05UUk9MUzogTWFwQ29udHJvbHMgPSAoXG4gIE9iamVjdC5rZXlzKE1BUF9DT05UUk9MUykgYXMgQXJyYXk8a2V5b2YgdHlwZW9mIE1BUF9DT05UUk9MUz5cbikucmVkdWNlKFxuICAoZmluYWwsIGN1cnJlbnQpID0+ICh7XG4gICAgLi4uZmluYWwsXG4gICAgW2N1cnJlbnRdOlxuICAgICAgY3VycmVudCA9PT0gTUFQX0NPTlRST0xTLm1hcExlZ2VuZFxuICAgICAgICA/IERFRkFVTFRfTUFQX0xFR0VORF9DT05UUk9MXG4gICAgICAgIDogREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVNcbiAgfSksXG4gIHt9IGFzIE1hcENvbnRyb2xzXG4pO1xuXG4vKipcbiAqIERlZmF1bHQgaW1hZ2UgZXhwb3J0IGNvbmZpZ1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgcmF0aW8gRGVmYXVsdDogYCdTQ1JFRU4nYCxcbiAqIEBwcm9wZXJ0eSByZXNvbHV0aW9uIERlZmF1bHQ6IGAnT05FX1gnYCxcbiAqIEBwcm9wZXJ0eSBsZWdlbmQgRGVmYXVsdDogYGZhbHNlYCxcbiAqIEBwcm9wZXJ0eSBtYXBIIERlZmF1bHQ6IDAsXG4gKiBAcHJvcGVydHkgbWFwVyBEZWZhdWx0OiAwLFxuICogQHByb3BlcnR5IGltYWdlU2l6ZSBEZWZhdWx0OiB7em9vbU9mZnNldDogMCwgc2NhbGU6IDEsIGltYWdlVzogMCwgaW1hZ2VIOiAwfSxcbiAqIEBwcm9wZXJ0eSBpbWFnZURhdGFVcmkgRGVmYXVsdDogYCcnYCxcbiAqIEBwcm9wZXJ0eSBleHBvcnRpbmcgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IGVycm9yIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBlc2NhcGVYaHRtbEZvcldlYnBhY2sgRGVmYXVsdDogYHRydWVgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9JTUFHRTogRXhwb3J0SW1hZ2UgPSB7XG4gIC8vIHVzZXIgb3B0aW9uc1xuICByYXRpbzogRVhQT1JUX0lNR19SQVRJT1MuU0NSRUVOLFxuICByZXNvbHV0aW9uOiBSRVNPTFVUSU9OUy5PTkVfWCxcbiAgbGVnZW5kOiBmYWxzZSxcbiAgbWFwSDogMCxcbiAgbWFwVzogMCxcbiAgaW1hZ2VTaXplOiB7XG4gICAgem9vbU9mZnNldDogMCxcbiAgICBzY2FsZTogMSxcbiAgICBpbWFnZVc6IDAsXG4gICAgaW1hZ2VIOiAwXG4gIH0sXG4gIC8vIHdoZW4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG1vY2sgbWFwIHZpZXdwb3J0IHdpbGwgbW92ZSB0byB0aGUgY2VudGVyIG9mIGRhdGFcbiAgY2VudGVyOiBmYWxzZSxcbiAgLy8gZXhwb3J0aW5nIHN0YXRlXG4gIGltYWdlRGF0YVVyaTogJycsXG4gIC8vIGV4cG9ydGluZzogdXNlZCB0byBhdHRhY2ggcGxvdC1jb250YWluZXIgdG8gZG9tXG4gIGV4cG9ydGluZzogZmFsc2UsXG4gIC8vIHByb2Nlc3Npbmc6IHVzZWQgYXMgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiBleHBvcnQgaW1hZ2UgaXMgYmVpbmcgcHJvZHVjZWRcbiAgcHJvY2Vzc2luZzogZmFsc2UsXG4gIGVycm9yOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byBhcHBseSBmaXggZm9yIHVnbGlmeSBlcnJvciBpbiBkb20tdG8taW1hZ2UgKHNob3VsZCBiZSB0cnVlIGZvciB3ZWJwYWNrIGJ1aWxkcylcbiAgZXNjYXBlWGh0bWxGb3JXZWJwYWNrOiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0FEX0ZJTEVTID0ge1xuICBmaWxlTG9hZGluZzogZmFsc2Vcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBleHBvcnREYXRhYCBzZXR0aW5nc1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgc2VsZWN0ZWREYXRhc2V0IERlZmF1bHQ6IGAnJ2AsXG4gKiBAcHJvcGVydHkgZGF0YVR5cGUgRGVmYXVsdDogYCdjc3YnYCxcbiAqIEBwcm9wZXJ0eSBmaWx0ZXJlZCBEZWZhdWx0OiBgdHJ1ZWAsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9EQVRBOiBFeHBvcnREYXRhID0ge1xuICBzZWxlY3RlZERhdGFzZXQ6ICcnLFxuICBkYXRhVHlwZTogRVhQT1JUX0RBVEFfVFlQRS5DU1YsXG4gIGZpbHRlcmVkOiB0cnVlXG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT1RJRklDQVRJT05TID0gW107XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4gLSBEZWZhdWx0OiBudWxsLCB0aGlzIGlzIHVzZWQgd2hlbiB3ZSBwcm92aWRlIGEgZGVmYXVsdCBtYXBib3ggdG9rZW4gZm9yIHVzZXJzIHRvIHRha2UgYWR2YW50YWdlIG9mXG4gKiBAcHJvcGVydHkgdXNlck1hcGJveFRva2VuIC0gRGVmYXVsdDogJycsIG1hcGJveCB0b2tlbiBwcm92aWRlZCBieSB1c2VyIHRocm91Z2ggaW5wdXQgZmllbGRcbiAqIEBwcm9wZXJ0eSBtb2RlIC0gRGVmYXVsdDogJ1JFQUQnLCByZWFkIG9ubHkgb3IgZWRpdGFibGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0hUTUw6IEV4cG9ydEh0bWwgPSB7XG4gIGV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuOiBudWxsLFxuICB1c2VyTWFwYm94VG9rZW46ICcnLFxuICBtb2RlOiBFWFBPUlRfSFRNTF9NQVBfTU9ERVMuUkVBRFxufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBoYXNEYXRhIC0gRGVmYXVsdDogJ3RydWUnLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSlNPTjogRXhwb3J0SnNvbiA9IHtcbiAgaGFzRGF0YTogdHJ1ZVxufTtcblxuLyoqXG4gKiBFeHBvcnQgTWFwIENvbmZpZ1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgSFRNTCAtIERlZmF1bHQ6ICdERUZBVUxUX0VYUE9SVF9IVE1MJyxcbiAqIEBwcm9wZXJ0eSBKU09OIC0gRGVmYXVsdDogJ0RFRkFVTFRfRVhQT1JUX0pTT04nLFxuICogQHByb3BlcnR5IGZvcm1hdCAtIERlZmF1bHQ6ICdIVE1MJyxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX01BUDogRXhwb3J0TWFwID0ge1xuICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiBERUZBVUxUX0VYUE9SVF9IVE1MLFxuICBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dOiBERUZBVUxUX0VYUE9SVF9KU09OLFxuICBmb3JtYXQ6IEVYUE9SVF9NQVBfRk9STUFUUy5IVE1MXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdWlTdGF0ZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJlYWRPbmx5IERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBhY3RpdmVTaWRlUGFuZWwgRGVmYXVsdDogYCdsYXllcidgXG4gKiBAcHJvcGVydHkgY3VycmVudE1vZGFsIERlZmF1bHQ6IGAnYWRkRGF0YSdgXG4gKiBAcHJvcGVydHkgZGF0YXNldEtleVRvUmVtb3ZlIERlZmF1bHQ6IGBudWxsYFxuICogQHByb3BlcnR5IHZpc2libGVEcm9wZG93biBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSBleHBvcnRJbWFnZSBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX0lNQUdFYF0oI2RlZmF1bHRfZXhwb3J0X2ltYWdlKVxuICogQHByb3BlcnR5IGV4cG9ydERhdGEgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9EQVRBYF0oI2RlZmF1bHRfZXhwb3J0X2RhdGEpXG4gKiBAcHJvcGVydHkgZXhwb3J0TWFwIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfTUFQYF0oI2RlZmF1bHRfZXhwb3J0X21hcClcbiAqIEBwcm9wZXJ0eSBtYXBDb250cm9scyBEZWZhdWx0OiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IG5vdGlmaWNhdGlvbnMgRGVmYXVsdDogYFtdYFxuICogQHByb3BlcnR5IGxvYWRGaWxlc1xuICogQHByb3BlcnR5IGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlIERlZmF1bHQ6IGB0cnVlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9VSV9TVEFURTogVWlTdGF0ZSA9IHtcbiAgcmVhZE9ubHk6IGZhbHNlLFxuICBhY3RpdmVTaWRlUGFuZWw6IERFRkFVTFRfQUNUSVZFX1NJREVfUEFORUwsXG4gIGN1cnJlbnRNb2RhbDogREVGQVVMVF9NT0RBTCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlOiBudWxsLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGwsXG4gIC8vIGV4cG9ydCBpbWFnZSBtb2RhbCB1aVxuICBleHBvcnRJbWFnZTogREVGQVVMVF9FWFBPUlRfSU1BR0UsXG4gIC8vIGV4cG9ydCBkYXRhIG1vZGFsIHVpXG4gIGV4cG9ydERhdGE6IERFRkFVTFRfRVhQT1JUX0RBVEEsXG4gIC8vIGh0bWwgZXhwb3J0XG4gIGV4cG9ydE1hcDogREVGQVVMVF9FWFBPUlRfTUFQLFxuICAvLyBtYXAgY29udHJvbCBwYW5lbHNcbiAgbWFwQ29udHJvbHM6IERFRkFVTFRfTUFQX0NPTlRST0xTLFxuICAvLyB1aSBub3RpZmljYXRpb25zXG4gIG5vdGlmaWNhdGlvbnM6IERFRkFVTFRfTk9USUZJQ0FUSU9OUyxcbiAgLy8gbG9hZCBmaWxlc1xuICBsb2FkRmlsZXM6IERFRkFVTFRfTE9BRF9GSUxFUyxcbiAgLy8gTG9jYWxlIG9mIHRoZSBVSVxuICBsb2NhbGU6IExPQ0FMRV9DT0RFUy5lbixcbiAgbGF5ZXJQYW5lbExpc3RWaWV3OiAnbGlzdCcsXG4gIGZpbHRlclBhbmVsTGlzdFZpZXc6ICdsaXN0JyxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHRydWVcbn07XG5cbi8qIFVwZGF0ZXJzICovXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRVaVN0YXRlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIHR5cGU/OiAodHlwZW9mIEFjdGlvblR5cGVzKVsnSU5JVCddO1xuICAgIHBheWxvYWQ6IEtlcGxlckdsSW5pdFBheWxvYWQ7XG4gIH1cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSkuaW5pdGlhbFVpU3RhdGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHNpZGUgcGFuZWwgdG8gYmUgc2hvd24sIG9uZSBvZiBgbGF5ZXJgLCBgZmlsdGVyYCwgYGludGVyYWN0aW9uYCwgYG1hcGAuIGNsb3NlIHNpZGUgcGFuZWwgaWYgYG51bGxgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogaWR9OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVTaWRlUGFuZWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgcmV0dXJuIGlkID09PSBzdGF0ZS5hY3RpdmVTaWRlUGFuZWxcbiAgICA/IHN0YXRlXG4gICAgOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY3RpdmVTaWRlUGFuZWw6IGlkXG4gICAgICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGFuZCBoaWRlIG1vZGFsIGRpYWxvZ1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtYWN0aW9uLnBheWxvYWQgaWQgb2YgbW9kYWwgdG8gYmUgc2hvd24sIG51bGwgdG8gaGlkZSBtb2RhbHMuIE9uZSBvZjpcbiAqICAtIFtgREFUQV9UQUJMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2RhdGFfdGFibGVfaWQpXG4gKiAgLSBbYERFTEVURV9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGVsZXRlX2RhdGFfaWQpXG4gKiAgLSBbYEFERF9EQVRBX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX2RhdGFfaWQpXG4gKiAgLSBbYEVYUE9SVF9JTUFHRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9pbWFnZV9pZClcbiAqICAtIFtgRVhQT1JUX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNleHBvcnRfZGF0YV9pZClcbiAqICAtIFtgQUREX01BUF9TVFlMRV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2FkZF9tYXBfc3R5bGVfaWQpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZU1vZGFsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgY3VycmVudE1vZGFsOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBhbmQgc2hvdyBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlNob3dFeHBvcnREcm9wZG93blVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogaWRcbn0pO1xuXG4vKipcbiAqIEhpZGUgc2lkZSBwYW5lbCBoZWFkZXIgZHJvcGRvd24sIGFjdGl2YXRlZCBieSBjbGlja2luZyB0aGUgc2hhcmUgbGluayBvbiB0b3Agb2YgdGhlIHNpZGUgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB2aXNpYmxlRHJvcGRvd246IG51bGxcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBzaWRlIHBhbmVsIGNsb3NlIGJ1dHRvbiBvbiB0b3AgbGVmdCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtzaG93fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbENsb3NlQnV0dG9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgaXNTaWRlUGFuZWxDbG9zZUJ1dHRvblZpc2libGU6IHNob3dcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgbWFwIGNvbnRyb2wgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbWFwIGNvbnRyb2wgcGFuZWwgaWQsIG9uZSBvZiB0aGUga2V5cyBvZjogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGluZGV4ID0gMH19OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVNYXBDb250cm9sVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGxldCB1cGRhdGVkU3RhdGUgPSBzdGF0ZTtcbiAgLy8gVGhlIGVmZmVjdCBwYW5lbCBhbmQgYWkgYXNzaXN0YW50IHBhbmVsIGNhbiBub3QgYmUgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWVcbiAgLy8gc28gd2UgbmVlZCB0byBkZWFjdGl2YXRlIHRoZSBvdGhlciBwYW5lbCB3aGVuIG9uZSBpcyBhY3RpdmF0ZWRcbiAgY29uc3QgcGFuZWxUb0RlYWN0aXZhdGUgPVxuICAgIHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5lZmZlY3RcbiAgICAgID8gTUFQX0NPTlRST0xTLmFpQXNzaXN0YW50XG4gICAgICA6IHBhbmVsSWQgPT09IE1BUF9DT05UUk9MUy5haUFzc2lzdGFudFxuICAgICAgPyBNQVBfQ09OVFJPTFMuZWZmZWN0XG4gICAgICA6IG51bGw7XG5cbiAgLy8gSWYgd2UgbmVlZCB0byBkZWFjdGl2YXRlIGEgY29tcGV0aW5nIHBhbmVsIGFuZCBpdCdzIGN1cnJlbnRseSBhY3RpdmVcbiAgaWYgKHBhbmVsVG9EZWFjdGl2YXRlICYmIHN0YXRlLm1hcENvbnRyb2xzW3BhbmVsVG9EZWFjdGl2YXRlXT8uYWN0aXZlKSB7XG4gICAgdXBkYXRlZFN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHMsXG4gICAgICAgIFtwYW5lbFRvRGVhY3RpdmF0ZV06IHtcbiAgICAgICAgICAuLi51cGRhdGVkU3RhdGUubWFwQ29udHJvbHNbcGFuZWxUb0RlYWN0aXZhdGVdLFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnVwZGF0ZWRTdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4udXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzLFxuICAgICAgW3BhbmVsSWRdOiB7XG4gICAgICAgIC4uLnVwZGF0ZWRTdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXSxcbiAgICAgICAgYWN0aXZlOiAhdXBkYXRlZFN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLmFjdGl2ZSxcbiAgICAgICAgYWN0aXZl