UNPKG

kepler.gl.geoiq

Version:

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

238 lines (196 loc) 28.4 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AddDataButtonFactory = AddDataButtonFactory; exports.AddExternalDataButtonFactory = AddExternalDataButtonFactory; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); 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 _reactAnythingSortable = _interopRequireDefault(require("react-anything-sortable")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reselect = require("reselect"); var _layerPanel = _interopRequireDefault(require("./layer-panel/layer-panel")); var _sourceDataCatalog = _interopRequireDefault(require("./source-data-catalog")); var _icons = require("../common/icons"); var _itemSelector = _interopRequireDefault(require("../common/item-selector/item-selector")); var _styledComponents2 = require("../common/styled-components"); var _defaultSettings = require("../../constants/default-settings"); function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .ui-sortable {\n display: block;\n position: relative;\n overflow: visible;\n user-select: none;\n\n :before {\n content: ' ';\n display: table;\n }\n\n :after {\n content: ' ';\n display: table;\n }\n }\n\n .ui-sortable-item.ui-sortable-dragging {\n position: absolute;\n z-index: 1688;\n cursor: move;\n }\n\n .ui-sortable-item.ui-sortable-dragging:hover {\n cursor: move;\n opacity: 0.5;\n }\n\n .ui-sortable-placeholder {\n display: none;\n }\n\n .ui-sortable-placeholder.visible {\n display: block;\n opacity: 0;\n z-index: -1;\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var StyledSortable = _styledComponents["default"].div(_templateObject()); var LayerBlendingSelector = function LayerBlendingSelector(_ref) { var layerBlending = _ref.layerBlending, updateLayerBlending = _ref.updateLayerBlending; return _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_styledComponents2.PanelLabel, null, "Layer Blending"), _react["default"].createElement(_itemSelector["default"], { selectedItems: layerBlending, options: Object.keys(_defaultSettings.LAYER_BLENDINGS), multiSelect: false, searchable: false, onChange: updateLayerBlending })); }; function AddDataButtonFactory() { var AddDataButton = function AddDataButton(_ref2) { var onClick = _ref2.onClick, isInactive = _ref2.isInactive; return _react["default"].createElement(_styledComponents2.Button, { onClick: onClick, isInactive: !isInactive, width: "105px", secondary: true }, _react["default"].createElement(_icons.Add, { height: "12px" }), "Add Data"); }; return AddDataButton; } function AddExternalDataButtonFactory() { var AddExternalDataButton = function AddExternalDataButton(_ref3) { var onClick = _ref3.onClick, isInactive = _ref3.isInactive; return _react["default"].createElement(_styledComponents2.Button, { onClick: onClick, isInactive: !isInactive, width: "135", margin: '0px 0px 0px 16px', secondary: true }, _react["default"].createElement(_icons.Add, { height: "12px" }), "Add Ext. Data"); }; return AddExternalDataButton; } LayerManagerFactory.deps = [AddDataButtonFactory, AddExternalDataButtonFactory, _layerPanel["default"], _sourceDataCatalog["default"]]; function LayerManagerFactory(AddDataButton, AddExternalDataButton, LayerPanel, SourceDataCatalog) { var _class, _temp; return _temp = _class = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(LayerManager, _Component); function LayerManager() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, LayerManager); 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"])(LayerManager)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerClassSelector", function (props) { return props.layerClasses; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerTypeOptionsSelector", (0, _reselect.createSelector)(_this.layerClassSelector, function (layerClasses) { return Object.keys(layerClasses).map(function (key) { var layer = new layerClasses[key](); return { id: key, label: layer.name, icon: layer.layerIcon }; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_addEmptyNewLayer", function () { _this.props.addLayer(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleSort", function (order) { _this.props.updateLayerOrder(order); }); return _this; } (0, _createClass2["default"])(LayerManager, [{ key: "render", value: function render() { var _this$props = this.props, layers = _this$props.layers, datasets = _this$props.datasets, layerOrder = _this$props.layerOrder, openModal = _this$props.openModal; var defaultDataset = Object.keys(datasets)[0]; var layerTypeOptions = this.layerTypeOptionsSelector(this.props); var layerActions = { layerConfigChange: this.props.layerConfigChange, layerVisualChannelConfigChange: this.props.layerVisualChannelConfigChange, layerTypeChange: this.props.layerTypeChange, layerVisConfigChange: this.props.layerVisConfigChange, removeLayer: this.props.removeLayer, updateLayerData: this.props.updateLayerData, axiosAPICAll: this.props.axiosAPICAll }; var panelProps = { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions }; return _react["default"].createElement(StyledSortable, { className: "layer-manager" }, _react["default"].createElement(SourceDataCatalog, { datasets: datasets, showDatasetTable: this.props.showDatasetTable, removeDataset: this.props.removeDataset, showDeleteDataset: true }), _react["default"].createElement(AddDataButton, { onClick: this.props.showAddDataModal, isInactive: !defaultDataset }), _react["default"].createElement(AddExternalDataButton, { onClick: this.props.showAddExternalDataModal, isInactive: !defaultDataset }), _react["default"].createElement(_styledComponents2.SidePanelDivider, null), _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_reactAnythingSortable["default"], { onSort: this._handleSort, direction: "vertical", sortHandle: "sort--handle", dynamic: true }, layerOrder.map(function (idx) { return _react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, { sortData: idx, key: layers[idx].id, idx: idx, layer: layers[idx] })); }))), _react["default"].createElement(_styledComponents2.SidePanelSection, null, defaultDataset ? _react["default"].createElement(_styledComponents2.Button, { onClick: this._addEmptyNewLayer, width: "105px" }, _react["default"].createElement(_icons.Add, { height: "12px" }), "Add Layer") : null)); } }]); return LayerManager; }(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", { addLayer: _propTypes["default"].func.isRequired, datasets: _propTypes["default"].object.isRequired, layerBlending: _propTypes["default"].string.isRequired, layerClasses: _propTypes["default"].object.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, layerConfigChange: _propTypes["default"].func.isRequired, layerVisualChannelConfigChange: _propTypes["default"].func.isRequired, layerTypeChange: _propTypes["default"].func.isRequired, layerVisConfigChange: _propTypes["default"].func.isRequired, openModal: _propTypes["default"].func.isRequired, removeLayer: _propTypes["default"].func.isRequired, removeDataset: _propTypes["default"].func.isRequired, showDatasetTable: _propTypes["default"].func.isRequired, updateLayerBlending: _propTypes["default"].func.isRequired, updateLayerOrder: _propTypes["default"].func.isRequired, updateLayerData: _propTypes["default"].func.isRequired, axiosAPICAll: _propTypes["default"].func.isRequired }), _temp; } var _default = LayerManagerFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJTdHlsZWRTb3J0YWJsZSIsInN0eWxlZCIsImRpdiIsIkxheWVyQmxlbmRpbmdTZWxlY3RvciIsImxheWVyQmxlbmRpbmciLCJ1cGRhdGVMYXllckJsZW5kaW5nIiwiT2JqZWN0Iiwia2V5cyIsIkxBWUVSX0JMRU5ESU5HUyIsIkFkZERhdGFCdXR0b25GYWN0b3J5IiwiQWRkRGF0YUJ1dHRvbiIsIm9uQ2xpY2siLCJpc0luYWN0aXZlIiwiQWRkRXh0ZXJuYWxEYXRhQnV0dG9uRmFjdG9yeSIsIkFkZEV4dGVybmFsRGF0YUJ1dHRvbiIsIkxheWVyTWFuYWdlckZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkiLCJMYXllclBhbmVsIiwiU291cmNlRGF0YUNhdGFsb2ciLCJwcm9wcyIsImxheWVyQ2xhc3NlcyIsImxheWVyQ2xhc3NTZWxlY3RvciIsIm1hcCIsImtleSIsImxheWVyIiwiaWQiLCJsYWJlbCIsIm5hbWUiLCJpY29uIiwibGF5ZXJJY29uIiwiYWRkTGF5ZXIiLCJvcmRlciIsInVwZGF0ZUxheWVyT3JkZXIiLCJsYXllcnMiLCJkYXRhc2V0cyIsImxheWVyT3JkZXIiLCJvcGVuTW9kYWwiLCJkZWZhdWx0RGF0YXNldCIsImxheWVyVHlwZU9wdGlvbnMiLCJsYXllclR5cGVPcHRpb25zU2VsZWN0b3IiLCJsYXllckFjdGlvbnMiLCJsYXllckNvbmZpZ0NoYW5nZSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImxheWVyVHlwZUNoYW5nZSIsImxheWVyVmlzQ29uZmlnQ2hhbmdlIiwicmVtb3ZlTGF5ZXIiLCJ1cGRhdGVMYXllckRhdGEiLCJheGlvc0FQSUNBbGwiLCJwYW5lbFByb3BzIiwic2hvd0RhdGFzZXRUYWJsZSIsInJlbW92ZURhdGFzZXQiLCJzaG93QWRkRGF0YU1vZGFsIiwic2hvd0FkZEV4dGVybmFsRGF0YU1vZGFsIiwiX2hhbmRsZVNvcnQiLCJpZHgiLCJfYWRkRW1wdHlOZXdMYXllciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImZ1bmMiLCJpc1JlcXVpcmVkIiwib2JqZWN0Iiwic3RyaW5nIiwiYXJyYXlPZiIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsY0FBYyxHQUFHQyw2QkFBT0MsR0FBVixtQkFBcEI7O0FBd0NBLElBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFFQyxhQUFGLFFBQUVBLGFBQUY7QUFBQSxNQUFpQkMsbUJBQWpCLFFBQWlCQSxtQkFBakI7QUFBQSxTQUM1QixnQ0FBQyxtQ0FBRCxRQUNFLGdDQUFDLDZCQUFELHlCQURGLEVBRUUsZ0NBQUMsd0JBQUQ7QUFDRSxJQUFBLGFBQWEsRUFBRUQsYUFEakI7QUFFRSxJQUFBLE9BQU8sRUFBRUUsTUFBTSxDQUFDQyxJQUFQLENBQVlDLGdDQUFaLENBRlg7QUFHRSxJQUFBLFdBQVcsRUFBRSxLQUhmO0FBSUUsSUFBQSxVQUFVLEVBQUUsS0FKZDtBQUtFLElBQUEsUUFBUSxFQUFFSDtBQUxaLElBRkYsQ0FENEI7QUFBQSxDQUE5Qjs7QUFhTyxTQUFTSSxvQkFBVCxHQUFnQztBQUNyQyxNQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCO0FBQUEsUUFBRUMsT0FBRixTQUFFQSxPQUFGO0FBQUEsUUFBV0MsVUFBWCxTQUFXQSxVQUFYO0FBQUEsV0FDcEIsZ0NBQUMseUJBQUQ7QUFBUSxNQUFBLE9BQU8sRUFBRUQsT0FBakI7QUFBMEIsTUFBQSxVQUFVLEVBQUUsQ0FBQ0MsVUFBdkM7QUFBbUQsTUFBQSxLQUFLLEVBQUMsT0FBekQ7QUFBaUUsTUFBQSxTQUFT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VyxFQUFFWSxzQkFBVUMsSUFBVixDQUFlQyxVQVhYO0FBWWpCVCxJQUFBQSxhQUFhLEVBQUVPLHNCQUFVQyxJQUFWLENBQWVDLFVBWmI7QUFhakJWLElBQUFBLGdCQUFnQixFQUFFUSxzQkFBVUMsSUFBVixDQUFlQyxVQWJoQjtBQWNqQnhELElBQUFBLG1CQUFtQixFQUFFc0Qsc0JBQVVDLElBQVYsQ0FBZUMsVUFkbkI7QUFlakIzQixJQUFBQSxnQkFBZ0IsRUFBRXlCLHNCQUFVQyxJQUFWLENBQWVDLFVBZmhCO0FBZ0JqQmIsSUFBQUEsZUFBZSxFQUFFVyxzQkFBVUMsSUFBVixDQUFlQyxVQWhCZjtBQWlCakJaLElBQUFBLFlBQVksRUFBRVUsc0JBQVVDLElBQVYsQ0FBZUM7QUFqQlosR0FEckI7QUErR0Q7O2VBRWM5QyxtQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBTb3J0YWJsZSBmcm9tICdyZWFjdC1hbnl0aGluZy1zb3J0YWJsZSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcblxuaW1wb3J0IExheWVyUGFuZWxGYWN0b3J5IGZyb20gJy4vbGF5ZXItcGFuZWwvbGF5ZXItcGFuZWwnO1xuaW1wb3J0IFNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeSBmcm9tICcuL3NvdXJjZS1kYXRhLWNhdGFsb2cnO1xuaW1wb3J0IHtBZGR9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBJdGVtU2VsZWN0b3IgZnJvbSAnY29tcG9uZW50cy9jb21tb24vaXRlbS1zZWxlY3Rvci9pdGVtLXNlbGVjdG9yJztcbmltcG9ydCB7XG4gIFBhbmVsTGFiZWwsXG4gIFNpZGVQYW5lbERpdmlkZXIsXG4gIFNpZGVQYW5lbFNlY3Rpb24sXG4gIEJ1dHRvblxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7TEFZRVJfQkxFTkRJTkdTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmNvbnN0IFN0eWxlZFNvcnRhYmxlID0gc3R5bGVkLmRpdmBcbiAgLnVpLXNvcnRhYmxlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICA6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICcgJztcbiAgICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIH1cblxuICAgIDphZnRlciB7XG4gICAgICBjb250ZW50OiAnICc7XG4gICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICB9XG4gIH1cblxuICAudWktc29ydGFibGUtaXRlbS51aS1zb3J0YWJsZS1kcmFnZ2luZyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDE2ODg7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5cbiAgLnVpLXNvcnRhYmxlLWl0ZW0udWktc29ydGFibGUtZHJhZ2dpbmc6aG92ZXIge1xuICAgIGN1cnNvcjogbW92ZTtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cblxuICAudWktc29ydGFibGUtcGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAudWktc29ydGFibGUtcGxhY2Vob2xkZXIudmlzaWJsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAtMTtcbiAgfVxuYDtcblxuY29uc3QgTGF5ZXJCbGVuZGluZ1NlbGVjdG9yID0gKHtsYXllckJsZW5kaW5nLCB1cGRhdGVMYXllckJsZW5kaW5nfSkgPT4gKFxuICA8U2lkZVBhbmVsU2VjdGlvbj5cbiAgICA8UGFuZWxMYWJlbD5MYXllciBCbGVuZGluZzwvUGFuZWxMYWJlbD5cbiAgICA8SXRlbVNlbGVjdG9yXG4gICAgICBzZWxlY3RlZEl0ZW1zPXtsYXllckJsZW5kaW5nfVxuICAgICAgb3B0aW9ucz17T2JqZWN0LmtleXMoTEFZRVJfQkxFTkRJTkdTKX1cbiAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgIHNlYXJjaGFibGU9e2ZhbHNlfVxuICAgICAgb25DaGFuZ2U9e3VwZGF0ZUxheWVyQmxlbmRpbmd9XG4gICAgLz5cbiAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIEFkZERhdGFCdXR0b25GYWN0b3J5KCkge1xuICBjb25zdCBBZGREYXRhQnV0dG9uID0gKHtvbkNsaWNrLCBpc0luYWN0aXZlfSkgPT4gKFxuICAgIDxCdXR0b24gb25DbGljaz17b25DbGlja30gaXNJbmFjdGl2ZT17IWlzSW5hY3RpdmV9IHdpZHRoPVwiMTA1cHhcIiBzZWNvbmRhcnk+XG4gICAgICA8QWRkIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgQWRkIERhdGFcbiAgICA8L0J1dHRvbj5cbiAgKTtcbiAgcmV0dXJuIEFkZERhdGFCdXR0b247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBZGRFeHRlcm5hbERhdGFCdXR0b25GYWN0b3J5KCkge1xuICBjb25zdCBBZGRFeHRlcm5hbERhdGFCdXR0b24gPSAoe29uQ2xpY2ssIGlzSW5hY3RpdmV9KSA9PiAoXG4gICAgPEJ1dHRvblxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgIGlzSW5hY3RpdmU9eyFpc0luYWN0aXZlfVxuICAgICAgd2lkdGg9XCIxMzVcIlxuICAgICAgbWFyZ2luPXsnMHB4IDBweCAwcHggMTZweCd9XG4gICAgICBzZWNvbmRhcnlcbiAgICA+XG4gICAgICA8QWRkIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgQWRkIEV4dC4gRGF0YVxuICAgIDwvQnV0dG9uPlxuICApO1xuICByZXR1cm4gQWRkRXh0ZXJuYWxEYXRhQnV0dG9uO1xufVxuXG5MYXllck1hbmFnZXJGYWN0b3J5LmRlcHMgPSBbXG4gIEFkZERhdGFCdXR0b25GYWN0b3J5LFxuICBBZGRFeHRlcm5hbERhdGFCdXR0b25GYWN0b3J5LFxuICBMYXllclBhbmVsRmFjdG9yeSxcbiAgU291cmNlRGF0YUNhdGFsb2dGYWN0b3J5XG5dO1xuXG5mdW5jdGlvbiBMYXllck1hbmFnZXJGYWN0b3J5KFxuICBBZGREYXRhQnV0dG9uLFxuICBBZGRFeHRlcm5hbERhdGFCdXR0b24sXG4gIExheWVyUGFuZWwsXG4gIFNvdXJjZURhdGFDYXRhbG9nXG4pIHtcbiAgcmV0dXJuIGNsYXNzIExheWVyTWFuYWdlciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGFkZExheWVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclR5cGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9wZW5Nb2RhbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZUxheWVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgcmVtb3ZlRGF0YXNldDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB1cGRhdGVMYXllckJsZW5kaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgdXBkYXRlTGF5ZXJPcmRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUxheWVyRGF0YTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGF4aW9zQVBJQ0FsbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICBsYXllckNsYXNzU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYXllckNsYXNzZXM7XG4gICAgbGF5ZXJUeXBlT3B0aW9uc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmxheWVyQ2xhc3NTZWxlY3RvcixcbiAgICAgIGxheWVyQ2xhc3NlcyA9PlxuICAgICAgICBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1trZXldKCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICBsYWJlbDogbGF5ZXIubmFtZSxcbiAgICAgICAgICAgIGljb246IGxheWVyLmxheWVySWNvblxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIF9hZGRFbXB0eU5ld0xheWVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5hZGRMYXllcigpO1xuICAgIH07XG5cbiAgICBfaGFuZGxlU29ydCA9IG9yZGVyID0+IHtcbiAgICAgIHRoaXMucHJvcHMudXBkYXRlTGF5ZXJPcmRlcihvcmRlcik7XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtsYXllcnMsIGRhdGFzZXRzLCBsYXllck9yZGVyLCBvcGVuTW9kYWx9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhc2V0ID0gT2JqZWN0LmtleXMoZGF0YXNldHMpWzBdO1xuICAgICAgY29uc3QgbGF5ZXJUeXBlT3B0aW9ucyA9IHRoaXMubGF5ZXJUeXBlT3B0aW9uc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgICAgY29uc3QgbGF5ZXJBY3Rpb25zID0ge1xuICAgICAgICBsYXllckNvbmZpZ0NoYW5nZTogdGhpcy5wcm9wcy5sYXllckNvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlOiB0aGlzLnByb3BzXG4gICAgICAgICAgLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUeXBlQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyVHlwZUNoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXNDb25maWdDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gICAgICAgIHJlbW92ZUxheWVyOiB0aGlzLnByb3BzLnJlbW92ZUxheWVyLFxuICAgICAgICB1cGRhdGVMYXllckRhdGE6IHRoaXMucHJvcHMudXBkYXRlTGF5ZXJEYXRhLFxuICAgICAgICBheGlvc0FQSUNBbGw6IHRoaXMucHJvcHMuYXhpb3NBUElDQWxsXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFuZWxQcm9wcyA9IHtkYXRhc2V0cywgb3Blbk1vZGFsLCBsYXllclR5cGVPcHRpb25zfTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFNvcnRhYmxlIGNsYXNzTmFtZT1cImxheWVyLW1hbmFnZXJcIj5cbiAgICAgICAgICA8U291cmNlRGF0YUNhdGFsb2dcbiAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgIHNob3dEYXRhc2V0VGFibGU9e3RoaXMucHJvcHMuc2hvd0RhdGFzZXRUYWJsZX1cbiAgICAgICAgICAgIHJlbW92ZURhdGFzZXQ9e3RoaXMucHJvcHMucmVtb3ZlRGF0YXNldH1cbiAgICAgICAgICAgIHNob3dEZWxldGVEYXRhc2V0XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QWRkRGF0YUJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5zaG93QWRkRGF0YU1vZGFsfVxuICAgICAgICAgICAgaXNJbmFjdGl2ZT17IWRlZmF1bHREYXRhc2V0fVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPEFkZEV4dGVybmFsRGF0YUJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5zaG93QWRkRXh0ZXJuYWxEYXRhTW9kYWx9XG4gICAgICAgICAgICBpc0luYWN0aXZlPXshZGVmYXVsdERhdGFzZXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8U2lkZVBhbmVsRGl2aWRlciAvPlxuICAgICAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgICAgPFNvcnRhYmxlXG4gICAgICAgICAgICAgIG9uU29ydD17dGhpcy5faGFuZGxlU29ydH1cbiAgICAgICAgICAgICAgZGlyZWN0aW9uPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICBzb3J0SGFuZGxlPVwic29ydC0taGFuZGxlXCJcbiAgICAgICAgICAgICAgZHluYW1pY1xuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bGF5ZXJPcmRlci5tYXAoaWR4ID0+IChcbiAgICAgICAgICAgICAgICA8TGF5ZXJQYW5lbFxuICAgICAgICAgICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgICAgICAgICB7Li4ubGF5ZXJBY3Rpb25zfVxuICAgICAgICAgICAgICAgICAgc29ydERhdGE9e2lkeH1cbiAgICAgICAgICAgICAgICAgIGtleT17bGF5ZXJzW2lkeF0uaWR9XG4gICAgICAgICAgICAgICAgICBpZHg9e2lkeH1cbiAgICAgICAgICAgICAgICAgIGxheWVyPXtsYXllcnNbaWR4XX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvU29ydGFibGU+XG4gICAgICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgICAge2RlZmF1bHREYXRhc2V0ID8gKFxuICAgICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuX2FkZEVtcHR5TmV3TGF5ZXJ9IHdpZHRoPVwiMTA1cHhcIj5cbiAgICAgICAgICAgICAgICA8QWRkIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgICAgICAgICAgIEFkZCBMYXllclxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvU2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgICB7LyogPExheWVyQmxlbmRpbmdTZWxlY3RvclxuICAgICAgICAgICAgbGF5ZXJCbGVuZGluZz17dGhpcy5wcm9wcy5sYXllckJsZW5kaW5nfVxuICAgICAgICAgICAgdXBkYXRlTGF5ZXJCbGVuZGluZz17dGhpcy5wcm9wcy51cGRhdGVMYXllckJsZW5kaW5nfVxuICAgICAgICAgIC8+ICovfVxuICAgICAgICA8L1N0eWxlZFNvcnRhYmxlPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyTWFuYWdlckZhY3Rvcnk7XG4iXX0=