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
JavaScript
"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