UNPKG

kepler.gl

Version:

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

180 lines (177 loc) 40.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.EffectPanelHeaderActionSectionFactory = EffectPanelHeaderActionSectionFactory; exports.defaultProps = exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _constants = require("@kepler.gl/constants"); var _panelHeaderAction = _interopRequireDefault(require("../side-panel/panel-header-action")); var _icons = require("../common/icons"); var _styledComponents2 = require("../common/styled-components"); var _defaultEffectIcons, _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var defaultProps = exports.defaultProps = { isDragNDropEnabled: true }; var defaultActionIcons = { remove: _icons.Trash, visible: _icons.EyeSeen, hidden: _icons.EyeUnseen, enableConfig: _icons.ArrowDown, disableConfig: _icons.ArrowUp }; var defaultEffectIcons = (_defaultEffectIcons = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_defaultEffectIcons, _constants.LIGHT_AND_SHADOW_EFFECT.type, _icons.LightAndShadowEffectIcon), _constants.POSTPROCESSING_EFFECTS.ink.type, _icons.InkEffectIcon), _constants.POSTPROCESSING_EFFECTS.brightnessContrast.type, _icons.BrightnessContrastEffectIcon), _constants.POSTPROCESSING_EFFECTS.hueSaturation.type, _icons.HueSaturationEffectIcon), _constants.POSTPROCESSING_EFFECTS.vibrance.type, _icons.VibranceEffectIcon), _constants.POSTPROCESSING_EFFECTS.sepia.type, _icons.SepiaEffectIcon), _constants.POSTPROCESSING_EFFECTS.dotScreen.type, _icons.DotScreenEffectIcon), _constants.POSTPROCESSING_EFFECTS.colorHalftone.type, _icons.ColorHalftoneEffectIcon), _constants.POSTPROCESSING_EFFECTS.noise.type, _icons.NoiseEffectIcon), _constants.POSTPROCESSING_EFFECTS.triangleBlur.type, _icons.TriangleBlurEffectIcon), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_defaultEffectIcons, _constants.POSTPROCESSING_EFFECTS.zoomBlur.type, _icons.ZoomBlurEffectIcon), _constants.POSTPROCESSING_EFFECTS.tiltShift.type, _icons.TiltShiftEffectIcon), _constants.POSTPROCESSING_EFFECTS.edgeWork.type, _icons.EdgeWorkEffectIcon), _constants.POSTPROCESSING_EFFECTS.vignette.type, _icons.VignetteEffectIcon), _constants.POSTPROCESSING_EFFECTS.magnify.type, _icons.MagnifyEffectIcon), _constants.POSTPROCESSING_EFFECTS.hexagonalPixelate.type, _icons.HexagonalPixelateEffectIcon)); var StyledEffectPanelHeader = (0, _styledComponents["default"])(_styledComponents2.StyledPanelHeader)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n position: relative;\n align-items: stretch;\n\n .effect__drag-handle {\n margin-left: -5px;\n color: ", ";\n }\n\n .effect__drag-handle__placeholder {\n height: 20px;\n padding: 0px;\n margin: 10px 10px 10px 5px;\n }\n\n &:hover {\n cursor: pointer;\n background-color: ", ";\n .effect__drag-handle {\n opacity: 1;\n }\n }\n\n border-left: 3px solid ", ";\n"])), function (props) { return props.theme.effectPanelHeaderHeight; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.panelBackgroundHover; }, function (props) { return props.theme.panelBackgroundHover; }); var HeaderActionSection = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: absolute;\n height: 100%;\n align-items: stretch;\n right: 10px;\n &:hover {\n .effect-panel__header__actions__hidden {\n opacity: 1;\n background-color: ", ";\n }\n }\n"])), function (props) { return props.theme.panelBackgroundHover; }); // Hiden actions only show up on hover var StyledPanelHeaderHiddenActions = _styledComponents["default"].div.attrs({ className: 'effect-panel__header__actions__hidden' })(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n opacity: 0;\n display: flex;\n align-items: center;\n transition: opacity 0.4s ease, background-color 0.4s ease;\n background-color: ", ";\n\n &:hover {\n opacity: 1;\n }\n"])), function (props) { return props.isConfigActive ? props.theme.panelBackgroundHover : props.theme.panelBackground; }); var StyledDragHandle = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n opacity: 0;\n z-index: 1000;\n &:hover {\n cursor: move;\n opacity: 1;\n color: ", ";\n }\n"])), function (props) { return props.theme.textColorHl; }); var DragHandle = function DragHandle(_ref) { var className = _ref.className, listeners = _ref.listeners, children = _ref.children; return /*#__PURE__*/_react["default"].createElement(StyledDragHandle, (0, _extends2["default"])({ className: className }, listeners), children); }; EffectPanelHeaderActionSectionFactory.deps = [_panelHeaderAction["default"]]; function EffectPanelHeaderActionSectionFactory(PanelHeaderAction) { var EffectPanelHeaderActionSection = function EffectPanelHeaderActionSection(props) { var effectId = props.effectId, isEnabled = props.isEnabled, isConfigActive = props.isConfigActive, onToggleEnabled = props.onToggleEnabled, onRemoveEffect = props.onRemoveEffect, onToggleEnableConfig = props.onToggleEnableConfig, actionItems = props.actionItems, _props$actionIcons = props.actionIcons, actionIcons = _props$actionIcons === void 0 ? defaultActionIcons : _props$actionIcons; var effectActionItems = (0, _react.useMemo)(function () { return actionItems !== null && actionItems !== void 0 ? actionItems : [{ key: 'remove-effect', isHidden: true, tooltip: 'tooltip.removeEffect', tooltipType: 'error', onClick: onRemoveEffect, icon: actionIcons.remove }, { key: 'visibility-toggle', tooltip: isEnabled ? 'tooltip.disableEffect' : 'tooltip.enabledEffect', onClick: onToggleEnabled, icon: isEnabled ? actionIcons.visible : actionIcons.hidden }, { key: 'enable-config', classNames: { 'is-open': isConfigActive }, tooltip: 'tooltip.effectSettings', onClick: onToggleEnableConfig, icon: actionIcons.enableConfig }]; }, [actionItems, actionIcons, isEnabled, isConfigActive, onRemoveEffect, onToggleEnabled, onToggleEnableConfig]); return /*#__PURE__*/_react["default"].createElement(HeaderActionSection, { className: "effect-panel__header__actions" }, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderHiddenActions, { isConfigActive: isConfigActive }, effectActionItems.filter(function (item) { return Boolean(item.isHidden); }).map(function (item) { return /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { key: item.key, className: "effect__".concat(item.key), testId: "".concat(item.key, "-action"), id: effectId, tooltip: item.tooltip, onClick: item.onClick, tooltipType: item.tooltipType, IconComponent: item.icon }); })), effectActionItems.filter(function (item) { return !item.isHidden; }).map(function (item) { return /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { key: item.key, className: (0, _classnames["default"])("effect__".concat(item.key), item.classNames), testId: "".concat(item.key, "-action"), id: effectId, tooltip: item.tooltip, onClick: item.onClick, tooltipType: item.tooltipType, IconComponent: item.icon }); })); }; return EffectPanelHeaderActionSection; } var StyledEffectTitleSection = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 8px;\n flex-grow: 1;\n align-items: center;\n display: flex;\n color: ", ";\n"])), function (props) { return props.theme.textColor; }); var IconPlaceholder = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n width: 20px;\n height: 20px;\n"]))); var EffectIconWrapper = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n height: 18px;\n margin: auto;\n color: ", ";\n"])), function (props) { return props.theme.textColor; }); EffectPanelHeaderFactory.deps = [EffectPanelHeaderActionSectionFactory]; function EffectPanelHeaderFactory(EffectPanelHeaderActionSection) { var EffectPanelHeader = function EffectPanelHeader(props) { var isConfigActive = props.isConfigActive, _props$isDragNDropEna = props.isDragNDropEnabled, isDragNDropEnabled = _props$isDragNDropEna === void 0 ? true : _props$isDragNDropEna, type = props.type, onToggleEnableConfig = props.onToggleEnableConfig, listeners = props.listeners, _props$showSortHandle = props.showSortHandle, showSortHandle = _props$showSortHandle === void 0 ? true : _props$showSortHandle; var label = (0, _react.useMemo)(function () { var description = _constants.EFFECT_DESCRIPTIONS.find(function (_description) { return _description.type === type; }); return (description === null || description === void 0 ? void 0 : description.name) || 'Effect'; }, [type]); var EffectIcon = defaultEffectIcons[type]; return /*#__PURE__*/_react["default"].createElement(StyledEffectPanelHeader, { className: (0, _classnames["default"])('effect-panel__header', { 'sort--handle': !isConfigActive }), active: isConfigActive, onClick: onToggleEnableConfig }, isDragNDropEnabled ? /*#__PURE__*/_react["default"].createElement(DragHandle, { className: "effect__drag-handle", listeners: listeners }, showSortHandle ? /*#__PURE__*/_react["default"].createElement(_icons.VertDots, { height: "20px" }) : /*#__PURE__*/_react["default"].createElement(IconPlaceholder, null)) : /*#__PURE__*/_react["default"].createElement("div", { className: "effect__drag-handle__placeholder" }), /*#__PURE__*/_react["default"].createElement(EffectIconWrapper, null, EffectIcon ? /*#__PURE__*/_react["default"].createElement(EffectIcon, { height: "18px" }) : null), /*#__PURE__*/_react["default"].createElement(StyledEffectTitleSection, null, label), /*#__PURE__*/_react["default"].createElement(EffectPanelHeaderActionSection, props)); }; return EffectPanelHeader; } var _default = exports["default"] = EffectPanelHeaderFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfcGFuZWxIZWFkZXJBY3Rpb24iLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfZGVmYXVsdEVmZmVjdEljb25zIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiZGVmYXVsdFByb3BzIiwiZXhwb3J0cyIsImlzRHJhZ05Ecm9wRW5hYmxlZCIsImRlZmF1bHRBY3Rpb25JY29ucyIsInJlbW92ZSIsIlRyYXNoIiwidmlzaWJsZSIsIkV5ZVNlZW4iLCJoaWRkZW4iLCJFeWVVbnNlZW4iLCJlbmFibGVDb25maWciLCJBcnJvd0Rvd24iLCJkaXNhYmxlQ29uZmlnIiwiQXJyb3dVcCIsImRlZmF1bHRFZmZlY3RJY29ucyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsInR5cGUiLCJMaWdodEFuZFNoYWRvd0VmZmVjdEljb24iLCJQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTIiwiaW5rIiwiSW5rRWZmZWN0SWNvbiIsImJyaWdodG5lc3NDb250cmFzdCIsIkJyaWdodG5lc3NDb250cmFzdEVmZmVjdEljb24iLCJodWVTYXR1cmF0aW9uIiwiSHVlU2F0dXJhdGlvbkVmZmVjdEljb24iLCJ2aWJyYW5jZSIsIlZpYnJhbmNlRWZmZWN0SWNvbiIsInNlcGlhIiwiU2VwaWFFZmZlY3RJY29uIiwiZG90U2NyZWVuIiwiRG90U2NyZWVuRWZmZWN0SWNvbiIsImNvbG9ySGFsZnRvbmUiLCJDb2xvckhhbGZ0b25lRWZmZWN0SWNvbiIsIm5vaXNlIiwiTm9pc2VFZmZlY3RJY29uIiwidHJpYW5nbGVCbHVyIiwiVHJpYW5nbGVCbHVyRWZmZWN0SWNvbiIsInpvb21CbHVyIiwiWm9vbUJsdXJFZmZlY3RJY29uIiwidGlsdFNoaWZ0IiwiVGlsdFNoaWZ0RWZmZWN0SWNvbiIsImVkZ2VXb3JrIiwiRWRnZVdvcmtFZmZlY3RJY29uIiwidmlnbmV0dGUiLCJWaWduZXR0ZUVmZmVjdEljb24iLCJtYWduaWZ5IiwiTWFnbmlmeUVmZmVjdEljb24iLCJoZXhhZ29uYWxQaXhlbGF0ZSIsIkhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvbiIsIlN0eWxlZEVmZmVjdFBhbmVsSGVhZGVyIiwic3R5bGVkIiwiU3R5bGVkUGFuZWxIZWFkZXIiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJlZmZlY3RQYW5lbEhlYWRlckhlaWdodCIsInRleHRDb2xvciIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiSGVhZGVyQWN0aW9uU2VjdGlvbiIsImRpdiIsIlN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9ucyIsImF0dHJzIiwiY2xhc3NOYW1lIiwiaXNDb25maWdBY3RpdmUiLCJwYW5lbEJhY2tncm91bmQiLCJTdHlsZWREcmFnSGFuZGxlIiwidGV4dENvbG9ySGwiLCJEcmFnSGFuZGxlIiwiX3JlZiIsImxpc3RlbmVycyIsImNoaWxkcmVuIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsIkVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnkiLCJkZXBzIiwiUGFuZWxIZWFkZXJBY3Rpb25GYWN0b3J5IiwiUGFuZWxIZWFkZXJBY3Rpb24iLCJFZmZlY3RQYW5lbEhlYWRlckFjdGlvblNlY3Rpb24iLCJlZmZlY3RJZCIsImlzRW5hYmxlZCIsIm9uVG9nZ2xlRW5hYmxlZCIsIm9uUmVtb3ZlRWZmZWN0Iiwib25Ub2dnbGVFbmFibGVDb25maWciLCJhY3Rpb25JdGVtcyIsIl9wcm9wcyRhY3Rpb25JY29ucyIsImFjdGlvbkljb25zIiwiZWZmZWN0QWN0aW9uSXRlbXMiLCJ1c2VNZW1vIiwia2V5IiwiaXNIaWRkZW4iLCJ0b29sdGlwIiwidG9vbHRpcFR5cGUiLCJvbkNsaWNrIiwiaWNvbiIsImNsYXNzTmFtZXMiLCJmaWx0ZXIiLCJpdGVtIiwiQm9vbGVhbiIsIm1hcCIsImNvbmNhdCIsInRlc3RJZCIsImlkIiwiSWNvbkNvbXBvbmVudCIsImNsYXNzbmFtZXMiLCJTdHlsZWRFZmZlY3RUaXRsZVNlY3Rpb24iLCJJY29uUGxhY2Vob2xkZXIiLCJFZmZlY3RJY29uV3JhcHBlciIsIkVmZmVjdFBhbmVsSGVhZGVyRmFjdG9yeSIsIkVmZmVjdFBhbmVsSGVhZGVyIiwiX3Byb3BzJGlzRHJhZ05Ecm9wRW5hIiwiX3Byb3BzJHNob3dTb3J0SGFuZGxlIiwic2hvd1NvcnRIYW5kbGUiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwiRUZGRUNUX0RFU0NSSVBUSU9OUyIsImZpbmQiLCJfZGVzY3JpcHRpb24iLCJuYW1lIiwiRWZmZWN0SWNvbiIsImFjdGl2ZSIsIlZlcnREb3RzIiwiaGVpZ2h0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWZmZWN0cy9lZmZlY3QtcGFuZWwtaGVhZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge1xuICBFRkZFQ1RfREVTQ1JJUFRJT05TLFxuICBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCxcbiAgUE9TVFBST0NFU1NJTkdfRUZGRUNUU1xufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmltcG9ydCBQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnksIHtQYW5lbEhlYWRlckFjdGlvbkljb259IGZyb20gJy4uL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLWFjdGlvbic7XG5pbXBvcnQge1xuICBBcnJvd0Rvd24sXG4gIEFycm93VXAsXG4gIEV5ZVNlZW4sXG4gIEV5ZVVuc2VlbixcbiAgVHJhc2gsXG4gIFZlcnREb3RzLFxuICBMaWdodEFuZFNoYWRvd0VmZmVjdEljb24sXG4gIElua0VmZmVjdEljb24sXG4gIEJyaWdodG5lc3NDb250cmFzdEVmZmVjdEljb24sXG4gIEh1ZVNhdHVyYXRpb25FZmZlY3RJY29uLFxuICBWaWJyYW5jZUVmZmVjdEljb24sXG4gIFNlcGlhRWZmZWN0SWNvbixcbiAgRG90U2NyZWVuRWZmZWN0SWNvbixcbiAgQ29sb3JIYWxmdG9uZUVmZmVjdEljb24sXG4gIE5vaXNlRWZmZWN0SWNvbixcbiAgVHJpYW5nbGVCbHVyRWZmZWN0SWNvbixcbiAgWm9vbUJsdXJFZmZlY3RJY29uLFxuICBUaWx0U2hpZnRFZmZlY3RJY29uLFxuICBFZGdlV29ya0VmZmVjdEljb24sXG4gIFZpZ25ldHRlRWZmZWN0SWNvbixcbiAgTWFnbmlmeUVmZmVjdEljb24sXG4gIEhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvbixcbiAgQmFzZVByb3BzXG59IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge1N0eWxlZFBhbmVsSGVhZGVyfSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5leHBvcnQgdHlwZSBBY3Rpb25JdGVtID0ge1xuICBrZXk6IHN0cmluZztcbiAgaXNIaWRkZW4/OiBib29sZWFuO1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIGNsYXNzTmFtZXM/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgaWNvbjogUGFuZWxIZWFkZXJBY3Rpb25JY29uO1xuICB0b29sdGlwVHlwZT86ICdlcnJvcic7XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBFZmZlY3RQYW5lbEhlYWRlclByb3BzID0ge1xuICB0eXBlOiBzdHJpbmc7XG4gIGxpc3RlbmVyczogYW55O1xuICBlZmZlY3RJZDogc3RyaW5nO1xuICBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gIGlzQ29uZmlnQWN0aXZlOiBib29sZWFuO1xuICBpc0pzb25FZGl0b3JBY3RpdmU6IGJvb2xlYW47XG4gIHNob3dTb3J0SGFuZGxlPzogYm9vbGVhbjtcbiAgaXNEcmFnTkRyb3BFbmFibGVkOiBib29sZWFuO1xuICBvblRvZ2dsZUVuYWJsZWQ6ICgpID0+IHZvaWQ7XG4gIG9uUmVtb3ZlRWZmZWN0OiAoKSA9PiB2b2lkO1xuICBvblRvZ2dsZUVuYWJsZUNvbmZpZzogKCkgPT4gdm9pZDtcbiAgYWN0aW9uSWNvbnM/OiB7XG4gICAgcmVtb3ZlOiBSZWFjdC5Db21wb25lbnRUeXBlPFBhcnRpYWw8QmFzZVByb3BzPj47XG4gICAgdmlzaWJsZTogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGhpZGRlbjogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGVuYWJsZUNvbmZpZzogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGRpc2FibGVDb25maWc6IFJlYWN0LkNvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgfTtcbiAgYWN0aW9uSXRlbXM/OiBBY3Rpb25JdGVtW107XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBpc0RyYWdORHJvcEVuYWJsZWQ6IHRydWVcbn07XG5cbmNvbnN0IGRlZmF1bHRBY3Rpb25JY29ucyA9IHtcbiAgcmVtb3ZlOiBUcmFzaCxcbiAgdmlzaWJsZTogRXllU2VlbixcbiAgaGlkZGVuOiBFeWVVbnNlZW4sXG4gIGVuYWJsZUNvbmZpZzogQXJyb3dEb3duLFxuICBkaXNhYmxlQ29uZmlnOiBBcnJvd1VwXG59O1xuXG5jb25zdCBkZWZhdWx0RWZmZWN0SWNvbnMgPSB7XG4gIFtMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlXTogTGlnaHRBbmRTaGFkb3dFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5pbmsudHlwZV06IElua0VmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLmJyaWdodG5lc3NDb250cmFzdC50eXBlXTogQnJpZ2h0bmVzc0NvbnRyYXN0RWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuaHVlU2F0dXJhdGlvbi50eXBlXTogSHVlU2F0dXJhdGlvbkVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnZpYnJhbmNlLnR5cGVdOiBWaWJyYW5jZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnNlcGlhLnR5cGVdOiBTZXBpYUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLmRvdFNjcmVlbi50eXBlXTogRG90U2NyZWVuRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuY29sb3JIYWxmdG9uZS50eXBlXTogQ29sb3JIYWxmdG9uZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLm5vaXNlLnR5cGVdOiBOb2lzZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnRyaWFuZ2xlQmx1ci50eXBlXTogVHJpYW5nbGVCbHVyRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuem9vbUJsdXIudHlwZV06IFpvb21CbHVyRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMudGlsdFNoaWZ0LnR5cGVdOiBUaWx0U2hpZnRFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5lZGdlV29yay50eXBlXTogRWRnZVdvcmtFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy52aWduZXR0ZS50eXBlXTogVmlnbmV0dGVFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5tYWduaWZ5LnR5cGVdOiBNYWduaWZ5RWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuaGV4YWdvbmFsUGl4ZWxhdGUudHlwZV06IEhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvblxufTtcblxuY29uc3QgU3R5bGVkRWZmZWN0UGFuZWxIZWFkZXIgPSBzdHlsZWQoU3R5bGVkUGFuZWxIZWFkZXIpYFxuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxIZWFkZXJIZWlnaHR9cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cbiAgLmVmZmVjdF9fZHJhZy1oYW5kbGUge1xuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIH1cblxuICAuZWZmZWN0X19kcmFnLWhhbmRsZV9fcGxhY2Vob2xkZXIge1xuICAgIGhlaWdodDogMjBweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgbWFyZ2luOiAxMHB4IDEwcHggMTBweCA1cHg7XG4gIH1cblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgLmVmZmVjdF9fZHJhZy1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gIH1cblxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuYDtcblxuY29uc3QgSGVhZGVyQWN0aW9uU2VjdGlvbiA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgcmlnaHQ6IDEwcHg7XG4gICY6aG92ZXIge1xuICAgIC5lZmZlY3QtcGFuZWxfX2hlYWRlcl9fYWN0aW9uc19faGlkZGVuIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICB9XG4gIH1cbmA7XG5cbi8vIEhpZGVuIGFjdGlvbnMgb25seSBzaG93IHVwIG9uIGhvdmVyXG50eXBlIFN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9uc1Byb3BzID0ge2lzQ29uZmlnQWN0aXZlOiBib29sZWFufTtcbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9ucyA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdlZmZlY3QtcGFuZWxfX2hlYWRlcl9fYWN0aW9uc19faGlkZGVuJ1xufSk8U3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zUHJvcHM+YFxuICBvcGFjaXR5OiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAwLjRzIGVhc2U7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT5cbiAgICBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSA/IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyIDogcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcblxuICAmOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREcmFnSGFuZGxlID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgb3BhY2l0eTogMDtcbiAgei1pbmRleDogMTAwMDtcbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICB9XG5gO1xuXG5jb25zdCBEcmFnSGFuZGxlID0gKHtjbGFzc05hbWUsIGxpc3RlbmVycywgY2hpbGRyZW59KSA9PiAoXG4gIDxTdHlsZWREcmFnSGFuZGxlIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSB7Li4ubGlzdGVuZXJzfT5cbiAgICB7Y2hpbGRyZW59XG4gIDwvU3R5bGVkRHJhZ0hhbmRsZT5cbik7XG5cbkVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnkuZGVwcyA9IFtQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnldO1xuXG5leHBvcnQgZnVuY3Rpb24gRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uRmFjdG9yeShcbiAgUGFuZWxIZWFkZXJBY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIFBhbmVsSGVhZGVyQWN0aW9uRmFjdG9yeT5cbik6IFJlYWN0LkZDPEVmZmVjdFBhbmVsSGVhZGVyUHJvcHM+IHtcbiAgY29uc3QgRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uID0gKHByb3BzOiBFZmZlY3RQYW5lbEhlYWRlclByb3BzKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZWZmZWN0SWQsXG4gICAgICBpc0VuYWJsZWQsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIG9uVG9nZ2xlRW5hYmxlZCxcbiAgICAgIG9uUmVtb3ZlRWZmZWN0LFxuICAgICAgb25Ub2dnbGVFbmFibGVDb25maWcsXG4gICAgICBhY3Rpb25JdGVtcyxcbiAgICAgIGFjdGlvbkljb25zID0gZGVmYXVsdEFjdGlvbkljb25zXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZWZmZWN0QWN0aW9uSXRlbXM6IEFjdGlvbkl0ZW1bXSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBhY3Rpb25JdGVtcyA/PyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAncmVtb3ZlLWVmZmVjdCcsXG4gICAgICAgICAgICBpc0hpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgIHRvb2x0aXA6ICd0b29sdGlwLnJlbW92ZUVmZmVjdCcsXG4gICAgICAgICAgICB0b29sdGlwVHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IG9uUmVtb3ZlRWZmZWN0LFxuICAgICAgICAgICAgaWNvbjogYWN0aW9uSWNvbnMucmVtb3ZlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICd2aXNpYmlsaXR5LXRvZ2dsZScsXG4gICAgICAgICAgICB0b29sdGlwOiBpc0VuYWJsZWQgPyAndG9vbHRpcC5kaXNhYmxlRWZmZWN0JyA6ICd0b29sdGlwLmVuYWJsZWRFZmZlY3QnLFxuICAgICAgICAgICAgb25DbGljazogb25Ub2dnbGVFbmFibGVkLFxuICAgICAgICAgICAgaWNvbjogaXNFbmFibGVkID8gYWN0aW9uSWNvbnMudmlzaWJsZSA6IGFjdGlvbkljb25zLmhpZGRlblxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnZW5hYmxlLWNvbmZpZycsXG4gICAgICAgICAgICBjbGFzc05hbWVzOiB7J2lzLW9wZW4nOiBpc0NvbmZpZ0FjdGl2ZX0sXG4gICAgICAgICAgICB0b29sdGlwOiAndG9vbHRpcC5lZmZlY3RTZXR0aW5ncycsXG4gICAgICAgICAgICBvbkNsaWNrOiBvblRvZ2dsZUVuYWJsZUNvbmZpZyxcbiAgICAgICAgICAgIGljb246IGFjdGlvbkljb25zLmVuYWJsZUNvbmZpZ1xuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgYWN0aW9uSXRlbXMsXG4gICAgICAgIGFjdGlvbkljb25zLFxuICAgICAgICBpc0VuYWJsZWQsXG4gICAgICAgIGlzQ29uZmlnQWN0aXZlLFxuICAgICAgICBvblJlbW92ZUVmZmVjdCxcbiAgICAgICAgb25Ub2dnbGVFbmFibGVkLFxuICAgICAgICBvblRvZ2dsZUVuYWJsZUNvbmZpZ1xuICAgICAgXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEhlYWRlckFjdGlvblNlY3Rpb24gY2xhc3NOYW1lPVwiZWZmZWN0LXBhbmVsX19oZWFkZXJfX2FjdGlvbnNcIj5cbiAgICAgICAgPFN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9ucyBpc0NvbmZpZ0FjdGl2ZT17aXNDb25maWdBY3RpdmV9PlxuICAgICAgICAgIHtlZmZlY3RBY3Rpb25JdGVtc1xuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogQWN0aW9uSXRlbSkgPT4gQm9vbGVhbihpdGVtLmlzSGlkZGVuKSlcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IEFjdGlvbkl0ZW0pID0+IChcbiAgICAgICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BlZmZlY3RfXyR7aXRlbS5rZXl9YH1cbiAgICAgICAgICAgICAgICB0ZXN0SWQ9e2Ake2l0ZW0ua2V5fS1hY3Rpb25gfVxuICAgICAgICAgICAgICAgIGlkPXtlZmZlY3RJZH1cbiAgICAgICAgICAgICAgICB0b29sdGlwPXtpdGVtLnRvb2x0aXB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17aXRlbS5vbkNsaWNrfVxuICAgICAgICAgICAgICAgIHRvb2x0aXBUeXBlPXtpdGVtLnRvb2x0aXBUeXBlfVxuICAgICAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2l0ZW0uaWNvbn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICA8L1N0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9ucz5cbiAgICAgICAge2VmZmVjdEFjdGlvbkl0ZW1zXG4gICAgICAgICAgLmZpbHRlcigoaXRlbTogQWN0aW9uSXRlbSkgPT4gIWl0ZW0uaXNIaWRkZW4pXG4gICAgICAgICAgLm1hcCgoaXRlbTogQWN0aW9uSXRlbSkgPT4gKFxuICAgICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICAgIGtleT17aXRlbS5rZXl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyhgZWZmZWN0X18ke2l0ZW0ua2V5fWAsIGl0ZW0uY2xhc3NOYW1lcyl9XG4gICAgICAgICAgICAgIHRlc3RJZD17YCR7aXRlbS5rZXl9LWFjdGlvbmB9XG4gICAgICAgICAgICAgIGlkPXtlZmZlY3RJZH1cbiAgICAgICAgICAgICAgdG9vbHRpcD17aXRlbS50b29sdGlwfVxuICAgICAgICAgICAgICBvbkNsaWNrPXtpdGVtLm9uQ2xpY2t9XG4gICAgICAgICAgICAgIHRvb2x0aXBUeXBlPXtpdGVtLnRvb2x0aXBUeXBlfVxuICAgICAgICAgICAgICBJY29uQ29tcG9uZW50PXtpdGVtLmljb259XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgPC9IZWFkZXJBY3Rpb25TZWN0aW9uPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbjtcbn1cblxuY29uc3QgU3R5bGVkRWZmZWN0VGl0bGVTZWN0aW9uID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgZmxleC1ncm93OiAxO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuYDtcblxuY29uc3QgSWNvblBsYWNlaG9sZGVyID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbmA7XG5cbmNvbnN0IEVmZmVjdEljb25XcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgaGVpZ2h0OiAxOHB4O1xuICBtYXJnaW46IGF1dG87XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG5gO1xuXG5FZmZlY3RQYW5lbEhlYWRlckZhY3RvcnkuZGVwcyA9IFtFZmZlY3RQYW5lbEhlYWRlckFjdGlvblNlY3Rpb25GYWN0b3J5XTtcblxuZnVuY3Rpb24gRWZmZWN0UGFuZWxIZWFkZXJGYWN0b3J5KFxuICBFZmZlY3RQYW5lbEhlYWRlckFjdGlvblNlY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIEVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3Rvcnk+XG4pOiBSZWFjdC5GQzxFZmZlY3RQYW5lbEhlYWRlclByb3BzPiB7XG4gIGNvbnN0IEVmZmVjdFBhbmVsSGVhZGVyID0gKHByb3BzOiBFZmZlY3RQYW5lbEhlYWRlclByb3BzKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgaXNDb25maWdBY3RpdmUsXG4gICAgICBpc0RyYWdORHJvcEVuYWJsZWQgPSB0cnVlLFxuICAgICAgdHlwZSxcbiAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnLFxuICAgICAgbGlzdGVuZXJzLFxuICAgICAgc2hvd1NvcnRIYW5kbGUgPSB0cnVlXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgbGFiZWwgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gRUZGRUNUX0RFU0NSSVBUSU9OUy5maW5kKF9kZXNjcmlwdGlvbiA9PiBfZGVzY3JpcHRpb24udHlwZSA9PT0gdHlwZSk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb24/Lm5hbWUgfHwgJ0VmZmVjdCc7XG4gICAgfSwgW3R5cGVdKTtcblxuICAgIGNvbnN0IEVmZmVjdEljb24gPSBkZWZhdWx0RWZmZWN0SWNvbnNbdHlwZV07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEVmZmVjdFBhbmVsSGVhZGVyXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZWZmZWN0LXBhbmVsX19oZWFkZXInLCB7XG4gICAgICAgICAgJ3NvcnQtLWhhbmRsZSc6ICFpc0NvbmZpZ0FjdGl2ZVxuICAgICAgICB9KX1cbiAgICAgICAgYWN0aXZlPXtpc0NvbmZpZ0FjdGl2ZX1cbiAgICAgICAgb25DbGljaz17b25Ub2dnbGVFbmFibGVDb25maWd9XG4gICAgICA+XG4gICAgICAgIHtpc0RyYWdORHJvcEVuYWJsZWQgPyAoXG4gICAgICAgICAgPERyYWdIYW5kbGUgY2xhc3NOYW1lPVwiZWZmZWN0X19kcmFnLWhhbmRsZVwiIGxpc3RlbmVycz17bGlzdGVuZXJzfT5cbiAgICAgICAgICAgIHtzaG93U29ydEhhbmRsZSA/IDxWZXJ0RG90cyBoZWlnaHQ9XCIyMHB4XCIgLz4gOiA8SWNvblBsYWNlaG9sZGVyIC8+fVxuICAgICAgICAgIDwvRHJhZ0hhbmRsZT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImVmZmVjdF9fZHJhZy1oYW5kbGVfX3BsYWNlaG9sZGVyXCIgLz5cbiAgICAgICAgKX1cblxuICAgICAgICA8RWZmZWN0SWNvbldyYXBwZXI+e0VmZmVjdEljb24gPyA8RWZmZWN0SWNvbiBoZWlnaHQ9XCIxOHB4XCIgLz4gOiBudWxsfTwvRWZmZWN0SWNvbldyYXBwZXI+XG5cbiAgICAgICAgPFN0eWxlZEVmZmVjdFRpdGxlU2VjdGlvbj57bGFiZWx9PC9TdHlsZWRFZmZlY3RUaXRsZVNlY3Rpb24+XG5cbiAgICAgICAgPEVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L1N0eWxlZEVmZmVjdFBhbmVsSGVhZGVyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEVmZmVjdFBhbmVsSGVhZGVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBFZmZlY3RQYW5lbEhlYWRlckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFNQSxJQUFBSyxrQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBeUJBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFBOEQsSUFBQVEsbUJBQUEsRUFBQUMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQXZDOUQ7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBbEIsd0JBQUFrQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxH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