kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
183 lines (181 loc) • 34.7 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.InputBoxContainer = exports.ColorSelectorInput = exports.ColorBlock = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _reactIntl = require("react-intl");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _react2 = require("@floating-ui/react");
var _utils = require("@kepler.gl/utils");
var _rangeSlider = _interopRequireDefault(require("../../common/range-slider"));
var _styledComponents2 = require("../../common/styled-components");
var _colorPalette = _interopRequireDefault(require("./color-palette"));
var _colorRangeSelector = _interopRequireDefault(require("./color-range-selector"));
var _singleColorPalette = _interopRequireDefault(require("./single-color-palette"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var OpacitySliderWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0px 12px 12px 12px;\n"])));
var OPACITY_SLIDER_PROPS = {
type: 'number',
range: [0, 1],
value0: 0,
step: 0.01,
isRanged: false,
label: 'Opacity',
showInput: true
};
var ColorBlock = exports.ColorBlock = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: 32px;\n height: 18px;\n border-radius: 1px;\n background-color: ", ";\n"])), function (props) {
return Array.isArray(props.backgroundcolor) ? "rgb(".concat(props.backgroundcolor.slice(0, 3).join(','), ")") : 'transparent';
});
var StyledColorSelectorWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n .selector__dropdown {\n max-height: 600px; /* increase from the default 500px defined by StyledPanelDropdown */\n }\n"])));
var ColorSelectorInput = exports.ColorSelectorInput = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n height: ", ";\n\n .color-selector__selector__label {\n text-transform: capitalize;\n font-size: 12px;\n text-align: center;\n color: ", ";\n }\n"])), function (props) {
return props.inputTheme === 'secondary' ? props.theme.secondaryInput : props.theme.input;
}, function (props) {
return props.theme.inputBoxHeight;
}, function (props) {
return props.theme.inputPlaceholderColor;
});
var InputBoxContainer = exports.InputBoxContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n\n .color-select__input-group {\n flex-grow: 1;\n }\n .color-select__input-group:nth-child(2) {\n margin-left: 12px;\n }\n"])));
ColorSelectorFactory.deps = [_colorRangeSelector["default"], _rangeSlider["default"]];
function ColorSelectorFactory(ColorRangeSelector, RangeSlider) {
var ColorSelector = function ColorSelector(_ref) {
var _ref$colorSets = _ref.colorSets,
colorSets = _ref$colorSets === void 0 ? [] : _ref$colorSets,
colorUI = _ref.colorUI,
inputTheme = _ref.inputTheme,
disabled = _ref.disabled,
useOpacity = _ref.useOpacity,
setColorUI = _ref.setColorUI;
var _useState = (0, _react.useState)(colorUI ? colorUI.showDropdown : false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
showDropdown = _useState2[0],
setShowDropdown = _useState2[1];
var showSketcher = colorUI ? colorUI.showSketcher : false;
var editingLookup = colorUI ? colorUI.showDropdown : showDropdown;
var editingColorSet = typeof editingLookup === 'number' && colorSets[editingLookup] ? colorSets[editingLookup] : false;
var closePanelDropdown = (0, _react.useCallback)(function () {
if (editingLookup === false) {
return;
}
if (setColorUI) {
setColorUI({
showDropdown: false,
showSketcher: false
});
} else {
setShowDropdown(false);
}
}, [editingLookup, setColorUI, setShowDropdown]);
var handleClickOutside = (0, _react.useCallback)(function () {
if (Number.isInteger(showSketcher)) {
// if sketcher is open, let sketch to close itself first
return;
}
closePanelDropdown();
}, [showSketcher, closePanelDropdown]);
// floating-ui boilerplate to establish close on outside click
var _useFloating = (0, _react2.useFloating)({
open: true,
onOpenChange: function onOpenChange(v) {
if (!v) {
handleClickOutside();
}
}
}),
refs = _useFloating.refs,
context = _useFloating.context;
var dismiss = (0, _react2.useDismiss)(context);
var _useInteractions = (0, _react2.useInteractions)([dismiss]),
getFloatingProps = _useInteractions.getFloatingProps;
var setColor = (0, _react.useCallback)(function (colorSet, color, opacity) {
var _ref2 = colorSet || {},
setColor = _ref2.setColor;
if (!setColor) {
return;
}
if (useOpacity && Array.isArray(color)) {
setColor([].concat((0, _toConsumableArray2["default"])(color.slice(0, 3)), [opacity]));
} else {
setColor(color);
}
}, [useOpacity]);
var onSelectColor = (0, _react.useCallback)(function (color, e) {
if (e) e.stopPropagation();
var colorSet = editingColorSet;
if (colorSet) {
setColor(colorSet, color, colorSet.selectedColor[3]);
}
}, [editingColorSet, setColor]);
var onSelectOpacity = (0, _react.useCallback)(function (opacity, e) {
if (e) e.stopPropagation();
var colorSet = editingColorSet;
if (colorSet) {
setColor(colorSet, colorSet.selectedColor, Math.round(opacity[1] * 255));
}
}, [editingColorSet, setColor]);
var onToggleDropdown = (0, _react.useCallback)(function (e, i) {
e.stopPropagation();
e.preventDefault();
var showDropdownValue = editingLookup === false ? i // open it for the specific color set index
: false; // close it
if (setColorUI) {
setColorUI({
showDropdown: showDropdownValue
});
} else {
setShowDropdown(showDropdownValue);
}
}, [editingLookup, setColorUI, setShowDropdown]);
return /*#__PURE__*/_react["default"].createElement(StyledColorSelectorWrapper, (0, _extends2["default"])({
className: "color-selector",
ref: refs.setFloating
}, getFloatingProps()), /*#__PURE__*/_react["default"].createElement(InputBoxContainer, null, colorSets.map(function (cSet, i) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: "color-select__input-group",
key: i
}, /*#__PURE__*/_react["default"].createElement(ColorSelectorInput, {
className: "color-selector__selector",
active: editingLookup === i,
disabled: disabled,
inputTheme: inputTheme,
onClick: function onClick(e) {
return onToggleDropdown(e, i);
}
}, cSet.isRange ? /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
colors: cSet.selectedColor.colors
}) : /*#__PURE__*/_react["default"].createElement(ColorBlock, {
className: "color-selector__selector__block",
backgroundcolor: cSet.selectedColor
}), cSet.label ? /*#__PURE__*/_react["default"].createElement("div", {
className: "color-selector__selector__label"
}, cSet.label) : null));
})), editingColorSet ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledPanelDropdown, {
className: "color-selector__dropdown"
}, editingColorSet.isRange && colorUI && setColorUI ? /*#__PURE__*/_react["default"].createElement(ColorRangeSelector, {
selectedColorRange: editingColorSet.selectedColor,
onSelectColorRange: onSelectColor,
setColorPaletteUI: setColorUI,
colorPaletteUI: colorUI
}) : /*#__PURE__*/_react["default"].createElement(_singleColorPalette["default"], {
selectedColor: (0, _utils.rgbToHex)(editingColorSet.selectedColor),
onSelectColor: onSelectColor
}), useOpacity ? /*#__PURE__*/_react["default"].createElement(OpacitySliderWrapper, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_reactIntl.FormattedMessage, {
id: "color.opacity"
})), /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, OPACITY_SLIDER_PROPS, {
value1: editingColorSet.selectedColor[3] / 255,
onChange: onSelectOpacity
}))) : null) : null);
};
return ColorSelector;
}
var _default = exports["default"] = ColorSelectorFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RJbnRsIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JlYWN0MiIsIl91dGlscyIsIl9yYW5nZVNsaWRlciIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9jb2xvclBhbGV0dGUiLCJfY29sb3JSYW5nZVNlbGVjdG9yIiwiX3NpbmdsZUNvbG9yUGFsZXR0ZSIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJPcGFjaXR5U2xpZGVyV3JhcHBlciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiT1BBQ0lUWV9TTElERVJfUFJPUFMiLCJ0eXBlIiwicmFuZ2UiLCJ2YWx1ZTAiLCJzdGVwIiwiaXNSYW5nZWQiLCJsYWJlbCIsInNob3dJbnB1dCIsIkNvbG9yQmxvY2siLCJleHBvcnRzIiwicHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJiYWNrZ3JvdW5kY29sb3IiLCJjb25jYXQiLCJzbGljZSIsImpvaW4iLCJTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlciIsIkNvbG9yU2VsZWN0b3JJbnB1dCIsImlucHV0VGhlbWUiLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiaW5wdXQiLCJpbnB1dEJveEhlaWdodCIsImlucHV0UGxhY2Vob2xkZXJDb2xvciIsIklucHV0Qm94Q29udGFpbmVyIiwiQ29sb3JTZWxlY3RvckZhY3RvcnkiLCJkZXBzIiwiQ29sb3JSYW5nZVNlbGVjdG9yRmFjdG9yeSIsIlJhbmdlU2xpZGVyRmFjdG9yeSIsIkNvbG9yUmFuZ2VTZWxlY3RvciIsIlJhbmdlU2xpZGVyIiwiQ29sb3JTZWxlY3RvciIsIl9yZWYiLCJfcmVmJGNvbG9yU2V0cyIsImNvbG9yU2V0cyIsImNvbG9yVUkiLCJkaXNhYmxlZCIsInVzZU9wYWNpdHkiLCJzZXRDb2xvclVJIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJzaG93RHJvcGRvd24iLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwic2V0U2hvd0Ryb3Bkb3duIiwic2hvd1NrZXRjaGVyIiwiZWRpdGluZ0xvb2t1cCIsImVkaXRpbmdDb2xvclNldCIsImNsb3NlUGFuZWxEcm9wZG93biIsInVzZUNhbGxiYWNrIiwiaGFuZGxlQ2xpY2tPdXRzaWRlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiX3VzZUZsb2F0aW5nIiwidXNlRmxvYXRpbmciLCJvcGVuIiwib25PcGVuQ2hhbmdlIiwidiIsInJlZnMiLCJjb250ZXh0IiwiZGlzbWlzcyIsInVzZURpc21pc3MiLCJfdXNlSW50ZXJhY3Rpb25zIiwidXNlSW50ZXJhY3Rpb25zIiwiZ2V0RmxvYXRpbmdQcm9wcyIsInNldENvbG9yIiwiY29sb3JTZXQiLCJjb2xvciIsIm9wYWNpdHkiLCJfcmVmMiIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJvblNlbGVjdENvbG9yIiwic3RvcFByb3BhZ2F0aW9uIiwic2VsZWN0ZWRDb2xvciIsIm9uU2VsZWN0T3BhY2l0eSIsIk1hdGgiLCJyb3VuZCIsIm9uVG9nZ2xlRHJvcGRvd24iLCJwcmV2ZW50RGVmYXVsdCIsInNob3dEcm9wZG93blZhbHVlIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsImNsYXNzTmFtZSIsInJlZiIsInNldEZsb2F0aW5nIiwibWFwIiwiY1NldCIsImtleSIsImFjdGl2ZSIsIm9uQ2xpY2siLCJpc1JhbmdlIiwiY29sb3JzIiwiU3R5bGVkUGFuZWxEcm9wZG93biIsInNlbGVjdGVkQ29sb3JSYW5nZSIsIm9uU2VsZWN0Q29sb3JSYW5nZSIsInNldENvbG9yUGFsZXR0ZVVJIiwiY29sb3JQYWxldHRlVUkiLCJyZ2JUb0hleCIsIlBhbmVsTGFiZWwiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaWQiLCJ2YWx1ZTEiLCJvbkNoYW5nZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3Itc2VsZWN0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VTdGF0ZSwgTW91c2VFdmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHt1c2VEaXNtaXNzLCB1c2VGbG9hdGluZywgdXNlSW50ZXJhY3Rpb25zfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QnO1xuXG5pbXBvcnQge0NvbG9yUmFuZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtDb2xvclVJLCBOZXN0ZWRQYXJ0aWFsLCBSR0JBQ29sb3IsIFJHQkNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7cmdiVG9IZXh9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQgUmFuZ2VTbGlkZXJGYWN0b3J5IGZyb20gJy4uLy4uL2NvbW1vbi9yYW5nZS1zbGlkZXInO1xuaW1wb3J0IHtQYW5lbExhYmVsLCBTdHlsZWRQYW5lbERyb3Bkb3dufSBmcm9tICcuLi8uLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IENvbG9yUGFsZXR0ZSBmcm9tICcuL2NvbG9yLXBhbGV0dGUnO1xuaW1wb3J0IENvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi9jb2xvci1yYW5nZS1zZWxlY3Rvcic7XG5pbXBvcnQgU2luZ2xlQ29sb3JQYWxldHRlIGZyb20gJy4vc2luZ2xlLWNvbG9yLXBhbGV0dGUnO1xuXG50eXBlIENvbG9yU2VsZWN0b3JJbnB1dFByb3BzID0ge1xuICBhY3RpdmU6IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaW5wdXRUaGVtZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbG9yU2V0ID0ge1xuICBzZWxlY3RlZENvbG9yOiBSR0JDb2xvciB8IFJHQkFDb2xvciB8IENvbG9yUmFuZ2U7XG4gIHNldENvbG9yOiAodjogUkdCQ29sb3IgfCBSR0JBQ29sb3IgfCBDb2xvclJhbmdlKSA9PiB2b2lkO1xuICBpc1JhbmdlPzogYm9vbGVhbjtcbiAgbGFiZWw/OiBzdHJpbmc7XG59O1xuXG50eXBlIENvbG9yU2VsZWN0b3JQcm9wcyA9IHtcbiAgY29sb3JTZXRzOiBDb2xvclNldFtdO1xuICBjb2xvclVJPzogQ29sb3JVSTtcbiAgaW5wdXRUaGVtZT86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB1c2VPcGFjaXR5PzogYm9vbGVhbjtcbiAgc2V0Q29sb3JVST86IChuZXdDb25maWc6IE5lc3RlZFBhcnRpYWw8Q29sb3JVST4pID0+IHZvaWQ7XG59O1xuXG5jb25zdCBPcGFjaXR5U2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmc6IDBweCAxMnB4IDEycHggMTJweDtcbmA7XG5cbmNvbnN0IE9QQUNJVFlfU0xJREVSX1BST1BTID0ge1xuICB0eXBlOiAnbnVtYmVyJyxcbiAgcmFuZ2U6IFswLCAxXSxcbiAgdmFsdWUwOiAwLFxuICBzdGVwOiAwLjAxLFxuICBpc1JhbmdlZDogZmFsc2UsXG4gIGxhYmVsOiAnT3BhY2l0eScsXG4gIHNob3dJbnB1dDogdHJ1ZVxufTtcblxuZXhwb3J0IGNvbnN0IENvbG9yQmxvY2sgPSBzdHlsZWQuZGl2PHtiYWNrZ3JvdW5kY29sb3I6IFJHQkNvbG9yfT5gXG4gIHdpZHRoOiAzMnB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PlxuICAgIEFycmF5LmlzQXJyYXkocHJvcHMuYmFja2dyb3VuZGNvbG9yKVxuICAgICAgPyBgcmdiKCR7cHJvcHMuYmFja2dyb3VuZGNvbG9yLnNsaWNlKDAsIDMpLmpvaW4oJywnKX0pYFxuICAgICAgOiAndHJhbnNwYXJlbnQnfTtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yU2VsZWN0b3JXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgLnNlbGVjdG9yX19kcm9wZG93biB7XG4gICAgbWF4LWhlaWdodDogNjAwcHg7IC8qIGluY3JlYXNlIGZyb20gdGhlIGRlZmF1bHQgNTAwcHggZGVmaW5lZCBieSBTdHlsZWRQYW5lbERyb3Bkb3duICovXG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBDb2xvclNlbGVjdG9ySW5wdXQgPSBzdHlsZWQuZGl2PENvbG9yU2VsZWN0b3JJbnB1dFByb3BzPmBcbiAgJHtwcm9wcyA9PiAocHJvcHMuaW5wdXRUaGVtZSA9PT0gJ3NlY29uZGFyeScgPyBwcm9wcy50aGVtZS5zZWNvbmRhcnlJbnB1dCA6IHByb3BzLnRoZW1lLmlucHV0KX07XG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEJveEhlaWdodH07XG5cbiAgLmNvbG9yLXNlbGVjdG9yX19zZWxlY3Rvcl9fbGFiZWwge1xuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRQbGFjZWhvbGRlckNvbG9yfTtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IElucHV0Qm94Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gIC5jb2xvci1zZWxlY3RfX2lucHV0LWdyb3VwIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLmNvbG9yLXNlbGVjdF9faW5wdXQtZ3JvdXA6bnRoLWNoaWxkKDIpIHtcbiAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgfVxuYDtcblxuQ29sb3JTZWxlY3RvckZhY3RvcnkuZGVwcyA9IFtDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5LCBSYW5nZVNsaWRlckZhY3RvcnldO1xuXG5mdW5jdGlvbiBDb2xvclNlbGVjdG9yRmFjdG9yeShcbiAgQ29sb3JSYW5nZVNlbGVjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5PixcbiAgUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT5cbik6IFJlYWN0LkZDPENvbG9yU2VsZWN0b3JQcm9wcz4ge1xuICBjb25zdCBDb2xvclNlbGVjdG9yOiBSZWFjdC5GQzxDb2xvclNlbGVjdG9yUHJvcHM+ID0gKHtcbiAgICBjb2xvclNldHMgPSBbXSxcbiAgICBjb2xvclVJLFxuICAgIGlucHV0VGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgdXNlT3BhY2l0eSxcbiAgICBzZXRDb2xvclVJXG4gIH06IENvbG9yU2VsZWN0b3JQcm9wcykgPT4ge1xuICAgIGNvbnN0IFtzaG93RHJvcGRvd24sIHNldFNob3dEcm9wZG93bl0gPSB1c2VTdGF0ZShjb2xvclVJID8gY29sb3JVSS5zaG93RHJvcGRvd24gOiBmYWxzZSk7XG4gICAgY29uc3Qgc2hvd1NrZXRjaGVyID0gY29sb3JVSSA/IGNvbG9yVUkuc2hvd1NrZXRjaGVyIDogZmFsc2U7XG4gICAgY29uc3QgZWRpdGluZ0xvb2t1cCA9IGNvbG9yVUkgPyBjb2xvclVJLnNob3dEcm9wZG93biA6IHNob3dEcm9wZG93bjtcbiAgICBjb25zdCBlZGl0aW5nQ29sb3JTZXQ6IENvbG9yU2V0IHwgZmFsc2UgPVxuICAgICAgdHlwZW9mIGVkaXRpbmdMb29rdXAgPT09ICdudW1iZXInICYmIGNvbG9yU2V0c1tlZGl0aW5nTG9va3VwXVxuICAgICAgICA/IGNvbG9yU2V0c1tlZGl0aW5nTG9va3VwXVxuICAgICAgICA6IGZhbHNlO1xuXG4gICAgY29uc3QgY2xvc2VQYW5lbERyb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKGVkaXRpbmdMb29rdXAgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZXRDb2xvclVJKSB7XG4gICAgICAgIHNldENvbG9yVUkoe3Nob3dEcm9wZG93bjogZmFsc2UsIHNob3dTa2V0Y2hlcjogZmFsc2V9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNob3dEcm9wZG93bihmYWxzZSk7XG4gICAgICB9XG4gICAgfSwgW2VkaXRpbmdMb29rdXAsIHNldENvbG9yVUksIHNldFNob3dEcm9wZG93bl0pO1xuXG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoc2hvd1NrZXRjaGVyKSkge1xuICAgICAgICAvLyBpZiBza2V0Y2hlciBpcyBvcGVuLCBsZXQgc2tldGNoIHRvIGNsb3NlIGl0c2VsZiBmaXJzdFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjbG9zZVBhbmVsRHJvcGRvd24oKTtcbiAgICB9LCBbc2hvd1NrZXRjaGVyLCBjbG9zZVBhbmVsRHJvcGRvd25dKTtcblxuICAgIC8vIGZsb2F0aW5nLXVpIGJvaWxlcnBsYXRlIHRvIGVzdGFibGlzaCBjbG9zZSBvbiBvdXRzaWRlIGNsaWNrXG4gICAgY29uc3Qge3JlZnMsIGNvbnRleHR9ID0gdXNlRmxvYXRpbmcoe1xuICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgIG9uT3BlbkNoYW5nZTogdiA9PiB7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgIGhhbmRsZUNsaWNrT3V0c2lkZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZGlzbWlzcyA9IHVzZURpc21pc3MoY29udGV4dCk7XG4gICAgY29uc3Qge2dldEZsb2F0aW5nUHJvcHN9ID0gdXNlSW50ZXJhY3Rpb25zKFtkaXNtaXNzXSk7XG5cbiAgICBjb25zdCBzZXRDb2xvciA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGNvbG9yU2V0OiBDb2xvclNldCwgY29sb3I6IFJHQkNvbG9yIHwgUkdCQUNvbG9yIHwgQ29sb3JSYW5nZSwgb3BhY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHtzZXRDb2xvcn0gPSBjb2xvclNldCB8fCB7fTtcbiAgICAgICAgaWYgKCFzZXRDb2xvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlT3BhY2l0eSAmJiBBcnJheS5pc0FycmF5KGNvbG9yKSkge1xuICAgICAgICAgIHNldENvbG9yKFsuLi5jb2xvci5zbGljZSgwLCAzKSwgb3BhY2l0eV0gYXMgUkdCQUNvbG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbdXNlT3BhY2l0eV1cbiAgICApO1xuXG4gICAgY29uc3Qgb25TZWxlY3RDb2xvciA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGNvbG9yOiBSR0JDb2xvciB8IENvbG9yUmFuZ2UsIGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGUpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbG9yU2V0ID0gZWRpdGluZ0NvbG9yU2V0O1xuICAgICAgICBpZiAoY29sb3JTZXQpIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvclNldCwgY29sb3IsIGNvbG9yU2V0LnNlbGVjdGVkQ29sb3JbM10pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2VkaXRpbmdDb2xvclNldCwgc2V0Q29sb3JdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0T3BhY2l0eSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKG9wYWNpdHk6IG51bWJlcltdLCBlOiBFdmVudCB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKGUpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbG9yU2V0ID0gZWRpdGluZ0NvbG9yU2V0O1xuICAgICAgICBpZiAoY29sb3JTZXQpIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvclNldCwgY29sb3JTZXQuc2VsZWN0ZWRDb2xvciwgTWF0aC5yb3VuZChvcGFjaXR5WzFdICogMjU1KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbZWRpdGluZ0NvbG9yU2V0LCBzZXRDb2xvcl1cbiAgICApO1xuXG4gICAgY29uc3Qgb25Ub2dnbGVEcm9wZG93biA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGUsIGkpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBzaG93RHJvcGRvd25WYWx1ZSA9XG4gICAgICAgICAgZWRpdGluZ0xvb2t1cCA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gaSAvLyBvcGVuIGl0IGZvciB0aGUgc3BlY2lmaWMgY29sb3Igc2V0IGluZGV4XG4gICAgICAgICAgICA6IGZhbHNlOyAvLyBjbG9zZSBpdFxuICAgICAgICBpZiAoc2V0Q29sb3JVSSkge1xuICAgICAgICAgIHNldENvbG9yVUkoe3Nob3dEcm9wZG93bjogc2hvd0Ryb3Bkb3duVmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRTaG93RHJvcGRvd24oc2hvd0Ryb3Bkb3duVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2VkaXRpbmdMb29rdXAsIHNldENvbG9yVUksIHNldFNob3dEcm9wZG93bl1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlclxuICAgICAgICBjbGFzc05hbWU9XCJjb2xvci1zZWxlY3RvclwiXG4gICAgICAgIHJlZj17cmVmcy5zZXRGbG9hdGluZ31cbiAgICAgICAgey4uLmdldEZsb2F0aW5nUHJvcHMoKX1cbiAgICAgID5cbiAgICAgICAgPElucHV0Qm94Q29udGFpbmVyPlxuICAgICAgICAgIHtjb2xvclNldHMubWFwKChjU2V0LCBpKSA9PiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXNlbGVjdF9faW5wdXQtZ3JvdXBcIiBrZXk9e2l9PlxuICAgICAgICAgICAgICA8Q29sb3JTZWxlY3RvcklucHV0XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX3NlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICBhY3RpdmU9e2VkaXRpbmdMb29rdXAgPT09IGl9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgIGlucHV0VGhlbWU9e2lucHV0VGhlbWV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiBvblRvZ2dsZURyb3Bkb3duKGUsIGkpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2NTZXQuaXNSYW5nZSA/IChcbiAgICAgICAgICAgICAgICAgIDxDb2xvclBhbGV0dGUgY29sb3JzPXsoY1NldC5zZWxlY3RlZENvbG9yIGFzIENvbG9yUmFuZ2UpLmNvbG9yc30gLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPENvbG9yQmxvY2tcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX3NlbGVjdG9yX19ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRjb2xvcj17Y1NldC5zZWxlY3RlZENvbG9yIGFzIFJHQkNvbG9yfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtjU2V0LmxhYmVsID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1zZWxlY3Rvcl9fc2VsZWN0b3JfX2xhYmVsXCI+e2NTZXQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvQ29sb3JTZWxlY3RvcklucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvSW5wdXRCb3hDb250YWluZXI+XG4gICAgICAgIHtlZGl0aW5nQ29sb3JTZXQgPyAoXG4gICAgICAgICAgPFN0eWxlZFBhbmVsRHJvcGRvd24gY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICB7ZWRpdGluZ0NvbG9yU2V0LmlzUmFuZ2UgJiYgY29sb3JVSSAmJiBzZXRDb2xvclVJID8gKFxuICAgICAgICAgICAgICA8Q29sb3JSYW5nZVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2xvclJhbmdlPXtlZGl0aW5nQ29sb3JTZXQuc2VsZWN0ZWRDb2xvciBhcyBDb2xvclJhbmdlfVxuICAgICAgICAgICAgICAgIG9uU2VsZWN0Q29sb3JSYW5nZT17b25TZWxlY3RDb2xvcn1cbiAgICAgICAgICAgICAgICBzZXRDb2xvclBhbGV0dGVVST17c2V0Q29sb3JVSX1cbiAgICAgICAgICAgICAgICBjb2xvclBhbGV0dGVVST17Y29sb3JVSSBhcyBDb2xvclVJfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFNpbmdsZUNvbG9yUGFsZXR0ZVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sb3I9e3JnYlRvSGV4KGVkaXRpbmdDb2xvclNldC5zZWxlY3RlZENvbG9yIGFzIFJHQkNvbG9yKX1cbiAgICAgICAgICAgICAgICBvblNlbGVjdENvbG9yPXtvblNlbGVjdENvbG9yfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt1c2VPcGFjaXR5ID8gKFxuICAgICAgICAgICAgICA8T3BhY2l0eVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICAgICAgPFBhbmVsTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD1cImNvbG9yLm9wYWNpdHlcIiAvPlxuICAgICAgICAgICAgICAgIDwvUGFuZWxMYWJlbD5cbiAgICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXJcbiAgICAgICAgICAgICAgICAgIHsuLi5PUEFDSVRZX1NMSURFUl9QUk9QU31cbiAgICAgICAgICAgICAgICAgIHZhbHVlMT17ZWRpdGluZ0NvbG9yU2V0LnNlbGVjdGVkQ29sb3JbM10gLyAyNTV9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25TZWxlY3RPcGFjaXR5fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvT3BhY2l0eVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L1N0eWxlZFBhbmVsRHJvcGRvd24+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDb2xvclNlbGVjdG9yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xvclNlbGVjdG9yRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMs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U0FBUyxFQUFDLGlDQUFpQztRQUMzQ3RFLGVBQWUsRUFBRTBFLElBQUksQ0FBQ2I7TUFBMEIsQ0FDakQsQ0FDRixFQUNBYSxJQUFJLENBQUNqRixLQUFLLGdCQUNUaEQsTUFBQSxZQUFBMkgsYUFBQTtRQUFLRSxTQUFTLEVBQUM7TUFBaUMsR0FBRUksSUFBSSxDQUFDakYsS0FBVyxDQUFDLEdBQ2pFLElBQ2MsQ0FDakIsQ0FBQztJQUFBLENBQ1AsQ0FDZ0IsQ0FBQyxFQUNuQjBDLGVBQWUsZ0JBQ2QxRixNQUFBLFlBQUEySCxhQUFBLENBQUNsSCxrQkFBQSxDQUFBOEgsbUJBQW1CO01BQUNWLFNBQVMsRUFBQztJQUEwQixHQUN0RG5DLGVBQWUsQ0FBQzJDLE9BQU8sSUFBSXZELE9BQU8sSUFBSUcsVUFBVSxnQkFDL0NqRixNQUFBLFlBQUEySCxhQUFBLENBQUNuRCxrQkFBa0I7TUFDakJnRSxrQkFBa0IsRUFBRTlDLGVBQWUsQ0FBQzBCLGFBQTRCO01BQ2hFcUIsa0JBQWtCLEVBQUV2QixhQUFjO01BQ2xDd0IsaUJBQWlCLEVBQUV6RCxVQUFXO01BQzlCMEQsY0FBYyxFQUFFN0Q7SUFBbUIsQ0FDcEMsQ0FBQyxnQkFFRjlFLE1BQUEsWUFBQTJILGFBQUEsQ0FBQy9HLG1CQUFBLFdBQWtCO01BQ2pCd0csYUFBYSxFQUFFLElBQUF3QixlQUFRLEVBQUNsRCxlQUFlLENBQUMwQixhQUF5QixDQUFFO01BQ25FRixhQUFhLEVBQUVBO0lBQWMsQ0FDOUIsQ0FDRixFQUNBbEMsVUFBVSxnQkFDVGhGLE1BQUEsWUFBQTJILGFBQUEsQ0FBQ3JGLG9CQUFvQixxQkFDbkJ0QyxNQUFBLFlBQUEySCxhQUFBLENBQUNsSCxrQkFBQSxDQUFBb0ksVUFBVSxxQkFDVDdJLE1BQUEsWUFBQTJILGFBQUEsQ0FBQ3hILFVBQUEsQ0FBQTJJLGdCQUFnQjtNQUFDQyxFQUFFLEVBQUM7SUFBZSxDQUFFLENBQzVCLENBQUMsZUFDYi9JLE1BQUEsWUFBQTJILGFBQUEsQ0FBQ2xELFdBQVcsTUFBQW1ELFNBQUEsaUJBQ05sRixvQkFBb0I7TUFDeEJzRyxNQUFNLEVBQUV0RCxlQUFlLENBQUMwQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBSTtNQUMvQzZCLFFBQVEsRUFBRTVCO0lBQWdCLEVBQzNCLENBQ21CLENBQUMsR0FDckIsSUFDZSxDQUFDLEdBQ3BCLElBQ3NCLENBQUM7RUFFakMsQ0FBQztFQUVELE9BQU8zQyxhQUFhO0FBQ3RCO0FBQUMsSUFBQXdFLFFBQUEsR0FBQS9GLE9BQUEsY0FFY2lCLG9CQUFvQiIsImlnbm9yZUxpc3QiOltdfQ==
;