kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
236 lines (232 loc) • 42.4 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("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
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 = /*#__PURE__*/_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, _utils.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, _utils.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 : _constants.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, _utils.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, _utils.histogramFromValues)(dataset.allIndexes, HISTOGRAM_BINS, fieldValueAccessor);
}, [aggregatedBins, columnStats, dataset, fieldValueAccessor]);
var histogramDomain = (0, _react.useMemo)(function () {
return (0, _utils.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, _utils.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 === _constants.SCALE_TYPES.custom) {
var customPalette = (0, _utils.initCustomPaletteByCustomScale)({
scale: selectedScale,
field: field,
range: range,
colorBreaks: colorBreaks
});
setColorUI({
showColorChart: true,
colorRangeConfig: {
customBreaks: true
},
customPalette: customPalette
});
onSelect(selectedScale, customPalette);
} else if ((0, _utils.hasColorMap)(range) && selectedScale !== _constants.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 === _constants.SCALE_TYPES.custom || scaleType === _constants.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2NvbG9yQnJlYWtzUGFuZWwiLCJfZHJvcGRvd25TZWxlY3QiLCJfYWNjZXNzb3IiLCJfZHJvcGRvd25MaXN0IiwiX2xhenlUaXBweSIsIl90eXBlYWhlYWQiLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiSElTVE9HUkFNX0JJTlMiLCJEcm9wZG93blByb3BDb250ZXh0IiwiUmVhY3QiLCJjcmVhdGVDb250ZXh0IiwiUE9QUEVSX09QVElPTlMiLCJtb2RpZmllcnMiLCJuYW1lIiwib3B0aW9ucyIsIm9mZnNldCIsIkRyb3Bkb3duQm90dG9tIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsImxpZ2h0IiwidGhlbWUiLCJkcm9wZG93bkxpc3RCb3JkZXJUb3BMVCIsImRyb3Bkb3duTGlzdEJvcmRlclRvcCIsIlN0eWxlZFNjYWxlU2VsZWN0RHJvcGRvd24iLCJkcm9wZG93bkxpc3RTaGFkb3ciLCJEcm9wZG93bldyYXBwZXIiLCJkcm9wZG93bldyYXBwZXJaIiwiZHJvcGRvd25XYXBwZXJNYXJnaW4iLCJTdHlsZWRDb2xvclNjYWxlU2VsZWN0b3IiLCJoaWRlVGlwcHkiLCJ0aXBweUluc3RhbmNlIiwiaGlkZSIsIkNvbG9yU2NhbGVTZWxlY3RvckZhY3RvcnkiLCJkZXBzIiwiQ29sb3JCcmVha3NQYW5lbEZhY3RvcnkiLCJDb2xvckJyZWFrc1BhbmVsIiwiQ29sb3JTY2FsZVNlbGVjdERyb3Bkb3duIiwiY3JlYXRlRWxlbWVudCIsIkNvbnN1bWVyIiwiY29udGV4dCIsIkNvbG9yU2NhbGVTZWxlY3RvciIsIl9yZWYiLCJfY29sb3JVSUNvbmZpZyRjb2xvclIiLCJfZmllbGQkZmlsdGVyUHJvcHMiLCJsYXllciIsImZpZWxkIiwiZGF0YXNldCIsIm9uU2VsZWN0Iiwic2NhbGVUeXBlIiwiZG9tYWluIiwiYWdncmVnYXRlZEJpbnMiLCJyYW5nZSIsInNldENvbG9yVUkiLCJjb2xvclVJQ29uZmlnIiwiY2hhbm5lbEtleSIsImRyb3Bkb3duU2VsZWN0UHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiZGlzcGxheU9wdGlvbiIsIkFjY2Vzc29yIiwiZ2VuZXJhdGVPcHRpb25Ub1N0cmluZ0ZvciIsImdldE9wdGlvblZhbHVlIiwidXNlTWVtbyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsInNldFRpcHB5SW5zdGFuY2UiLCJpc0VkaXRpbmdDb2xvckJyZWFrcyIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b21CcmVha3MiLCJjb2xvclNjYWxlIiwiZ2V0TGF5ZXJDb2xvclNjYWxlIiwiY29sb3JCcmVha3MiLCJfZmllbGQkdHlwZSIsImdldExlZ2VuZE9mU2NhbGUiLCJzY2FsZSIsImJ5Wm9vbSIsImxlbmd0aCIsImZpZWxkVHlwZSIsInR5cGUiLCJBTExfRklFTERfVFlQRVMiLCJyZWFsIiwiY29sdW1uU3RhdHMiLCJmaWx0ZXJQcm9wcyIsImZpZWxkVmFsdWVBY2Nlc3NvciIsImlkeCIsImdldFZhbHVlIiwiZGF0YUNvbnRhaW5lciIsInJvd0FzQXJyYXkiLCJhbGxCaW5zIiwiaGlzdG9ncmFtRnJvbVZhbHVlcyIsInZhbHVlcyIsIm1hcCIsImJpbiIsInZhbHVlIiwiYmlucyIsImFsbEluZGV4ZXMiLCJoaXN0b2dyYW1Eb21haW4iLCJnZXRIaXN0b2dyYW1Eb21haW4iLCJvcmRpbmFsRG9tYWluIiwiY29uZmlnIiwidmlzdWFsQ2hhbm5lbHMiLCJpc0ZpbHRlcmVkIiwiZmlsdGVyZWRJbmRleEZvckRvbWFpbiIsImZpbHRlcmVkQmlucyIsImZpbHRlckVtcHR5QmlucyIsInRocmVob2xkcyIsImIiLCJ4MCIsImhpc3RvZ3JhbUZyb21UaHJlc2hvbGQiLCJvblNlbGVjdFNjYWxlIiwidXNlQ2FsbGJhY2siLCJ2YWwiLCJzZWxlY3RlZFNjYWxlIiwiU0NBTEVfVFlQRVMiLCJjdXN0b20iLCJjdXN0b21QYWxldHRlIiwiaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlIiwic2hvd0NvbG9yQ2hhcnQiLCJoYXNDb2xvck1hcCIsImN1c3RvbU9yZGluYWwiLCJfIiwiY29sb3JNYXAiLCJuZXdSYW5nZSIsIm9uQXBwbHkiLCJvbkNhbmNlbCIsImlzQ3VzdG9tQnJlYWtzIiwiUHJvdmlkZXIiLCJjb2xvckZpZWxkIiwib25TY2FsZUNoYW5nZSIsInRyaWdnZXIiLCJwbGFjZW1lbnQiLCJhcHBlbmRUbyIsImludGVyYWN0aXZlIiwiaGlkZU9uQ2xpY2siLCJvbkNyZWF0ZSIsInBvcHBlck9wdGlvbnMiLCJyZW5kZXIiLCJhdHRycyIsImRpc2FibGVkIiwiX2V4dGVuZHMyIiwib25PcHRpb25TZWxlY3RlZCIsImN1c3RvbUxpc3RDb21wb25lbnQiLCJzZWFyY2hhYmxlIiwic2hvd09wdGlvbnNXaGVuRW1wdHkiLCJjbGFzc05hbWUiLCJzZWxlY3RlZEl0ZW1zIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3Itc2NhbGUtc2VsZWN0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTLCBTQ0FMRV9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtBZ2dyZWdhdGVkQmluLCBMYXllciwgVmlzdWFsQ2hhbm5lbERvbWFpbn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge0NvbG9yUmFuZ2UsIENvbG9yVUksIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldExheWVyQ29sb3JTY2FsZSxcbiAgZ2V0TGVnZW5kT2ZTY2FsZSxcbiAgaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlLFxuICBoaXN0b2dyYW1Gcm9tVmFsdWVzLFxuICBoaXN0b2dyYW1Gcm9tVGhyZXNob2xkLFxuICBnZXRIaXN0b2dyYW1Eb21haW4sXG4gIGhhc0NvbG9yTWFwXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQgQ29sb3JCcmVha3NQYW5lbEZhY3RvcnksIHtDb2xvckJyZWFrc1BhbmVsUHJvcHN9IGZyb20gJy4vY29sb3ItYnJlYWtzLXBhbmVsJztcbmltcG9ydCB7U2V0Q29sb3JVSUZ1bmN9IGZyb20gJy4vY3VzdG9tLXBhbGV0dGUnO1xuaW1wb3J0IERyb3Bkb3duU2VsZWN0IGZyb20gJy4uLy4uL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2Ryb3Bkb3duLXNlbGVjdCc7XG5pbXBvcnQgQWNjZXNzb3IgZnJvbSAnLi4vLi4vY29tbW9uL2l0ZW0tc2VsZWN0b3IvYWNjZXNzb3InO1xuaW1wb3J0IERyb3Bkb3duTGlzdCBmcm9tICcuLi8uLi9jb21tb24vaXRlbS1zZWxlY3Rvci9kcm9wZG93bi1saXN0JztcbmltcG9ydCBMYXp5VGlwcHkgZnJvbSAnLi4vLi4vbWFwL2xhenktdGlwcHknO1xuaW1wb3J0IFR5cGVhaGVhZCBmcm9tICcuLi8uLi9jb21tb24vaXRlbS1zZWxlY3Rvci90eXBlYWhlYWQnO1xuXG50eXBlIFRpcHB5SW5zdGFuY2UgPSBhbnk7IC8vICd0aXBweS1qcydcblxuY29uc3QgSElTVE9HUkFNX0JJTlMgPSAzMDtcblxuZXhwb3J0IHR5cGUgU2NhbGVPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgT25TZWxlY3RGdW5jID0gKHY6IHN0cmluZywgdmlzQ29uZmc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb250ZXh0UHJvcHMgPSBDb2xvckJyZWFrc1BhbmVsUHJvcHM7XG5cbmV4cG9ydCB0eXBlIENvbG9yU2NhbGVTZWxlY3RvclByb3BzID0ge1xuICBsYXllcjogTGF5ZXI7XG4gIGZpZWxkOiBGaWVsZDtcbiAgZGF0YXNldDogS2VwbGVyVGFibGU7XG4gIHNjYWxlVHlwZTogc3RyaW5nO1xuICBkb21haW46IFZpc3VhbENoYW5uZWxEb21haW47XG4gIHJhbmdlOiBDb2xvclJhbmdlO1xuICBvblNlbGVjdDogT25TZWxlY3RGdW5jO1xuICBzZXRDb2xvclVJOiBTZXRDb2xvclVJRnVuYztcbiAgY29sb3JVSUNvbmZpZzogQ29sb3JVSTtcbiAgb3B0aW9uczogU2NhbGVPcHRpb25bXTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzZWxlY3RlZEl0ZW1zOiBTY2FsZU9wdGlvbltdO1xuICBtdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgc2VhcmNoYWJsZTogYm9vbGVhbjtcbiAgZGlzcGxheU9wdGlvbjogc3RyaW5nO1xuICBnZXRPcHRpb25WYWx1ZTogc3RyaW5nO1xuICBhZ2dyZWdhdGVkQmlucz86IEFnZ3JlZ2F0ZWRCaW5bXTtcbiAgY2hhbm5lbEtleTogc3RyaW5nO1xufTtcblxuY29uc3QgRHJvcGRvd25Qcm9wQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuY29uc3QgUE9QUEVSX09QVElPTlMgPSB7XG4gIG1vZGlmaWVyczogW1xuICAgIC8vIHplcm8gb2Zmc2V0cyBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGFkZGVkIGluIFZlcnRpY2FsVG9vbGJhclxuICAgIHtuYW1lOiAnb2Zmc2V0Jywgb3B0aW9uczoge29mZnNldDogWzAsIDBdfX1cbiAgXVxufTtcblxuY29uc3QgRHJvcGRvd25Cb3R0b20gPSBzdHlsZWQuZGl2PHtsaWdodD86IGJvb2xlYW59PmBcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkXG4gICAgJHtwcm9wcyA9PlxuICAgICAgcHJvcHMubGlnaHQgPyBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RCb3JkZXJUb3BMVCA6IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEJvcmRlclRvcH07XG5gO1xuXG5jb25zdCBTdHlsZWRTY2FsZVNlbGVjdERyb3Bkb3duID0gc3R5bGVkLmRpdmBcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RTaGFkb3d9O1xuICAubGlzdC1zZWxlY3RvciB7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXItdG9wOiAwO1xuICB9XG4gIC5saXN0X19pdGVtIHtcbiAgICBwYWRkaW5nOiA0cHggOXB4O1xuICB9XG5gO1xuY29uc3QgRHJvcGRvd25XcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgYm9yZGVyOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bldyYXBwZXJafTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBtYXJnaW4tdG9wOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV2FwcGVyTWFyZ2lufXB4O1xuYDtcblxuY29uc3QgU3R5bGVkQ29sb3JTY2FsZVNlbGVjdG9yID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAudHlwZWFoZWFkIHtcbiAgICAvLyBhZGRzIHBhZGRpbmcgdG8gYm90dG9tIG9mIGRyb3Bkb3duXG4gICAgbWFyZ2luLWJvdHRvbTogNDBweDtcbiAgfVxuICBbZGF0YS10aXBweS1yb290XSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbmA7XG5cbmZ1bmN0aW9uIGhpZGVUaXBweSh0aXBweUluc3RhbmNlKSB7XG4gIGlmICh0aXBweUluc3RhbmNlKSB7XG4gICAgdGlwcHlJbnN0YW5jZS5oaWRlKCk7XG4gIH1cbn1cbkNvbG9yU2NhbGVTZWxlY3RvckZhY3RvcnkuZGVwcyA9IFtDb2xvckJyZWFrc1BhbmVsRmFjdG9yeV07XG5cbmZ1bmN0aW9uIENvbG9yU2NhbGVTZWxlY3RvckZhY3RvcnkoXG4gIENvbG9yQnJlYWtzUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIENvbG9yQnJlYWtzUGFuZWxGYWN0b3J5PlxuKTogUmVhY3QuRkM8Q29sb3JTY2FsZVNlbGVjdG9yUHJvcHM+IHtcbiAgY29uc3QgQ29sb3JTY2FsZVNlbGVjdERyb3Bkb3duID0gcHJvcHMgPT4gKFxuICAgIDxTdHlsZWRTY2FsZVNlbGVjdERyb3Bkb3duPlxuICAgICAgPERyb3Bkb3duTGlzdCB7Li4ucHJvcHN9IC8+XG4gICAgICA8RHJvcGRvd25Qcm9wQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgeyhjb250ZXh0OiBhbnkpID0+IChcbiAgICAgICAgICA8RHJvcGRvd25Cb3R0b20+XG4gICAgICAgICAgICA8Q29sb3JCcmVha3NQYW5lbCB7Li4uY29udGV4dH0gLz5cbiAgICAgICAgICA8L0Ryb3Bkb3duQm90dG9tPlxuICAgICAgICApfVxuICAgICAgPC9Ecm9wZG93blByb3BDb250ZXh0LkNvbnN1bWVyPlxuICAgIDwvU3R5bGVkU2NhbGVTZWxlY3REcm9wZG93bj5cbiAgKTtcblxuICBjb25zdCBDb2xvclNjYWxlU2VsZWN0b3I6IFJlYWN0LkZDPENvbG9yU2NhbGVTZWxlY3RvclByb3BzPiA9ICh7XG4gICAgbGF5ZXIsXG4gICAgZmllbGQsXG4gICAgZGF0YXNldCxcbiAgICBvblNlbGVjdCxcbiAgICBzY2FsZVR5cGUsXG4gICAgZG9tYWluLFxuICAgIGFnZ3JlZ2F0ZWRCaW5zLFxuICAgIHJhbmdlLFxuICAgIHNldENvbG9yVUksXG4gICAgY29sb3JVSUNvbmZpZyxcbiAgICBjaGFubmVsS2V5LFxuICAgIC4uLmRyb3Bkb3duU2VsZWN0UHJvcHNcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlPcHRpb24gPSBBY2Nlc3Nvci5nZW5lcmF0ZU9wdGlvblRvU3RyaW5nRm9yKGRyb3Bkb3duU2VsZWN0UHJvcHMuZGlzcGxheU9wdGlvbik7XG4gICAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gQWNjZXNzb3IuZ2VuZXJhdGVPcHRpb25Ub1N0cmluZ0Zvcihkcm9wZG93blNlbGVjdFByb3BzLmdldE9wdGlvblZhbHVlKSxcbiAgICAgIFtkcm9wZG93blNlbGVjdFByb3BzLmdldE9wdGlvblZhbHVlXVxuICAgICk7XG4gICAgY29uc3QgW3RpcHB5SW5zdGFuY2UsIHNldFRpcHB5SW5zdGFuY2VdID0gdXNlU3RhdGU8VGlwcHlJbnN0YW5jZT4oKTtcbiAgICBjb25zdCBpc0VkaXRpbmdDb2xvckJyZWFrcyA9IGNvbG9yVUlDb25maWc/LmNvbG9yUmFuZ2VDb25maWc/LmN1c3RvbUJyZWFrcztcbiAgICBjb25zdCBjb2xvclNjYWxlID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGdldExheWVyQ29sb3JTY2FsZSh7XG4gICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgZG9tYWluLFxuICAgICAgICAgIHNjYWxlVHlwZSxcbiAgICAgICAgICBsYXllclxuICAgICAgICB9KSxcbiAgICAgIFtyYW5nZSwgZG9tYWluLCBzY2FsZVR5cGUsIGxheWVyXVxuICAgICk7XG5cbiAgICBjb25zdCBjb2xvckJyZWFrcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbG9yU2NhbGVcbiAgICAgICAgPyBnZXRMZWdlbmRPZlNjYWxlKHtcbiAgICAgICAgICAgIHNjYWxlOiBjb2xvclNjYWxlLmJ5Wm9vbSAmJiBkb21haW4gPyBjb2xvclNjYWxlKGRvbWFpbj8ubGVuZ3RoIC0gMSkgOiBjb2xvclNjYWxlLFxuICAgICAgICAgICAgc2NhbGVUeXBlLFxuICAgICAgICAgICAgZmllbGRUeXBlOiBmaWVsZD8udHlwZSA/PyBBTExfRklFTERfVFlQRVMucmVhbFxuICAgICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCBbY29sb3JTY2FsZSwgc2NhbGVUeXBlLCBmaWVsZD8udHlwZSwgZG9tYWluXSk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0cyA9IGZpZWxkPy5maWx0ZXJQcm9wcz8uY29sdW1uU3RhdHM7XG5cbiAgICBjb25zdCBmaWVsZFZhbHVlQWNjZXNzb3IgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZFxuICAgICAgICA/IGlkeCA9PiBkYXRhc2V0LmdldFZhbHVlKGZpZWxkLm5hbWUsIGlkeClcbiAgICAgICAgOiBpZHggPT4gZGF0YXNldC5kYXRhQ29udGFpbmVyLnJvd0FzQXJyYXkoaWR4KTtcbiAgICB9LCBbZGF0YXNldCwgZmllbGRdKTtcblxuICAgIC8vIGFnZ3JlZ2F0ZWRCaW5zIHNob3VsZCBiZSB0aGUgcmF3IGRhdGFcbiAgICBjb25zdCBhbGxCaW5zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAoYWdncmVnYXRlZEJpbnMpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbUZyb21WYWx1ZXMoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhhZ2dyZWdhdGVkQmlucykubWFwKGJpbiA9PiBiaW4uaSksXG4gICAgICAgICAgSElTVE9HUkFNX0JJTlMsXG4gICAgICAgICAgaWR4ID0+IGFnZ3JlZ2F0ZWRCaW5zW2lkeF0udmFsdWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5TdGF0cz8uYmluc1xuICAgICAgICA/IGNvbHVtblN0YXRzPy5iaW5zXG4gICAgICAgIDogaGlzdG9ncmFtRnJvbVZhbHVlcyhkYXRhc2V0LmFsbEluZGV4ZXMsIEhJU1RPR1JBTV9CSU5TLCBmaWVsZFZhbHVlQWNjZXNzb3IpO1xuICAgIH0sIFthZ2dyZWdhdGVkQmlucywgY29sdW1uU3RhdHMsIGRhdGFzZXQsIGZpZWxkVmFsdWVBY2Nlc3Nvcl0pO1xuXG4gICAgY29uc3QgaGlzdG9ncmFtRG9tYWluID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gZ2V0SGlzdG9ncmFtRG9tYWluKHthZ2dyZWdhdGVkQmlucywgY29sdW1uU3RhdHMsIGRhdGFzZXQsIGZpZWxkVmFsdWVBY2Nlc3Nvcn0pO1xuICAgIH0sIFtkYXRhc2V0LCBmaWVsZFZhbHVlQWNjZXNzb3IsIGFnZ3JlZ2F0ZWRCaW5zLCBjb2x1bW5TdGF0c10pO1xuXG4gICAgY29uc3Qgb3JkaW5hbERvbWFpbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGxheWVyLmNvbmZpZ1tsYXllci52aXN1YWxDaGFubmVsc1tjaGFubmVsS2V5XS5kb21haW5dIHx8IFtdO1xuICAgIH0sIFtjaGFubmVsS2V5LCBsYXllci5jb25maWcsIGxheWVyLnZpc3VhbENoYW5uZWxzXSk7XG5cbiAgICBjb25zdCBpc0ZpbHRlcmVkID0gYWdncmVnYXRlZEJpbnNcbiAgICAgID8gZmFsc2VcbiAgICAgIDogZGF0YXNldC5maWx0ZXJlZEluZGV4Rm9yRG9tYWluLmxlbmd0aCAhPT0gZGF0YXNldC5hbGxJbmRleGVzLmxlbmd0aDtcblxuICAgIC8vIGdldCBmaWx0ZXJlZEJpbnMgKG5vdCBhcHBseSB0byBhZ2dyZWdhdGUgbGF5ZXIpXG4gICAgY29uc3QgZmlsdGVyZWRCaW5zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAoIWlzRmlsdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuIGFsbEJpbnM7XG4gICAgICB9XG4gICAgICAvLyBnZXQgdGhyZWhvbGRzXG4gICAgICBjb25zdCBmaWx0ZXJFbXB0eUJpbnMgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHRocmVob2xkcyA9IGFsbEJpbnMubWFwKGIgPT4gYi54MCk7XG4gICAgICByZXR1cm4gaGlzdG9ncmFtRnJvbVRocmVzaG9sZChcbiAgICAgICAgdGhyZWhvbGRzLFxuICAgICAgICBkYXRhc2V0LmZpbHRlcmVkSW5kZXhGb3JEb21haW4sXG4gICAgICAgIGZpZWxkVmFsdWVBY2Nlc3NvcixcbiAgICAgICAgZmlsdGVyRW1wdHlCaW5zXG4gICAgICApO1xuICAgIH0sIFtkYXRhc2V0LCBmaWVsZFZhbHVlQWNjZXNzb3IsIGFsbEJpbnMsIGlzRmlsdGVyZWRdKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0U2NhbGUgPSB1c2VDYWxsYmFjayhcbiAgICAgIHZhbCA9PiB7XG4gICAgICAgIC8vIGhpZ2hsaWdodCBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgaWYgKCF2YWwgfHwgaXNFZGl0aW5nQ29sb3JCcmVha3MpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTY2FsZSA9IGdldE9wdGlvblZhbHVlKHZhbCk7XG4gICAgICAgIGlmIChzZWxlY3RlZFNjYWxlID09PSBTQ0FMRV9UWVBFUy5jdXN0b20pIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21QYWxldHRlID0gaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlKHtcbiAgICAgICAgICAgIHNjYWxlOiBzZWxlY3RlZFNjYWxlLFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yQnJlYWtzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0Q29sb3JVSSh7XG4gICAgICAgICAgICBzaG93Q29sb3JDaGFydDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgICAgICAgY3VzdG9tQnJlYWtzOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VzdG9tUGFsZXR0ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG9uU2VsZWN0KHNlbGVjdGVkU2NhbGUsIGN1c3RvbVBhbGV0dGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0NvbG9yTWFwKHJhbmdlKSAmJiBzZWxlY3RlZFNjYWxlICE9PSBTQ0FMRV9UWVBFUy5jdXN0b21PcmRpbmFsKSB7XG4gICAgICAgICAgLy8gbm90IGN1c3RvbVxuICAgICAgICAgIC8vIHJlbW92ZSBjb2xvck1hcFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNvbnN0IHtjb2xvck1hcDogXywgLi4ubmV3UmFuZ2V9ID0gcmFuZ2U7XG4gICAgICAgICAgb25TZWxlY3Qoc2VsZWN0ZWRTY2FsZSwgbmV3UmFuZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uU2VsZWN0KHNlbGVjdGVkU2NhbGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2lzRWRpdGluZ0NvbG9yQnJlYWtzLCBmaWVsZCwgc2V0Q29sb3JVSSwgb25TZWxlY3QsIHJhbmdlLCBnZXRPcHRpb25WYWx1ZSwgY29sb3JCcmVha3NdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uQXBwbHkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBvblNlbGVjdChzY2FsZVR5cGUsIGNvbG9yVUlDb25maWcuY3VzdG9tUGFsZXR0ZSk7XG4gICAgICBoaWRlVGlwcHkodGlwcHlJbnN0YW5jZSk7XG4gICAgfSwgW29uU2VsZWN0LCBjb2xvclVJQ29uZmlnLmN1c3RvbVBhbGV0dGUsIHRpcHB5SW5zdGFuY2UsIHNjYWxlVHlwZV0pO1xuXG4gICAgY29uc3Qgb25DYW5jZWwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBoaWRlVGlwcHkodGlwcHlJbnN0YW5jZSk7XG4gICAgfSwgW3RpcHB5SW5zdGFuY2VdKTtcblxuICAgIGNvbnN0IGlzQ3VzdG9tQnJlYWtzID1cbiAgICAgIHNjYWxlVHlwZSA9PT0gU0NBTEVfVFlQRVMuY3VzdG9tIHx8IHNjYWxlVHlwZSA9PT0gU0NBTEVfVFlQRVMuY3VzdG9tT3JkaW5hbDtcblxuICAgIHJldHVybiAoXG4gICAgICA8RHJvcGRvd25Qcm9wQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgIHNldENvbG9yVUksXG4gICAgICAgICAgY29sb3JGaWVsZDogZmllbGQsXG4gICAgICAgICAgZGF0YXNldCxcbiAgICAgICAgICBjb2xvclVJQ29uZmlnLFxuICAgICAgICAgIGNvbG9yQnJlYWtzLFxuICAgICAgICAgIGlzQ3VzdG9tQnJlYWtzLFxuICAgICAgICAgIGFsbEJpbnMsXG4gICAgICAgICAgZmlsdGVyZWRCaW5zLFxuICAgICAgICAgIGlzRmlsdGVyZWQsXG4gICAgICAgICAgaGlzdG9ncmFtRG9tYWluLFxuICAgICAgICAgIG9yZGluYWxEb21haW4sXG4gICAgICAgICAgb25TY2FsZUNoYW5nZTogb25TZWxlY3QsXG4gICAgICAgICAgb25BcHBseSxcbiAgICAgICAgICBvbkNhbmNlbFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkQ29sb3JTY2FsZVNlbGVjdG9yPlxuICAgICAgICAgIDxMYXp5VGlwcHlcbiAgICAgICAgICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20tc3RhcnRcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJwYXJlbnRcIlxuICAgICAgICAgICAgaW50ZXJhY3RpdmU9e3RydWV9XG4gICAgICAgICAgICBoaWRlT25DbGljaz17IWlzRWRpdGluZ0NvbG9yQnJlYWtzfVxuICAgICAgICAgICAgb25DcmVhdGU9e3NldFRpcHB5SW5zdGFuY2V9XG4gICAgICAgICAgICBwb3BwZXJPcHRpb25zPXtQT1BQRVJfT1BUSU9OU31cbiAgICAgICAgICAgIHJlbmRlcj17YXR0cnMgPT4gKFxuICAgICAgICAgICAgICA8RHJvcGRvd25XcmFwcGVyIHsuLi5hdHRyc30+XG4gICAgICAgICAgICAgICAgey8qIEB0cy1pZ25vcmUqL31cbiAgICAgICAgICAgICAgICB7IWRyb3Bkb3duU2VsZWN0UHJvcHMuZGlzYWJsZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgPFR5cGVhaGVhZFxuICAgICAgICAgICAgICAgICAgICB7Li4uZHJvcGRvd25TZWxlY3RQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU9wdGlvbj17ZGlzcGxheU9wdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBnZXRPcHRpb25WYWx1ZT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIG9uT3B0aW9uU2VsZWN0ZWQ9e29uU2VsZWN0U2NhbGV9XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUxpc3RDb21wb25lbnQ9e0NvbG9yU2NhbGVTZWxlY3REcm9wZG93bn1cbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIHNob3dPcHRpb25zV2hlbkVtcHR5XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25XcmFwcGVyPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRyb3Bkb3duLXNlbGVjdFwiPlxuICAgICAgICAgICAgICB7LyogQHRzLWlnbm9yZSovfVxuICAgICAgICAgICAgICA8RHJvcGRvd25TZWxlY3RcbiAgICAgICAgICAgICAgICB7Li4uZHJvcGRvd25TZWxlY3RQcm9wc31cbiAgICAgICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtkaXNwbGF5T3B0aW9ufVxuICAgICAgICAgICAgICAgIHZhbHVlPXtkcm9wZG93blNlbGVjdFByb3BzLnNlbGVjdGVkSXRlbXNbMF19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0xhenlUaXBweT5cbiAgICAgICAgPC9TdHlsZWRDb2xvclNjYWxlU2VsZWN0b3I+XG4gICAgICA8L0Ryb3Bkb3duUHJvcENvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIENvbG9yU2NhbGVTZWxlY3Rvcjtcbn1cbmV4cG9ydCBkZWZhdWx0IENvbG9yU2NhbGVTZWxlY3RvckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFJQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFVQSxJQUFBSyxpQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQU0sZUFBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsYUFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsVUFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBQTZELElBQUFXLFNBQUE7RUFBQUMsVUFBQTtBQUFBLElBQUFDLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUExQjdEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFB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