UNPKG

matrix-react-sdk

Version:
166 lines (164 loc) 34.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _languageHandler = require("../../../languageHandler"); var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _FormattingUtils = require("../../../utils/FormattingUtils"); var _EventIndexPeg = _interopRequireDefault(require("../../../indexing/EventIndexPeg")); var _SettingLevel = require("../../../settings/SettingLevel"); var _SeshatResetDialog = _interopRequireDefault(require("../dialogs/SeshatResetDialog")); var _InlineSpinner = _interopRequireDefault(require("../elements/InlineSpinner")); var _ExternalLink = _interopRequireDefault(require("../elements/ExternalLink")); var _SettingsSubsection = require("./shared/SettingsSubsection"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (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; } /* Copyright 2024 New Vector Ltd. Copyright 2020, 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class EventIndexPanel extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "updateCurrentRoom", async () => { const eventIndex = _EventIndexPeg.default.get(); const stats = await eventIndex?.getStats().catch(() => {}); // This call may fail if sporadically, not a huge issue as we will try later again and probably succeed. if (!stats) return; this.setState({ eventIndexSize: stats.size, roomCount: stats.roomCount }); }); (0, _defineProperty2.default)(this, "onManage", async () => { _Modal.default.createDialogAsync( // @ts-ignore: TS doesn't seem to like the type of this now that it // has also been converted to TS as well, but I can't figure out why... Promise.resolve().then(() => _interopRequireWildcard(require("../../../async-components/views/dialogs/eventindex/ManageEventIndexDialog"))), { onFinished: () => {} }, null, /* priority = */false, /* static = */true); }); (0, _defineProperty2.default)(this, "onEnable", async () => { this.setState({ enabling: true }); await _EventIndexPeg.default.initEventIndex(); await _EventIndexPeg.default.get()?.addInitialCheckpoints(); _EventIndexPeg.default.get()?.startCrawler(); await _SettingsStore.default.setValue("enableEventIndexing", null, _SettingLevel.SettingLevel.DEVICE, true); await this.updateState(); }); (0, _defineProperty2.default)(this, "confirmEventStoreReset", () => { const { close } = _Modal.default.createDialog(_SeshatResetDialog.default, { onFinished: async success => { if (success) { await _SettingsStore.default.setValue("enableEventIndexing", null, _SettingLevel.SettingLevel.DEVICE, false); await _EventIndexPeg.default.deleteEventIndex(); await this.onEnable(); close(); } } }); }); this.state = { enabling: false, eventIndexSize: 0, roomCount: 0, eventIndexingEnabled: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "enableEventIndexing") }; } componentWillUnmount() { const eventIndex = _EventIndexPeg.default.get(); if (eventIndex !== null) { eventIndex.removeListener("changedCheckpoint", this.updateCurrentRoom); } } componentDidMount() { this.updateState(); } async updateState() { const eventIndex = _EventIndexPeg.default.get(); const eventIndexingEnabled = _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "enableEventIndexing"); const enabling = false; let eventIndexSize = 0; let roomCount = 0; if (eventIndex !== null) { eventIndex.on("changedCheckpoint", this.updateCurrentRoom); const stats = await eventIndex.getStats().catch(() => {}); // This call may fail if sporadically, not a huge issue as we // will try later again in the updateCurrentRoom call and // probably succeed. if (stats) { eventIndexSize = stats.size; roomCount = stats.roomCount; } } this.setState({ enabling, eventIndexSize, roomCount, eventIndexingEnabled }); } render() { let eventIndexingSettings; const brand = _SdkConfig.default.get().brand; if (_EventIndexPeg.default.get() !== null) { eventIndexingSettings = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, (0, _languageHandler._t)("settings|security|message_search_enabled", { size: (0, _FormattingUtils.formatBytes)(this.state.eventIndexSize, 0), // This drives the singular / plural string // selection for "room" / "rooms" only. count: this.state.roomCount, rooms: (0, _FormattingUtils.formatCountLong)(this.state.roomCount) })), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "primary", onClick: this.onManage }, (0, _languageHandler._t)("action|manage"))); } else if (!this.state.eventIndexingEnabled && _EventIndexPeg.default.supportIsInstalled()) { eventIndexingSettings = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, (0, _languageHandler._t)("settings|security|message_search_disabled")), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "primary", disabled: this.state.enabling, onClick: this.onEnable }, (0, _languageHandler._t)("action|enable")), this.state.enabling ? /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, null) : /*#__PURE__*/_react.default.createElement("div", null))); } else if (_EventIndexPeg.default.platformHasSupport() && !_EventIndexPeg.default.supportIsInstalled()) { const nativeLink = "https://github.com/vector-im/element-desktop/blob/develop/" + "docs/native-node-modules.md#" + "adding-seshat-for-search-in-e2e-encrypted-rooms"; eventIndexingSettings = /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, (0, _languageHandler._t)("settings|security|message_search_unsupported", { brand }, { nativeLink: sub => /*#__PURE__*/_react.default.createElement(_ExternalLink.default, { href: nativeLink, target: "_blank", rel: "noreferrer noopener" }, sub) })); } else if (!_EventIndexPeg.default.platformHasSupport()) { eventIndexingSettings = /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, (0, _languageHandler._t)("settings|security|message_search_unsupported_web", { brand }, { desktopLink: sub => /*#__PURE__*/_react.default.createElement(_ExternalLink.default, { href: "https://element.io/get-started", target: "_blank", rel: "noreferrer noopener" }, sub) })); } else { eventIndexingSettings = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, this.state.enabling ? /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, null) : (0, _languageHandler._t)("settings|security|message_search_failed")), _EventIndexPeg.default.error && /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, /*#__PURE__*/_react.default.createElement("details", null, /*#__PURE__*/_react.default.createElement("summary", null, (0, _languageHandler._t)("common|advanced")), /*#__PURE__*/_react.default.createElement("code", null, _EventIndexPeg.default.error instanceof Error ? _EventIndexPeg.default.error.message : (0, _languageHandler._t)("error|unknown")), /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { key: "delete", kind: "danger", onClick: this.confirmEventStoreReset }, (0, _languageHandler._t)("action|reset")))))); } return eventIndexingSettings; } } exports.default = EventIndexPanel; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2RrQ29uZmlnIiwiX01vZGFsIiwiX1NldHRpbmdzU3RvcmUiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9Gb3JtYXR0aW5nVXRpbHMiLCJfRXZlbnRJbmRleFBlZyIsIl9TZXR0aW5nTGV2ZWwiLCJfU2VzaGF0UmVzZXREaWFsb2ciLCJfSW5saW5lU3Bpbm5lciIsIl9FeHRlcm5hbExpbmsiLCJfU2V0dGluZ3NTdWJzZWN0aW9uIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJFdmVudEluZGV4UGFuZWwiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZXZlbnRJbmRleCIsIkV2ZW50SW5kZXhQZWciLCJzdGF0cyIsImdldFN0YXRzIiwiY2F0Y2giLCJzZXRTdGF0ZSIsImV2ZW50SW5kZXhTaXplIiwic2l6ZSIsInJvb21Db3VudCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nQXN5bmMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJvbkZpbmlzaGVkIiwiZW5hYmxpbmciLCJpbml0RXZlbnRJbmRleCIsImFkZEluaXRpYWxDaGVja3BvaW50cyIsInN0YXJ0Q3Jhd2xlciIsIlNldHRpbmdzU3RvcmUiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsInVwZGF0ZVN0YXRlIiwiY2xvc2UiLCJjcmVhdGVEaWFsb2ciLCJTZXNoYXRSZXNldERpYWxvZyIsInN1Y2Nlc3MiLCJkZWxldGVFdmVudEluZGV4Iiwib25FbmFibGUiLCJzdGF0ZSIsImV2ZW50SW5kZXhpbmdFbmFibGVkIiwiZ2V0VmFsdWVBdCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJ1cGRhdGVDdXJyZW50Um9vbSIsImNvbXBvbmVudERpZE1vdW50Iiwib24iLCJyZW5kZXIiLCJldmVudEluZGV4aW5nU2V0dGluZ3MiLCJicmFuZCIsIlNka0NvbmZpZyIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsIlNldHRpbmdzU3Vic2VjdGlvblRleHQiLCJfdCIsImZvcm1hdEJ5dGVzIiwiY291bnQiLCJyb29tcyIsImZvcm1hdENvdW50TG9uZyIsImtpbmQiLCJvbkNsaWNrIiwib25NYW5hZ2UiLCJzdXBwb3J0SXNJbnN0YWxsZWQiLCJkaXNhYmxlZCIsInBsYXRmb3JtSGFzU3VwcG9ydCIsIm5hdGl2ZUxpbmsiLCJzdWIiLCJocmVmIiwidGFyZ2V0IiwicmVsIiwiZGVza3RvcExpbmsiLCJlcnJvciIsIkVycm9yIiwibWVzc2FnZSIsImtleSIsImNvbmZpcm1FdmVudFN0b3JlUmVzZXQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvRXZlbnRJbmRleFBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vLi4vLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7IGZvcm1hdEJ5dGVzLCBmb3JtYXRDb3VudExvbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRm9ybWF0dGluZ1V0aWxzXCI7XG5pbXBvcnQgRXZlbnRJbmRleFBlZyBmcm9tIFwiLi4vLi4vLi4vaW5kZXhpbmcvRXZlbnRJbmRleFBlZ1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xldmVsIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdMZXZlbFwiO1xuaW1wb3J0IFNlc2hhdFJlc2V0RGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL1Nlc2hhdFJlc2V0RGlhbG9nXCI7XG5pbXBvcnQgSW5saW5lU3Bpbm5lciBmcm9tIFwiLi4vZWxlbWVudHMvSW5saW5lU3Bpbm5lclwiO1xuaW1wb3J0IEV4dGVybmFsTGluayBmcm9tIFwiLi4vZWxlbWVudHMvRXh0ZXJuYWxMaW5rXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1N1YnNlY3Rpb25UZXh0IH0gZnJvbSBcIi4vc2hhcmVkL1NldHRpbmdzU3Vic2VjdGlvblwiO1xuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBlbmFibGluZzogYm9vbGVhbjtcbiAgICBldmVudEluZGV4U2l6ZTogbnVtYmVyO1xuICAgIHJvb21Db3VudDogbnVtYmVyO1xuICAgIGV2ZW50SW5kZXhpbmdFbmFibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudEluZGV4UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e30sIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczoge30pIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlbmFibGluZzogZmFsc2UsXG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZTogMCxcbiAgICAgICAgICAgIHJvb21Db3VudDogMCxcbiAgICAgICAgICAgIGV2ZW50SW5kZXhpbmdFbmFibGVkOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoU2V0dGluZ0xldmVsLkRFVklDRSwgXCJlbmFibGVFdmVudEluZGV4aW5nXCIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDdXJyZW50Um9vbSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IEV2ZW50SW5kZXhQZWcuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZXZlbnRJbmRleD8uZ2V0U3RhdHMoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIC8vIFRoaXMgY2FsbCBtYXkgZmFpbCBpZiBzcG9yYWRpY2FsbHksIG5vdCBhIGh1Z2UgaXNzdWUgYXMgd2Ugd2lsbCB0cnkgbGF0ZXIgYWdhaW4gYW5kIHByb2JhYmx5IHN1Y2NlZWQuXG4gICAgICAgIGlmICghc3RhdHMpIHJldHVybjtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGV2ZW50SW5kZXhTaXplOiBzdGF0cy5zaXplLFxuICAgICAgICAgICAgcm9vbUNvdW50OiBzdGF0cy5yb29tQ291bnQsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBFdmVudEluZGV4UGVnLmdldCgpO1xuXG4gICAgICAgIGlmIChldmVudEluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudEluZGV4LnJlbW92ZUxpc3RlbmVyKFwiY2hhbmdlZENoZWNrcG9pbnRcIiwgdGhpcy51cGRhdGVDdXJyZW50Um9vbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBFdmVudEluZGV4UGVnLmdldCgpO1xuICAgICAgICBjb25zdCBldmVudEluZGV4aW5nRW5hYmxlZCA9IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWVBdChTZXR0aW5nTGV2ZWwuREVWSUNFLCBcImVuYWJsZUV2ZW50SW5kZXhpbmdcIik7XG4gICAgICAgIGNvbnN0IGVuYWJsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGV2ZW50SW5kZXhTaXplID0gMDtcbiAgICAgICAgbGV0IHJvb21Db3VudCA9IDA7XG5cbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50SW5kZXgub24oXCJjaGFuZ2VkQ2hlY2twb2ludFwiLCB0aGlzLnVwZGF0ZUN1cnJlbnRSb29tKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBldmVudEluZGV4LmdldFN0YXRzKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgLy8gVGhpcyBjYWxsIG1heSBmYWlsIGlmIHNwb3JhZGljYWxseSwgbm90IGEgaHVnZSBpc3N1ZSBhcyB3ZVxuICAgICAgICAgICAgLy8gd2lsbCB0cnkgbGF0ZXIgYWdhaW4gaW4gdGhlIHVwZGF0ZUN1cnJlbnRSb29tIGNhbGwgYW5kXG4gICAgICAgICAgICAvLyBwcm9iYWJseSBzdWNjZWVkLlxuICAgICAgICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRJbmRleFNpemUgPSBzdGF0cy5zaXplO1xuICAgICAgICAgICAgICAgIHJvb21Db3VudCA9IHN0YXRzLnJvb21Db3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZW5hYmxpbmcsXG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZSxcbiAgICAgICAgICAgIHJvb21Db3VudCxcbiAgICAgICAgICAgIGV2ZW50SW5kZXhpbmdFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTWFuYWdlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2dBc3luYyhcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IFRTIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIHRoZSB0eXBlIG9mIHRoaXMgbm93IHRoYXQgaXRcbiAgICAgICAgICAgIC8vIGhhcyBhbHNvIGJlZW4gY29udmVydGVkIHRvIFRTIGFzIHdlbGwsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgd2h5Li4uXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi9hc3luYy1jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvZXZlbnRpbmRleC9NYW5hZ2VFdmVudEluZGV4RGlhbG9nXCIpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ6ICgpID0+IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvKiBwcmlvcml0eSA9ICovIGZhbHNlLFxuICAgICAgICAgICAgLyogc3RhdGljID0gKi8gdHJ1ZSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkVuYWJsZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlbmFibGluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgRXZlbnRJbmRleFBlZy5pbml0RXZlbnRJbmRleCgpO1xuICAgICAgICBhd2FpdCBFdmVudEluZGV4UGVnLmdldCgpPy5hZGRJbml0aWFsQ2hlY2twb2ludHMoKTtcbiAgICAgICAgRXZlbnRJbmRleFBlZy5nZXQoKT8uc3RhcnRDcmF3bGVyKCk7XG4gICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJlbmFibGVFdmVudEluZGV4aW5nXCIsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIHRydWUpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXRlKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY29uZmlybUV2ZW50U3RvcmVSZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgeyBjbG9zZSB9ID0gTW9kYWwuY3JlYXRlRGlhbG9nKFNlc2hhdFJlc2V0RGlhbG9nLCB7XG4gICAgICAgICAgICBvbkZpbmlzaGVkOiBhc3luYyAoc3VjY2Vzcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJlbmFibGVFdmVudEluZGV4aW5nXCIsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXZlbnRJbmRleFBlZy5kZWxldGVFdmVudEluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25FbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgZXZlbnRJbmRleGluZ1NldHRpbmdzOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYnJhbmQgPSBTZGtDb25maWcuZ2V0KCkuYnJhbmQ7XG5cbiAgICAgICAgaWYgKEV2ZW50SW5kZXhQZWcuZ2V0KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50SW5kZXhpbmdTZXR0aW5ncyA9IChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2VuYWJsZWRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGZvcm1hdEJ5dGVzKHRoaXMuc3RhdGUuZXZlbnRJbmRleFNpemUsIDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHJpdmVzIHRoZSBzaW5ndWxhciAvIHBsdXJhbCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gZm9yIFwicm9vbVwiIC8gXCJyb29tc1wiIG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IHRoaXMuc3RhdGUucm9vbUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb21zOiBmb3JtYXRDb3VudExvbmcodGhpcy5zdGF0ZS5yb29tQ291bnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24ga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXt0aGlzLm9uTWFuYWdlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxtYW5hZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc3RhdGUuZXZlbnRJbmRleGluZ0VuYWJsZWQgJiYgRXZlbnRJbmRleFBlZy5zdXBwb3J0SXNJbnN0YWxsZWQoKSkge1xuICAgICAgICAgICAgZXZlbnRJbmRleGluZ1NldHRpbmdzID0gKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb25UZXh0PntfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2Rpc2FibGVkXCIpfTwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJwcmltYXJ5XCIgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuZW5hYmxpbmd9IG9uQ2xpY2s9e3RoaXMub25FbmFibGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxlbmFibGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5lbmFibGluZyA/IDxJbmxpbmVTcGlubmVyIC8+IDogPGRpdiAvPn1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKEV2ZW50SW5kZXhQZWcucGxhdGZvcm1IYXNTdXBwb3J0KCkgJiYgIUV2ZW50SW5kZXhQZWcuc3VwcG9ydElzSW5zdGFsbGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUxpbmsgPVxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9naXRodWIuY29tL3ZlY3Rvci1pbS9lbGVtZW50LWRlc2t0b3AvYmxvYi9kZXZlbG9wL1wiICtcbiAgICAgICAgICAgICAgICBcImRvY3MvbmF0aXZlLW5vZGUtbW9kdWxlcy5tZCNcIiArXG4gICAgICAgICAgICAgICAgXCJhZGRpbmctc2VzaGF0LWZvci1zZWFyY2gtaW4tZTJlLWVuY3J5cHRlZC1yb29tc1wiO1xuXG4gICAgICAgICAgICBldmVudEluZGV4aW5nU2V0dGluZ3MgPSAoXG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfdW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTGluazogKHN1YikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGhyZWY9e25hdGl2ZUxpbmt9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRXh0ZXJuYWxMaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIUV2ZW50SW5kZXhQZWcucGxhdGZvcm1IYXNTdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIGV2ZW50SW5kZXhpbmdTZXR0aW5ncyA9IChcbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZXR0aW5nc3xzZWN1cml0eXxtZXNzYWdlX3NlYXJjaF91bnN1cHBvcnRlZF93ZWJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVza3RvcExpbms6IChzdWIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEV4dGVybmFsTGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vZWxlbWVudC5pby9nZXQtc3RhcnRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRXh0ZXJuYWxMaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudEluZGV4aW5nU2V0dGluZ3MgPSAoXG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5lbmFibGluZyA/IDxJbmxpbmVTcGlubmVyIC8+IDogX3QoXCJzZXR0aW5nc3xzZWN1cml0eXxtZXNzYWdlX3NlYXJjaF9mYWlsZWRcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICAgICAge0V2ZW50SW5kZXhQZWcuZXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PntfdChcImNvbW1vbnxhZHZhbmNlZFwiKX08L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0V2ZW50SW5kZXhQZWcuZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRJbmRleFBlZy5lcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdChcImVycm9yfHVua25vd25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBrZXk9XCJkZWxldGVcIiBraW5kPVwiZGFuZ2VyXCIgb25DbGljaz17dGhpcy5jb25maXJtRXZlbnRTdG9yZVJlc2V0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258cmVzZXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50SW5kZXhpbmdTZXR0aW5ncztcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGlCQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sY0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsa0JBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLGNBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFZLG1CQUFB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