kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
236 lines (232 loc) • 42.5 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"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
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 _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src");
var _colorBreaksPanel = _interopRequireDefault(require("./color-breaks-panel"));
var _dropdownSelect = _interopRequireDefault(require("../../common/item-selector/dropdown-select"));
var _accessor = _interopRequireDefault(require("../../common/item-selector/accessor"));
var _dropdownList = _interopRequireDefault(require("../../common/item-selector/dropdown-list"));
var _lazyTippy = _interopRequireDefault(require("../../map/lazy-tippy"));
var _typeahead = _interopRequireDefault(require("../../common/item-selector/typeahead"));
var _excluded = ["layer", "field", "dataset", "onSelect", "scaleType", "domain", "aggregatedBins", "range", "setColorUI", "colorUIConfig", "channelKey"],
_excluded2 = ["colorMap"];
var _templateObject, _templateObject2, _templateObject3, _templateObject4; // 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; }
// 'tippy-js'
var HISTOGRAM_BINS = 30;
var DropdownPropContext = _react["default"].createContext({});
var POPPER_OPTIONS = {
modifiers: [
// zero offsets since they are already added in VerticalToolbar
{
name: 'offset',
options: {
offset: [0, 0]
}
}]
};
var DropdownBottom = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n border-top: 1px solid\n ", ";\n"])), function (props) {
return props.light ? props.theme.dropdownListBorderTopLT : props.theme.dropdownListBorderTop;
});
var StyledScaleSelectDropdown = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n box-shadow: ", ";\n .list-selector {\n box-shadow: none;\n border-top: 0;\n }\n .list__item {\n padding: 4px 9px;\n }\n"])), function (props) {
return props.theme.dropdownListShadow;
});
var DropdownWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n border: 0;\n width: 100%;\n left: 0;\n z-index: ", ";\n position: absolute;\n margin-top: ", "px;\n"])), function (props) {
return props.theme.dropdownWrapperZ;
}, function (props) {
return props.theme.dropdownWapperMargin;
});
var StyledColorScaleSelector = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n .typeahead {\n // adds padding to bottom of dropdown\n margin-bottom: 40px;\n }\n [data-tippy-root] {\n width: 100%;\n }\n"])));
function hideTippy(tippyInstance) {
if (tippyInstance) {
tippyInstance.hide();
}
}
ColorScaleSelectorFactory.deps = [_colorBreaksPanel["default"]];
function ColorScaleSelectorFactory(ColorBreaksPanel) {
var ColorScaleSelectDropdown = function ColorScaleSelectDropdown(props) {
return /*#__PURE__*/_react["default"].createElement(StyledScaleSelectDropdown, null, /*#__PURE__*/_react["default"].createElement(_dropdownList["default"], props), /*#__PURE__*/_react["default"].createElement(DropdownPropContext.Consumer, null, function (context) {
return /*#__PURE__*/_react["default"].createElement(DropdownBottom, null, /*#__PURE__*/_react["default"].createElement(ColorBreaksPanel, context));
}));
};
var ColorScaleSelector = function ColorScaleSelector(_ref) {
var _colorUIConfig$colorR, _field$filterProps;
var layer = _ref.layer,
field = _ref.field,
dataset = _ref.dataset,
onSelect = _ref.onSelect,
scaleType = _ref.scaleType,
domain = _ref.domain,
aggregatedBins = _ref.aggregatedBins,
range = _ref.range,
setColorUI = _ref.setColorUI,
colorUIConfig = _ref.colorUIConfig,
channelKey = _ref.channelKey,
dropdownSelectProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
var displayOption = _accessor["default"].generateOptionToStringFor(dropdownSelectProps.displayOption);
var getOptionValue = (0, _react.useMemo)(function () {
return _accessor["default"].generateOptionToStringFor(dropdownSelectProps.getOptionValue);
}, [dropdownSelectProps.getOptionValue]);
var _useState = (0, _react.useState)(),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
tippyInstance = _useState2[0],
setTippyInstance = _useState2[1];
var isEditingColorBreaks = colorUIConfig === null || colorUIConfig === void 0 || (_colorUIConfig$colorR = colorUIConfig.colorRangeConfig) === null || _colorUIConfig$colorR === void 0 ? void 0 : _colorUIConfig$colorR.customBreaks;
var colorScale = (0, _react.useMemo)(function () {
return (0, _src2.getLayerColorScale)({
range: range,
domain: domain,
scaleType: scaleType,
layer: layer
});
}, [range, domain, scaleType, layer]);
var colorBreaks = (0, _react.useMemo)(function () {
var _field$type;
return colorScale ? (0, _src2.getLegendOfScale)({
scale: colorScale.byZoom && domain ? colorScale((domain === null || domain === void 0 ? void 0 : domain.length) - 1) : colorScale,
scaleType: scaleType,
fieldType: (_field$type = field === null || field === void 0 ? void 0 : field.type) !== null && _field$type !== void 0 ? _field$type : _src.ALL_FIELD_TYPES.real
}) : null;
}, [colorScale, scaleType, field === null || field === void 0 ? void 0 : field.type, domain]);
var columnStats = field === null || field === void 0 || (_field$filterProps = field.filterProps) === null || _field$filterProps === void 0 ? void 0 : _field$filterProps.columnStats;
var fieldValueAccessor = (0, _react.useMemo)(function () {
return field ? function (idx) {
return dataset.getValue(field.name, idx);
} : function (idx) {
return dataset.dataContainer.rowAsArray(idx);
};
}, [dataset, field]);
// aggregatedBins should be the raw data
var allBins = (0, _react.useMemo)(function () {
if (aggregatedBins) {
return (0, _src2.histogramFromValues)(Object.values(aggregatedBins).map(function (bin) {
return bin.i;
}), HISTOGRAM_BINS, function (idx) {
return aggregatedBins[idx].value;
});
}
return columnStats !== null && columnStats !== void 0 && columnStats.bins ? columnStats === null || columnStats === void 0 ? void 0 : columnStats.bins : (0, _src2.histogramFromValues)(dataset.allIndexes, HISTOGRAM_BINS, fieldValueAccessor);
}, [aggregatedBins, columnStats, dataset, fieldValueAccessor]);
var histogramDomain = (0, _react.useMemo)(function () {
return (0, _src2.getHistogramDomain)({
aggregatedBins: aggregatedBins,
columnStats: columnStats,
dataset: dataset,
fieldValueAccessor: fieldValueAccessor
});
}, [dataset, fieldValueAccessor, aggregatedBins, columnStats]);
var ordinalDomain = (0, _react.useMemo)(function () {
return layer.config[layer.visualChannels[channelKey].domain] || [];
}, [channelKey, layer.config, layer.visualChannels]);
var isFiltered = aggregatedBins ? false : dataset.filteredIndexForDomain.length !== dataset.allIndexes.length;
// get filteredBins (not apply to aggregate layer)
var filteredBins = (0, _react.useMemo)(function () {
if (!isFiltered) {
return allBins;
}
// get threholds
var filterEmptyBins = false;
var threholds = allBins.map(function (b) {
return b.x0;
});
return (0, _src2.histogramFromThreshold)(threholds, dataset.filteredIndexForDomain, fieldValueAccessor, filterEmptyBins);
}, [dataset, fieldValueAccessor, allBins, isFiltered]);
var onSelectScale = (0, _react.useCallback)(function (val) {
// highlight selected option
if (!val || isEditingColorBreaks) return;
var selectedScale = getOptionValue(val);
if (selectedScale === _src.SCALE_TYPES.custom) {
var customPalette = (0, _src2.initCustomPaletteByCustomScale)({
scale: selectedScale,
field: field,
range: range,
colorBreaks: colorBreaks
});
setColorUI({
showColorChart: true,
colorRangeConfig: {
customBreaks: true
},
customPalette: customPalette
});
onSelect(selectedScale, customPalette);
} else if ((0, _src2.hasColorMap)(range) && selectedScale !== _src.SCALE_TYPES.customOrdinal) {
// not custom
// remove colorMap
// eslint-disable-next-line no-unused-vars
var _ = range.colorMap,
newRange = (0, _objectWithoutProperties2["default"])(range, _excluded2);
onSelect(selectedScale, newRange);
} else {
onSelect(selectedScale);
}
}, [isEditingColorBreaks, field, setColorUI, onSelect, range, getOptionValue, colorBreaks]);
var onApply = (0, _react.useCallback)(function () {
onSelect(scaleType, colorUIConfig.customPalette);
hideTippy(tippyInstance);
}, [onSelect, colorUIConfig.customPalette, tippyInstance, scaleType]);
var onCancel = (0, _react.useCallback)(function () {
hideTippy(tippyInstance);
}, [tippyInstance]);
var isCustomBreaks = scaleType === _src.SCALE_TYPES.custom || scaleType === _src.SCALE_TYPES.customOrdinal;
return /*#__PURE__*/_react["default"].createElement(DropdownPropContext.Provider, {
value: {
setColorUI: setColorUI,
colorField: field,
dataset: dataset,
colorUIConfig: colorUIConfig,
colorBreaks: colorBreaks,
isCustomBreaks: isCustomBreaks,
allBins: allBins,
filteredBins: filteredBins,
isFiltered: isFiltered,
histogramDomain: histogramDomain,
ordinalDomain: ordinalDomain,
onScaleChange: onSelect,
onApply: onApply,
onCancel: onCancel
}
}, /*#__PURE__*/_react["default"].createElement(StyledColorScaleSelector, null, /*#__PURE__*/_react["default"].createElement(_lazyTippy["default"], {
trigger: "click",
placement: "bottom-start",
appendTo: "parent",
interactive: true,
hideOnClick: !isEditingColorBreaks,
onCreate: setTippyInstance,
popperOptions: POPPER_OPTIONS,
render: function render(attrs) {
return /*#__PURE__*/_react["default"].createElement(DropdownWrapper, attrs, !dropdownSelectProps.disabled && /*#__PURE__*/_react["default"].createElement(_typeahead["default"], (0, _extends2["default"])({}, dropdownSelectProps, {
displayOption: displayOption
// @ts-ignore
,
getOptionValue: getOptionValue,
onOptionSelected: onSelectScale,
customListComponent: ColorScaleSelectDropdown,
searchable: false,
showOptionsWhenEmpty: true
})));
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "dropdown-select"
}, /*#__PURE__*/_react["default"].createElement(_dropdownSelect["default"], (0, _extends2["default"])({}, dropdownSelectProps, {
displayOption: displayOption,
value: dropdownSelectProps.selectedItems[0]
}))))));
};
return ColorScaleSelector;
}
var _default = exports["default"] = ColorScaleSelectorFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3JjIiwiX3NyYzIiLCJfY29sb3JCcmVha3NQYW5lbCIsIl9kcm9wZG93blNlbGVjdCIsIl9hY2Nlc3NvciIsIl9kcm9wZG93bkxpc3QiLCJfbGF6eVRpcHB5IiwiX3R5cGVhaGVhZCIsIl9leGNsdWRlZCIsIl9leGNsdWRlZDIiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJISVNUT0dSQU1fQklOUyIsIkRyb3Bkb3duUHJvcENvbnRleHQiLCJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJQT1BQRVJfT1BUSU9OUyIsIm1vZGlmaWVycyIsIm5hbWUiLCJvcHRpb25zIiwib2Zmc2V0IiwiRHJvcGRvd25Cb3R0b20iLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwibGlnaHQiLCJ0aGVtZSIsImRyb3Bkb3duTGlzdEJvcmRlclRvcExUIiwiZHJvcGRvd25MaXN0Qm9yZGVyVG9wIiwiU3R5bGVkU2NhbGVTZWxlY3REcm9wZG93biIsImRyb3Bkb3duTGlzdFNoYWRvdyIsIkRyb3Bkb3duV3JhcHBlciIsImRyb3Bkb3duV3JhcHBlcloiLCJkcm9wZG93bldhcHBlck1hcmdpbiIsIlN0eWxlZENvbG9yU2NhbGVTZWxlY3RvciIsImhpZGVUaXBweSIsInRpcHB5SW5zdGFuY2UiLCJoaWRlIiwiQ29sb3JTY2FsZVNlbGVjdG9yRmFjdG9yeSIsImRlcHMiLCJDb2xvckJyZWFrc1BhbmVsRmFjdG9yeSIsIkNvbG9yQnJlYWtzUGFuZWwiLCJDb2xvclNjYWxlU2VsZWN0RHJvcGRvd24iLCJjcmVhdGVFbGVtZW50IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwiQ29sb3JTY2FsZVNlbGVjdG9yIiwiX3JlZiIsIl9jb2xvclVJQ29uZmlnJGNvbG9yUiIsIl9maWVsZCRmaWx0ZXJQcm9wcyIsImxheWVyIiwiZmllbGQiLCJkYXRhc2V0Iiwib25TZWxlY3QiLCJzY2FsZVR5cGUiLCJkb21haW4iLCJhZ2dyZWdhdGVkQmlucyIsInJhbmdlIiwic2V0Q29sb3JVSSIsImNvbG9yVUlDb25maWciLCJjaGFubmVsS2V5IiwiZHJvcGRvd25TZWxlY3RQcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJkaXNwbGF5T3B0aW9uIiwiQWNjZXNzb3IiLCJnZW5lcmF0ZU9wdGlvblRvU3RyaW5nRm9yIiwiZ2V0T3B0aW9uVmFsdWUiLCJ1c2VNZW1vIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwic2V0VGlwcHlJbnN0YW5jZSIsImlzRWRpdGluZ0NvbG9yQnJlYWtzIiwiY29sb3JSYW5nZUNvbmZpZyIsImN1c3RvbUJyZWFrcyIsImNvbG9yU2NhbGUiLCJnZXRMYXllckNvbG9yU2NhbGUiLCJjb2xvckJyZWFrcyIsIl9maWVsZCR0eXBlIiwiZ2V0TGVnZW5kT2ZTY2FsZSIsInNjYWxlIiwiYnlab29tIiwibGVuZ3RoIiwiZmllbGRUeXBlIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInJlYWwiLCJjb2x1bW5TdGF0cyIsImZpbHRlclByb3BzIiwiZmllbGRWYWx1ZUFjY2Vzc29yIiwiaWR4IiwiZ2V0VmFsdWUiLCJkYXRhQ29udGFpbmVyIiwicm93QXNBcnJheSIsImFsbEJpbnMiLCJoaXN0b2dyYW1Gcm9tVmFsdWVzIiwidmFsdWVzIiwibWFwIiwiYmluIiwidmFsdWUiLCJiaW5zIiwiYWxsSW5kZXhlcyIsImhpc3RvZ3JhbURvbWFpbiIsImdldEhpc3RvZ3JhbURvbWFpbiIsIm9yZGluYWxEb21haW4iLCJjb25maWciLCJ2aXN1YWxDaGFubmVscyIsImlzRmlsdGVyZWQiLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZmlsdGVyZWRCaW5zIiwiZmlsdGVyRW1wdHlCaW5zIiwidGhyZWhvbGRzIiwiYiIsIngwIiwiaGlzdG9ncmFtRnJvbVRocmVzaG9sZCIsIm9uU2VsZWN0U2NhbGUiLCJ1c2VDYWxsYmFjayIsInZhbCIsInNlbGVjdGVkU2NhbGUiLCJTQ0FMRV9UWVBFUyIsImN1c3RvbSIsImN1c3RvbVBhbGV0dGUiLCJpbml0Q3VzdG9tUGFsZXR0ZUJ5Q3VzdG9tU2NhbGUiLCJzaG93Q29sb3JDaGFydCIsImhhc0NvbG9yTWFwIiwiY3VzdG9tT3JkaW5hbCIsIl8iLCJjb2xvck1hcCIsIm5ld1JhbmdlIiwib25BcHBseSIsIm9uQ2FuY2VsIiwiaXNDdXN0b21CcmVha3MiLCJQcm92aWRlciIsImNvbG9yRmllbGQiLCJvblNjYWxlQ2hhbmdlIiwidHJpZ2dlciIsInBsYWNlbWVudCIsImFwcGVuZFRvIiwiaW50ZXJhY3RpdmUiLCJoaWRlT25DbGljayIsIm9uQ3JlYXRlIiwicG9wcGVyT3B0aW9ucyIsInJlbmRlciIsImF0dHJzIiwiZGlzYWJsZWQiLCJfZXh0ZW5kczIiLCJvbk9wdGlvblNlbGVjdGVkIiwiY3VzdG9tTGlzdENvbXBvbmVudCIsInNlYXJjaGFibGUiLCJzaG93T3B0aW9uc1doZW5FbXB0eSIsImNsYXNzTmFtZSIsInNlbGVjdGVkSXRlbXMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvc2lkZS1wYW5lbC9sYXllci1wYW5lbC9jb2xvci1zY2FsZS1zZWxlY3Rvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIFNDQUxFX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0FnZ3JlZ2F0ZWRCaW4sIExheWVyLCBWaXN1YWxDaGFubmVsRG9tYWlufSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7Q29sb3JSYW5nZSwgQ29sb3JVSSwgRmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtcbiAgZ2V0TGF5ZXJDb2xvclNjYWxlLFxuICBnZXRMZWdlbmRPZlNjYWxlLFxuICBpbml0Q3VzdG9tUGFsZXR0ZUJ5Q3VzdG9tU2NhbGUsXG4gIGhpc3RvZ3JhbUZyb21WYWx1ZXMsXG4gIGhpc3RvZ3JhbUZyb21UaHJlc2hvbGQsXG4gIGdldEhpc3RvZ3JhbURvbWFpbixcbiAgaGFzQ29sb3JNYXBcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCBDb2xvckJyZWFrc1BhbmVsRmFjdG9yeSwge0NvbG9yQnJlYWtzUGFuZWxQcm9wc30gZnJvbSAnLi9jb2xvci1icmVha3MtcGFuZWwnO1xuaW1wb3J0IHtTZXRDb2xvclVJRnVuY30gZnJvbSAnLi9jdXN0b20tcGFsZXR0ZSc7XG5pbXBvcnQgRHJvcGRvd25TZWxlY3QgZnJvbSAnLi4vLi4vY29tbW9uL2l0ZW0tc2VsZWN0b3IvZHJvcGRvd24tc2VsZWN0JztcbmltcG9ydCBBY2Nlc3NvciBmcm9tICcuLi8uLi9jb21tb24vaXRlbS1zZWxlY3Rvci9hY2Nlc3Nvcic7XG5pbXBvcnQgRHJvcGRvd25MaXN0IGZyb20gJy4uLy4uL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2Ryb3Bkb3duLWxpc3QnO1xuaW1wb3J0IExhenlUaXBweSBmcm9tICcuLi8uLi9tYXAvbGF6eS10aXBweSc7XG5pbXBvcnQgVHlwZWFoZWFkIGZyb20gJy4uLy4uL2NvbW1vbi9pdGVtLXNlbGVjdG9yL3R5cGVhaGVhZCc7XG5cbnR5cGUgVGlwcHlJbnN0YW5jZSA9IGFueTsgLy8gJ3RpcHB5LWpzJ1xuXG5jb25zdCBISVNUT0dSQU1fQklOUyA9IDMwO1xuXG5leHBvcnQgdHlwZSBTY2FsZU9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBPblNlbGVjdEZ1bmMgPSAodjogc3RyaW5nLCB2aXNDb25mZz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbnRleHRQcm9wcyA9IENvbG9yQnJlYWtzUGFuZWxQcm9wcztcblxuZXhwb3J0IHR5cGUgQ29sb3JTY2FsZVNlbGVjdG9yUHJvcHMgPSB7XG4gIGxheWVyOiBMYXllcjtcbiAgZmllbGQ6IEZpZWxkO1xuICBkYXRhc2V0OiBLZXBsZXJUYWJsZTtcbiAgc2NhbGVUeXBlOiBzdHJpbmc7XG4gIGRvbWFpbjogVmlzdWFsQ2hhbm5lbERvbWFpbjtcbiAgcmFuZ2U6IENvbG9yUmFuZ2U7XG4gIG9uU2VsZWN0OiBPblNlbGVjdEZ1bmM7XG4gIHNldENvbG9yVUk6IFNldENvbG9yVUlGdW5jO1xuICBjb2xvclVJQ29uZmlnOiBDb2xvclVJO1xuICBvcHRpb25zOiBTY2FsZU9wdGlvbltdO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHNlbGVjdGVkSXRlbXM6IFNjYWxlT3B0aW9uW107XG4gIG11bHRpU2VsZWN0OiBib29sZWFuO1xuICBzZWFyY2hhYmxlOiBib29sZWFuO1xuICBkaXNwbGF5T3B0aW9uOiBzdHJpbmc7XG4gIGdldE9wdGlvblZhbHVlOiBzdHJpbmc7XG4gIGFnZ3JlZ2F0ZWRCaW5zPzogQWdncmVnYXRlZEJpbltdO1xuICBjaGFubmVsS2V5OiBzdHJpbmc7XG59O1xuXG5jb25zdCBEcm9wZG93blByb3BDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5jb25zdCBQT1BQRVJfT1BUSU9OUyA9IHtcbiAgbW9kaWZpZXJzOiBbXG4gICAgLy8gemVybyBvZmZzZXRzIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgYWRkZWQgaW4gVmVydGljYWxUb29sYmFyXG4gICAge25hbWU6ICdvZmZzZXQnLCBvcHRpb25zOiB7b2Zmc2V0OiBbMCwgMF19fVxuICBdXG59O1xuXG5jb25zdCBEcm9wZG93bkJvdHRvbSA9IHN0eWxlZC5kaXY8e2xpZ2h0PzogYm9vbGVhbn0+YFxuICBib3JkZXItdG9wOiAxcHggc29saWRcbiAgICAke3Byb3BzID0+XG4gICAgICBwcm9wcy5saWdodCA/IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEJvcmRlclRvcExUIDogcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0Qm9yZGVyVG9wfTtcbmA7XG5cbmNvbnN0IFN0eWxlZFNjYWxlU2VsZWN0RHJvcGRvd24gPSBzdHlsZWQuZGl2YFxuICBib3gtc2hhZG93OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdFNoYWRvd307XG4gIC5saXN0LXNlbGVjdG9yIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJvcmRlci10b3A6IDA7XG4gIH1cbiAgLmxpc3RfX2l0ZW0ge1xuICAgIHBhZGRpbmc6IDRweCA5cHg7XG4gIH1cbmA7XG5jb25zdCBEcm9wZG93bldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBib3JkZXI6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV3JhcHBlclp9O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi10b3A6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25XYXBwZXJNYXJnaW59cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRDb2xvclNjYWxlU2VsZWN0b3IgPSBzdHlsZWQuZGl2YFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC50eXBlYWhlYWQge1xuICAgIC8vIGFkZHMgcGFkZGluZyB0byBib3R0b20gb2YgZHJvcGRvd25cbiAgICBtYXJnaW4tYm90dG9tOiA0MHB4O1xuICB9XG4gIFtkYXRhLXRpcHB5LXJvb3RdIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuYDtcblxuZnVuY3Rpb24gaGlkZVRpcHB5KHRpcHB5SW5zdGFuY2UpIHtcbiAgaWYgKHRpcHB5SW5zdGFuY2UpIHtcbiAgICB0aXBweUluc3RhbmNlLmhpZGUoKTtcbiAgfVxufVxuQ29sb3JTY2FsZVNlbGVjdG9yRmFjdG9yeS5kZXBzID0gW0NvbG9yQnJlYWtzUGFuZWxGYWN0b3J5XTtcblxuZnVuY3Rpb24gQ29sb3JTY2FsZVNlbGVjdG9yRmFjdG9yeShcbiAgQ29sb3JCcmVha3NQYW5lbDogUmV0dXJuVHlwZTx0eXBlb2YgQ29sb3JCcmVha3NQYW5lbEZhY3Rvcnk+XG4pOiBSZWFjdC5GQzxDb2xvclNjYWxlU2VsZWN0b3JQcm9wcz4ge1xuICBjb25zdCBDb2xvclNjYWxlU2VsZWN0RHJvcGRvd24gPSBwcm9wcyA9PiAoXG4gICAgPFN0eWxlZFNjYWxlU2VsZWN0RHJvcGRvd24+XG4gICAgICA8RHJvcGRvd25MaXN0IHsuLi5wcm9wc30gLz5cbiAgICAgIDxEcm9wZG93blByb3BDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7KGNvbnRleHQ6IGFueSkgPT4gKFxuICAgICAgICAgIDxEcm9wZG93bkJvdHRvbT5cbiAgICAgICAgICAgIDxDb2xvckJyZWFrc1BhbmVsIHsuLi5jb250ZXh0fSAvPlxuICAgICAgICAgIDwvRHJvcGRvd25Cb3R0b20+XG4gICAgICAgICl9XG4gICAgICA8L0Ryb3Bkb3duUHJvcENvbnRleHQuQ29uc3VtZXI+XG4gICAgPC9TdHlsZWRTY2FsZVNlbGVjdERyb3Bkb3duPlxuICApO1xuXG4gIGNvbnN0IENvbG9yU2NhbGVTZWxlY3RvcjogUmVhY3QuRkM8Q29sb3JTY2FsZVNlbGVjdG9yUHJvcHM+ID0gKHtcbiAgICBsYXllcixcbiAgICBmaWVsZCxcbiAgICBkYXRhc2V0LFxuICAgIG9uU2VsZWN0LFxuICAgIHNjYWxlVHlwZSxcbiAgICBkb21haW4sXG4gICAgYWdncmVnYXRlZEJpbnMsXG4gICAgcmFuZ2UsXG4gICAgc2V0Q29sb3JVSSxcbiAgICBjb2xvclVJQ29uZmlnLFxuICAgIGNoYW5uZWxLZXksXG4gICAgLi4uZHJvcGRvd25TZWxlY3RQcm9wc1xuICB9KSA9PiB7XG4gICAgY29uc3QgZGlzcGxheU9wdGlvbiA9IEFjY2Vzc29yLmdlbmVyYXRlT3B0aW9uVG9TdHJpbmdGb3IoZHJvcGRvd25TZWxlY3RQcm9wcy5kaXNwbGF5T3B0aW9uKTtcbiAgICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiBBY2Nlc3Nvci5nZW5lcmF0ZU9wdGlvblRvU3RyaW5nRm9yKGRyb3Bkb3duU2VsZWN0UHJvcHMuZ2V0T3B0aW9uVmFsdWUpLFxuICAgICAgW2Ryb3Bkb3duU2VsZWN0UHJvcHMuZ2V0T3B0aW9uVmFsdWVdXG4gICAgKTtcbiAgICBjb25zdCBbdGlwcHlJbnN0YW5jZSwgc2V0VGlwcHlJbnN0YW5jZV0gPSB1c2VTdGF0ZTxUaXBweUluc3RhbmNlPigpO1xuICAgIGNvbnN0IGlzRWRpdGluZ0NvbG9yQnJlYWtzID0gY29sb3JVSUNvbmZpZz8uY29sb3JSYW5nZUNvbmZpZz8uY3VzdG9tQnJlYWtzO1xuICAgIGNvbnN0IGNvbG9yU2NhbGUgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgZ2V0TGF5ZXJDb2xvclNjYWxlKHtcbiAgICAgICAgICByYW5nZSxcbiAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgc2NhbGVUeXBlLFxuICAgICAgICAgIGxheWVyXG4gICAgICAgIH0pLFxuICAgICAgW3JhbmdlLCBkb21haW4sIHNjYWxlVHlwZSwgbGF5ZXJdXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbG9yQnJlYWtzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gY29sb3JTY2FsZVxuICAgICAgICA/IGdldExlZ2VuZE9mU2NhbGUoe1xuICAgICAgICAgICAgc2NhbGU6IGNvbG9yU2NhbGUuYnlab29tICYmIGRvbWFpbiA/IGNvbG9yU2NhbGUoZG9tYWluPy5sZW5ndGggLSAxKSA6IGNvbG9yU2NhbGUsXG4gICAgICAgICAgICBzY2FsZVR5cGUsXG4gICAgICAgICAgICBmaWVsZFR5cGU6IGZpZWxkPy50eXBlID8/IEFMTF9GSUVMRF9UWVBFUy5yZWFsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBudWxsO1xuICAgIH0sIFtjb2xvclNjYWxlLCBzY2FsZVR5cGUsIGZpZWxkPy50eXBlLCBkb21haW5dKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRzID0gZmllbGQ/LmZpbHRlclByb3BzPy5jb2x1bW5TdGF0cztcblxuICAgIGNvbnN0IGZpZWxkVmFsdWVBY2Nlc3NvciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgICAgID8gaWR4ID0+IGRhdGFzZXQuZ2V0VmFsdWUoZmllbGQubmFtZSwgaWR4KVxuICAgICAgICA6IGlkeCA9PiBkYXRhc2V0LmRhdGFDb250YWluZXIucm93QXNBcnJheShpZHgpO1xuICAgIH0sIFtkYXRhc2V0LCBmaWVsZF0pO1xuXG4gICAgLy8gYWdncmVnYXRlZEJpbnMgc2hvdWxkIGJlIHRoZSByYXcgZGF0YVxuICAgIGNvbnN0IGFsbEJpbnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGlmIChhZ2dyZWdhdGVkQmlucykge1xuICAgICAgICByZXR1cm4gaGlzdG9ncmFtRnJvbVZhbHVlcyhcbiAgICAgICAgICBPYmplY3QudmFsdWVzKGFnZ3JlZ2F0ZWRCaW5zKS5tYXAoYmluID0+IGJpbi5pKSxcbiAgICAgICAgICBISVNUT0dSQU1fQklOUyxcbiAgICAgICAgICBpZHggPT4gYWdncmVnYXRlZEJpbnNbaWR4XS52YWx1ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtblN0YXRzPy5iaW5zXG4gICAgICAgID8gY29sdW1uU3RhdHM/LmJpbnNcbiAgICAgICAgOiBoaXN0b2dyYW1Gcm9tVmFsdWVzKGRhdGFzZXQuYWxsSW5kZXhlcywgSElTVE9HUkFNX0JJTlMsIGZpZWxkVmFsdWVBY2Nlc3Nvcik7XG4gICAgfSwgW2FnZ3JlZ2F0ZWRCaW5zLCBjb2x1bW5TdGF0cywgZGF0YXNldCwgZmllbGRWYWx1ZUFjY2Vzc29yXSk7XG5cbiAgICBjb25zdCBoaXN0b2dyYW1Eb21haW4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBnZXRIaXN0b2dyYW1Eb21haW4oe2FnZ3JlZ2F0ZWRCaW5zLCBjb2x1bW5TdGF0cywgZGF0YXNldCwgZmllbGRWYWx1ZUFjY2Vzc29yfSk7XG4gICAgfSwgW2RhdGFzZXQsIGZpZWxkVmFsdWVBY2Nlc3NvciwgYWdncmVnYXRlZEJpbnMsIGNvbHVtblN0YXRzXSk7XG5cbiAgICBjb25zdCBvcmRpbmFsRG9tYWluID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gbGF5ZXIuY29uZmlnW2xheWVyLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxLZXldLmRvbWFpbl0gfHwgW107XG4gICAgfSwgW2NoYW5uZWxLZXksIGxheWVyLmNvbmZpZywgbGF5ZXIudmlzdWFsQ2hhbm5lbHNdKTtcblxuICAgIGNvbnN0IGlzRmlsdGVyZWQgPSBhZ2dyZWdhdGVkQmluc1xuICAgICAgPyBmYWxzZVxuICAgICAgOiBkYXRhc2V0LmZpbHRlcmVkSW5kZXhGb3JEb21haW4ubGVuZ3RoICE9PSBkYXRhc2V0LmFsbEluZGV4ZXMubGVuZ3RoO1xuXG4gICAgLy8gZ2V0IGZpbHRlcmVkQmlucyAobm90IGFwcGx5IHRvIGFnZ3JlZ2F0ZSBsYXllcilcbiAgICBjb25zdCBmaWx0ZXJlZEJpbnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGlmICghaXNGaWx0ZXJlZCkge1xuICAgICAgICByZXR1cm4gYWxsQmlucztcbiAgICAgIH1cbiAgICAgIC8vIGdldCB0aHJlaG9sZHNcbiAgICAgIGNvbnN0IGZpbHRlckVtcHR5QmlucyA9IGZhbHNlO1xuICAgICAgY29uc3QgdGhyZWhvbGRzID0gYWxsQmlucy5tYXAoYiA9PiBiLngwKTtcbiAgICAgIHJldHVybiBoaXN0b2dyYW1Gcm9tVGhyZXNob2xkKFxuICAgICAgICB0aHJlaG9sZHMsXG4gICAgICAgIGRhdGFzZXQuZmlsdGVyZWRJbmRleEZvckRvbWFpbixcbiAgICAgICAgZmllbGRWYWx1ZUFjY2Vzc29yLFxuICAgICAgICBmaWx0ZXJFbXB0eUJpbnNcbiAgICAgICk7XG4gICAgfSwgW2RhdGFzZXQsIGZpZWxkVmFsdWVBY2Nlc3NvciwgYWxsQmlucywgaXNGaWx0ZXJlZF0pO1xuXG4gICAgY29uc3Qgb25TZWxlY3RTY2FsZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgLy8gaGlnaGxpZ2h0IHNlbGVjdGVkIG9wdGlvblxuICAgICAgICBpZiAoIXZhbCB8fCBpc0VkaXRpbmdDb2xvckJyZWFrcykgcmV0dXJuO1xuICAgICAgICBjb25zdCBzZWxlY3RlZFNjYWxlID0gZ2V0T3B0aW9uVmFsdWUodmFsKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkU2NhbGUgPT09IFNDQUxFX1RZUEVTLmN1c3RvbSkge1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVBhbGV0dGUgPSBpbml0Q3VzdG9tUGFsZXR0ZUJ5Q3VzdG9tU2NhbGUoe1xuICAgICAgICAgICAgc2NhbGU6IHNlbGVjdGVkU2NhbGUsXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3JCcmVha3NcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZXRDb2xvclVJKHtcbiAgICAgICAgICAgIHNob3dDb2xvckNoYXJ0OiB0cnVlLFxuICAgICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgICBjdXN0b21CcmVha3M6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb25TZWxlY3Qoc2VsZWN0ZWRTY2FsZSwgY3VzdG9tUGFsZXR0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29sb3JNYXAocmFuZ2UpICYmIHNlbGVjdGVkU2NhbGUgIT09IFNDQUxFX1RZUEVTLmN1c3RvbU9yZGluYWwpIHtcbiAgICAgICAgICAvLyBub3QgY3VzdG9tXG4gICAgICAgICAgLy8gcmVtb3ZlIGNvbG9yTWFwXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgICAgY29uc3Qge2NvbG9yTWFwOiBfLCAuLi5uZXdSYW5nZX0gPSByYW5nZTtcbiAgICAgICAgICBvblNlbGVjdChzZWxlY3RlZFNjYWxlLCBuZXdSYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25TZWxlY3Qoc2VsZWN0ZWRTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbaXNFZGl0aW5nQ29sb3JCcmVha3MsIGZpZWxkLCBzZXRDb2xvclVJLCBvblNlbGVjdCwgcmFuZ2UsIGdldE9wdGlvblZhbHVlLCBjb2xvckJyZWFrc11cbiAgICApO1xuXG4gICAgY29uc3Qgb25BcHBseSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIG9uU2VsZWN0KHNjYWxlVHlwZSwgY29sb3JVSUNvbmZpZy5jdXN0b21QYWxldHRlKTtcbiAgICAgIGhpZGVUaXBweSh0aXBweUluc3RhbmNlKTtcbiAgICB9LCBbb25TZWxlY3QsIGNvbG9yVUlDb25maWcuY3VzdG9tUGFsZXR0ZSwgdGlwcHlJbnN0YW5jZSwgc2NhbGVUeXBlXSk7XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGhpZGVUaXBweSh0aXBweUluc3RhbmNlKTtcbiAgICB9LCBbdGlwcHlJbnN0YW5jZV0pO1xuXG4gICAgY29uc3QgaXNDdXN0b21CcmVha3MgPVxuICAgICAgc2NhbGVUeXBlID09PSBTQ0FMRV9UWVBFUy5jdXN0b20gfHwgc2NhbGVUeXBlID09PSBTQ0FMRV9UWVBFUy5jdXN0b21PcmRpbmFsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wZG93blByb3BDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgIHZhbHVlPXt7XG4gICAgICAgICAgc2V0Q29sb3JVSSxcbiAgICAgICAgICBjb2xvckZpZWxkOiBmaWVsZCxcbiAgICAgICAgICBkYXRhc2V0LFxuICAgICAgICAgIGNvbG9yVUlDb25maWcsXG4gICAgICAgICAgY29sb3JCcmVha3MsXG4gICAgICAgICAgaXNDdXN0b21CcmVha3MsXG4gICAgICAgICAgYWxsQmlucyxcbiAgICAgICAgICBmaWx0ZXJlZEJpbnMsXG4gICAgICAgICAgaXNGaWx0ZXJlZCxcbiAgICAgICAgICBoaXN0b2dyYW1Eb21haW4sXG4gICAgICAgICAgb3JkaW5hbERvbWFpbixcbiAgICAgICAgICBvblNjYWxlQ2hhbmdlOiBvblNlbGVjdCxcbiAgICAgICAgICBvbkFwcGx5LFxuICAgICAgICAgIG9uQ2FuY2VsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxTdHlsZWRDb2xvclNjYWxlU2VsZWN0b3I+XG4gICAgICAgICAgPExhenlUaXBweVxuICAgICAgICAgICAgdHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiXG4gICAgICAgICAgICBhcHBlbmRUbz1cInBhcmVudFwiXG4gICAgICAgICAgICBpbnRlcmFjdGl2ZT17dHJ1ZX1cbiAgICAgICAgICAgIGhpZGVPbkNsaWNrPXshaXNFZGl0aW5nQ29sb3JCcmVha3N9XG4gICAgICAgICAgICBvbkNyZWF0ZT17c2V0VGlwcHlJbnN0YW5jZX1cbiAgICAgICAgICAgIHBvcHBlck9wdGlvbnM9e1BPUFBFUl9PUFRJT05TfVxuICAgICAgICAgICAgcmVuZGVyPXthdHRycyA9PiAoXG4gICAgICAgICAgICAgIDxEcm9wZG93bldyYXBwZXIgey4uLmF0dHJzfT5cbiAgICAgICAgICAgICAgICB7LyogQHRzLWlnbm9yZSovfVxuICAgICAgICAgICAgICAgIHshZHJvcGRvd25TZWxlY3RQcm9wcy5kaXNhYmxlZCAmJiAoXG4gICAgICAgICAgICAgICAgICA8VHlwZWFoZWFkXG4gICAgICAgICAgICAgICAgICAgIHsuLi5kcm9wZG93blNlbGVjdFByb3BzfVxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtkaXNwbGF5T3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGdldE9wdGlvblZhbHVlPXtnZXRPcHRpb25WYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25PcHRpb25TZWxlY3RlZD17b25TZWxlY3RTY2FsZX1cbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tTGlzdENvbXBvbmVudD17Q29sb3JTY2FsZVNlbGVjdERyb3Bkb3dufVxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgc2hvd09wdGlvbnNXaGVuRW1wdHlcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9Ecm9wZG93bldyYXBwZXI+XG4gICAgICAgICAgICApfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZHJvcGRvd24tc2VsZWN0XCI+XG4gICAgICAgICAgICAgIHsvKiBAdHMtaWdub3JlKi99XG4gICAgICAgICAgICAgIDxEcm9wZG93blNlbGVjdFxuICAgICAgICAgICAgICAgIHsuLi5kcm9wZG93blNlbGVjdFByb3BzfVxuICAgICAgICAgICAgICAgIGRpc3BsYXlPcHRpb249e2Rpc3BsYXlPcHRpb259XG4gICAgICAgICAgICAgICAgdmFsdWU9e2Ryb3Bkb3duU2VsZWN0UHJvcHMuc2VsZWN0ZWRJdGVtc1swXX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvTGF6eVRpcHB5PlxuICAgICAgICA8L1N0eWxlZENvbG9yU2NhbGVTZWxlY3Rvcj5cbiAgICAgIDwvRHJvcGRvd25Qcm9wQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9O1xuICByZXR1cm4gQ29sb3JTY2FsZVNlbGVjdG9yO1xufVxuZXhwb3J0IGRlZmF1bHQgQ29sb3JTY2FsZVNlbGVjdG9yRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLElBQUEsR0FBQUgsT0FBQTtBQUlBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQVVBLElBQUFLLGlCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBTSxlQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxTQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxhQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxVQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxVQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFBNkQsSUFBQVcsU0FBQTtFQUFBQyxVQUFBO0FBQUEsSUFBQUMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQTFCN0Q7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFB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