UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

595 lines (519 loc) 62.9 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reselect = require("reselect"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reactIntl = require("react-intl"); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents2 = require("../common/styled-components"); var _mapLayerSelector = _interopRequireDefault(require("../common/map-layer-selector")); var _logo = _interopRequireDefault(require("../common/logo")); var _mapLegend = _interopRequireDefault(require("./map-legend")); var _icons = require("../common/icons"); var _verticalToolbar = _interopRequireDefault(require("../common/vertical-toolbar")); var _toolbarItem = _interopRequireDefault(require("../common/toolbar-item")); var _defaultSettings = require("../../constants/default-settings"); function _templateObject6() { var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n right: 32px;\n"]); _templateObject6 = function _templateObject6() { return data; }; return data; } function _templateObject5() { var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n background-color: ", ";\n height: 32px;\n padding: 6px 12px;\n font-size: 11px;\n color: ", ";\n position: relative;\n\n button {\n width: 18px;\n height: 18px;\n }\n"]); _templateObject5 = function _templateObject5() { return data; }; return data; } function _templateObject4() { var data = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n max-height: 500px;\n min-height: 100px;\n overflow: auto;\n"]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n flex-grow: 1;\n z-index: 1;\n p {\n margin-bottom: 0;\n }\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 4px 0;\n display: flex;\n justify-content: flex-end;\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n right: 0;\n width: ", "px;\n padding: ", "px;\n z-index: 10;\n top: ", "px;\n position: absolute;\n"]); _templateObject = function _templateObject() { return data; }; return data; } var StyledMapControl = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.mapControl.width; }, function (props) { return props.theme.mapControl.padding; }, function (props) { return props.top; }); var StyledMapControlAction = _styledComponents["default"].div(_templateObject2()); var StyledMapControlPanel = _styledComponents["default"].div(_templateObject3(), function (props) { return props.theme.mapPanelBackgroundColor; }); var StyledMapControlPanelContent = _styledComponents["default"].div(_templateObject4(), function (props) { return props.theme.dropdownScrollBar; }); var StyledMapControlPanelHeader = _styledComponents["default"].div(_templateObject5(), function (props) { return props.theme.mapPanelHeaderBackgroundColor; }, function (props) { return props.theme.titleTextColor; }); var ActionPanel = function ActionPanel(_ref) { var className = _ref.className, children = _ref.children; return _react["default"].createElement(StyledMapControlAction, { className: className }, children); }; ActionPanel.displayName = 'ActionPanel'; var MapControlTooltip = _react["default"].memo(function (_ref2) { var id = _ref2.id, message = _ref2.message; return _react["default"].createElement(_styledComponents2.Tooltip, { id: id, place: "left", effect: "solid" }, _react["default"].createElement("span", null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: message }))); }); MapControlTooltip.displayName = 'MapControlTooltip'; var MapLegendTooltip = function MapLegendTooltip(_ref3) { var id = _ref3.id, message = _ref3.message; return _react["default"].createElement(_styledComponents2.Tooltip, { id: id, place: "left", effect: "solid" }, _react["default"].createElement("span", null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: message }))); }; var LayerSelectorPanel = _react["default"].memo(function (_ref4) { var items = _ref4.items, onMapToggleLayer = _ref4.onMapToggleLayer, isActive = _ref4.isActive, toggleMenuPanel = _ref4.toggleMenuPanel; return !isActive ? _react["default"].createElement(_styledComponents2.MapControlButton, { key: 1, onClick: function onClick(e) { e.preventDefault(); toggleMenuPanel(); }, className: "map-control-button toggle-layer", "data-tip": true, "data-for": "toggle-layer" }, _react["default"].createElement(_icons.Layers, { height: "22px" }), _react["default"].createElement(MapControlTooltip, { id: "toggle-layer", message: isActive ? 'tooltip.hideLayerPanel' : 'tooltip.showLayerPanel' })) : _react["default"].createElement(MapControlPanel, { header: "header.visibleLayers", onClick: toggleMenuPanel }, _react["default"].createElement(_mapLayerSelector["default"], { layers: items, onMapToggleLayer: onMapToggleLayer })); }); LayerSelectorPanel.displayName = 'LayerSelectorPanel'; var MapControlPanel = _react["default"].memo(function (_ref5) { var children = _ref5.children, header = _ref5.header, onClick = _ref5.onClick, _ref5$scale = _ref5.scale, scale = _ref5$scale === void 0 ? 1 : _ref5$scale, isExport = _ref5.isExport; return _react["default"].createElement(StyledMapControlPanel, { style: { transform: "scale(".concat(scale, ") translate(calc(-").concat(25 * (scale - 1), "% - ").concat(10 * scale, "px), calc(").concat(25 * (scale - 1), "% + ").concat(10 * scale, "px))"), marginBottom: '8px' } }, _react["default"].createElement(StyledMapControlPanelHeader, null, isExport ? _react["default"].createElement(_logo["default"], { version: false, appName: "kepler.gl" }) : _react["default"].createElement("span", { style: { verticalAlign: 'middle' } }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: header })), isExport ? null : _react["default"].createElement(_styledComponents2.IconRoundSmall, { className: "close-map-control-item", onClick: onClick }, _react["default"].createElement(_icons.Close, { height: "16px" }))), _react["default"].createElement(StyledMapControlPanelContent, null, children)); }); MapControlPanel.displayName = 'MapControlPanel'; var MapLegendPanel = function MapLegendPanel(_ref6) { var layers = _ref6.layers, isActive = _ref6.isActive, scale = _ref6.scale, onToggleMenuPanel = _ref6.onToggleMenuPanel, isExport = _ref6.isExport; return !isActive ? _react["default"].createElement(_styledComponents2.MapControlButton, { key: 2, "data-tip": true, "data-for": "show-legend", className: "map-control-button show-legend", onClick: function onClick(e) { e.preventDefault(); onToggleMenuPanel(); } }, _react["default"].createElement(_icons.Legend, { height: "22px" }), _react["default"].createElement(MapLegendTooltip, { id: "show-legend", message: 'tooltip.showLegend' })) : _react["default"].createElement(MapControlPanel, { scale: scale, header: 'header.layerLegend', onClick: onToggleMenuPanel, isExport: isExport }, _react["default"].createElement(_mapLegend["default"], { layers: layers })); }; MapLegendPanel.displayName = 'MapControlPanel'; var SplitMapButton = _react["default"].memo(function (_ref7) { var isSplit = _ref7.isSplit, mapIndex = _ref7.mapIndex, onToggleSplitMap = _ref7.onToggleSplitMap; return _react["default"].createElement(_styledComponents2.MapControlButton, { active: isSplit, onClick: function onClick(e) { e.preventDefault(); onToggleSplitMap(isSplit ? mapIndex : undefined); }, key: "split-".concat(isSplit), className: (0, _classnames["default"])('map-control-button', 'split-map', { 'close-map': isSplit }), "data-tip": true, "data-for": "action-toggle" }, isSplit ? _react["default"].createElement(_icons.Delete, { height: "18px" }) : _react["default"].createElement(_icons.Split, { height: "18px" }), _react["default"].createElement(MapControlTooltip, { id: "action-toggle", message: isSplit ? 'tooltip.closePanel' : 'tooltip.switchToDualView' })); }); SplitMapButton.displayName = 'SplitMapButton'; var Toggle3dButton = _react["default"].memo(function (_ref8) { var dragRotate = _ref8.dragRotate, onTogglePerspective = _ref8.onTogglePerspective; return _react["default"].createElement(_styledComponents2.MapControlButton, { onClick: function onClick(e) { e.preventDefault(); onTogglePerspective(); }, active: dragRotate, "data-tip": true, "data-for": "action-3d" }, _react["default"].createElement(_icons.Cube3d, { height: "22px" }), _react["default"].createElement(MapControlTooltip, { id: "action-3d", message: dragRotate ? 'tooltip.disable3DMap' : 'tooltip.3DMap' })); }); Toggle3dButton.displayName = 'Toggle3dButton'; var StyledToolbar = (0, _styledComponents["default"])(_verticalToolbar["default"])(_templateObject6()); var MapDrawPanel = _react["default"].memo(function (_ref9) { var editor = _ref9.editor, isActive = _ref9.isActive, onToggleMenuPanel = _ref9.onToggleMenuPanel, onSetEditorMode = _ref9.onSetEditorMode, onToggleEditorVisibility = _ref9.onToggleEditorVisibility; return _react["default"].createElement("div", { className: "map-draw-controls", style: { position: 'relative' } }, isActive ? _react["default"].createElement(StyledToolbar, { show: isActive }, _react["default"].createElement(_toolbarItem["default"], { className: "edit-feature", onClick: function onClick() { return onSetEditorMode(_defaultSettings.EDITOR_MODES.EDIT); }, label: "toolbar.select", iconHeight: "22px", icon: _icons.CursorClick, active: editor.mode === _defaultSettings.EDITOR_MODES.EDIT }), _react["default"].createElement(_toolbarItem["default"], { className: "draw-feature", onClick: function onClick() { return onSetEditorMode(_defaultSettings.EDITOR_MODES.DRAW_POLYGON); }, label: "toolbar.polygon", iconHeight: "22px", icon: _icons.Polygon, active: editor.mode === _defaultSettings.EDITOR_MODES.DRAW_POLYGON }), _react["default"].createElement(_toolbarItem["default"], { className: "draw-rectangle", onClick: function onClick() { return onSetEditorMode(_defaultSettings.EDITOR_MODES.DRAW_RECTANGLE); }, label: "toolbar.rectangle", iconHeight: "22px", icon: _icons.Rectangle, active: editor.mode === _defaultSettings.EDITOR_MODES.DRAW_RECTANGLE }), _react["default"].createElement(_toolbarItem["default"], { className: "toggle-features", onClick: onToggleEditorVisibility, label: editor.visible ? 'toolbar.hide' : 'toolbar.show', iconHeight: "22px", icon: editor.visible ? _icons.EyeSeen : _icons.EyeUnseen })) : null, _react["default"].createElement(_styledComponents2.MapControlButton, { onClick: function onClick(e) { e.preventDefault(); onToggleMenuPanel(); }, active: isActive, "data-tip": true, "data-for": "map-draw" }, _react["default"].createElement(_icons.DrawPolygon, { height: "22px" }), _react["default"].createElement(MapControlTooltip, { id: "map-draw", message: "tooltip.DrawOnMap" }))); }); MapDrawPanel.displayName = 'MapDrawPanel'; var LocalePanel = _react["default"].memo(function (_ref10) { var availableLocales = _ref10.availableLocales, isActive = _ref10.isActive, onToggleMenuPanel = _ref10.onToggleMenuPanel, onSetLocale = _ref10.onSetLocale, activeLocale = _ref10.activeLocale; var onClickItem = (0, _react.useCallback)(function (locale) { onSetLocale(locale); }, [onSetLocale]); var onClickButton = (0, _react.useCallback)(function (e) { e.preventDefault(); onToggleMenuPanel(); }, [onToggleMenuPanel]); var getLabel = (0, _react.useCallback)(function (locale) { return "toolbar.".concat(locale); }, []); return _react["default"].createElement("div", { style: { position: 'relative' } }, isActive ? _react["default"].createElement(StyledToolbar, { show: isActive }, availableLocales.map(function (locale) { return _react["default"].createElement(_toolbarItem["default"], { key: locale, onClick: function onClick() { return onClickItem(locale); }, label: getLabel(locale), active: activeLocale === locale }); })) : null, _react["default"].createElement(_styledComponents2.MapControlButton, { onClick: onClickButton, active: isActive, "data-tip": true, "data-for": "locale" }, activeLocale.toUpperCase(), _react["default"].createElement(MapControlTooltip, { id: "locale", message: "tooltip.selectLocale" }))); }); LocalePanel.displayName = 'LocalePanel'; var MapControlFactory = function MapControlFactory() { var MapControl = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(MapControl, _Component); function MapControl() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, MapControl); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(MapControl)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerSelector", function (props) { return props.layers; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layersToRenderSelector", function (props) { return props.layersToRender; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerPanelItemsSelector", (0, _reselect.createSelector)(_this.layerSelector, _this.layersToRenderSelector, function (layers, layersToRender) { return layers.filter(function (l) { return l.config.isVisible; }).map(function (layer) { return { id: layer.id, name: layer.config.label, // layer isVisible: layersToRender[layer.id] }; }); })); return _this; } (0, _createClass2["default"])(MapControl, [{ key: "render", value: function render() { var _this$props = this.props, dragRotate = _this$props.dragRotate, layers = _this$props.layers, layersToRender = _this$props.layersToRender, isSplit = _this$props.isSplit, isExport = _this$props.isExport, mapIndex = _this$props.mapIndex, mapControls = _this$props.mapControls, onTogglePerspective = _this$props.onTogglePerspective, onToggleSplitMap = _this$props.onToggleSplitMap, onMapToggleLayer = _this$props.onMapToggleLayer, onToggleMapControl = _this$props.onToggleMapControl, editor = _this$props.editor, scale = _this$props.scale, readOnly = _this$props.readOnly, locale = _this$props.locale; var _mapControls$visibleL = mapControls.visibleLayers, visibleLayers = _mapControls$visibleL === void 0 ? {} : _mapControls$visibleL, _mapControls$mapLegen = mapControls.mapLegend, mapLegend = _mapControls$mapLegen === void 0 ? {} : _mapControls$mapLegen, _mapControls$toggle3d = mapControls.toggle3d, toggle3d = _mapControls$toggle3d === void 0 ? {} : _mapControls$toggle3d, _mapControls$splitMap = mapControls.splitMap, splitMap = _mapControls$splitMap === void 0 ? {} : _mapControls$splitMap, _mapControls$mapDraw = mapControls.mapDraw, mapDraw = _mapControls$mapDraw === void 0 ? {} : _mapControls$mapDraw, _mapControls$mapLocal = mapControls.mapLocale, mapLocale = _mapControls$mapLocal === void 0 ? {} : _mapControls$mapLocal; return _react["default"].createElement(StyledMapControl, { className: "map-control" }, splitMap.show && readOnly !== true ? _react["default"].createElement(ActionPanel, { className: "split-map", key: 0 }, _react["default"].createElement(SplitMapButton, { isSplit: isSplit, mapIndex: mapIndex, onToggleSplitMap: onToggleSplitMap })) : null, isSplit && visibleLayers.show && readOnly !== true ? _react["default"].createElement(ActionPanel, { className: "map-layers", key: 1 }, _react["default"].createElement(LayerSelectorPanel, { items: this.layerPanelItemsSelector(this.props), onMapToggleLayer: onMapToggleLayer, isActive: visibleLayers.active, toggleMenuPanel: function toggleMenuPanel() { return onToggleMapControl('visibleLayers'); } })) : null, toggle3d.show ? _react["default"].createElement(ActionPanel, { className: "toggle-3d", key: 2 }, _react["default"].createElement(Toggle3dButton, { dragRotate: dragRotate, onTogglePerspective: onTogglePerspective })) : null, mapLegend.show ? _react["default"].createElement(ActionPanel, { className: "show-legend", key: 3 }, _react["default"].createElement(MapLegendPanel, { layers: layers.filter(function (l) { return layersToRender[l.id]; }), scale: scale, isExport: isExport, onMapToggleLayer: onMapToggleLayer, isActive: mapLegend.active, onToggleMenuPanel: function onToggleMenuPanel() { return onToggleMapControl('mapLegend'); } })) : null, mapDraw.show ? _react["default"].createElement(ActionPanel, { key: 4 }, _react["default"].createElement(MapDrawPanel, { isActive: mapDraw.active && mapDraw.activeMapIndex === mapIndex, editor: editor, onToggleMenuPanel: function onToggleMenuPanel() { return onToggleMapControl('mapDraw'); }, onSetEditorMode: this.props.onSetEditorMode, onToggleEditorVisibility: this.props.onToggleEditorVisibility })) : null, mapLocale.show ? _react["default"].createElement(ActionPanel, { key: 5 }, _react["default"].createElement(LocalePanel, { isActive: mapLocale.active, activeLocale: locale, availableLocales: Object.keys(_defaultSettings.LOCALES), onSetLocale: this.props.onSetLocale, onToggleMenuPanel: function onToggleMenuPanel() { return onToggleMapControl('mapLocale'); } })) : null); } }]); return MapControl; }(_react.Component); (0, _defineProperty2["default"])(MapControl, "propTypes", { datasets: _propTypes["default"].object.isRequired, dragRotate: _propTypes["default"].bool.isRequired, isSplit: _propTypes["default"].bool.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].object), layersToRender: _propTypes["default"].object.isRequired, mapIndex: _propTypes["default"].number.isRequired, mapControls: _propTypes["default"].object.isRequired, onTogglePerspective: _propTypes["default"].func.isRequired, onToggleSplitMap: _propTypes["default"].func.isRequired, onToggleMapControl: _propTypes["default"].func.isRequired, onSetEditorMode: _propTypes["default"].func.isRequired, onToggleEditorVisibility: _propTypes["default"].func.isRequired, top: _propTypes["default"].number.isRequired, onSetLocale: _propTypes["default"].func.isRequired, locale: _propTypes["default"].string.isRequired, // optional readOnly: _propTypes["default"].bool, scale: _propTypes["default"].number, mapLayers: _propTypes["default"].object, editor: _propTypes["default"].object }); (0, _defineProperty2["default"])(MapControl, "defaultProps", { isSplit: false, top: 0, mapIndex: 0 }); MapControl.displayName = 'MapControl'; return MapControl; }; var _default = MapControlFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtY29udHJvbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRNYXBDb250cm9sIiwic3R5bGVkIiwiZGl2IiwicHJvcHMiLCJ0aGVtZSIsIm1hcENvbnRyb2wiLCJ3aWR0aCIsInBhZGRpbmciLCJ0b3AiLCJTdHlsZWRNYXBDb250cm9sQWN0aW9uIiwiU3R5bGVkTWFwQ29udHJvbFBhbmVsIiwibWFwUGFuZWxCYWNrZ3JvdW5kQ29sb3IiLCJTdHlsZWRNYXBDb250cm9sUGFuZWxDb250ZW50IiwiZHJvcGRvd25TY3JvbGxCYXIiLCJTdHlsZWRNYXBDb250cm9sUGFuZWxIZWFkZXIiLCJtYXBQYW5lbEhlYWRlckJhY2tncm91bmRDb2xvciIsInRpdGxlVGV4dENvbG9yIiwiQWN0aW9uUGFuZWwiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsImRpc3BsYXlOYW1lIiwiTWFwQ29udHJvbFRvb2x0aXAiLCJSZWFjdCIsIm1lbW8iLCJpZCIsIm1lc3NhZ2UiLCJNYXBMZWdlbmRUb29sdGlwIiwiTGF5ZXJTZWxlY3RvclBhbmVsIiwiaXRlbXMiLCJvbk1hcFRvZ2dsZUxheWVyIiwiaXNBY3RpdmUiLCJ0b2dnbGVNZW51UGFuZWwiLCJlIiwicHJldmVudERlZmF1bHQiLCJNYXBDb250cm9sUGFuZWwiLCJoZWFkZXIiLCJvbkNsaWNrIiwic2NhbGUiLCJpc0V4cG9ydCIsInRyYW5zZm9ybSIsIm1hcmdpbkJvdHRvbSIsInZlcnRpY2FsQWxpZ24iLCJNYXBMZWdlbmRQYW5lbCIsImxheWVycyIsIm9uVG9nZ2xlTWVudVBhbmVsIiwiU3BsaXRNYXBCdXR0b24iLCJpc1NwbGl0IiwibWFwSW5kZXgiLCJvblRvZ2dsZVNwbGl0TWFwIiwidW5kZWZpbmVkIiwiVG9nZ2xlM2RCdXR0b24iLCJkcmFnUm90YXRlIiwib25Ub2dnbGVQZXJzcGVjdGl2ZSIsIlN0eWxlZFRvb2xiYXIiLCJWZXJ0aWNhbFRvb2xiYXIiLCJNYXBEcmF3UGFuZWwiLCJlZGl0b3IiLCJvblNldEVkaXRvck1vZGUiLCJvblRvZ2dsZUVkaXRvclZpc2liaWxpdHkiLCJwb3NpdGlvbiIsIkVESVRPUl9NT0RFUyIsIkVESVQiLCJDdXJzb3JDbGljayIsIm1vZGUiLCJEUkFXX1BPTFlHT04iLCJQb2x5Z29uIiwiRFJBV19SRUNUQU5HTEUiLCJSZWN0YW5nbGUiLCJ2aXNpYmxlIiwiRXllU2VlbiIsIkV5ZVVuc2VlbiIsIkxvY2FsZVBhbmVsIiwiYXZhaWxhYmxlTG9jYWxlcyIsIm9uU2V0TG9jYWxlIiwiYWN0aXZlTG9jYWxlIiwib25DbGlja0l0ZW0iLCJsb2NhbGUiLCJvbkNsaWNrQnV0dG9uIiwiZ2V0TGFiZWwiLCJtYXAiLCJ0b1VwcGVyQ2FzZSIsIk1hcENvbnRyb2xGYWN0b3J5IiwiTWFwQ29udHJvbCIsImxheWVyc1RvUmVuZGVyIiwibGF5ZXJTZWxlY3RvciIsImxheWVyc1RvUmVuZGVyU2VsZWN0b3IiLCJmaWx0ZXIiLCJsIiwiY29uZmlnIiwiaXNWaXNpYmxlIiwibGF5ZXIiLCJuYW1lIiwibGFiZWwiLCJtYXBDb250cm9scyIsIm9uVG9nZ2xlTWFwQ29udHJvbCIsInJlYWRPbmx5IiwidmlzaWJsZUxheWVycyIsIm1hcExlZ2VuZCIsInRvZ2dsZTNkIiwic3BsaXRNYXAiLCJtYXBEcmF3IiwibWFwTG9jYWxlIiwic2hvdyIsImxheWVyUGFuZWxJdGVtc1NlbGVjdG9yIiwiYWN0aXZlIiwiYWN0aXZlTWFwSW5kZXgiLCJPYmplY3QiLCJrZXlzIiwiTE9DQUxFUyIsIkNvbXBvbmVudCIsImRhdGFzZXRzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsImJvb2wiLCJhcnJheU9mIiwibnVtYmVyIiwiZnVuYyIsInN0cmluZyIsIm1hcExheWVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztB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d0Isa0JBMEJOO0FBQ3BCcEMsSUFBQUEsT0FBTyxFQUFFLEtBRFc7QUFFcEJ0QyxJQUFBQSxHQUFHLEVBQUUsQ0FGZTtBQUdwQnVDLElBQUFBLFFBQVEsRUFBRTtBQUhVLEdBMUJNO0FBc0o5Qm1DLEVBQUFBLFVBQVUsQ0FBQzlELFdBQVgsR0FBeUIsWUFBekI7QUFFQSxTQUFPOEQsVUFBUDtBQUNELENBekpEOztlQTJKZUQsaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjAgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCB7SWNvblJvdW5kU21hbGwsIE1hcENvbnRyb2xCdXR0b24sIFRvb2x0aXB9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBNYXBMYXllclNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL21hcC1sYXllci1zZWxlY3Rvcic7XG5pbXBvcnQgS2VwbGVyR2xMb2dvIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2xvZ28nO1xuaW1wb3J0IE1hcExlZ2VuZCBmcm9tICcuL21hcC1sZWdlbmQnO1xuaW1wb3J0IHtcbiAgQ2xvc2UsXG4gIEN1YmUzZCxcbiAgQ3Vyc29yQ2xpY2ssXG4gIERlbGV0ZSxcbiAgRHJhd1BvbHlnb24sXG4gIEV5ZVNlZW4sXG4gIEV5ZVVuc2VlbixcbiAgTGF5ZXJzLFxuICBMZWdlbmQsXG4gIFBvbHlnb24sXG4gIFJlY3RhbmdsZSxcbiAgU3BsaXRcbn0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFZlcnRpY2FsVG9vbGJhciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi92ZXJ0aWNhbC10b29sYmFyJztcbmltcG9ydCBUb29sYmFySXRlbSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi90b29sYmFyLWl0ZW0nO1xuaW1wb3J0IHtFRElUT1JfTU9ERVMsIExPQ0FMRVN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgU3R5bGVkTWFwQ29udHJvbCA9IHN0eWxlZC5kaXZgXG4gIHJpZ2h0OiAwO1xuICB3aWR0aDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tYXBDb250cm9sLndpZHRofXB4O1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgei1pbmRleDogMTA7XG4gIHRvcDogJHtwcm9wcyA9PiBwcm9wcy50b3B9cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbmA7XG5cbmNvbnN0IFN0eWxlZE1hcENvbnRyb2xBY3Rpb24gPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0cHggMDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbmA7XG5cbmNvbnN0IFN0eWxlZE1hcENvbnRyb2xQYW5lbCA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubWFwUGFuZWxCYWNrZ3JvdW5kQ29sb3J9O1xuICBmbGV4LWdyb3c6IDE7XG4gIHotaW5kZXg6IDE7XG4gIHAge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1hcENvbnRyb2xQYW5lbENvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duU2Nyb2xsQmFyfTtcbiAgbWF4LWhlaWdodDogNTAwcHg7XG4gIG1pbi1oZWlnaHQ6IDEwMHB4O1xuICBvdmVyZmxvdzogYXV0bztcbmA7XG5cbmNvbnN0IFN0eWxlZE1hcENvbnRyb2xQYW5lbEhlYWRlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tYXBQYW5lbEhlYWRlckJhY2tncm91bmRDb2xvcn07XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGl0bGVUZXh0Q29sb3J9O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgYnV0dG9uIHtcbiAgICB3aWR0aDogMThweDtcbiAgICBoZWlnaHQ6IDE4cHg7XG4gIH1cbmA7XG5cbmNvbnN0IEFjdGlvblBhbmVsID0gKHtjbGFzc05hbWUsIGNoaWxkcmVufSkgPT4gKFxuICA8U3R5bGVkTWFwQ29udHJvbEFjdGlvbiBjbGFzc05hbWU9e2NsYXNzTmFtZX0+e2NoaWxkcmVufTwvU3R5bGVkTWFwQ29udHJvbEFjdGlvbj5cbik7XG5cbkFjdGlvblBhbmVsLmRpc3BsYXlOYW1lID0gJ0FjdGlvblBhbmVsJztcblxuY29uc3QgTWFwQ29udHJvbFRvb2x0aXAgPSBSZWFjdC5tZW1vKCh7aWQsIG1lc3NhZ2V9KSA9PiAoXG4gIDxUb29sdGlwIGlkPXtpZH0gcGxhY2U9XCJsZWZ0XCIgZWZmZWN0PVwic29saWRcIj5cbiAgICA8c3Bhbj5cbiAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXttZXNzYWdlfSAvPlxuICAgIDwvc3Bhbj5cbiAgPC9Ub29sdGlwPlxuKSk7XG5cbk1hcENvbnRyb2xUb29sdGlwLmRpc3BsYXlOYW1lID0gJ01hcENvbnRyb2xUb29sdGlwJztcblxuY29uc3QgTWFwTGVnZW5kVG9vbHRpcCA9ICh7aWQsIG1lc3NhZ2V9KSA9PiAoXG4gIDxUb29sdGlwIGlkPXtpZH0gcGxhY2U9XCJsZWZ0XCIgZWZmZWN0PVwic29saWRcIj5cbiAgICA8c3Bhbj5cbiAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXttZXNzYWdlfSAvPlxuICAgIDwvc3Bhbj5cbiAgPC9Ub29sdGlwPlxuKTtcblxuY29uc3QgTGF5ZXJTZWxlY3RvclBhbmVsID0gUmVhY3QubWVtbygoe2l0ZW1zLCBvbk1hcFRvZ2dsZUxheWVyLCBpc0FjdGl2ZSwgdG9nZ2xlTWVudVBhbmVsfSkgPT5cbiAgIWlzQWN0aXZlID8gKFxuICAgIDxNYXBDb250cm9sQnV0dG9uXG4gICAgICBrZXk9ezF9XG4gICAgICBvbkNsaWNrPXtlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0b2dnbGVNZW51UGFuZWwoKTtcbiAgICAgIH19XG4gICAgICBjbGFzc05hbWU9XCJtYXAtY29udHJvbC1idXR0b24gdG9nZ2xlLWxheWVyXCJcbiAgICAgIGRhdGEtdGlwXG4gICAgICBkYXRhLWZvcj1cInRvZ2dsZS1sYXllclwiXG4gICAgPlxuICAgICAgPExheWVycyBoZWlnaHQ9XCIyMnB4XCIgLz5cbiAgICAgIDxNYXBDb250cm9sVG9vbHRpcFxuICAgICAgICBpZD1cInRvZ2dsZS1sYXllclwiXG4gICAgICAgIG1lc3NhZ2U9e2lzQWN0aXZlID8gJ3Rvb2x0aXAuaGlkZUxheWVyUGFuZWwnIDogJ3Rvb2x0aXAuc2hvd0xheWVyUGFuZWwnfVxuICAgICAgLz5cbiAgICA8L01hcENvbnRyb2xCdXR0b24+XG4gICkgOiAoXG4gICAgPE1hcENvbnRyb2xQYW5lbCBoZWFkZXI9XCJoZWFkZXIudmlzaWJsZUxheWVyc1wiIG9uQ2xpY2s9e3RvZ2dsZU1lbnVQYW5lbH0+XG4gICAgICA8TWFwTGF5ZXJTZWxlY3RvciBsYXllcnM9e2l0ZW1zfSBvbk1hcFRvZ2dsZUxheWVyPXtvbk1hcFRvZ2dsZUxheWVyfSAvPlxuICAgIDwvTWFwQ29udHJvbFBhbmVsPlxuICApXG4pO1xuXG5MYXllclNlbGVjdG9yUGFuZWwuZGlzcGxheU5hbWUgPSAnTGF5ZXJTZWxlY3RvclBhbmVsJztcblxuY29uc3QgTWFwQ29udHJvbFBhbmVsID0gUmVhY3QubWVtbygoe2NoaWxkcmVuLCBoZWFkZXIsIG9uQ2xpY2ssIHNjYWxlID0gMSwgaXNFeHBvcnR9KSA9PiAoXG4gIDxTdHlsZWRNYXBDb250cm9sUGFuZWxcbiAgICBzdHlsZT17e1xuICAgICAgdHJhbnNmb3JtOiBgc2NhbGUoJHtzY2FsZX0pIHRyYW5zbGF0ZShjYWxjKC0kezI1ICogKHNjYWxlIC0gMSl9JSAtICR7MTAgKlxuICAgICAgICBzY2FsZX1weCksIGNhbGMoJHsyNSAqIChzY2FsZSAtIDEpfSUgKyAkezEwICogc2NhbGV9cHgpKWAsXG4gICAgICBtYXJnaW5Cb3R0b206ICc4cHgnXG4gICAgfX1cbiAgPlxuICAgIDxTdHlsZWRNYXBDb250cm9sUGFuZWxIZWFkZXI+XG4gICAgICB7aXNFeHBvcnQgPyAoXG4gICAgICAgIDxLZXBsZXJHbExvZ28gdmVyc2lvbj17ZmFsc2V9IGFwcE5hbWU9XCJrZXBsZXIuZ2xcIiAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPHNwYW4gc3R5bGU9e3t2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJ319PlxuICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtoZWFkZXJ9IC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgICB7aXNFeHBvcnQgPyBudWxsIDogKFxuICAgICAgICA8SWNvblJvdW5kU21hbGwgY2xhc3NOYW1lPVwiY2xvc2UtbWFwLWNvbnRyb2wtaXRlbVwiIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgICAgIDxDbG9zZSBoZWlnaHQ9XCIxNnB4XCIgLz5cbiAgICAgICAgPC9JY29uUm91bmRTbWFsbD5cbiAgICAgICl9XG4gICAgPC9TdHlsZWRNYXBDb250cm9sUGFuZWxIZWFkZXI+XG4gICAgPFN0eWxlZE1hcENvbnRyb2xQYW5lbENvbnRlbnQ+e2NoaWxkcmVufTwvU3R5bGVkTWFwQ29udHJvbFBhbmVsQ29udGVudD5cbiAgPC9TdHlsZWRNYXBDb250cm9sUGFuZWw+XG4pKTtcblxuTWFwQ29udHJvbFBhbmVsLmRpc3BsYXlOYW1lID0gJ01hcENvbnRyb2xQYW5lbCc7XG5cbmNvbnN0IE1hcExlZ2VuZFBhbmVsID0gKHtsYXllcnMsIGlzQWN0aXZlLCBzY2FsZSwgb25Ub2dnbGVNZW51UGFuZWwsIGlzRXhwb3J0fSkgPT5cbiAgIWlzQWN0aXZlID8gKFxuICAgIDxNYXBDb250cm9sQnV0dG9uXG4gICAgICBrZXk9ezJ9XG4gICAgICBkYXRhLXRpcFxuICAgICAgZGF0YS1mb3I9XCJzaG93LWxlZ2VuZFwiXG4gICAgICBjbGFzc05hbWU9XCJtYXAtY29udHJvbC1idXR0b24gc2hvdy1sZWdlbmRcIlxuICAgICAgb25DbGljaz17ZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25Ub2dnbGVNZW51UGFuZWwoKTtcbiAgICAgIH19XG4gICAgPlxuICAgICAgPExlZ2VuZCBoZWlnaHQ9XCIyMnB4XCIgLz5cbiAgICAgIDxNYXBMZWdlbmRUb29sdGlwIGlkPVwic2hvdy1sZWdlbmRcIiBtZXNzYWdlPXsndG9vbHRpcC5zaG93TGVnZW5kJ30gLz5cbiAgICA8L01hcENvbnRyb2xCdXR0b24+XG4gICkgOiAoXG4gICAgPE1hcENvbnRyb2xQYW5lbFxuICAgICAgc2NhbGU9e3NjYWxlfVxuICAgICAgaGVhZGVyPXsnaGVhZGVyLmxheWVyTGVnZW5kJ31cbiAgICAgIG9uQ2xpY2s9e29uVG9nZ2xlTWVudVBhbmVsfVxuICAgICAgaXNFeHBvcnQ9e2lzRXhwb3J0fVxuICAgID5cbiAgICAgIDxNYXBMZWdlbmQgbGF5ZXJzPXtsYXllc