UNPKG

kepler.gl.geoiq

Version:

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

285 lines (238 loc) 33.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.PaletteConfig = exports.ColorPaletteGroup = exports.ALL_TYPES = exports.ALL_STEPS = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); 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 _lodash = _interopRequireDefault(require("lodash.uniq")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reselect = require("reselect"); var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector")); var _styledComponents2 = require("../../common/styled-components"); var _switch = _interopRequireDefault(require("../../common/switch")); var _colorPalette = _interopRequireDefault(require("./color-palette")); var _customPalette = _interopRequireDefault(require("./custom-palette")); var _colorRanges = require("../../../constants/color-ranges"); var _dataUtils = require("../../../utils/data-utils"); var _colorUtils = require("../../../utils/color-utils"); var _templateObject, _templateObject2, _templateObject3, _templateObject4; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var ALL_TYPES = exports.ALL_TYPES = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (c) { return c.type; }).filter(function (ctype) { return ctype; }).concat(['all', 'custom'])); var ALL_STEPS = exports.ALL_STEPS = (0, _lodash["default"])(_colorRanges.COLOR_RANGES.map(function (d) { return d.colors.length; })).sort(_dataUtils.numberSort); var StyledColorConfig = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px 12px 0 12px;\n"]))); var StyledColorRangeSelector = _styledComponents["default"].div.attrs({ className: 'color-range-selector' })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding-bottom: 12px;\n"]))); var StyledPaletteConfig = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n .color-palette__config__label {\n flex-grow: 1;\n }\n .color-palette__config__select {\n flex-grow: 1;\n }\n .item-selector .item-selector__dropdown {\n ", ";\n }\n"])), function (props) { return props.theme.secondaryInput; }); var CONFIG_SETTINGS = { type: { type: 'select', options: ALL_TYPES }, steps: { type: 'select', options: ALL_STEPS }, reversed: { type: 'switch', options: [true, false] }, custom: { label: 'Custom Palette', type: 'switch', options: [true, false] } }; var ColorRangeSelect = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(ColorRangeSelect, _Component); var _super = _createSuper(ColorRangeSelect); function ColorRangeSelect() { var _this; (0, _classCallCheck2["default"])(this, ColorRangeSelect); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "colorRangesSelector", function (props) { return props.colorRanges; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configTypeSelector", function (props) { return props.colorPaletteUI.colorRangeConfig.type; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configStepSelector", function (props) { return props.colorPaletteUI.colorRangeConfig.steps; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filteredColorRange", (0, _reselect.createSelector)(_this.colorRangesSelector, _this.configTypeSelector, _this.configStepSelector, function (colorRanges, type, steps) { return colorRanges.filter(function (colorRange) { var isType = type === 'all' || type === colorRange.type; var isStep = Number(steps) === colorRange.colors.length; return isType && isStep; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateConfig", function (_ref) { var key = _ref.key, value = _ref.value; _this._setColorRangeConfig((0, _defineProperty2["default"])({}, key, value)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSetCustomPalette", function (config) { _this.props.setColorPaletteUI({ customPalette: config }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setColorRangeConfig", function (newConfig) { _this.props.setColorPaletteUI({ colorRangeConfig: newConfig }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCustomPaletteCancel", function (newConfig) { _this.props.setColorPaletteUI({ showSketcher: false, colorRangeConfig: { custom: false } }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleSketcher", function (val) { _this.props.setColorPaletteUI({ showSketcher: val }); }); return _this; } (0, _createClass2["default"])(ColorRangeSelect, [{ key: "render", value: function render() { var _this2 = this; var _this$props$colorPale = this.props.colorPaletteUI, customPalette = _this$props$colorPale.customPalette, showSketcher = _this$props$colorPale.showSketcher, colorRangeConfig = _this$props$colorPale.colorRangeConfig; var filteredColorRanges = this.filteredColorRange(this.props); return (/*#__PURE__*/_react["default"].createElement(StyledColorRangeSelector, null, /*#__PURE__*/_react["default"].createElement(StyledColorConfig, null, (colorRangeConfig.custom ? ['custom'] : Object.keys(colorRangeConfig)).map(function (key) { return (/*#__PURE__*/_react["default"].createElement(PaletteConfig, { key: key, label: CONFIG_SETTINGS[key].label || key, config: CONFIG_SETTINGS[key], value: colorRangeConfig[key], onChange: function onChange(value) { return _this2._updateConfig({ key: key, value: value }); } }) ); })), colorRangeConfig.custom ? /*#__PURE__*/_react["default"].createElement(_customPalette["default"], { customPalette: customPalette, showSketcher: showSketcher, selected: this.props.selectedColorRange, onApply: this.props.onSelectColorRange, onToggleSketcher: this._onToggleSketcher, setCustomPalette: this._onSetCustomPalette, onCancel: this._onCustomPaletteCancel }) : /*#__PURE__*/_react["default"].createElement(ColorPaletteGroup, { colorRanges: filteredColorRanges, onSelect: this.props.onSelectColorRange, selected: this.props.selectedColorRange, reversed: colorRangeConfig.reversed })) ); } }]); return ColorRangeSelect; }(_react.Component); (0, _defineProperty2["default"])(ColorRangeSelect, "propTypes", { colorPaletteUI: _propTypes["default"].object.isRequired, selectedColorRange: _propTypes["default"].object.isRequired, onSelectColorRange: _propTypes["default"].func.isRequired, setColorPaletteUI: _propTypes["default"].func.isRequired, // optional colorRanges: _propTypes["default"].arrayOf(_propTypes["default"].any) }); (0, _defineProperty2["default"])(ColorRangeSelect, "defaultProps", { colorRanges: _colorRanges.COLOR_RANGES, onSelectColorRange: function onSelectColorRange() {}, setColorPaletteUI: function setColorPaletteUI() {} }); var PaletteConfig = exports.PaletteConfig = function PaletteConfig(_ref2) { var label = _ref2.label, value = _ref2.value, _ref2$config = _ref2.config, type = _ref2$config.type, options = _ref2$config.options, _onChange = _ref2.onChange; return (/*#__PURE__*/_react["default"].createElement(StyledPaletteConfig, { className: "color-palette__config", onClick: function onClick(e) { return e.stopPropagation(); } }, /*#__PURE__*/_react["default"].createElement("div", { className: "color-palette__config__label" }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, label)), type === 'select' && /*#__PURE__*/_react["default"].createElement("div", { className: "color-palette__config__select" }, /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], { selectedItems: value, options: options, multiSelect: false, searchable: false, onChange: _onChange })), type === 'switch' && /*#__PURE__*/_react["default"].createElement(_switch["default"], { checked: value, id: "".concat(label, "-toggle"), onChange: function onChange() { return _onChange(!value); }, secondary: true })) ); }; var StyledColorRange = _styledComponents["default"].div.attrs({ className: 'color-palette-outer' })(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px;\n :hover {\n background-color: ", ";\n cursor: pointer;\n }\n"])), function (props) { return props.theme.panelBackgroundHover; }); var ColorPaletteGroup = exports.ColorPaletteGroup = function ColorPaletteGroup(_ref3) { var reversed = _ref3.reversed, onSelect = _ref3.onSelect, selected = _ref3.selected, colorRanges = _ref3.colorRanges; return (/*#__PURE__*/_react["default"].createElement("div", { className: "color-palette__group" }, colorRanges.map(function (colorRange, i) { return (/*#__PURE__*/_react["default"].createElement(StyledColorRange, { key: "".concat(colorRange.name, "-").concat(i), onClick: function onClick(e) { return onSelect(reversed ? (0, _colorUtils.reverseColorRange)(true, colorRange) : colorRange, e); } }, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], { colors: colorRange.colors, isReversed: reversed, isSelected: colorRange.name === selected.name && reversed === Boolean(selected.reversed) })) ); })) ); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJmaWx0ZXIiLCJjdHlwZSIsImNvbmNhdCIsIkFMTF9TVEVQUyIsImQiLCJjb2xvcnMiLCJsZW5ndGgiLCJzb3J0IiwibnVtYmVyU29ydCIsIlN0eWxlZENvbG9yQ29uZmlnIiwic3R5bGVkIiwiZGl2IiwiU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJTdHlsZWRQYWxldHRlQ29uZmlnIiwicHJvcHMiLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiQ09ORklHX1NFVFRJTkdTIiwib3B0aW9ucyIsInN0ZXBzIiwicmV2ZXJzZWQiLCJjdXN0b20iLCJsYWJlbCIsIkNvbG9yUmFuZ2VTZWxlY3QiLCJjb2xvclJhbmdlcyIsImNvbG9yUGFsZXR0ZVVJIiwiY29sb3JSYW5nZUNvbmZpZyIsImNvbG9yUmFuZ2VzU2VsZWN0b3IiLCJjb25maWdUeXBlU2VsZWN0b3IiLCJjb25maWdTdGVwU2VsZWN0b3IiLCJjb2xvclJhbmdlIiwiaXNUeXBlIiwiaXNTdGVwIiwiTnVtYmVyIiwia2V5IiwidmFsdWUiLCJfc2V0Q29sb3JSYW5nZUNvbmZpZyIsImNvbmZpZyIsInNldENvbG9yUGFsZXR0ZVVJIiwiY3VzdG9tUGFsZXR0ZSIsIm5ld0NvbmZpZyIsInNob3dTa2V0Y2hlciIsInZhbCIsImZpbHRlcmVkQ29sb3JSYW5nZXMiLCJmaWx0ZXJlZENvbG9yUmFuZ2UiLCJPYmplY3QiLCJrZXlzIiwiX3VwZGF0ZUNvbmZpZyIsInNlbGVjdGVkQ29sb3JSYW5nZSIsIm9uU2VsZWN0Q29sb3JSYW5nZSIsIl9vblRvZ2dsZVNrZXRjaGVyIiwiX29uU2V0Q3VzdG9tUGFsZXR0ZSIsIl9vbkN1c3RvbVBhbGV0dGVDYW5jZWwiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImFycmF5T2YiLCJhbnkiLCJQYWxldHRlQ29uZmlnIiwib25DaGFuZ2UiLCJlIiwic3RvcFByb3BhZ2F0aW9uIiwiU3R5bGVkQ29sb3JSYW5nZSIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiQ29sb3JQYWxldHRlR3JvdXAiLCJvblNlbGVjdCIsInNlbGVjdGVkIiwiaSIsIm5hbWUiLCJCb29sZWFuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVPLElBQU1BLFNBQVMsdUJBQUcsd0JBQ3ZCQywwQkFBYUMsR0FBYixDQUFpQixVQUFBQyxDQUFDO0FBQUEsU0FBSUEsQ0FBQyxDQUFDQyxJQUFOO0FBQUEsQ0FBbEIsRUFDR0MsTUFESCxDQUNVLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFKO0FBQUEsQ0FEZixFQUVHQyxNQUZILENBRVUsQ0FBQyxLQUFELEVBQVEsUUFBUixDQUZWLENBRHVCLENBQWxCO0FBTUEsSUFBTUMsU0FBUyx1QkFBRyx3QkFBS1AsMEJBQWFDLEdBQWIsQ0FBaUIsVUFBQU8sQ0FBQztBQUFBLFNBQUlBLENBQUMsQ0FBQ0MsTUFBRixDQUFTQyxNQUFiO0FBQUEsQ0FBbEIsQ0FBTCxFQUE2Q0MsSUFBN0MsQ0FBa0RDLHFCQUFsRCxDQUFsQjs7QUFFUCxJQUFNQyxpQkFBaUIsR0FBR0MsNkJBQU9DLEdBQVYsc0hBQXZCOztBQUlBLElBQU1DLHdCQUF3QixHQUFHRiw2QkFBT0MsR0FBUCxDQUFXRSxLQUFYLENBQWlCO0FBQ2hEQyxFQUFBQSxTQUFTLEVBQUU7QUFEcUMsQ0FBakIsQ0FBSCxtSEFBOUI7O0FBTUEsSUFBTUMsbUJBQW1CLEdBQUdMLDZCQUFPQyxHQUFWLG1YQVluQixVQUFB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c0JBLFFBQXRCO0FBQUEsTUFBZ0M1QyxXQUFoQyxTQUFnQ0EsV0FBaEM7QUFBQSx1QkFDL0I7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQ0dBLFdBQVcsQ0FBQzdCLEdBQVosQ0FBZ0IsVUFBQ21DLFVBQUQsRUFBYXVDLENBQWI7QUFBQSwyQkFDZixnQ0FBQyxnQkFBRDtBQUVFLFVBQUEsR0FBRyxZQUFLdkMsVUFBVSxDQUFDd0MsSUFBaEIsY0FBd0JELENBQXhCLENBRkw7QUFHRSxVQUFBLE9BQU8sRUFBRSxpQkFBQVAsQ0FBQztBQUFBLG1CQUNSSyxRQUFRLENBQ04vQyxRQUFRLEdBQUcsbUNBQWtCLElBQWxCLEVBQXdCVSxVQUF4QixDQUFILEdBQXlDQSxVQUQzQyxFQUVOZ0MsQ0FGTSxDQURBO0FBQUE7QUFIWix3QkFVRSxnQ0FBQyx3QkFBRDtBQUNFLFVBQUEsTUFBTSxFQUFFaEMsVUFBVSxDQUFDM0IsTUFEckI7QUFFRSxVQUFBLFVBQVUsRUFBRWlCLFFBRmQ7QUFHRSxVQUFBLFVBQVUsRUFDUlUsVUFBVSxDQUFDd0MsSUFBWCxLQUFvQkYsUUFBUSxDQUFDRSxJQUE3QixJQUNBbEQsUUFBUSxLQUFLbUQsT0FBTyxDQUFDSCxRQUFRLENBQUNoRCxRQUFWO0FBTHhCLFVBVkY7QUFEZTtBQUFBLEtBQWhCLENBREg7QUFEK0I7QUFBQSxDQUExQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuXG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge1BhbmVsTGFiZWx9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3dpdGNoJztcbmltcG9ydCBDb2xvclBhbGV0dGUgZnJvbSAnLi9jb2xvci1wYWxldHRlJztcbmltcG9ydCBDdXN0b21QYWxldHRlIGZyb20gJy4vY3VzdG9tLXBhbGV0dGUnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVN9IGZyb20gJ2NvbnN0YW50cy9jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtudW1iZXJTb3J0fSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7cmV2ZXJzZUNvbG9yUmFuZ2V9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IEFMTF9UWVBFUyA9IHVuaXEoXG4gIENPTE9SX1JBTkdFUy5tYXAoYyA9PiBjLnR5cGUpXG4gICAgLmZpbHRlcihjdHlwZSA9PiBjdHlwZSlcbiAgICAuY29uY2F0KFsnYWxsJywgJ2N1c3RvbSddKVxuKTtcblxuZXhwb3J0IGNvbnN0IEFMTF9TVEVQUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChkID0+IGQuY29sb3JzLmxlbmd0aCkpLnNvcnQobnVtYmVyU29ydCk7XG5cbmNvbnN0IFN0eWxlZENvbG9yQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMTJweCAxMnB4IDAgMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2VTZWxlY3RvciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdjb2xvci1yYW5nZS1zZWxlY3Rvcidcbn0pYFxuICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbGV0dGVDb25maWcgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fbGFiZWwge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuY29sb3ItcGFsZXR0ZV9fY29uZmlnX19zZWxlY3Qge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuaXRlbS1zZWxlY3RvciAuaXRlbS1zZWxlY3Rvcl9fZHJvcGRvd24ge1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2Vjb25kYXJ5SW5wdXR9O1xuICB9XG5gO1xuXG5jb25zdCBDT05GSUdfU0VUVElOR1MgPSB7XG4gIHR5cGU6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfVFlQRVNcbiAgfSxcbiAgc3RlcHM6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfU1RFUFNcbiAgfSxcbiAgcmV2ZXJzZWQ6IHtcbiAgICB0eXBlOiAnc3dpdGNoJyxcbiAgICBvcHRpb25zOiBbdHJ1ZSwgZmFsc2VdXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGxhYmVsOiAnQ3VzdG9tIFBhbGV0dGUnLFxuICAgIHR5cGU6ICdzd2l0Y2gnLFxuICAgIG9wdGlvbnM6IFt0cnVlLCBmYWxzZV1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sb3JSYW5nZVNlbGVjdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgY29sb3JQYWxldHRlVUk6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBzZWxlY3RlZENvbG9yUmFuZ2U6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvblNlbGVjdENvbG9yUmFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgc2V0Q29sb3JQYWxldHRlVUk6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgLy8gb3B0aW9uYWxcbiAgICBjb2xvclJhbmdlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSlcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGNvbG9yUmFuZ2VzOiBDT0xPUl9SQU5HRVMsXG4gICAgb25TZWxlY3RDb2xvclJhbmdlOiAoKSA9PiB7fSxcbiAgICBzZXRDb2xvclBhbGV0dGVVSTogKCkgPT4ge31cbiAgfTtcblxuICBjb2xvclJhbmdlc1NlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JSYW5nZXM7XG4gIGNvbmZpZ1R5cGVTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmNvbG9yUGFsZXR0ZVVJLmNvbG9yUmFuZ2VDb25maWcudHlwZTtcbiAgY29uZmlnU3RlcFNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JQYWxldHRlVUkuY29sb3JSYW5nZUNvbmZpZy5zdGVwcztcbiAgZmlsdGVyZWRDb2xvclJhbmdlID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5jb2xvclJhbmdlc1NlbGVjdG9yLFxuICAgIHRoaXMuY29uZmlnVHlwZVNlbGVjdG9yLFxuICAgIHRoaXMuY29uZmlnU3RlcFNlbGVjdG9yLFxuICAgIChjb2xvclJhbmdlcywgdHlwZSwgc3RlcHMpID0+IHtcbiAgICAgIHJldHVybiBjb2xvclJhbmdlcy5maWx0ZXIoY29sb3JSYW5nZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVHlwZSA9IHR5cGUgPT09ICdhbGwnIHx8IHR5cGUgPT09IGNvbG9yUmFuZ2UudHlwZTtcbiAgICAgICAgY29uc3QgaXNTdGVwID0gTnVtYmVyKHN0ZXBzKSA9PT0gY29sb3JSYW5nZS5jb2xvcnMubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBpc1R5cGUgJiYgaXNTdGVwO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIF91cGRhdGVDb25maWcgPSAoe2tleSwgdmFsdWV9KSA9PiB7XG4gICAgdGhpcy5fc2V0Q29sb3JSYW5nZUNvbmZpZyh7W2tleV06IHZhbHVlfSk7XG4gIH07XG5cbiAgX29uU2V0Q3VzdG9tUGFsZXR0ZSA9IGNvbmZpZyA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBjdXN0b21QYWxldHRlOiBjb25maWdcbiAgICB9KTtcbiAgfTtcblxuICBfc2V0Q29sb3JSYW5nZUNvbmZpZyA9IG5ld0NvbmZpZyA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiBuZXdDb25maWdcbiAgICB9KTtcbiAgfTtcblxuICBfb25DdXN0b21QYWxldHRlQ2FuY2VsID0gbmV3Q29uZmlnID0+IHtcbiAgICB0aGlzLnByb3BzLnNldENvbG9yUGFsZXR0ZVVJKHtcbiAgICAgIHNob3dTa2V0Y2hlcjogZmFsc2UsXG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiB7Y3VzdG9tOiBmYWxzZX1cbiAgICB9KTtcbiAgfTtcblxuICBfb25Ub2dnbGVTa2V0Y2hlciA9IHZhbCA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBzaG93U2tldGNoZXI6IHZhbFxuICAgIH0pO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdXN0b21QYWxldHRlLFxuICAgICAgc2hvd1NrZXRjaGVyLFxuICAgICAgY29sb3JSYW5nZUNvbmZpZ1xuICAgIH0gPSB0aGlzLnByb3BzLmNvbG9yUGFsZXR0ZVVJO1xuXG4gICAgY29uc3QgZmlsdGVyZWRDb2xvclJhbmdlcyA9IHRoaXMuZmlsdGVyZWRDb2xvclJhbmdlKHRoaXMucHJvcHMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRDb2xvclJhbmdlU2VsZWN0b3I+XG4gICAgICAgIDxTdHlsZWRDb2xvckNvbmZpZz5cbiAgICAgICAgICB7KGNvbG9yUmFuZ2VDb25maWcuY3VzdG9tXG4gICAgICAgICAgICA/IFsnY3VzdG9tJ11cbiAgICAgICAgICAgIDogT2JqZWN0LmtleXMoY29sb3JSYW5nZUNvbmZpZylcbiAgICAgICAgICApLm1hcChrZXkgPT4gKFxuICAgICAgICAgICAgPFBhbGV0dGVDb25maWdcbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtDT05GSUdfU0VUVElOR1Nba2V5XS5sYWJlbCB8fCBrZXl9XG4gICAgICAgICAgICAgIGNvbmZpZz17Q09ORklHX1NFVFRJTkdTW2tleV19XG4gICAgICAgICAgICAgIHZhbHVlPXtjb2xvclJhbmdlQ29uZmlnW2tleV19XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB0aGlzLl91cGRhdGVDb25maWcoe2tleSwgdmFsdWV9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvU3R5bGVkQ29sb3JDb25maWc+XG5cbiAgICAgICAge2NvbG9yUmFuZ2VDb25maWcuY3VzdG9tID8gKFxuICAgICAgICAgIDxDdXN0b21QYWxldHRlXG4gICAgICAgICAgICBjdXN0b21QYWxldHRlPXtjdXN0b21QYWxldHRlfVxuICAgICAgICAgICAgc2hvd1NrZXRjaGVyPXtzaG93U2tldGNoZXJ9XG4gICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5wcm9wcy5zZWxlY3RlZENvbG9yUmFuZ2V9XG4gICAgICAgICAgICBvbkFwcGx5PXt0aGlzLnByb3BzLm9uU2VsZWN0Q29sb3JSYW5nZX1cbiAgICAgICAgICAgIG9uVG9nZ2xlU2tldGNoZXI9e3RoaXMuX29uVG9nZ2xlU2tldGNoZXJ9XG4gICAgICAgICAgICBzZXRDdXN0b21QYWxldHRlPXt0aGlzLl9vblNldEN1c3RvbVBhbGV0dGV9XG4gICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5fb25DdXN0b21QYWxldHRlQ2FuY2VsfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPENvbG9yUGFsZXR0ZUdyb3VwXG4gICAgICAgICAgICBjb2xvclJhbmdlcz17ZmlsdGVyZWRDb2xvclJhbmdlc31cbiAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnByb3BzLm9uU2VsZWN0Q29sb3JSYW5nZX1cbiAgICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLnByb3BzLnNlbGVjdGVkQ29sb3JSYW5nZX1cbiAgICAgICAgICAgIHJldmVyc2VkPXtjb2xvclJhbmdlQ29uZmlnLnJldmVyc2VkfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1N0eWxlZENvbG9yUmFuZ2VTZWxlY3Rvcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQYWxldHRlQ29uZmlnID0gKHtcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICBjb25maWc6IHt0eXBlLCBvcHRpb25zfSxcbiAgb25DaGFuZ2Vcbn0pID0+IChcbiAgPFN0eWxlZFBhbGV0dGVDb25maWdcbiAgICBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdcIlxuICAgIG9uQ2xpY2s9e2UgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbFwiPlxuICAgICAgPFBhbmVsTGFiZWw+e2xhYmVsfTwvUGFuZWxMYWJlbD5cbiAgICA8L2Rpdj5cbiAgICB7dHlwZSA9PT0gJ3NlbGVjdCcgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX3NlbGVjdFwiPlxuICAgICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz17dmFsdWV9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgICB7dHlwZSA9PT0gJ3N3aXRjaCcgJiYgKFxuICAgICAgPFN3aXRjaFxuICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgaWQ9e2Ake2xhYmVsfS10b2dnbGVgfVxuICAgICAgICBvbkNoYW5nZT17KCkgPT4gb25DaGFuZ2UoIXZhbHVlKX1cbiAgICAgICAgc2Vjb25kYXJ5XG4gICAgICAvPlxuICAgICl9XG4gIDwvU3R5bGVkUGFsZXR0ZUNvbmZpZz5cbik7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2UgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY29sb3ItcGFsZXR0ZS1vdXRlcidcbn0pYFxuICBwYWRkaW5nOiAwIDhweDtcbiAgOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBDb2xvclBhbGV0dGVHcm91cCA9ICh7cmV2ZXJzZWQsIG9uU2VsZWN0LCBzZWxlY3RlZCwgY29sb3JSYW5nZXN9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fZ3JvdXBcIj5cbiAgICB7Y29sb3JSYW5nZXMubWFwKChjb2xvclJhbmdlLCBpKSA9PiAoXG4gICAgICA8U3R5bGVkQ29sb3JSYW5nZVxuXG4gICAgICAgIGtleT17YCR7Y29sb3JSYW5nZS5uYW1lfS0ke2l9YH1cbiAgICAgICAgb25DbGljaz17ZSA9PlxuICAgICAgICAgIG9uU2VsZWN0KFxuICAgICAgICAgICAgcmV2ZXJzZWQgPyByZXZlcnNlQ29sb3JSYW5nZSh0cnVlLCBjb2xvclJhbmdlKSA6IGNvbG9yUmFuZ2UsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIDxDb2xvclBhbGV0dGVcbiAgICAgICAgICBjb2xvcnM9e2NvbG9yUmFuZ2UuY29sb3JzfVxuICAgICAgICAgIGlzUmV2ZXJzZWQ9e3JldmVyc2VkfVxuICAgICAgICAgIGlzU2VsZWN0ZWQ9e1xuICAgICAgICAgICAgY29sb3JSYW5nZS5uYW1lID09PSBzZWxlY3RlZC5uYW1lICYmXG4gICAgICAgICAgICByZXZlcnNlZCA9PT0gQm9vbGVhbihzZWxlY3RlZC5yZXZlcnNlZClcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1N0eWxlZENvbG9yUmFuZ2U+XG4gICAgKSl9XG4gIDwvZGl2PlxuKTtcbiJdfQ==