UNPKG

kepler.gl

Version:

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

252 lines (250 loc) 47.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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _reactLifecyclesCompat = require("react-lifecycles-compat"); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _reactMapGl = require("react-map-gl"); var _styledComponents2 = require("../common/styled-components"); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/styles/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl"); var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/localization/src"); var _src4 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // Utils 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; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var MapH = 190; var MapW = 264; var ErrorMsg = { styleError: 'Failed to load map style, make sure it is published. For private style, paste in your access token.' }; var PreviewMap = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-left: 116px;\n flex-shrink: 0;\n\n .preview-title {\n font-weight: 500;\n font-size: 10px;\n padding: 8px 0px;\n }\n\n .preview-title.error {\n color: ", ";\n max-width: 250px;\n }\n\n ", ";\n\n ", ";\n"])), function (props) { return props.theme.errorColor; }, _src.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 32px;\n "]))), _src.media.palm(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: unset;\n .preview-title {\n margin-top: 0px;\n }\n "])))); var StyledPreviewImage = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background: ", ";\n border-radius: 4px;\n box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.18);\n width: ", "px;\n height: ", "px;\n position: relative;\n\n .preview-image-placeholder {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .preview-image-spinner {\n position: absolute;\n left: calc(50% - 25px);\n top: calc(50% - 25px);\n }\n"])), function (props) { return props.theme.modalImagePlaceHolder; }, MapW, MapH); var InlineLink = _styledComponents["default"].a(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n font-weight: 500;\n\n &:hover {\n cursor: pointer;\n }\n"]))); var nop = function nop() { return; }; function AddMapStyleModalFactory() { var AddMapStyleModal = /*#__PURE__*/function (_Component) { function AddMapStyleModal() { var _this; (0, _classCallCheck2["default"])(this, AddMapStyleModal); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, AddMapStyleModal, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { reRenderKey: 0, previousToken: null }); (0, _defineProperty2["default"])(_this, "_map", void 0); (0, _defineProperty2["default"])(_this, "_setMapRef", function (mapRef) { // Handle change of the basemap library if (_this._map && mapRef) { var _map = mapRef.getMap(); if (_map && _this._map !== _map) { _this._map.off('style.load', nop); _this._map.off('error', nop); _this._map = null; } } var map = mapRef && mapRef.getMap(); if (map && _this._map !== map) { _this._map = map; map.on('style.load', function () { var style = map.getStyle(); _this.loadMapStyleJson(style); }); map.on('error', function () { _this.loadMapStyleError(); }); } }); (0, _defineProperty2["default"])(_this, "loadMapStyleJson", function (style) { _this.props.loadCustomMapStyle({ style: style, error: false }); }); (0, _defineProperty2["default"])(_this, "loadMapStyleError", function () { _this.props.loadCustomMapStyle({ error: true }); }); return _this; } (0, _inherits2["default"])(AddMapStyleModal, _Component); return (0, _createClass2["default"])(AddMapStyleModal, [{ key: "render", value: function render() { var _this$props$transform, _this$props2, _this2 = this; var _this$props = this.props, inputStyle = _this$props.inputStyle, mapState = _this$props.mapState, intl = _this$props.intl; var baseMapLibraryName = (0, _src2.getBaseMapLibrary)(inputStyle); var baseMapLibraryConfig = (0, _src2.getApplicationConfig)().baseMapLibraryConfig[baseMapLibraryName]; var mapboxApiAccessToken = inputStyle.accessToken || this.props.mapboxApiAccessToken; var mapProps = _objectSpread(_objectSpread({}, mapState), {}, { // TODO baseApiUrl should be taken into account in transformRequest as we use dynamic mapLib import // baseApiUrl: mapboxApiUrl, mapboxAccessToken: mapboxApiAccessToken, mapLib: baseMapLibraryConfig.getMapLib(), preserveDrawingBuffer: true, transformRequest: ((_this$props$transform = (_this$props2 = this.props).transformRequest) === null || _this$props$transform === void 0 ? void 0 : _this$props$transform.call(_this$props2, mapboxApiAccessToken)) || (0, _src2.transformRequest)(mapboxApiAccessToken) }); return /*#__PURE__*/_react["default"].createElement("div", { className: "add-map-style-modal" }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalContent, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalVerticalPanel, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'modal.addStyle.pasteTitle' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle0' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/studio-manual-publish/#style-url" }, ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle2' })), ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle3' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://docs.mapbox.com/mapbox-gl-js/style-spec" }, ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle4' }))), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.url || '', onChange: function onChange(_ref) { var value = _ref.target.value; return _this2.props.inputMapStyle({ url: value, id: 'Custom Style', icon: "".concat((0, _src2.getApplicationConfig)().cdnUrl, "/").concat(_src4.NO_BASEMAP_ICON) }); }, placeholder: "e.g. https://basemaps.cartocdn.com/gl/positron-gl-style/style.json" })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'modal.addStyle.publishTitle' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.publishSubtitle1' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/studio/styles/" }, ' ', "mapbox"), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle2' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/studio-manual-publish/" }, ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle3' })), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle4' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.publishSubtitle5' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/how-access-tokens-work/" }, ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle6' })), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle7' })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.accessToken || '', onChange: function onChange(_ref2) { var value = _ref2.target.value; return _this2.props.inputMapStyle({ accessToken: value }); }, placeholder: intl.formatMessage({ id: 'modal.addStyle.exampleToken' }) })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_src3.FormattedMessage, { id: 'modal.addStyle.namingTitle' })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.label || '', onChange: function onChange(_ref3) { var value = _ref3.target.value; return _this2.props.inputMapStyle({ label: value }); }, placeholder: "Name your style" }))), /*#__PURE__*/_react["default"].createElement(PreviewMap, null, /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])('preview-title', { error: inputStyle.error }) }, inputStyle.error ? ErrorMsg.styleError : inputStyle.style && inputStyle.style.name || ''), /*#__PURE__*/_react["default"].createElement(StyledPreviewImage, { className: "preview-image" }, !inputStyle.isValid ? /*#__PURE__*/_react["default"].createElement("div", { className: "preview-image-spinner" }) : /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledMapContainer, null, /*#__PURE__*/_react["default"].createElement(_reactMapGl.Map, (0, _extends2["default"])({}, mapProps, { ref: this._setMapRef, key: "".concat(baseMapLibraryName, "-").concat(this.state.reRenderKey, "-").concat(inputStyle.url, "-").concat(mapboxApiAccessToken), style: { width: MapW, height: MapH }, mapStyle: inputStyle.url === null ? undefined : inputStyle.url }))))))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if (props.inputStyle && props.inputStyle.accessToken && props.inputStyle.accessToken !== state.previousToken) { // toke has changed // ReactMapGl doesn't re-create map when token has changed // here we force the map to update return { reRenderKey: state.reRenderKey + 1, previousToken: props.inputStyle.accessToken }; } return null; } }]); }(_react.Component); return (0, _reactIntl.injectIntl)((0, _reactLifecyclesCompat.polyfill)(AddMapStyleModal)); } var _default = exports["default"] = AddMapStyleModalFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RMaWZlY3ljbGVzQ29tcGF0IiwiX2NsYXNzbmFtZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfcmVhY3RNYXBHbCIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9zcmMiLCJfc3JjMiIsIl9yZWFjdEludGwiLCJfc3JjMyIsIl9zcmM0IiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiTWFwSCIsIk1hcFciLCJFcnJvck1zZyIsInN0eWxlRXJyb3IiLCJQcmV2aWV3TWFwIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwiZXJyb3JDb2xvciIsIm1lZGlhIiwicG9ydGFibGUiLCJwYWxtIiwiU3R5bGVkUHJldmlld0ltYWdlIiwibW9kYWxJbWFnZVBsYWNlSG9sZGVyIiwiSW5saW5lTGluayIsIm5vcCIsIkFkZE1hcFN0eWxlTW9kYWxGYWN0b3J5IiwiQWRkTWFwU3R5bGVNb2RhbCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsInJlUmVuZGVyS2V5IiwicHJldmlvdXNUb2tlbiIsIm1hcFJlZiIsIl9tYXAiLCJtYXAiLCJnZXRNYXAiLCJvZmYiLCJvbiIsInN0eWxlIiwiZ2V0U3R5bGUiLCJsb2FkTWFwU3R5bGVKc29uIiwibG9hZE1hcFN0eWxlRXJyb3IiLCJsb2FkQ3VzdG9tTWFwU3R5bGUiLCJlcnJvciIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJyZW5kZXIiLCJfdGhpcyRwcm9wcyR0cmFuc2Zvcm0iLCJfdGhpcyRwcm9wczIiLCJfdGhpczIiLCJfdGhpcyRwcm9wcyIsImlucHV0U3R5bGUiLCJtYXBTdGF0ZSIsImludGwiLCJiYXNlTWFwTGlicmFyeU5hbWUiLCJnZXRCYXNlTWFwTGlicmFyeSIsImJhc2VNYXBMaWJyYXJ5Q29uZmlnIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsImFjY2Vzc1Rva2VuIiwibWFwUHJvcHMiLCJtYXBib3hBY2Nlc3NUb2tlbiIsIm1hcExpYiIsImdldE1hcExpYiIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInRyYW5zZm9ybVJlcXVlc3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiU3R5bGVkTW9kYWxDb250ZW50IiwiU3R5bGVkTW9kYWxWZXJ0aWNhbFBhbmVsIiwiU3R5bGVkTW9kYWxTZWN0aW9uIiwiRm9ybWF0dGVkTWVzc2FnZSIsImlkIiwiZm9ybWF0TWVzc2FnZSIsInRhcmdldCIsImhyZWYiLCJJbnB1dExpZ2h0IiwidHlwZSIsInVybCIsIm9uQ2hhbmdlIiwiX3JlZiIsImlucHV0TWFwU3R5bGUiLCJpY29uIiwiY2RuVXJsIiwiTk9fQkFTRU1BUF9JQ09OIiwicGxhY2Vob2xkZXIiLCJfcmVmMiIsImxhYmVsIiwiX3JlZjMiLCJjbGFzc25hbWVzIiwibmFtZSIsImlzVmFsaWQiLCJTdHlsZWRNYXBDb250YWluZXIiLCJNYXAiLCJfZXh0ZW5kczIiLCJyZWYiLCJfc2V0TWFwUmVmIiwic3RhdGUiLCJ3aWR0aCIsImhlaWdodCIsIm1hcFN0eWxlIiwidW5kZWZpbmVkIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiQ29tcG9uZW50IiwiaW5qZWN0SW50bCIsInBvbHlmaWxsIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL21vZGFscy9hZGQtbWFwLXN0eWxlLW1vZGFsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7cG9seWZpbGx9IGZyb20gJ3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge01hcCwgTWFwYm94TWFwLCBNYXBSZWZ9IGZyb20gJ3JlYWN0LW1hcC1nbCc7XG5pbXBvcnQge1xuICBTdHlsZWRNb2RhbENvbnRlbnQsXG4gIElucHV0TGlnaHQsXG4gIFN0eWxlZE1hcENvbnRhaW5lcixcbiAgU3R5bGVkTW9kYWxWZXJ0aWNhbFBhbmVsLFxuICBTdHlsZWRNb2RhbFNlY3Rpb25cbn0gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7bWVkaWF9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcblxuLy8gVXRpbHNcbmltcG9ydCB7Z2V0QXBwbGljYXRpb25Db25maWcsIGdldEJhc2VNYXBMaWJyYXJ5LCB0cmFuc2Zvcm1SZXF1ZXN0fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7aW5qZWN0SW50bCwgSW50bFNoYXBlfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnQGtlcGxlci5nbC9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtOT19CQVNFTUFQX0lDT059IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7SW5wdXRTdHlsZSwgTWFwU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtBY3Rpb25IYW5kbGVyLCBpbnB1dE1hcFN0eWxlLCBsb2FkQ3VzdG9tTWFwU3R5bGV9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmNvbnN0IE1hcEggPSAxOTA7XG5jb25zdCBNYXBXID0gMjY0O1xuY29uc3QgRXJyb3JNc2cgPSB7XG4gIHN0eWxlRXJyb3I6XG4gICAgJ0ZhaWxlZCB0byBsb2FkIG1hcCBzdHlsZSwgbWFrZSBzdXJlIGl0IGlzIHB1Ymxpc2hlZC4gRm9yIHByaXZhdGUgc3R5bGUsIHBhc3RlIGluIHlvdXIgYWNjZXNzIHRva2VuLidcbn07XG5cbmNvbnN0IFByZXZpZXdNYXAgPSBzdHlsZWQuZGl2YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgbWFyZ2luLWxlZnQ6IDExNnB4O1xuICBmbGV4LXNocmluazogMDtcblxuICAucHJldmlldy10aXRsZSB7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgcGFkZGluZzogOHB4IDBweDtcbiAgfVxuXG4gIC5wcmV2aWV3LXRpdGxlLmVycm9yIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbiAgICBtYXgtd2lkdGg6IDI1MHB4O1xuICB9XG5cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tbGVmdDogMzJweDtcbiAgYH07XG5cbiAgJHttZWRpYS5wYWxtYFxuICAgIG1hcmdpbi1sZWZ0OiB1bnNldDtcbiAgICAucHJldmlldy10aXRsZSB7XG4gICAgICBtYXJnaW4tdG9wOiAwcHg7XG4gICAgfVxuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZFByZXZpZXdJbWFnZSA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubW9kYWxJbWFnZVBsYWNlSG9sZGVyfTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2hhZG93OiAwIDhweCAxNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE4KTtcbiAgd2lkdGg6ICR7TWFwV31weDtcbiAgaGVpZ2h0OiAke01hcEh9cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAucHJldmlldy1pbWFnZS1wbGFjZWhvbGRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICB9XG5cbiAgLnByZXZpZXctaW1hZ2Utc3Bpbm5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IGNhbGMoNTAlIC0gMjVweCk7XG4gICAgdG9wOiBjYWxjKDUwJSAtIDI1cHgpO1xuICB9XG5gO1xuXG5jb25zdCBJbmxpbmVMaW5rID0gc3R5bGVkLmFgXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5gO1xuXG5jb25zdCBub3AgPSAoKSA9PiB7XG4gIHJldHVybjtcbn07XG5cbmludGVyZmFjZSBBZGRNYXBTdHlsZU1vZGFsUHJvcHMge1xuICBpbnB1dE1hcFN0eWxlOiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBpbnB1dE1hcFN0eWxlPjtcbiAgaW5wdXRTdHlsZTogSW5wdXRTdHlsZTtcbiAgbG9hZEN1c3RvbU1hcFN0eWxlOiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBsb2FkQ3VzdG9tTWFwU3R5bGU+O1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBtYXBib3hBcGlVcmw/OiBzdHJpbmc7XG4gIHRyYW5zZm9ybVJlcXVlc3Q/OiAobWFwYm94S2V5OiBzdHJpbmcpID0+IChcbiAgICB1cmw6IHN0cmluZyxcbiAgICByZXNvdXJjZVR5cGU6IHN0cmluZ1xuICApID0+IHtcbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgbWFwU3RhdGU6IE1hcFN0YXRlO1xuICBpbnRsOiBJbnRsU2hhcGU7XG59XG5cbmZ1bmN0aW9uIEFkZE1hcFN0eWxlTW9kYWxGYWN0b3J5KCkge1xuICBjbGFzcyBBZGRNYXBTdHlsZU1vZGFsIGV4dGVuZHMgQ29tcG9uZW50PEFkZE1hcFN0eWxlTW9kYWxQcm9wcz4ge1xuICAgIHN0YXRlID0ge1xuICAgICAgcmVSZW5kZXJLZXk6IDAsXG4gICAgICBwcmV2aW91c1Rva2VuOiBudWxsXG4gICAgfTtcblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLmlucHV0U3R5bGUgJiZcbiAgICAgICAgcHJvcHMuaW5wdXRTdHlsZS5hY2Nlc3NUb2tlbiAmJlxuICAgICAgICBwcm9wcy5pbnB1dFN0eWxlLmFjY2Vzc1Rva2VuICE9PSBzdGF0ZS5wcmV2aW91c1Rva2VuXG4gICAgICApIHtcbiAgICAgICAgLy8gdG9rZSBoYXMgY2hhbmdlZFxuICAgICAgICAvLyBSZWFjdE1hcEdsIGRvZXNuJ3QgcmUtY3JlYXRlIG1hcCB3aGVuIHRva2VuIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIGhlcmUgd2UgZm9yY2UgdGhlIG1hcCB0byB1cGRhdGVcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlUmVuZGVyS2V5OiBzdGF0ZS5yZVJlbmRlcktleSArIDEsXG4gICAgICAgICAgcHJldmlvdXNUb2tlbjogcHJvcHMuaW5wdXRTdHlsZS5hY2Nlc3NUb2tlblxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfbWFwOiBNYXBib3hNYXAgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICAgX3NldE1hcFJlZiA9IChtYXBSZWY6IE1hcFJlZikgPT4ge1xuICAgICAgLy8gSGFuZGxlIGNoYW5nZSBvZiB0aGUgYmFzZW1hcCBsaWJyYXJ5XG4gICAgICBpZiAodGhpcy5fbWFwICYmIG1hcFJlZikge1xuICAgICAgICBjb25zdCBtYXAgPSBtYXBSZWYuZ2V0TWFwKCk7XG4gICAgICAgIGlmIChtYXAgJiYgdGhpcy5fbWFwICE9PSBtYXApIHtcbiAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdzdHlsZS5sb2FkJywgbm9wKTtcbiAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdlcnJvcicsIG5vcCk7XG4gICAgICAgICAgdGhpcy5fbWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXAgPSBtYXBSZWYgJiYgbWFwUmVmLmdldE1hcCgpO1xuICAgICAgaWYgKG1hcCAmJiB0aGlzLl9tYXAgIT09IG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG5cbiAgICAgICAgbWFwLm9uKCdzdHlsZS5sb2FkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWFwLmdldFN0eWxlKCk7XG4gICAgICAgICAgdGhpcy5sb2FkTWFwU3R5bGVKc29uKHN0eWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWFwLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRNYXBTdHlsZUVycm9yKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsb2FkTWFwU3R5bGVKc29uID0gc3R5bGUgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5sb2FkQ3VzdG9tTWFwU3R5bGUoe3N0eWxlLCBlcnJvcjogZmFsc2V9KTtcbiAgICB9O1xuXG4gICAgbG9hZE1hcFN0eWxlRXJyb3IgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxvYWRDdXN0b21NYXBTdHlsZSh7ZXJyb3I6IHRydWV9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2lucHV0U3R5bGUsIG1hcFN0YXRlLCBpbnRsfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGNvbnN0IGJhc2VNYXBMaWJyYXJ5TmFtZSA9IGdldEJhc2VNYXBMaWJyYXJ5KGlucHV0U3R5bGUpO1xuICAgICAgY29uc3QgYmFzZU1hcExpYnJhcnlDb25maWcgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmJhc2VNYXBMaWJyYXJ5Q29uZmlnW2Jhc2VNYXBMaWJyYXJ5TmFtZV07XG5cbiAgICAgIGNvbnN0IG1hcGJveEFwaUFjY2Vzc1Rva2VuID0gaW5wdXRTdHlsZS5hY2Nlc3NUb2tlbiB8fCB0aGlzLnByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuO1xuICAgICAgY29uc3QgbWFwUHJvcHMgPSB7XG4gICAgICAgIC4uLm1hcFN0YXRlLFxuICAgICAgICAvLyBUT0RPIGJhc2VBcGlVcmwgc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiB0cmFuc2Zvcm1SZXF1ZXN0IGFzIHdlIHVzZSBkeW5hbWljIG1hcExpYiBpbXBvcnRcbiAgICAgICAgLy8gYmFzZUFwaVVybDogbWFwYm94QXBpVXJsLFxuICAgICAgICBtYXBib3hBY2Nlc3NUb2tlbjogbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICAgIG1hcExpYjogYmFzZU1hcExpYnJhcnlDb25maWcuZ2V0TWFwTGliKCksXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDpcbiAgICAgICAgICB0aGlzLnByb3BzLnRyYW5zZm9ybVJlcXVlc3Q/LihtYXBib3hBcGlBY2Nlc3NUb2tlbikgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0KG1hcGJveEFwaUFjY2Vzc1Rva2VuKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhZGQtbWFwLXN0eWxlLW1vZGFsXCI+XG4gICAgICAgICAgPFN0eWxlZE1vZGFsQ29udGVudD5cbiAgICAgICAgICAgIDxTdHlsZWRNb2RhbFZlcnRpY2FsUGFuZWw+XG4gICAgICAgICAgICAgIDxTdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmFkZFN0eWxlLnBhc3RlVGl0bGUnfSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi1zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wYXN0ZVN1YnRpdGxlMCd9KX1cbiAgICAgICAgICAgICAgICAgIDxJbmxpbmVMaW5rXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvc3R1ZGlvLW1hbnVhbC1wdWJsaXNoLyNzdHlsZS11cmxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnBhc3RlU3VidGl0bGUyJ30pfVxuICAgICAgICAgICAgICAgICAgPC9JbmxpbmVMaW5rPnsnICd9XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnBhc3RlU3VidGl0bGUzJ30pfVxuICAgICAgICAgICAgICAgICAgPElubGluZUxpbmtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wYXN0ZVN1YnRpdGxlNCd9KX1cbiAgICAgICAgICAgICAgICAgIDwvSW5saW5lTGluaz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0U3R5bGUudXJsIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh7dGFyZ2V0OiB7dmFsdWV9fSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dE1hcFN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICB1cmw6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiAnQ3VzdG9tIFN0eWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICBpY29uOiBgJHtnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmNkblVybH0vJHtOT19CQVNFTUFQX0lDT059YFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGh0dHBzOi8vYmFzZW1hcHMuY2FydG9jZG4uY29tL2dsL3Bvc2l0cm9uLWdsLXN0eWxlL3N0eWxlLmpzb25cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuXG4gICAgICAgICAgICAgIDxTdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hUaXRsZSd9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTEnfSl9XG4gICAgICAgICAgICAgICAgICA8SW5saW5lTGluayB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly93d3cubWFwYm94LmNvbS9zdHVkaW8vc3R5bGVzL1wiPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICBtYXBib3hcbiAgICAgICAgICAgICAgICAgIDwvSW5saW5lTGluaz57JyAnfVxuICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wdWJsaXNoU3VidGl0bGUyJ30pfVxuICAgICAgICAgICAgICAgICAgPElubGluZUxpbmtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9zdHVkaW8tbWFudWFsLXB1Ymxpc2gvXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wdWJsaXNoU3VidGl0bGUzJ30pfVxuICAgICAgICAgICAgICAgICAgPC9JbmxpbmVMaW5rPnsnICd9XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTQnfSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucHVibGlzaFN1YnRpdGxlNSd9KX1cbiAgICAgICAgICAgICAgICAgIDxJbmxpbmVMaW5rXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvaG93LWFjY2Vzcy10b2tlbnMtd29yay9cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTYnfSl9XG4gICAgICAgICAgICAgICAgICA8L0lubGluZUxpbms+eycgJ31cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucHVibGlzaFN1YnRpdGxlNyd9KX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0U3R5bGUuYWNjZXNzVG9rZW4gfHwgJyd9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHt0YXJnZXQ6IHt2YWx1ZX19KSA9PiB0aGlzLnByb3BzLmlucHV0TWFwU3R5bGUoe2FjY2Vzc1Rva2VuOiB2YWx1ZX0pfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5leGFtcGxlVG9rZW4nfSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuYWRkU3R5bGUubmFtaW5nVGl0bGUnfSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRTdHlsZS5sYWJlbCB8fCAnJ31cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoe3RhcmdldDoge3ZhbHVlfX0pID0+IHRoaXMucHJvcHMuaW5wdXRNYXBTdHlsZSh7bGFiZWw6IHZhbHVlfSl9XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciBzdHlsZVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgICAgICA8L1N0eWxlZE1vZGFsVmVydGljYWxQYW5lbD5cbiAgICAgICAgICAgIDxQcmV2aWV3TWFwPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdwcmV2aWV3LXRpdGxlJywge1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGlucHV0U3R5bGUuZXJyb3JcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtpbnB1dFN0eWxlLmVycm9yXG4gICAgICAgICAgICAgICAgICA/IEVycm9yTXNnLnN0eWxlRXJyb3JcbiAgICAgICAgICAgICAgICAgIDogKGlucHV0U3R5bGUuc3R5bGUgJiYgaW5wdXRTdHlsZS5zdHlsZS5uYW1lKSB8fCAnJ31cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxTdHlsZWRQcmV2aWV3SW1hZ2UgY2xhc3NOYW1lPVwicHJldmlldy1pbWFnZVwiPlxuICAgICAgICAgICAgICAgIHsvKiogTm90ZSwgd2UgbmVlZCB0aGUgTWFwIHRvIHJlbmRlciB3aXRoIGVycm9yZWQgcGFyYW1zIHRvIGdldCBzdHlsZS5lcnJvciBtZXNzYWdlcyAqL31cbiAgICAgICAgICAgICAgICB7IWlucHV0U3R5bGUuaXNWYWxpZCA/IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJldmlldy1pbWFnZS1zcGlubmVyXCIgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZE1hcENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPE1hcFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5tYXBQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuX3NldE1hcFJlZn1cbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Ake2Jhc2VNYXBMaWJyYXJ5TmFtZX0tJHt0aGlzLnN0YXRlLnJlUmVuZGVyS2V5fS0ke2lucHV0U3R5bGUudXJsfS0ke21hcGJveEFwaUFjY2Vzc1Rva2VufWB9XG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXBXLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBNYXBIXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBtYXBTdHlsZT17aW5wdXRTdHlsZS51cmwgPT09IG51bGwgPyB1bmRlZmluZWQgOiBpbnB1dFN0eWxlLnVybH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkTWFwQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvU3R5bGVkUHJldmlld0ltYWdlPlxuICAgICAgICAgICAgPC9QcmV2aWV3TWFwPlxuICAgICAgICAgIDwvU3R5bGVkTW9kYWxDb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluamVjdEludGwocG9seWZpbGwoQWRkTWFwU3R5bGVNb2RhbCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBZGRNYXBTdHlsZU1vZGFsRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLHNCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxpQkFBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssV0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sa0JBQUEsR0FBQU4sT0FBQTtBQU9BLElBQUFPLElBQUEsR0FBQVAsT0FBQTtBQUdBLElBQUFRLEtBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFVBQUEs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QUFVLENBQUN3QyxPQUFPLGdCQUNsQjNKLE1BQUEsWUFBQWtJLGFBQUE7VUFBS0MsU0FBUyxFQUFDO1FBQXVCLENBQUUsQ0FBQyxnQkFFekNuSSxNQUFBLFlBQUFrSSxhQUFBLENBQUMxSCxrQkFBQSxDQUFBb0osa0JBQWtCLHFCQUNqQjVKLE1BQUEsWUFBQWtJLGFBQUEsQ0FBQzNILFdBQUEsQ0FBQXNKLEdBQUcsTUFBQUMsU0FBQSxpQkFDRWxDLFFBQVE7VUFDWm1DLEdBQUcsRUFBRSxJQUFJLENBQUNDLFVBQVc7VUFDckJwRCxHQUFHLEtBQUFqQixNQUFBLENBQUsyQixrQkFBa0IsT0FBQTNCLE1BQUEsQ0FBSSxJQUFJLENBQUNzRSxLQUFLLENBQUNyRSxXQUFXLE9BQUFELE1BQUEsQ0FBSXdCLFVBQVUsQ0FBQzJCLEdBQUcsT0FBQW5ELE1BQUEsQ0FBSStCLG9CQUFvQixDQUFHO1VBQ2pHdEIsS0FBSyxFQUFFO1lBQ0w4RCxLQUFLLEVBQUVqRyxJQUFJO1lBQ1hrRyxNQUFNLEVBQUVuRztVQUNWLENBQUU7VUFDRm9HLFFBQVEsRUFBRWpELFVBQVUsQ0FBQzJCLEdBQUcsS0FBSyxJQUFJLEdBQUd1QixTQUFTLEdBQUdsRCxVQUFVLENBQUMyQjtRQUFJLEVBQ2hFLENBQ2lCLENBRUosQ0FDVixDQUNNLENBQ2pCLENBQUM7TUFFVjtJQUFDO01BQUFsQyxHQUFBO01BQUFDLEtBQUEsRUF2TUQsU0FBT3lELHdCQUF3QkEsQ0FBQzlGLEtBQUssRUFBRXlGLEtBQUssRUFBRTtRQUM1QyxJQUNFekYsS0FBSyxDQUFDMkMsVUFBVSxJQUNoQjNDLEtBQUssQ0FBQzJDLFVBQVUsQ0FBQ1EsV0FBVyxJQUM1Qm5ELEtBQUssQ0FBQzJDLFVBQVUsQ0FBQ1EsV0FBVyxLQUFLc0MsS0FBSyxDQUFDcEUsYUFBYSxFQUNwRDtVQUNBO1VBQ0E7VUFDQTs7VUFFQSxPQUFPO1lBQ0xELFdBQVcsRUFBRXFFLEtBQUssQ0FBQ3JFLFdBQVcsR0FBRyxDQUFDO1lBQ2xDQyxhQUFhLEVBQUVyQixLQUFLLENBQUMyQyxVQUFVLENBQUNRO1VBQ2xDLENBQUM7UUFDSDtRQUVBLE9BQU8sSUFBSTtNQUNiO0lBQUM7RUFBQSxFQXZCNEI0QyxnQkFBUztFQWdOeEMsT0FBTyxJQUFBQyxxQkFBVSxFQUFDLElBQUFDLCtCQUFRLEVBQUN0RixnQkFBZ0IsQ0FBQyxDQUFDO0FBQy9DO0FBQUMsSUFBQXVGLFFBQUEsR0FBQUMsT0FBQSxjQUVjekYsdUJBQXVCIiwiaWdub3JlTGlzdCI6W119