kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
185 lines (182 loc) • 34.2 kB
JavaScript
"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.EditButton = exports.ColorBreaksDisplay = exports.CategoricalColorDisplay = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/common-utils/src");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src");
var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src");
var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components"));
var _columnStatsChart = _interopRequireDefault(require("../../common/column-stats-chart"));
var _icons = require("../../common/icons");
var _styledComponents2 = require("../../common/styled-components");
var _customPalette = _interopRequireWildcard(require("./custom-palette"));
var _templateObject, _templateObject2, _templateObject3; // 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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var StyledColorBreaksPanel = _styledComponents["default"].div.attrs({
className: 'styled-color-breaks-panel'
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 10px;\n"])));
var StyledColorBreaksDisplay = _styledComponents["default"].div.attrs({
className: 'styled-color-breaks-display'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 8px 12px 0 12px;\n"])));
var ColorBreaksPanelWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])([""])));
var EditButton = exports.EditButton = function EditButton(_ref) {
var onClickEdit = _ref.onClickEdit;
return /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, {
className: "editp__button",
link: true,
onClick: onClickEdit
}, /*#__PURE__*/_react["default"].createElement(_icons.Edit, {
height: "16px"
}), "Edit");
};
var ColorBreaksDisplay = exports.ColorBreaksDisplay = function ColorBreaksDisplay(_ref2) {
var currentBreaks = _ref2.currentBreaks,
onEdit = _ref2.onEdit;
if (!(0, _src3.isNumericColorBreaks)(currentBreaks)) {
// don't display color breaks for ordinal breaks, user can change it in custom breaks
return null;
}
return /*#__PURE__*/_react["default"].createElement(StyledColorBreaksDisplay, null, onEdit ? /*#__PURE__*/_react["default"].createElement(EditButton, {
onClickEdit: onEdit
}) : null, currentBreaks.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement(_customPalette.ColorPaletteItem, {
className: "disabled",
key: index
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "custom-palette-input__left"
}, /*#__PURE__*/_react["default"].createElement(_customPalette.ColorSwatch, {
color: item.data
}), /*#__PURE__*/_react["default"].createElement(_customPalette.EditableColorRange, {
item: item,
isLast: index === currentBreaks.length - 1,
index: index,
editable: false
})));
}));
};
var CategoricalColorDisplay = exports.CategoricalColorDisplay = function CategoricalColorDisplay(_ref3) {
var colorMap = _ref3.colorMap,
onEdit = _ref3.onEdit;
return /*#__PURE__*/_react["default"].createElement(StyledColorBreaksDisplay, null, onEdit ? /*#__PURE__*/_react["default"].createElement(EditButton, {
onClickEdit: onEdit
}) : null, colorMap === null || colorMap === void 0 ? void 0 : colorMap.map(function (cm, index) {
return /*#__PURE__*/_react["default"].createElement(_customPalette.ColorPaletteItem, {
className: "disabled",
key: index
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "custom-palette-input__left"
}, /*#__PURE__*/_react["default"].createElement(_customPalette.ColorSwatch, {
color: cm[1]
}), /*#__PURE__*/_react["default"].createElement(_customPalette.CategoricalSelector, {
index: index,
selectedValues: (0, _src.toArray)(cm[0]),
allValues: [],
editable: false
})));
}));
};
ColorBreaksPanelFactory.deps = [_customPalette["default"], _columnStatsChart["default"]];
function ColorBreaksPanelFactory(CustomPalette, ColumnStatsChart) {
// eslint-disable-next-line complexity
var ColorBreaksPanel = function ColorBreaksPanel(_ref4) {
var _customPalette$name;
var colorBreaks = _ref4.colorBreaks,
colorUIConfig = _ref4.colorUIConfig,
dataset = _ref4.dataset,
colorField = _ref4.colorField,
isCustomBreaks = _ref4.isCustomBreaks,
allBins = _ref4.allBins,
filteredBins = _ref4.filteredBins,
isFiltered = _ref4.isFiltered,
histogramDomain = _ref4.histogramDomain,
ordinalDomain = _ref4.ordinalDomain,
setColorUI = _ref4.setColorUI,
onScaleChange = _ref4.onScaleChange,
onApply = _ref4.onApply,
onCancel = _ref4.onCancel;
var customPalette = colorUIConfig.customPalette,
showSketcher = colorUIConfig.showSketcher,
colorRangeConfig = colorUIConfig.colorRangeConfig;
var isEditingCustomBreaks = Boolean(colorRangeConfig.customBreaks);
var currentBreaks = (0, _react.useMemo)(function () {
return isEditingCustomBreaks ? (0, _src3.colorMapToColorBreaks)(customPalette.colorMap) : colorBreaks;
}, [customPalette.colorMap, isEditingCustomBreaks, colorBreaks]);
var onClickEditCustomBreaks = (0, _react.useCallback)(function () {
setColorUI({
colorRangeConfig: {
customBreaks: true
}
});
}, [setColorUI]);
var onCilckCancel = (0, _react.useCallback)(function () {
setColorUI({
showSketcher: false,
colorRangeConfig: {
customBreaks: false
}
});
onCancel();
}, [setColorUI, onCancel]);
var onColumnStatsChartChanged = (0, _react.useCallback)(function (newColorBreaks) {
var newColors = newColorBreaks.map(function (cb) {
return cb.data;
});
var newColorMap = (0, _src3.colorBreaksToColorMap)(newColorBreaks);
var newCustomPalette = _objectSpread(_objectSpread({}, customPalette), {}, {
colorMap: newColorMap,
colors: newColors
});
// update custom pallette editor
if (!isEditingCustomBreaks) {
setColorUI({
colorRangeConfig: {
customBreaks: true
},
customPalette: newCustomPalette
});
} else {
setColorUI({
customPalette: newCustomPalette
});
}
// trigger the map to re-render using newCustomPalette
onScaleChange(_src2.SCALE_TYPES.custom, newCustomPalette);
}, [setColorUI, customPalette, isEditingCustomBreaks, onScaleChange]);
return /*#__PURE__*/_react["default"].createElement(ColorBreaksPanelWrapper, null, dataset && allBins.length > 1 && (0, _src3.isNumericColorBreaks)(colorBreaks) ? /*#__PURE__*/_react["default"].createElement(ColumnStatsChart, {
colorField: colorField,
dataset: dataset,
colorBreaks: currentBreaks,
allBins: allBins,
filteredBins: filteredBins,
isFiltered: isFiltered,
histogramDomain: histogramDomain,
onChangedUpdater: onColumnStatsChartChanged
}) : null, /*#__PURE__*/_react["default"].createElement(StyledColorBreaksPanel, null, isEditingCustomBreaks ? /*#__PURE__*/_react["default"].createElement(CustomPalette, {
ordinalDomain: ordinalDomain,
customPalette: customPalette,
setColorPaletteUI: setColorUI,
showSketcher: showSketcher,
onApply: onApply,
onCancel: onCilckCancel
}) : currentBreaks && allBins.length > 1 && (0, _src3.isNumericColorBreaks)(colorBreaks) ? /*#__PURE__*/_react["default"].createElement(ColorBreaksDisplay, {
currentBreaks: currentBreaks,
onEdit: isCustomBreaks ? onClickEditCustomBreaks : null
}) : customPalette.colorMap && customPalette.type === 'customOrdinal' && (_customPalette$name = customPalette.name) !== null && _customPalette$name !== void 0 && _customPalette$name.endsWith(colorField.name) ? /*#__PURE__*/_react["default"].createElement(CategoricalColorDisplay, {
colorMap: customPalette.colorMap,
onEdit: isCustomBreaks ? onClickEditCustomBreaks : null
}) : null));
};
return _react["default"].memo(ColorBreaksPanel);
}
var _default = exports["default"] = ColorBreaksPanelFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3JjIiwicmVxdWlyZSIsIl9zcmMyIiwiX3NyYzMiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb2x1bW5TdGF0c0NoYXJ0IiwiX2ljb25zIiwiX3N0eWxlZENvbXBvbmVudHMyIiwiX2N1c3RvbVBhbGV0dGUiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlN0eWxlZENvbG9yQnJlYWtzUGFuZWwiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5IiwiQ29sb3JCcmVha3NQYW5lbFdyYXBwZXIiLCJFZGl0QnV0dG9uIiwiZXhwb3J0cyIsIl9yZWYiLCJvbkNsaWNrRWRpdCIsImNyZWF0ZUVsZW1lbnQiLCJCdXR0b24iLCJsaW5rIiwib25DbGljayIsIkVkaXQiLCJoZWlnaHQiLCJDb2xvckJyZWFrc0Rpc3BsYXkiLCJfcmVmMiIsImN1cnJlbnRCcmVha3MiLCJvbkVkaXQiLCJub3RPcmRpbmFsQ29sb3JCcmVha3MiLCJtYXAiLCJpdGVtIiwiaW5kZXgiLCJDb2xvclBhbGV0dGVJdGVtIiwia2V5IiwiQ29sb3JTd2F0Y2giLCJjb2xvciIsImRhdGEiLCJFZGl0YWJsZUNvbG9yUmFuZ2UiLCJpc0xhc3QiLCJlZGl0YWJsZSIsIkNhdGVnb3JpY2FsQ29sb3JEaXNwbGF5IiwiX3JlZjMiLCJjb2xvck1hcCIsImNtIiwiQ2F0ZWdvcmljYWxTZWxlY3RvciIsInNlbGVjdGVkVmFsdWVzIiwidG9BcnJheSIsImFsbFZhbHVlcyIsIkNvbG9yQnJlYWtzUGFuZWxGYWN0b3J5IiwiZGVwcyIsIkN1c3RvbVBhbGV0dGVGYWN0b3J5IiwiQ29sdW1uU3RhdHNDaGFydEZhY3RvcnkiLCJDdXN0b21QYWxldHRlIiwiQ29sdW1uU3RhdHNDaGFydCIsIkNvbG9yQnJlYWtzUGFuZWwiLCJfcmVmNCIsIl9jdXN0b21QYWxldHRlJG5hbWUiLCJjb2xvckJyZWFrcyIsImNvbG9yVUlDb25maWciLCJkYXRhc2V0IiwiY29sb3JGaWVsZCIsImlzQ3VzdG9tQnJlYWtzIiwiYWxsQmlucyIsImZpbHRlcmVkQmlucyIsImlzRmlsdGVyZWQiLCJoaXN0b2dyYW1Eb21haW4iLCJvcmRpbmFsRG9tYWluIiwic2V0Q29sb3JVSSIsIm9uU2NhbGVDaGFuZ2UiLCJvbkFwcGx5Iiwib25DYW5jZWwiLCJjdXN0b21QYWxldHRlIiwic2hvd1NrZXRjaGVyIiwiY29sb3JSYW5nZUNvbmZpZyIsImlzRWRpdGluZ0N1c3RvbUJyZWFrcyIsIkJvb2xlYW4iLCJjdXN0b21CcmVha3MiLCJ1c2VNZW1vIiwiY29sb3JNYXBUb0NvbG9yQnJlYWtzIiwib25DbGlja0VkaXRDdXN0b21CcmVha3MiLCJ1c2VDYWxsYmFjayIsIm9uQ2lsY2tDYW5jZWwiLCJvbkNvbHVtblN0YXRzQ2hhcnRDaGFuZ2VkIiwibmV3Q29sb3JCcmVha3MiLCJuZXdDb2xvcnMiLCJjYiIsIm5ld0NvbG9yTWFwIiwiY29sb3JCcmVha3NUb0NvbG9yTWFwIiwibmV3Q3VzdG9tUGFsZXR0ZSIsImNvbG9ycyIsIlNDQUxFX1RZUEVTIiwiY3VzdG9tIiwib25DaGFuZ2VkVXBkYXRlciIsInNldENvbG9yUGFsZXR0ZVVJIiwidHlwZSIsIm5hbWUiLCJlbmRzV2l0aCIsIlJlYWN0IiwibWVtbyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItYnJlYWtzLXBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge3RvQXJyYXl9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7U0NBTEVfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtCaW4sIENvbG9yTWFwLCBDb2xvclVJLCBGaWVsZH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBDb2xvckJyZWFrLFxuICBDb2xvckJyZWFrT3JkaW5hbCxcbiAgY29sb3JCcmVha3NUb0NvbG9yTWFwLFxuICBjb2xvck1hcFRvQ29sb3JCcmVha3MsXG4gIGlzTnVtZXJpY0NvbG9yQnJlYWtzIGFzIG5vdE9yZGluYWxDb2xvckJyZWFrc1xufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBDb2x1bW5TdGF0c0NoYXJ0RmFjdG9yeSBmcm9tICcuLi8uLi9jb21tb24vY29sdW1uLXN0YXRzLWNoYXJ0JztcbmltcG9ydCB7RWRpdH0gZnJvbSAnLi4vLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCB7QnV0dG9ufSBmcm9tICcuLi8uLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEN1c3RvbVBhbGV0dGVGYWN0b3J5LCB7XG4gIENvbG9yUGFsZXR0ZUl0ZW0sXG4gIENvbG9yU3dhdGNoLFxuICBFZGl0YWJsZUNvbG9yUmFuZ2UsXG4gIENhdGVnb3JpY2FsU2VsZWN0b3IsXG4gIFNldENvbG9yVUlGdW5jXG59IGZyb20gJy4vY3VzdG9tLXBhbGV0dGUnO1xuXG5jb25zdCBTdHlsZWRDb2xvckJyZWFrc1BhbmVsID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3N0eWxlZC1jb2xvci1icmVha3MtcGFuZWwnXG59KWBcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yQnJlYWtzRGlzcGxheSA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzdHlsZWQtY29sb3ItYnJlYWtzLWRpc3BsYXknXG59KWBcbiAgcGFkZGluZzogOHB4IDEycHggMCAxMnB4O1xuYDtcblxuY29uc3QgQ29sb3JCcmVha3NQYW5lbFdyYXBwZXIgPSBzdHlsZWQuZGl2YGA7XG5cbnR5cGUgRWRpdEJ1dHRvblByb3BzID0ge29uQ2xpY2tFZGl0OiAoKSA9PiB2b2lkfTtcblxuZXhwb3J0IGNvbnN0IEVkaXRCdXR0b246IFJlYWN0LkZDPEVkaXRCdXR0b25Qcm9wcz4gPSAoe29uQ2xpY2tFZGl0fSkgPT4gKFxuICA8QnV0dG9uIGNsYXNzTmFtZT1cImVkaXRwX19idXR0b25cIiBsaW5rIG9uQ2xpY2s9e29uQ2xpY2tFZGl0fT5cbiAgICA8RWRpdCBoZWlnaHQ9XCIxNnB4XCIgLz5cbiAgICBFZGl0XG4gIDwvQnV0dG9uPlxuKTtcblxuZXhwb3J0IHR5cGUgQ29sb3JCcmVha3NEaXNwbGF5UHJvcHMgPSB7XG4gIGN1cnJlbnRCcmVha3M/OiBDb2xvckJyZWFrW10gfCBDb2xvckJyZWFrT3JkaW5hbFtdIHwgbnVsbDtcbiAgb25FZGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IENvbG9yQnJlYWtzRGlzcGxheTogUmVhY3QuRkM8Q29sb3JCcmVha3NEaXNwbGF5UHJvcHM+ID0gKHtjdXJyZW50QnJlYWtzLCBvbkVkaXR9KSA9PiB7XG4gIGlmICghbm90T3JkaW5hbENvbG9yQnJlYWtzKGN1cnJlbnRCcmVha3MpKSB7XG4gICAgLy8gZG9uJ3QgZGlzcGxheSBjb2xvciBicmVha3MgZm9yIG9yZGluYWwgYnJlYWtzLCB1c2VyIGNhbiBjaGFuZ2UgaXQgaW4gY3VzdG9tIGJyZWFrc1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZENvbG9yQnJlYWtzRGlzcGxheT5cbiAgICAgIHtvbkVkaXQgPyA8RWRpdEJ1dHRvbiBvbkNsaWNrRWRpdD17b25FZGl0fSAvPiA6IG51bGx9XG4gICAgICB7Y3VycmVudEJyZWFrcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgIDxDb2xvclBhbGV0dGVJdGVtIGNsYXNzTmFtZT1cImRpc2FibGVkXCIga2V5PXtpbmRleH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjdXN0b20tcGFsZXR0ZS1pbnB1dF9fbGVmdFwiPlxuICAgICAgICAgICAgPENvbG9yU3dhdGNoIGNvbG9yPXtpdGVtLmRhdGF9IC8+XG4gICAgICAgICAgICA8RWRpdGFibGVDb2xvclJhbmdlXG4gICAgICAgICAgICAgIGl0ZW09e2l0ZW19XG4gICAgICAgICAgICAgIGlzTGFzdD17aW5kZXggPT09IGN1cnJlbnRCcmVha3MubGVuZ3RoIC0gMX1cbiAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBlZGl0YWJsZT17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0NvbG9yUGFsZXR0ZUl0ZW0+XG4gICAgICApKX1cbiAgICA8L1N0eWxlZENvbG9yQnJlYWtzRGlzcGxheT5cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIENhdGVnb3JpY2FsQ29sb3JEaXNwbGF5UHJvcHMgPSB7XG4gIGNvbG9yTWFwPzogQ29sb3JNYXA7XG4gIG9uRWRpdDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBDYXRlZ29yaWNhbENvbG9yRGlzcGxheTogUmVhY3QuRkM8Q2F0ZWdvcmljYWxDb2xvckRpc3BsYXlQcm9wcz4gPSAoe1xuICBjb2xvck1hcCxcbiAgb25FZGl0XG59OiBDYXRlZ29yaWNhbENvbG9yRGlzcGxheVByb3BzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZENvbG9yQnJlYWtzRGlzcGxheT5cbiAgICAgIHtvbkVkaXQgPyA8RWRpdEJ1dHRvbiBvbkNsaWNrRWRpdD17b25FZGl0fSAvPiA6IG51bGx9XG4gICAgICB7Y29sb3JNYXA/Lm1hcCgoY20sIGluZGV4KSA9PiAoXG4gICAgICAgIDxDb2xvclBhbGV0dGVJdGVtIGNsYXNzTmFtZT1cImRpc2FibGVkXCIga2V5PXtpbmRleH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjdXN0b20tcGFsZXR0ZS1pbnB1dF9fbGVmdFwiPlxuICAgICAgICAgICAgPENvbG9yU3dhdGNoIGNvbG9yPXtjbVsxXX0gLz5cbiAgICAgICAgICAgIDxDYXRlZ29yaWNhbFNlbGVjdG9yXG4gICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXM9e3RvQXJyYXkoY21bMF0pfVxuICAgICAgICAgICAgICBhbGxWYWx1ZXM9e1tdfVxuICAgICAgICAgICAgICBlZGl0YWJsZT17ZmFsc2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0NvbG9yUGFsZXR0ZUl0ZW0+XG4gICAgICApKX1cbiAgICA8L1N0eWxlZENvbG9yQnJlYWtzRGlzcGxheT5cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbG9yQnJlYWtzUGFuZWxQcm9wcyA9IHtcbiAgY29sb3JCcmVha3M6IENvbG9yQnJlYWtbXSB8IENvbG9yQnJlYWtPcmRpbmFsW10gfCBudWxsO1xuICBjb2xvclVJQ29uZmlnOiBDb2xvclVJO1xuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSB8IHVuZGVmaW5lZDtcbiAgY29sb3JGaWVsZDogRmllbGQ7XG4gIGlzQ3VzdG9tQnJlYWtzOiBib29sZWFuO1xuICBhbGxCaW5zOiBCaW5bXTtcbiAgZmlsdGVyZWRCaW5zOiBCaW5bXTtcbiAgaXNGaWx0ZXJlZDogYm9vbGVhbjtcbiAgaGlzdG9ncmFtRG9tYWluOiBudW1iZXJbXTtcbiAgb3JkaW5hbERvbWFpbjogbnVtYmVyW10gfCBzdHJpbmdbXTtcbiAgc2V0Q29sb3JVSTogU2V0Q29sb3JVSUZ1bmM7XG4gIG9uU2NhbGVDaGFuZ2U6ICh2OiBzdHJpbmcsIHZpc0NvbmZnPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZDtcbiAgb25BcHBseTogKGU6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkO1xufTtcblxuQ29sb3JCcmVha3NQYW5lbEZhY3RvcnkuZGVwcyA9IFtDdXN0b21QYWxldHRlRmFjdG9yeSwgQ29sdW1uU3RhdHNDaGFydEZhY3RvcnldO1xuXG5mdW5jdGlvbiBDb2xvckJyZWFrc1BhbmVsRmFjdG9yeShcbiAgQ3VzdG9tUGFsZXR0ZTogUmV0dXJuVHlwZTx0eXBlb2YgQ3VzdG9tUGFsZXR0ZUZhY3Rvcnk+LFxuICBDb2x1bW5TdGF0c0NoYXJ0OiBSZXR1cm5UeXBlPHR5cGVvZiBDb2x1bW5TdGF0c0NoYXJ0RmFjdG9yeT5cbik6IFJlYWN0LkZDPENvbG9yQnJlYWtzUGFuZWxQcm9wcz4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBDb2xvckJyZWFrc1BhbmVsOiBSZWFjdC5GQzxDb2xvckJyZWFrc1BhbmVsUHJvcHM+ID0gKHtcbiAgICBjb2xvckJyZWFrcyxcbiAgICBjb2xvclVJQ29uZmlnLFxuICAgIGRhdGFzZXQsXG4gICAgY29sb3JGaWVsZCxcbiAgICBpc0N1c3RvbUJyZWFrcyxcbiAgICBhbGxCaW5zLFxuICAgIGZpbHRlcmVkQmlucyxcbiAgICBpc0ZpbHRlcmVkLFxuICAgIGhpc3RvZ3JhbURvbWFpbixcbiAgICBvcmRpbmFsRG9tYWluLFxuICAgIHNldENvbG9yVUksXG4gICAgb25TY2FsZUNoYW5nZSxcbiAgICBvbkFwcGx5LFxuICAgIG9uQ2FuY2VsXG4gIH0pID0+IHtcbiAgICBjb25zdCB7Y3VzdG9tUGFsZXR0ZSwgc2hvd1NrZXRjaGVyLCBjb2xvclJhbmdlQ29uZmlnfSA9IGNvbG9yVUlDb25maWc7XG4gICAgY29uc3QgaXNFZGl0aW5nQ3VzdG9tQnJlYWtzID0gQm9vbGVhbihjb2xvclJhbmdlQ29uZmlnLmN1c3RvbUJyZWFrcyk7XG5cbiAgICBjb25zdCBjdXJyZW50QnJlYWtzID0gdXNlTWVtbyhcbiAgICAgICgpID0+IChpc0VkaXRpbmdDdXN0b21CcmVha3MgPyBjb2xvck1hcFRvQ29sb3JCcmVha3MoY3VzdG9tUGFsZXR0ZS5jb2xvck1hcCkgOiBjb2xvckJyZWFrcyksXG4gICAgICBbY3VzdG9tUGFsZXR0ZS5jb2xvck1hcCwgaXNFZGl0aW5nQ3VzdG9tQnJlYWtzLCBjb2xvckJyZWFrc11cbiAgICApO1xuXG4gICAgY29uc3Qgb25DbGlja0VkaXRDdXN0b21CcmVha3MgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBzZXRDb2xvclVJKHtcbiAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgIGN1c3RvbUJyZWFrczogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBbc2V0Q29sb3JVSV0pO1xuXG4gICAgY29uc3Qgb25DaWxja0NhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldENvbG9yVUkoe1xuICAgICAgICBzaG93U2tldGNoZXI6IGZhbHNlLFxuICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgICAgY3VzdG9tQnJlYWtzOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG9uQ2FuY2VsKCk7XG4gICAgfSwgW3NldENvbG9yVUksIG9uQ2FuY2VsXSk7XG5cbiAgICBjb25zdCBvbkNvbHVtblN0YXRzQ2hhcnRDaGFuZ2VkID0gdXNlQ2FsbGJhY2soXG4gICAgICBuZXdDb2xvckJyZWFrcyA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0NvbG9ycyA9IG5ld0NvbG9yQnJlYWtzLm1hcChjYiA9PiBjYi5kYXRhKTtcbiAgICAgICAgY29uc3QgbmV3Q29sb3JNYXAgPSBjb2xvckJyZWFrc1RvQ29sb3JNYXAobmV3Q29sb3JCcmVha3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld0N1c3RvbVBhbGV0dGUgPSB7XG4gICAgICAgICAgLi4uY3VzdG9tUGFsZXR0ZSxcbiAgICAgICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXAsXG4gICAgICAgICAgY29sb3JzOiBuZXdDb2xvcnNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyB1cGRhdGUgY3VzdG9tIHBhbGxldHRlIGVkaXRvclxuICAgICAgICBpZiAoIWlzRWRpdGluZ0N1c3RvbUJyZWFrcykge1xuICAgICAgICAgIHNldENvbG9yVUkoe1xuICAgICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgICBjdXN0b21CcmVha3M6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21QYWxldHRlOiBuZXdDdXN0b21QYWxldHRlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q29sb3JVSSh7Y3VzdG9tUGFsZXR0ZTogbmV3Q3VzdG9tUGFsZXR0ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciB0aGUgbWFwIHRvIHJlLXJlbmRlciB1c2luZyBuZXdDdXN0b21QYWxldHRlXG4gICAgICAgIG9uU2NhbGVDaGFuZ2UoU0NBTEVfVFlQRVMuY3VzdG9tLCBuZXdDdXN0b21QYWxldHRlKTtcbiAgICAgIH0sXG4gICAgICBbc2V0Q29sb3JVSSwgY3VzdG9tUGFsZXR0ZSwgaXNFZGl0aW5nQ3VzdG9tQnJlYWtzLCBvblNjYWxlQ2hhbmdlXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbG9yQnJlYWtzUGFuZWxXcmFwcGVyPlxuICAgICAgICB7ZGF0YXNldCAmJiBhbGxCaW5zLmxlbmd0aCA+IDEgJiYgbm90T3JkaW5hbENvbG9yQnJlYWtzKGNvbG9yQnJlYWtzKSA/IChcbiAgICAgICAgICA8Q29sdW1uU3RhdHNDaGFydFxuICAgICAgICAgICAgY29sb3JGaWVsZD17Y29sb3JGaWVsZH1cbiAgICAgICAgICAgIGRhdGFzZXQ9e2RhdGFzZXR9XG4gICAgICAgICAgICBjb2xvckJyZWFrcz17Y3VycmVudEJyZWFrc31cbiAgICAgICAgICAgIGFsbEJpbnM9e2FsbEJpbnN9XG4gICAgICAgICAgICBmaWx0ZXJlZEJpbnM9e2ZpbHRlcmVkQmluc31cbiAgICAgICAgICAgIGlzRmlsdGVyZWQ9e2lzRmlsdGVyZWR9XG4gICAgICAgICAgICBoaXN0b2dyYW1Eb21haW49e2hpc3RvZ3JhbURvbWFpbn1cbiAgICAgICAgICAgIG9uQ2hhbmdlZFVwZGF0ZXI9e29uQ29sdW1uU3RhdHNDaGFydENoYW5nZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxTdHlsZWRDb2xvckJyZWFrc1BhbmVsPlxuICAgICAgICAgIHtpc0VkaXRpbmdDdXN0b21CcmVha3MgPyAoXG4gICAgICAgICAgICA8Q3VzdG9tUGFsZXR0ZVxuICAgICAgICAgICAgICBvcmRpbmFsRG9tYWluPXtvcmRpbmFsRG9tYWlufVxuICAgICAgICAgICAgICBjdXN0b21QYWxldHRlPXtjdXN0b21QYWxldHRlfVxuICAgICAgICAgICAgICBzZXRDb2xvclBhbGV0dGVVST17c2V0Q29sb3JVSX1cbiAgICAgICAgICAgICAgc2hvd1NrZXRjaGVyPXtzaG93U2tldGNoZXJ9XG4gICAgICAgICAgICAgIG9uQXBwbHk9e29uQXBwbHl9XG4gICAgICAgICAgICAgIG9uQ2FuY2VsPXtvbkNpbGNrQ2FuY2VsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogY3VycmVudEJyZWFrcyAmJiBhbGxCaW5zLmxlbmd0aCA+IDEgJiYgbm90T3JkaW5hbENvbG9yQnJlYWtzKGNvbG9yQnJlYWtzKSA/IChcbiAgICAgICAgICAgIDxDb2xvckJyZWFrc0Rpc3BsYXlcbiAgICAgICAgICAgICAgY3VycmVudEJyZWFrcz17Y3VycmVudEJyZWFrc31cbiAgICAgICAgICAgICAgb25FZGl0PXtpc0N1c3RvbUJyZWFrcyA/IG9uQ2xpY2tFZGl0Q3VzdG9tQnJlYWtzIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IGN1c3RvbVBhbGV0dGUuY29sb3JNYXAgJiZcbiAgICAgICAgICAgIGN1c3RvbVBhbGV0dGUudHlwZSA9PT0gJ2N1c3RvbU9yZGluYWwnICYmXG4gICAgICAgICAgICBjdXN0b21QYWxldHRlLm5hbWU/LmVuZHNXaXRoKGNvbG9yRmllbGQubmFtZSkgPyAoXG4gICAgICAgICAgICA8Q2F0ZWdvcmljYWxDb2xvckRpc3BsYXlcbiAgICAgICAgICAgICAgY29sb3JNYXA9e2N1c3RvbVBhbGV0dGUuY29sb3JNYXB9XG4gICAgICAgICAgICAgIG9uRWRpdD17aXNDdXN0b21CcmVha3MgPyBvbkNsaWNrRWRpdEN1c3RvbUJyZWFrcyA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1N0eWxlZENvbG9yQnJlYWtzUGFuZWw+XG4gICAgICA8L0NvbG9yQnJlYWtzUGFuZWxXcmFwcGVyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0Lm1lbW8oQ29sb3JCcmVha3NQYW5lbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yQnJlYWtzUGFuZWxGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsS0FBQSxHQUFBRixPQUFBO0FBT0EsSUFBQUcsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQU4sT0FBQTtBQUNBLElBQUFPLGlCQUFBLEdBQUFELHNCQUFBLENBQUFOLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxrQkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsY0FBQSxHQUFBTix1QkFBQSxDQUFBSixPQUFBO0FBTTBCLElBQUFXLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUF6QjFCO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVgsd0JBQUFXLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FB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