UNPKG

matrix-react-sdk

Version:
156 lines (154 loc) 28.1 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 _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore")); var _Modal = _interopRequireDefault(require("../../../../Modal")); var _FormattingUtils = require("../../../../utils/FormattingUtils"); var _EventIndexPeg = _interopRequireDefault(require("../../../../indexing/EventIndexPeg")); var _SettingLevel = require("../../../../settings/SettingLevel"); var _Field = _interopRequireDefault(require("../../../../components/views/elements/Field")); var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog")); var _DialogButtons = _interopRequireDefault(require("../../../../components/views/elements/DialogButtons")); 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. */ /* * Allows the user to introspect the event index state and disable it. */ class ManageEventIndexDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "updateCurrentRoom", async room => { const eventIndex = _EventIndexPeg.default.get(); if (!eventIndex) return; let stats; try { stats = await eventIndex.getStats(); } catch { // This call may fail if sporadically, not a huge issue as we will // try later again and probably succeed. return; } let currentRoom = null; if (room) currentRoom = room.name; const roomStats = eventIndex.crawlingRooms(); const crawlingRoomsCount = roomStats.crawlingRooms.size; const roomCount = roomStats.totalRooms.size; this.setState({ eventIndexSize: stats?.size ?? 0, eventCount: stats?.eventCount ?? 0, crawlingRoomsCount: crawlingRoomsCount, roomCount: roomCount, currentRoom: currentRoom }); }); (0, _defineProperty2.default)(this, "onDisable", async () => { const DisableEventIndexDialog = (await Promise.resolve().then(() => _interopRequireWildcard(require("./DisableEventIndexDialog")))).default; _Modal.default.createDialog(DisableEventIndexDialog, undefined, undefined, /* priority = */false, /* static = */true); }); (0, _defineProperty2.default)(this, "onCrawlerSleepTimeChange", e => { this.setState({ crawlerSleepTime: parseInt(e.target.value, 10) }); _SettingsStore.default.setValue("crawlerSleepTime", null, _SettingLevel.SettingLevel.DEVICE, e.target.value); }); this.state = { eventIndexSize: 0, eventCount: 0, crawlingRoomsCount: 0, roomCount: 0, currentRoom: null, crawlerSleepTime: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "crawlerSleepTime") }; } componentWillUnmount() { const eventIndex = _EventIndexPeg.default.get(); if (eventIndex !== null) { eventIndex.removeListener("changedCheckpoint", this.updateCurrentRoom); } } async componentDidMount() { let eventIndexSize = 0; let crawlingRoomsCount = 0; let roomCount = 0; let eventCount = 0; let currentRoom = null; const eventIndex = _EventIndexPeg.default.get(); if (eventIndex !== null) { eventIndex.on("changedCheckpoint", this.updateCurrentRoom); try { const stats = await eventIndex.getStats(); if (stats) { eventIndexSize = stats.size; eventCount = stats.eventCount; } } catch { // This call may fail if sporadically, not a huge issue as we // will try later again in the updateCurrentRoom call and // probably succeed. } const roomStats = eventIndex.crawlingRooms(); crawlingRoomsCount = roomStats.crawlingRooms.size; roomCount = roomStats.totalRooms.size; const room = eventIndex.currentRoom(); if (room) currentRoom = room.name; } this.setState({ eventIndexSize, eventCount, crawlingRoomsCount, roomCount, currentRoom }); } render() { const brand = _SdkConfig.default.get().brand; let crawlerState; if (this.state.currentRoom === null) { crawlerState = (0, _languageHandler._t)("settings|security|message_search_indexing_idle"); } else { crawlerState = (0, _languageHandler._t)("settings|security|message_search_indexing", { currentRoom: this.state.currentRoom }); } const doneRooms = Math.max(0, this.state.roomCount - this.state.crawlingRoomsCount); const eventIndexingSettings = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("settings|security|message_search_intro", { brand }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsTab_subsectionText" }, crawlerState, /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_space_used"), " ", (0, _FormattingUtils.formatBytes)(this.state.eventIndexSize, 0), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_indexed_messages"), " ", (0, _FormattingUtils.formatCountLong)(this.state.eventCount), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_indexed_rooms"), " ", (0, _languageHandler._t)("settings|security|message_search_room_progress", { doneRooms: (0, _FormattingUtils.formatCountLong)(doneRooms), totalRooms: (0, _FormattingUtils.formatCountLong)(this.state.roomCount) }), " ", /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("settings|security|message_search_sleep_time"), type: "number", value: this.state.crawlerSleepTime.toString(), onChange: this.onCrawlerSleepTimeChange }))); return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { className: "mx_ManageEventIndexDialog", onFinished: this.props.onFinished, title: (0, _languageHandler._t)("settings|security|message_search_section") }, eventIndexingSettings, /*#__PURE__*/_react.default.createElement(_DialogButtons.default, { primaryButton: (0, _languageHandler._t)("action|done"), onPrimaryButtonClick: this.props.onFinished, primaryButtonClass: "primary", cancelButton: (0, _languageHandler._t)("action|disable"), onCancel: this.onDisable, cancelButtonClass: "danger" })); } } exports.default = ManageEventIndexDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2RrQ29uZmlnIiwiX1NldHRpbmdzU3RvcmUiLCJfTW9kYWwiLCJfRm9ybWF0dGluZ1V0aWxzIiwiX0V2ZW50SW5kZXhQZWciLCJfU2V0dGluZ0xldmVsIiwiX0ZpZWxkIiwiX0Jhc2VEaWFsb2ciLCJfRGlhbG9nQnV0dG9ucyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiTWFuYWdlRXZlbnRJbmRleERpYWxvZyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJyb29tIiwiZXZlbnRJbmRleCIsIkV2ZW50SW5kZXhQZWciLCJzdGF0cyIsImdldFN0YXRzIiwiY3VycmVudFJvb20iLCJuYW1lIiwicm9vbVN0YXRzIiwiY3Jhd2xpbmdSb29tcyIsImNyYXdsaW5nUm9vbXNDb3VudCIsInNpemUiLCJyb29tQ291bnQiLCJ0b3RhbFJvb21zIiwic2V0U3RhdGUiLCJldmVudEluZGV4U2l6ZSIsImV2ZW50Q291bnQiLCJEaXNhYmxlRXZlbnRJbmRleERpYWxvZyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwidW5kZWZpbmVkIiwiY3Jhd2xlclNsZWVwVGltZSIsInBhcnNlSW50IiwidGFyZ2V0IiwidmFsdWUiLCJTZXR0aW5nc1N0b3JlIiwic2V0VmFsdWUiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJzdGF0ZSIsImdldFZhbHVlQXQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUxpc3RlbmVyIiwidXBkYXRlQ3VycmVudFJvb20iLCJjb21wb25lbnREaWRNb3VudCIsIm9uIiwicmVuZGVyIiwiYnJhbmQiLCJTZGtDb25maWciLCJjcmF3bGVyU3RhdGUiLCJfdCIsImRvbmVSb29tcyIsIk1hdGgiLCJtYXgiLCJldmVudEluZGV4aW5nU2V0dGluZ3MiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiZm9ybWF0Qnl0ZXMiLCJmb3JtYXRDb3VudExvbmciLCJsYWJlbCIsInR5cGUiLCJ0b1N0cmluZyIsIm9uQ2hhbmdlIiwib25DcmF3bGVyU2xlZXBUaW1lQ2hhbmdlIiwib25GaW5pc2hlZCIsInRpdGxlIiwicHJpbWFyeUJ1dHRvbiIsIm9uUHJpbWFyeUJ1dHRvbkNsaWNrIiwicHJpbWFyeUJ1dHRvbkNsYXNzIiwiY2FuY2VsQnV0dG9uIiwib25DYW5jZWwiLCJvbkRpc2FibGUiLCJjYW5jZWxCdXR0b25DbGFzcyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXN5bmMtY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL2V2ZW50aW5kZXgvTWFuYWdlRXZlbnRJbmRleERpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCB7IGZvcm1hdEJ5dGVzLCBmb3JtYXRDb3VudExvbmcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbHMvRm9ybWF0dGluZ1V0aWxzXCI7XG5pbXBvcnQgRXZlbnRJbmRleFBlZyBmcm9tIFwiLi4vLi4vLi4vLi4vaW5kZXhpbmcvRXZlbnRJbmRleFBlZ1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xldmVsIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdMZXZlbFwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi4vLi4vLi4vLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0RpYWxvZ0J1dHRvbnNcIjtcbmltcG9ydCB7IElJbmRleFN0YXRzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2luZGV4aW5nL0Jhc2VFdmVudEluZGV4TWFuYWdlclwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBvbkZpbmlzaGVkKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGV2ZW50SW5kZXhTaXplOiBudW1iZXI7XG4gICAgZXZlbnRDb3VudDogbnVtYmVyO1xuICAgIGNyYXdsaW5nUm9vbXNDb3VudDogbnVtYmVyO1xuICAgIHJvb21Db3VudDogbnVtYmVyO1xuICAgIGN1cnJlbnRSb29tOiBzdHJpbmcgfCBudWxsO1xuICAgIGNyYXdsZXJTbGVlcFRpbWU6IG51bWJlcjtcbn1cblxuLypcbiAqIEFsbG93cyB0aGUgdXNlciB0byBpbnRyb3NwZWN0IHRoZSBldmVudCBpbmRleCBzdGF0ZSBhbmQgZGlzYWJsZSBpdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFuYWdlRXZlbnRJbmRleERpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZXZlbnRJbmRleFNpemU6IDAsXG4gICAgICAgICAgICBldmVudENvdW50OiAwLFxuICAgICAgICAgICAgY3Jhd2xpbmdSb29tc0NvdW50OiAwLFxuICAgICAgICAgICAgcm9vbUNvdW50OiAwLFxuICAgICAgICAgICAgY3VycmVudFJvb206IG51bGwsXG4gICAgICAgICAgICBjcmF3bGVyU2xlZXBUaW1lOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoU2V0dGluZ0xldmVsLkRFVklDRSwgXCJjcmF3bGVyU2xlZXBUaW1lXCIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDdXJyZW50Um9vbSA9IGFzeW5jIChyb29tOiBSb29tKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBFdmVudEluZGV4UGVnLmdldCgpO1xuICAgICAgICBpZiAoIWV2ZW50SW5kZXgpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRzOiBJSW5kZXhTdGF0cyB8IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdHMgPSBhd2FpdCBldmVudEluZGV4LmdldFN0YXRzKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhpcyBjYWxsIG1heSBmYWlsIGlmIHNwb3JhZGljYWxseSwgbm90IGEgaHVnZSBpc3N1ZSBhcyB3ZSB3aWxsXG4gICAgICAgICAgICAvLyB0cnkgbGF0ZXIgYWdhaW4gYW5kIHByb2JhYmx5IHN1Y2NlZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudFJvb206IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChyb29tKSBjdXJyZW50Um9vbSA9IHJvb20ubmFtZTtcbiAgICAgICAgY29uc3Qgcm9vbVN0YXRzID0gZXZlbnRJbmRleC5jcmF3bGluZ1Jvb21zKCk7XG4gICAgICAgIGNvbnN0IGNyYXdsaW5nUm9vbXNDb3VudCA9IHJvb21TdGF0cy5jcmF3bGluZ1Jvb21zLnNpemU7XG4gICAgICAgIGNvbnN0IHJvb21Db3VudCA9IHJvb21TdGF0cy50b3RhbFJvb21zLnNpemU7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZTogc3RhdHM/LnNpemUgPz8gMCxcbiAgICAgICAgICAgIGV2ZW50Q291bnQ6IHN0YXRzPy5ldmVudENvdW50ID8/IDAsXG4gICAgICAgICAgICBjcmF3bGluZ1Jvb21zQ291bnQ6IGNyYXdsaW5nUm9vbXNDb3VudCxcbiAgICAgICAgICAgIHJvb21Db3VudDogcm9vbUNvdW50LFxuICAgICAgICAgICAgY3VycmVudFJvb206IGN1cnJlbnRSb29tLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gRXZlbnRJbmRleFBlZy5nZXQoKTtcblxuICAgICAgICBpZiAoZXZlbnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbmRleC5yZW1vdmVMaXN0ZW5lcihcImNoYW5nZWRDaGVja3BvaW50XCIsIHRoaXMudXBkYXRlQ3VycmVudFJvb20pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZXZlbnRJbmRleFNpemUgPSAwO1xuICAgICAgICBsZXQgY3Jhd2xpbmdSb29tc0NvdW50ID0gMDtcbiAgICAgICAgbGV0IHJvb21Db3VudCA9IDA7XG4gICAgICAgIGxldCBldmVudENvdW50ID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRSb29tOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gRXZlbnRJbmRleFBlZy5nZXQoKTtcblxuICAgICAgICBpZiAoZXZlbnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbmRleC5vbihcImNoYW5nZWRDaGVja3BvaW50XCIsIHRoaXMudXBkYXRlQ3VycmVudFJvb20pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZXZlbnRJbmRleC5nZXRTdGF0cygpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0cykge1xuICAgICAgICAgICAgICAgICAgICBldmVudEluZGV4U2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQgPSBzdGF0cy5ldmVudENvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBtYXkgZmFpbCBpZiBzcG9yYWRpY2FsbHksIG5vdCBhIGh1Z2UgaXNzdWUgYXMgd2VcbiAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSBsYXRlciBhZ2FpbiBpbiB0aGUgdXBkYXRlQ3VycmVudFJvb20gY2FsbCBhbmRcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBzdWNjZWVkLlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb29tU3RhdHMgPSBldmVudEluZGV4LmNyYXdsaW5nUm9vbXMoKTtcbiAgICAgICAgICAgIGNyYXdsaW5nUm9vbXNDb3VudCA9IHJvb21TdGF0cy5jcmF3bGluZ1Jvb21zLnNpemU7XG4gICAgICAgICAgICByb29tQ291bnQgPSByb29tU3RhdHMudG90YWxSb29tcy5zaXplO1xuXG4gICAgICAgICAgICBjb25zdCByb29tID0gZXZlbnRJbmRleC5jdXJyZW50Um9vbSgpO1xuICAgICAgICAgICAgaWYgKHJvb20pIGN1cnJlbnRSb29tID0gcm9vbS5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZSxcbiAgICAgICAgICAgIGV2ZW50Q291bnQsXG4gICAgICAgICAgICBjcmF3bGluZ1Jvb21zQ291bnQsXG4gICAgICAgICAgICByb29tQ291bnQsXG4gICAgICAgICAgICBjdXJyZW50Um9vbSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRpc2FibGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IERpc2FibGVFdmVudEluZGV4RGlhbG9nID0gKGF3YWl0IGltcG9ydChcIi4vRGlzYWJsZUV2ZW50SW5kZXhEaWFsb2dcIikpLmRlZmF1bHQ7XG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhEaXNhYmxlRXZlbnRJbmRleERpYWxvZywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIC8qIHByaW9yaXR5ID0gKi8gZmFsc2UsIC8qIHN0YXRpYyA9ICovIHRydWUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ3Jhd2xlclNsZWVwVGltZUNoYW5nZSA9IChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3Jhd2xlclNsZWVwVGltZTogcGFyc2VJbnQoZS50YXJnZXQudmFsdWUsIDEwKSB9KTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcImNyYXdsZXJTbGVlcFRpbWVcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gU2RrQ29uZmlnLmdldCgpLmJyYW5kO1xuXG4gICAgICAgIGxldCBjcmF3bGVyU3RhdGU7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRSb29tID09PSBudWxsKSB7XG4gICAgICAgICAgICBjcmF3bGVyU3RhdGUgPSBfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2luZGV4aW5nX2lkbGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmF3bGVyU3RhdGUgPSBfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2luZGV4aW5nXCIsIHsgY3VycmVudFJvb206IHRoaXMuc3RhdGUuY3VycmVudFJvb20gfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkb25lUm9vbXMgPSBNYXRoLm1heCgwLCB0aGlzLnN0YXRlLnJvb21Db3VudCAtIHRoaXMuc3RhdGUuY3Jhd2xpbmdSb29tc0NvdW50KTtcblxuICAgICAgICBjb25zdCBldmVudEluZGV4aW5nU2V0dGluZ3MgPSAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2ludHJvXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TZXR0aW5nc1RhYl9zdWJzZWN0aW9uVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7Y3Jhd2xlclN0YXRlfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfc3BhY2VfdXNlZFwiKX0ge2Zvcm1hdEJ5dGVzKHRoaXMuc3RhdGUuZXZlbnRJbmRleFNpemUsIDApfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfaW5kZXhlZF9tZXNzYWdlc1wiKX0ge2Zvcm1hdENvdW50TG9uZyh0aGlzLnN0YXRlLmV2ZW50Q291bnQpfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfaW5kZXhlZF9yb29tc1wiKX17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX3Jvb21fcHJvZ3Jlc3NcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVJvb21zOiBmb3JtYXRDb3VudExvbmcoZG9uZVJvb21zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUm9vbXM6IGZvcm1hdENvdW50TG9uZyh0aGlzLnN0YXRlLnJvb21Db3VudCksXG4gICAgICAgICAgICAgICAgICAgIH0pfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfc2xlZXBfdGltZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuY3Jhd2xlclNsZWVwVGltZS50b1N0cmluZygpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25DcmF3bGVyU2xlZXBUaW1lQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWFuYWdlRXZlbnRJbmRleERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX3NlY3Rpb25cIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2V2ZW50SW5kZXhpbmdTZXR0aW5nc31cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxkb25lXCIpfVxuICAgICAgICAgICAgICAgICAgICBvblByaW1hcnlCdXR0b25DbGljaz17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uQ2xhc3M9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPXtfdChcImFjdGlvbnxkaXNhYmxlXCIpfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkRpc2FibGV9XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNsYXNzPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAg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