UNPKG

kepler.gl

Version:

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

261 lines (259 loc) 49.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _localization = require("@kepler.gl/localization"); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _styledComponents2 = require("../../common/styled-components"); var _icons = require("../../common/icons"); var _tippyTooltip = _interopRequireDefault(require("../../common/tippy-tooltip")); var _filterPanelHeader = _interopRequireDefault(require("../../side-panel/filter-panel/filter-panel-header")); var _sourceSelector = _interopRequireDefault(require("../../side-panel/common/source-selector")); var _sourceDataSelector = _interopRequireDefault(require("../../side-panel/common/source-data-selector")); var _layerTypeListItem = _interopRequireDefault(require("../../side-panel/layer-panel/layer-type-list-item")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10; // 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 TrashIcon = (0, _styledComponents["default"])(_icons.Trash)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n cursor: pointer;\n color: ", ";\n margin-left: 8px;\n"])), function (props) { return props.theme.fontWhiteColor; }); var SyncedDatasetsArea = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n .side-panel-section {\n margin-bottom: 0;\n }\n"]))); var StyledContentTitle = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 8px;\n"])), function (props) { return props.theme.subtextColor; }); var StyledSeparator = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n border-left: 1px dashed ", ";\n height: 16px;\n margin: 4px 0 4px 8px;\n"])), function (props) { return props.theme.subtextColor; }); var StyledButton = (0, _styledComponents["default"])(_styledComponents2.Button)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 2px;\n padding: 2px;\n"]))); function getDatasetsWithTimeField(datasets) { var rv = {}; for (var _i = 0, _Object$keys = Object.keys(datasets); _i < _Object$keys.length; _i++) { var id = _Object$keys[_i]; // TODO: change to if (datasets[id].fields.some(function (f) { return f.type === _constants.ALL_FIELD_TYPES.timestamp; })) { rv[id] = datasets[id]; } } return rv; } function getTimeFields(dataset) { return dataset.fields.filter(function (f) { return f.type === _constants.ALL_FIELD_TYPES.timestamp; }); } function DatasetItemFactory(SourceSelector, FilterPanelHeader) { var StyledFilterPanelHeader = (0, _styledComponents["default"])(FilterPanelHeader)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n border: none;\n height: unset;\n padding: 2px 0;\n background: none;\n align-items: baseline;\n "]))); var StyledSourceSelector = (0, _styledComponents["default"])(SourceSelector)(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n flex: 1;\n -webkit-border-radius: 8px;\n -moz-border-radius: 8px;\n border-radius: 8px;\n background-color: transparent;\n "]))); // Check if this component already exists var DatasetItem = function DatasetItem(_ref) { var dataId = _ref.dataId, datasets = _ref.datasets, supportedFields = _ref.supportedFields, idx = _ref.idx, filter = _ref.filter, index = _ref.index, onRemoveSyncedFilter = _ref.onRemoveSyncedFilter, filterDatasetsNum = _ref.filterDatasetsNum, datasetsWithTimeNum = _ref.datasetsWithTimeNum, onSelectSyncedDataset = _ref.onSelectSyncedDataset, _onFieldSelector = _ref.onFieldSelector; return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(StyledFilterPanelHeader, { datasets: [datasets[dataId]], allAvailableFields: supportedFields, idx: idx, filter: filter, removeFilter: function removeFilter() { return onRemoveSyncedFilter(index); } }, /*#__PURE__*/_react["default"].createElement(StyledSourceSelector, { datasets: datasets, disabled: filterDatasetsNum >= datasetsWithTimeNum, dataId: dataId, onSelectDataset: function onSelectDataset(datasetId) { return onSelectSyncedDataset(datasetId, index); }, fields: getTimeFields(datasets[dataId]), fieldValue: filter.name[index], onFieldSelector: function onFieldSelector(field) { return _onFieldSelector(field, index); } }))); }; return DatasetItem; } DatasetItemFactory.deps = [_sourceSelector["default"], _filterPanelHeader["default"]]; var StyledLayerTimeline = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n"]))); var StyledLayerList = _styledComponents["default"].div(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n flex: 1;\n"]))); function LayerTimelineFactory(LayerTypeListItem) { var StyledLayerTypeListItem = (0, _styledComponents["default"])(LayerTypeListItem)(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 4px;\n "])), function (props) { return props.theme.dropdownListHighlightBg; }); var LayerTimeline = function LayerTimeline(_ref2) { var layers = _ref2.layers, theme = _ref2.theme, onDelete = _ref2.onDelete; return /*#__PURE__*/_react["default"].createElement(StyledLayerTimeline, null, /*#__PURE__*/_react["default"].createElement(StyledLayerList, null, layers.map(function (layer) { return /*#__PURE__*/_react["default"].createElement(StyledLayerTypeListItem, { key: layer.id, value: { icon: layer.layerIcon, label: layer.name }, theme: _objectSpread(_objectSpread({}, theme), {}, { layerTypeIconSizeSM: 24 }) }); })), /*#__PURE__*/_react["default"].createElement(TrashIcon, { height: "12px", width: "12px", onClick: onDelete })); }; return (0, _styledComponents.withTheme)(LayerTimeline); } LayerTimelineFactory.deps = [_layerTypeListItem["default"]]; function SyncedDatasetButtonFactory() { var SyncedDatasetButton = function SyncedDatasetButton(_ref3) { var onAddSyncedFilter = _ref3.onAddSyncedFilter; return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(_tippyTooltip["default"], { delay: [500, 0], placement: "top", render: function render() { return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'tooltip.timeFilterSync' })); } }, /*#__PURE__*/_react["default"].createElement(StyledButton, { className: "add-sync-dataset", secondary: true, onClick: onAddSyncedFilter }, /*#__PURE__*/_react["default"].createElement(_icons.Add, { height: "12px" }), /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'filterManager.timeFilterSync' })))); }; return SyncedDatasetButton; } function SyncLayerTimelineButtonFactory() { var SyncLayerTimelineButton = function SyncLayerTimelineButton(_ref4) { var onSyncLayerTimeline = _ref4.onSyncLayerTimeline; return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(_tippyTooltip["default"], { delay: [500, 0], placement: "top", render: function render() { return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'tooltip.timeLayerSync' })); } }, /*#__PURE__*/_react["default"].createElement(StyledButton, { className: "add-sync-dataset", secondary: true, onClick: onSyncLayerTimeline }, /*#__PURE__*/_react["default"].createElement(_icons.Add, { height: "12px" }), /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'filterManager.timeLayerSync' })))); }; return SyncLayerTimelineButton; } function FilterSyncedDatasetPanelFactory(DatasetItem, LayerTimeline, SourceDataSelector, SyncedDatasetButton, SyncLayerTimelineButton) { var FilterSyncedDatasetPanel = function FilterSyncedDatasetPanel(_ref5) { var datasets = _ref5.datasets, layers = _ref5.layers, filter = _ref5.filter, setFilter = _ref5.setFilter, idx = _ref5.idx, supportedFields = _ref5.supportedFields, onFieldSelector = _ref5.onFieldSelector, onSourceDataSelector = _ref5.onSourceDataSelector, syncTimeFilterWithLayerTimeline = _ref5.syncTimeFilterWithLayerTimeline; var datasetsWithTime = (0, _react.useMemo)(function () { return getDatasetsWithTimeField(datasets); }, [datasets]); var filterDatasetsNum = (0, _react.useMemo)(function () { return filter.dataId.length; }, [filter.dataId]); var datasetsWithTimeNum = (0, _react.useMemo)(function () { return Object.keys(datasetsWithTime).length; }, [datasetsWithTime]); var onRemoveSyncedFilter = (0, _react.useCallback)(function (valueIndex) { setFilter(idx, 'dataId', null, valueIndex); }, [idx, setFilter]); var onSelectSyncedDataset = (0, _react.useCallback)(function (datasetId, valueIndex) { setFilter(idx, 'dataId', datasetId, valueIndex); }, [setFilter, idx]); var onAddSyncedFilter = (0, _react.useCallback)(function () { var _getTimeFields; var nextId = Object.keys(datasetsWithTime).find(function (id) { return !filter.dataId.includes(id); }); if (!nextId) return; var timeFieldNames = (_getTimeFields = getTimeFields(datasets[nextId])) === null || _getTimeFields === void 0 ? void 0 : _getTimeFields.map(function (f) { return f.name; }); if (!timeFieldNames || timeFieldNames.length < 1) return; var nextName = timeFieldNames.includes(filter.name[0]) ? filter.name[0] : timeFieldNames[0]; setFilter(idx, ['dataId', 'name'], [nextId, nextName], filter.dataId.length); }, [setFilter, idx, datasetsWithTime, datasets, filter.dataId, filter.name]); var onSyncLayerTimeline = (0, _react.useCallback)(function () { return syncTimeFilterWithLayerTimeline(idx, true); }, [syncTimeFilterWithLayerTimeline, idx]); var onRemoveSyncWithLayerTimeline = (0, _react.useCallback)(function () { return syncTimeFilterWithLayerTimeline(idx, false); }, [syncTimeFilterWithLayerTimeline, idx]); var animatableLayers = (0, _react.useMemo)(function () { return (0, _utils.getAnimatableVisibleLayers)(layers); }, [layers]); var isLinkedWithLayerTimeline = (0, _react.useMemo)(function () { return filter.syncedWithLayerTimeline; }, [filter]); return /*#__PURE__*/_react["default"].createElement(SyncedDatasetsArea, null, filter.dataId.length > 1 ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledContentTitle, null, "Datasets"), filter.dataId.map(function (dataId, index) { return /*#__PURE__*/_react["default"].createElement(DatasetItem, { key: dataId, dataId: dataId, index: index, datasets: datasets, supportedFields: supportedFields, idx: idx, filter: filter, onRemoveSyncedFilter: onRemoveSyncedFilter, filterDatasetsNum: filterDatasetsNum, datasetsWithTimeNum: datasetsWithTimeNum, onSelectSyncedDataset: onSelectSyncedDataset, onFieldSelector: onFieldSelector }); })) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(SourceDataSelector, { inputTheme: "secondary", datasets: datasets, dataId: Array.isArray(filter.dataId) ? filter.dataId[0] : filter.dataId, onSelect: onSourceDataSelector })), isLinkedWithLayerTimeline ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(LayerTimeline, { layers: animatableLayers, onDelete: onRemoveSyncWithLayerTimeline })) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, animatableLayers.length ? /*#__PURE__*/_react["default"].createElement(SyncLayerTimelineButton, { onSyncLayerTimeline: onSyncLayerTimeline }) : null), filterDatasetsNum < datasetsWithTimeNum ? /*#__PURE__*/_react["default"].createElement(SyncedDatasetButton, { onAddSyncedFilter: onAddSyncedFilter }) : null); }; FilterSyncedDatasetPanel.displayName = 'FilterSyncedDatasetPanel'; return FilterSyncedDatasetPanel; } FilterSyncedDatasetPanelFactory.deps = [DatasetItemFactory, LayerTimelineFactory, _sourceDataSelector["default"], SyncedDatasetButtonFactory, SyncLayerTimelineButtonFactory]; var _default = exports["default"] = FilterSyncedDatasetPanelFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9sb2NhbGl6YXRpb24iLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX3N0eWxlZENvbXBvbmVudHMyIiwiX2ljb25zIiwiX3RpcHB5VG9vbHRpcCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZmlsdGVyUGFuZWxIZWFkZXIiLCJfc291cmNlU2VsZWN0b3IiLCJfc291cmNlRGF0YVNlbGVjdG9yIiwiX2xheWVyVHlwZUxpc3RJdGVtIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX3RlbXBsYXRlT2JqZWN0OCIsIl90ZW1wbGF0ZU9iamVjdDkiLCJfdGVtcGxhdGVPYmplY3QxMCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlRyYXNoSWNvbiIsInN0eWxlZCIsIlRyYXNoIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwiZm9udFdoaXRlQ29sb3IiLCJTeW5jZWREYXRhc2V0c0FyZWEiLCJkaXYiLCJTdHlsZWRDb250ZW50VGl0bGUiLCJzdWJ0ZXh0Q29sb3IiLCJTdHlsZWRTZXBhcmF0b3IiLCJTdHlsZWRCdXR0b24iLCJCdXR0b24iLCJnZXREYXRhc2V0c1dpdGhUaW1lRmllbGQiLCJkYXRhc2V0cyIsInJ2IiwiX2kiLCJfT2JqZWN0JGtleXMiLCJpZCIsImZpZWxkcyIsInNvbWUiLCJmIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImdldFRpbWVGaWVsZHMiLCJkYXRhc2V0IiwiRGF0YXNldEl0ZW1GYWN0b3J5IiwiU291cmNlU2VsZWN0b3IiLCJGaWx0ZXJQYW5lbEhlYWRlciIsIlN0eWxlZEZpbHRlclBhbmVsSGVhZGVyIiwiU3R5bGVkU291cmNlU2VsZWN0b3IiLCJEYXRhc2V0SXRlbSIsIl9yZWYiLCJkYXRhSWQiLCJzdXBwb3J0ZWRGaWVsZHMiLCJpZHgiLCJpbmRleCIsIm9uUmVtb3ZlU3luY2VkRmlsdGVyIiwiZmlsdGVyRGF0YXNldHNOdW0iLCJkYXRhc2V0c1dpdGhUaW1lTnVtIiwib25TZWxlY3RTeW5jZWREYXRhc2V0Iiwib25GaWVsZFNlbGVjdG9yIiwiY3JlYXRlRWxlbWVudCIsImFsbEF2YWlsYWJsZUZpZWxkcyIsInJlbW92ZUZpbHRlciIsImRpc2FibGVkIiwib25TZWxlY3REYXRhc2V0IiwiZGF0YXNldElkIiwiZmllbGRWYWx1ZSIsIm5hbWUiLCJmaWVsZCIsImRlcHMiLCJTb3VyY2VTZWxlY3RvckZhY3RvcnkiLCJGaWx0ZXJQYW5lbEhlYWRlckZhY3RvcnkiLCJTdHlsZWRMYXllclRpbWVsaW5lIiwiU3R5bGVkTGF5ZXJMaXN0IiwiTGF5ZXJUaW1lbGluZUZhY3RvcnkiLCJMYXllclR5cGVMaXN0SXRlbSIsIlN0eWxlZExheWVyVHlwZUxpc3RJdGVtIiwiZHJvcGRvd25MaXN0SGlnaGxpZ2h0QmciLCJMYXllclRpbWVsaW5lIiwiX3JlZjIiLCJsYXllcnMiLCJvbkRlbGV0ZSIsIm1hcCIsImxheWVyIiwia2V5IiwidmFsdWUiLCJpY29uIiwibGF5ZXJJY29uIiwibGFiZWwiLCJsYXllclR5cGVJY29uU2l6ZVNNIiwiaGVpZ2h0Iiwid2lkdGgiLCJvbkNsaWNrIiwid2l0aFRoZW1lIiwiTGF5ZXJUeXBlTGlzdEl0ZW1GYWN0b3J5IiwiU3luY2VkRGF0YXNldEJ1dHRvbkZhY3RvcnkiLCJTeW5jZWREYXRhc2V0QnV0dG9uIiwiX3JlZjMiLCJvbkFkZFN5bmNlZEZpbHRlciIsImRlbGF5IiwicGxhY2VtZW50IiwicmVuZGVyIiwiRm9ybWF0dGVkTWVzc2FnZSIsImNsYXNzTmFtZSIsInNlY29uZGFyeSIsIkFkZCIsIlN5bmNMYXllclRpbWVsaW5lQnV0dG9uRmFjdG9yeSIsIlN5bmNMYXllclRpbWVsaW5lQnV0dG9uIiwiX3JlZjQiLCJvblN5bmNMYXllclRpbWVsaW5lIiwiRmlsdGVyU3luY2VkRGF0YXNldFBhbmVsRmFjdG9yeSIsIlNvdXJjZURhdGFTZWxlY3RvciIsIkZpbHRlclN5bmNlZERhdGFzZXRQYW5lbCIsIl9yZWY1Iiwic2V0RmlsdGVyIiwib25Tb3VyY2VEYXRhU2VsZWN0b3IiLCJzeW5jVGltZUZpbHRlcldpdGhMYXllclRpbWVsaW5lIiwiZGF0YXNldHNXaXRoVGltZSIsInVzZU1lbW8iLCJ1c2VDYWxsYmFjayIsInZhbHVlSW5kZXgiLCJfZ2V0VGltZUZpZWxkcyIsIm5leHRJZCIsImZpbmQiLCJpbmNsdWRlcyIsInRpbWVGaWVsZE5hbWVzIiwibmV4dE5hbWUiLCJvblJlbW92ZVN5bmNXaXRoTGF5ZXJUaW1lbGluZSIsImFuaW1hdGFibGVMYXllcnMiLCJnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyIsImlzTGlua2VkV2l0aExheWVyVGltZWxpbmUiLCJzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSIsIkZyYWdtZW50IiwiaW5wdXRUaGVtZSIsIkFycmF5IiwiaXNBcnJheSIsIm9uU2VsZWN0IiwiZGlzcGxheU5hbWUiLCJTb3VyY2VEYXRhU2VsZWN0b3JGYWN0b3J5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9maWx0ZXItc3luY2VkLWRhdGFzZXQtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnQGtlcGxlci5nbC9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnN9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge0J1dHRvbn0gZnJvbSAnLi4vLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7QWRkLCBUcmFzaH0gZnJvbSAnLi4vLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCBUaXBweVRvb2x0aXAgZnJvbSAnLi4vLi4vY29tbW9uL3RpcHB5LXRvb2x0aXAnO1xuaW1wb3J0IEZpbHRlclBhbmVsSGVhZGVyRmFjdG9yeSBmcm9tICcuLi8uLi9zaWRlLXBhbmVsL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwtaGVhZGVyJztcbmltcG9ydCBTb3VyY2VTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi4vLi4vc2lkZS1wYW5lbC9jb21tb24vc291cmNlLXNlbGVjdG9yJztcbmltcG9ydCBTb3VyY2VEYXRhU2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uLy4uL3NpZGUtcGFuZWwvY29tbW9uL3NvdXJjZS1kYXRhLXNlbGVjdG9yJztcbmltcG9ydCBMYXllclR5cGVMaXN0SXRlbUZhY3RvcnkgZnJvbSAnLi4vLi4vc2lkZS1wYW5lbC9sYXllci1wYW5lbC9sYXllci10eXBlLWxpc3QtaXRlbSc7XG5cbmNvbnN0IFRyYXNoSWNvbiA9IHN0eWxlZChUcmFzaClgXG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udFdoaXRlQ29sb3J9O1xuICBtYXJnaW4tbGVmdDogOHB4O1xuYDtcblxuY29uc3QgU3luY2VkRGF0YXNldHNBcmVhID0gc3R5bGVkLmRpdmBcbiAgLnNpZGUtcGFuZWwtc2VjdGlvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkQ29udGVudFRpdGxlID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc3VidGV4dENvbG9yfTtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuYDtcblxuY29uc3QgU3R5bGVkU2VwYXJhdG9yID0gc3R5bGVkLmRpdmBcbiAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICBoZWlnaHQ6IDE2cHg7XG4gIG1hcmdpbjogNHB4IDAgNHB4IDhweDtcbmA7XG5cbmNvbnN0IFN0eWxlZEJ1dHRvbiA9IHN0eWxlZChCdXR0b24pYFxuICBtYXJnaW4tdG9wOiAycHg7XG4gIHBhZGRpbmc6IDJweDtcbmA7XG5cbmZ1bmN0aW9uIGdldERhdGFzZXRzV2l0aFRpbWVGaWVsZChkYXRhc2V0cykge1xuICBjb25zdCBydiA9IHt9O1xuICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKGRhdGFzZXRzKSkge1xuICAgIC8vIFRPRE86IGNoYW5nZSB0b1xuICAgIGlmIChkYXRhc2V0c1tpZF0uZmllbGRzLnNvbWUoZiA9PiBmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApKSB7XG4gICAgICBydltpZF0gPSBkYXRhc2V0c1tpZF07XG4gICAgfVxuICB9XG4gIHJldHVybiBydjtcbn1cblxuZnVuY3Rpb24gZ2V0VGltZUZpZWxkcyhkYXRhc2V0KSB7XG4gIHJldHVybiBkYXRhc2V0LmZpZWxkcy5maWx0ZXIoZiA9PiBmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApO1xufVxuXG5mdW5jdGlvbiBEYXRhc2V0SXRlbUZhY3RvcnkoU291cmNlU2VsZWN0b3IsIEZpbHRlclBhbmVsSGVhZGVyKSB7XG4gIGNvbnN0IFN0eWxlZEZpbHRlclBhbmVsSGVhZGVyID0gc3R5bGVkKEZpbHRlclBhbmVsSGVhZGVyKWBcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBoZWlnaHQ6IHVuc2V0O1xuICAgIHBhZGRpbmc6IDJweCAwO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICBgO1xuXG4gIGNvbnN0IFN0eWxlZFNvdXJjZVNlbGVjdG9yID0gc3R5bGVkKFNvdXJjZVNlbGVjdG9yKWBcbiAgICBmbGV4OiAxO1xuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIC1tb3otYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYDtcblxuICAvLyBDaGVjayBpZiB0aGlzIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0c1xuICBjb25zdCBEYXRhc2V0SXRlbSA9ICh7XG4gICAgZGF0YUlkLFxuICAgIGRhdGFzZXRzLFxuICAgIHN1cHBvcnRlZEZpZWxkcyxcbiAgICBpZHgsXG4gICAgZmlsdGVyLFxuICAgIGluZGV4LFxuICAgIG9uUmVtb3ZlU3luY2VkRmlsdGVyLFxuICAgIGZpbHRlckRhdGFzZXRzTnVtLFxuICAgIGRhdGFzZXRzV2l0aFRpbWVOdW0sXG4gICAgb25TZWxlY3RTeW5jZWREYXRhc2V0LFxuICAgIG9uRmllbGRTZWxlY3RvclxuICB9KSA9PiAoXG4gICAgPGRpdj5cbiAgICAgIDxTdHlsZWRTZXBhcmF0b3IgLz5cbiAgICAgIDxTdHlsZWRGaWx0ZXJQYW5lbEhlYWRlclxuICAgICAgICBkYXRhc2V0cz17W2RhdGFzZXRzW2RhdGFJZF1dfVxuICAgICAgICBhbGxBdmFpbGFibGVGaWVsZHM9e3N1cHBvcnRlZEZpZWxkc31cbiAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICByZW1vdmVGaWx0ZXI9eygpID0+IG9uUmVtb3ZlU3luY2VkRmlsdGVyKGluZGV4KX1cbiAgICAgID5cbiAgICAgICAgPFN0eWxlZFNvdXJjZVNlbGVjdG9yXG4gICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgIGRpc2FibGVkPXtmaWx0ZXJEYXRhc2V0c051bSA+PSBkYXRhc2V0c1dpdGhUaW1lTnVtfVxuICAgICAgICAgIGRhdGFJZD17ZGF0YUlkfVxuICAgICAgICAgIG9uU2VsZWN0RGF0YXNldD17ZGF0YXNldElkID0+IG9uU2VsZWN0U3luY2VkRGF0YXNldChkYXRhc2V0SWQsIGluZGV4KX1cbiAgICAgICAgICBmaWVsZHM9e2dldFRpbWVGaWVsZHMoZGF0YXNldHNbZGF0YUlkXSl9XG4gICAgICAgICAgZmllbGRWYWx1ZT17ZmlsdGVyLm5hbWVbaW5kZXhdfVxuICAgICAgICAgIG9uRmllbGRTZWxlY3Rvcj17ZmllbGQgPT4gb25GaWVsZFNlbGVjdG9yKGZpZWxkLCBpbmRleCl9XG4gICAgICAgIC8+XG4gICAgICA8L1N0eWxlZEZpbHRlclBhbmVsSGVhZGVyPlxuICAgIDwvZGl2PlxuICApO1xuXG4gIHJldHVybiBEYXRhc2V0SXRlbTtcbn1cblxuRGF0YXNldEl0ZW1GYWN0b3J5LmRlcHMgPSBbU291cmNlU2VsZWN0b3JGYWN0b3J5LCBGaWx0ZXJQYW5lbEhlYWRlckZhY3RvcnldO1xuXG5jb25zdCBTdHlsZWRMYXllclRpbWVsaW5lID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5cbmNvbnN0IFN0eWxlZExheWVyTGlzdCA9IHN0eWxlZC5kaXZgXG4gIGZsZXg6IDE7XG5gO1xuXG5mdW5jdGlvbiBMYXllclRpbWVsaW5lRmFjdG9yeShMYXllclR5cGVMaXN0SXRlbSkge1xuICBjb25zdCBTdHlsZWRMYXllclR5cGVMaXN0SXRlbSA9IHN0eWxlZChMYXllclR5cGVMaXN0SXRlbSlgXG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RIaWdobGlnaHRCZ307XG4gICAgcGFkZGluZzogNHB4O1xuICBgO1xuXG4gIGNvbnN0IExheWVyVGltZWxpbmUgPSAoe2xheWVycywgdGhlbWUsIG9uRGVsZXRlfSkgPT4gKFxuICAgIDxTdHlsZWRMYXllclRpbWVsaW5lPlxuICAgICAgPFN0eWxlZExheWVyTGlzdD5cbiAgICAgICAge2xheWVycy5tYXAobGF5ZXIgPT4gKFxuICAgICAgICAgIDxTdHlsZWRMYXllclR5cGVMaXN0SXRlbVxuICAgICAgICAgICAga2V5PXtsYXllci5pZH1cbiAgICAgICAgICAgIHZhbHVlPXt7aWNvbjogbGF5ZXIubGF5ZXJJY29uLCBsYWJlbDogbGF5ZXIubmFtZX19XG4gICAgICAgICAgICB0aGVtZT17ey4uLnRoZW1lLCBsYXllclR5cGVJY29uU2l6ZVNNOiAyNH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L1N0eWxlZExheWVyTGlzdD5cbiAgICAgIDxUcmFzaEljb24gaGVpZ2h0PVwiMTJweFwiIHdpZHRoPVwiMTJweFwiIG9uQ2xpY2s9e29uRGVsZXRlfSAvPlxuICAgIDwvU3R5bGVkTGF5ZXJUaW1lbGluZT5cbiAgKTtcblxuICByZXR1cm4gd2l0aFRoZW1lKExheWVyVGltZWxpbmUpO1xufVxuXG5MYXllclRpbWVsaW5lRmFjdG9yeS5kZXBzID0gW0xheWVyVHlwZUxpc3RJdGVtRmFjdG9yeV07XG5cbmZ1bmN0aW9uIFN5bmNlZERhdGFzZXRCdXR0b25GYWN0b3J5KCkge1xuICBjb25zdCBTeW5jZWREYXRhc2V0QnV0dG9uID0gKHtvbkFkZFN5bmNlZEZpbHRlcn0pID0+IChcbiAgICA8ZGl2PlxuICAgICAgPFN0eWxlZFNlcGFyYXRvciAvPlxuICAgICAgPFRpcHB5VG9vbHRpcFxuICAgICAgICBkZWxheT17WzUwMCwgMF19XG4gICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIHJlbmRlcj17KCkgPT4gKFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J3Rvb2x0aXAudGltZUZpbHRlclN5bmMnfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkQnV0dG9uIGNsYXNzTmFtZT1cImFkZC1zeW5jLWRhdGFzZXRcIiBzZWNvbmRhcnk9e3RydWV9IG9uQ2xpY2s9e29uQWRkU3luY2VkRmlsdGVyfT5cbiAgICAgICAgICA8QWRkIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsdGVyTWFuYWdlci50aW1lRmlsdGVyU3luYyd9IC8+XG4gICAgICAgIDwvU3R5bGVkQnV0dG9uPlxuICAgICAgPC9UaXBweVRvb2x0aXA+XG4gICAgPC9kaXY+XG4gICk7XG5cbiAgcmV0dXJuIFN5bmNlZERhdGFzZXRCdXR0b247XG59XG5cbmZ1bmN0aW9uIFN5bmNMYXllclRpbWVsaW5lQnV0dG9uRmFjdG9yeSgpIHtcbiAgY29uc3QgU3luY0xheWVyVGltZWxpbmVCdXR0b24gPSAoe29uU3luY0xheWVyVGltZWxpbmV9KSA9PiAoXG4gICAgPGRpdj5cbiAgICAgIDxTdHlsZWRTZXBhcmF0b3IgLz5cbiAgICAgIDxUaXBweVRvb2x0aXBcbiAgICAgICAgZGVsYXk9e1s1MDAsIDBdfVxuICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICByZW5kZXI9eygpID0+IChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eyd0b29sdGlwLnRpbWVMYXllclN5bmMnfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkQnV0dG9uIGNsYXNzTmFtZT1cImFkZC1zeW5jLWRhdGFzZXRcIiBzZWNvbmRhcnk9e3RydWV9IG9uQ2xpY2s9e29uU3luY0xheWVyVGltZWxpbmV9PlxuICAgICAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWx0ZXJNYW5hZ2VyLnRpbWVMYXllclN5bmMnfSAvPlxuICAgICAgICA8L1N0eWxlZEJ1dHRvbj5cbiAgICAgIDwvVGlwcHlUb29sdGlwPlxuICAgIDwvZGl2PlxuICApO1xuXG4gIHJldHVybiBTeW5jTGF5ZXJUaW1lbGluZUJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gRmlsdGVyU3luY2VkRGF0YXNldFBhbmVsRmFjdG9yeShcbiAgRGF0YXNldEl0ZW0sXG4gIExheWVyVGltZWxpbmUsXG4gIFNvdXJjZURhdGFTZWxlY3RvcixcbiAgU3luY2VkRGF0YXNldEJ1dHRvbixcbiAgU3luY0xheWVyVGltZWxpbmVCdXR0b25cbikge1xuICBjb25zdCBGaWx0ZXJTeW5jZWREYXRhc2V0UGFuZWwgPSAoe1xuICAgIGRhdGFzZXRzLFxuICAgIGxheWVycyxcbiAgICBmaWx0ZXIsXG4gICAgc2V0RmlsdGVyLFxuICAgIGlkeCxcbiAgICBzdXBwb3J0ZWRGaWVsZHMsXG4gICAgb25GaWVsZFNlbGVjdG9yLFxuICAgIG9uU291cmNlRGF0YVNlbGVjdG9yLFxuICAgIHN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRzV2l0aFRpbWUgPSB1c2VNZW1vKCgpID0+IGdldERhdGFzZXRzV2l0aFRpbWVGaWVsZChkYXRhc2V0cyksIFtkYXRhc2V0c10pO1xuICAgIGNvbnN0IGZpbHRlckRhdGFzZXRzTnVtID0gdXNlTWVtbygoKSA9PiBmaWx0ZXIuZGF0YUlkLmxlbmd0aCwgW2ZpbHRlci5kYXRhSWRdKTtcbiAgICBjb25zdCBkYXRhc2V0c1dpdGhUaW1lTnVtID0gdXNlTWVtbyhcbiAgICAgICgpID0+IE9iamVjdC5rZXlzKGRhdGFzZXRzV2l0aFRpbWUpLmxlbmd0aCxcbiAgICAgIFtkYXRhc2V0c1dpdGhUaW1lXVxuICAgICk7XG5cbiAgICBjb25zdCBvblJlbW92ZVN5bmNlZEZpbHRlciA9IHVzZUNhbGxiYWNrKFxuICAgICAgdmFsdWVJbmRleCA9PiB7XG4gICAgICAgIHNldEZpbHRlcihpZHgsICdkYXRhSWQnLCBudWxsLCB2YWx1ZUluZGV4KTtcbiAgICAgIH0sXG4gICAgICBbaWR4LCBzZXRGaWx0ZXJdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0U3luY2VkRGF0YXNldCA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGRhdGFzZXRJZCwgdmFsdWVJbmRleCkgPT4ge1xuICAgICAgICBzZXRGaWx0ZXIoaWR4LCAnZGF0YUlkJywgZGF0YXNldElkLCB2YWx1ZUluZGV4KTtcbiAgICAgIH0sXG4gICAgICBbc2V0RmlsdGVyLCBpZHhdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uQWRkU3luY2VkRmlsdGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dElkID0gT2JqZWN0LmtleXMoZGF0YXNldHNXaXRoVGltZSkuZmluZChpZCA9PiAhZmlsdGVyLmRhdGFJZC5pbmNsdWRlcyhpZCkpO1xuICAgICAgaWYgKCFuZXh0SWQpIHJldHVybjtcbiAgICAgIGNvbnN0IHRpbWVGaWVsZE5hbWVzID0gZ2V0VGltZUZpZWxkcyhkYXRhc2V0c1tuZXh0SWRdKT8ubWFwKGYgPT4gZi5uYW1lKTtcbiAgICAgIGlmICghdGltZUZpZWxkTmFtZXMgfHwgdGltZUZpZWxkTmFtZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV4dE5hbWUgPSB0aW1lRmllbGROYW1lcy5pbmNsdWRlcyhmaWx0ZXIubmFtZVswXSkgPyBmaWx0ZXIubmFtZVswXSA6IHRpbWVGaWVsZE5hbWVzWzBdO1xuICAgICAgc2V0RmlsdGVyKGlkeCwgWydkYXRhSWQnLCAnbmFtZSddLCBbbmV4dElkLCBuZXh0TmFtZV0sIGZpbHRlci5kYXRhSWQubGVuZ3RoKTtcbiAgICB9LCBbc2V0RmlsdGVyLCBpZHgsIGRhdGFzZXRzV2l0aFRpbWUsIGRhdGFzZXRzLCBmaWx0ZXIuZGF0YUlkLCBmaWx0ZXIubmFtZV0pO1xuXG4gICAgY29uc3Qgb25TeW5jTGF5ZXJUaW1lbGluZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKCkgPT4gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZShpZHgsIHRydWUpLFxuICAgICAgW3N5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmUsIGlkeF1cbiAgICApO1xuXG4gICAgY29uc3Qgb25SZW1vdmVTeW5jV2l0aExheWVyVGltZWxpbmUgPSB1c2VDYWxsYmFjayhcbiAgICAgICgpID0+IHN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmUoaWR4LCBmYWxzZSksXG4gICAgICBbc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZSwgaWR4XVxuICAgICk7XG5cbiAgICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gdXNlTWVtbygoKSA9PiBnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyhsYXllcnMpLCBbbGF5ZXJzXSk7XG5cbiAgICBjb25zdCBpc0xpbmtlZFdpdGhMYXllclRpbWVsaW5lID0gdXNlTWVtbygoKSA9PiBmaWx0ZXIuc3luY2VkV2l0aExheWVyVGltZWxpbmUsIFtmaWx0ZXJdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3luY2VkRGF0YXNldHNBcmVhPlxuICAgICAgICB7ZmlsdGVyLmRhdGFJZC5sZW5ndGggPiAxID8gKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8U3R5bGVkQ29udGVudFRpdGxlPkRhdGFzZXRzPC9TdHlsZWRDb250ZW50VGl0bGU+XG4gICAgICAgICAgICB7ZmlsdGVyLmRhdGFJZC5tYXAoKGRhdGFJZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RGF0YXNldEl0ZW1cbiAgICAgICAgICAgICAgICAgIGtleT17ZGF0YUlkfVxuICAgICAgICAgICAgICAgICAgZGF0YUlkPXtkYXRhSWR9XG4gICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRGaWVsZHM9e3N1cHBvcnRlZEZpZWxkc31cbiAgICAgICAgICAgICAgICAgIGlkeD17aWR4fVxuICAgICAgICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICBvblJlbW92ZVN5bmNlZEZpbHRlcj17b25SZW1vdmVTeW5jZWRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICBmaWx0ZXJEYXRhc2V0c051bT17ZmlsdGVyRGF0YXNldHNOdW19XG4gICAgICAgICAgICAgICAgICBkYXRhc2V0c1dpdGhUaW1lTnVtPXtkYXRhc2V0c1dpdGhUaW1lTnVtfVxuICAgICAgICAgICAgICAgICAgb25TZWxlY3RTeW5jZWREYXRhc2V0PXtvblNlbGVjdFN5bmNlZERhdGFzZXR9XG4gICAgICAgICAgICAgICAgICBvbkZpZWxkU2VsZWN0b3I9e29uRmllbGRTZWxlY3Rvcn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxTb3VyY2VEYXRhU2VsZWN0b3JcbiAgICAgICAgICAgICAgaW5wdXRUaGVtZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgZGF0YUlkPXtBcnJheS5pc0FycmF5KGZpbHRlci5kYXRhSWQpID8gZmlsdGVyLmRhdGFJZFswXSA6IGZpbHRlci5kYXRhSWR9XG4gICAgICAgICAgICAgIG9uU2VsZWN0PXtvblNvdXJjZURhdGFTZWxlY3Rvcn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICAgIHsvKiogc3luYyB3aXRoIGFuaW1hdGFibGUgbGF5ZXJzICovfVxuICAgICAgICB7aXNMaW5rZWRXaXRoTGF5ZXJUaW1lbGluZSA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFN0eWxlZFNlcGFyYXRvciAvPlxuICAgICAgICAgICAgPExheWVyVGltZWxpbmUgbGF5ZXJzPXthbmltYXRhYmxlTGF5ZXJzfSBvbkRlbGV0ZT17b25SZW1vdmVTeW5jV2l0aExheWVyVGltZWxpbmV9IC8+XG4gICAgICAgICAgPC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHthbmltYXRhYmxlTGF5ZXJzLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgPFN5bmNMYXllclRpbWVsaW5lQnV0dG9uIG9uU3luY0xheWVyVGltZWxpbmU9e29uU3luY0xheWVyVGltZWxpbmV9IC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgICAge2ZpbHRlckRhdGFzZXRzTnVtIDwgZGF0YXNldHNXaXRoVGltZU51bSA/IChcbiAgICAgICAgICA8U3luY2VkRGF0YXNldEJ1dHRvbiBvbkFkZFN5bmNlZEZpbHRlcj17b25BZGRTeW5jZWRGaWx0ZXJ9IC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TeW5jZWREYXRhc2V0c0FyZWE+XG4gICAgKTtcbiAgfTtcblxuICBGaWx0ZXJTeW5jZWREYXRhc2V0UGFuZWwuZGlzcGxheU5hbWUgPSAnRmlsdGVyU3luY2VkRGF0YXNldFBhbmVsJztcblxuICByZXR1cm4gRmlsdGVyU3luY2VkRGF0YXNldFBhbmVsO1xufVxuXG5GaWx0ZXJTeW5jZWREYXRhc2V0UGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIERhdGFzZXRJdGVtRmFjdG9yeSxcbiAgTGF5ZXJUaW1lbGluZUZhY3RvcnksXG4gIFNvdXJjZURhdGFTZWxlY3RvckZhY3RvcnksXG4gIFN5bmNlZERhdGFzZXRCdXR0b25GYWN0b3J5LFxuICBTeW5jTGF5ZXJUaW1lbGluZUJ1dHRvbkZhY3Rvcnlcbl07XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlclN5bmNlZERhdGFzZXRQYW5lbEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsYUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBRUEsSUFBQUssa0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQVIsT0FBQTtBQUNBLElBQUFTLGtCQUFBLEdBQUFELHNCQUFBLENBQUFSLE9BQUE7QUFDQSxJQUFBVSxlQUFBLEdBQUFGLHNCQUFBLENBQUFSLE9BQUE7QUFDQSxJQUFBVyxtQkFBQSxHQUFBSCxzQkFBQSxDQUFBUixPQUFBO0FBQ0EsSUFBQVksa0JBQUEsR0FBQUosc0JBQUEsQ0FBQVIsT0FBQTtBQUF5RixJQUFBYSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFB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