matrix-react-sdk
Version:
SDK for matrix.org using React
166 lines (164 loc) • 34.3 kB
JavaScript
;
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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