matrix-react-sdk
Version:
SDK for matrix.org using React
181 lines (170 loc) • 20.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.EventIndexPeg = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _logger = require("matrix-js-sdk/src/logger");
var _PlatformPeg = _interopRequireDefault(require("../PlatformPeg"));
var _EventIndex = _interopRequireDefault(require("../indexing/EventIndex"));
var _MatrixClientPeg = require("../MatrixClientPeg");
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var _SettingLevel = require("../settings/SettingLevel");
/*
Copyright 2024 New Vector Ltd.
Copyright 2019-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.
*/
/*
* Object holding the global EventIndex object. Can only be initialized if the
* platform supports event indexing.
*/
const INDEX_VERSION = 1;
/**
* Holds the current instance of the `EventIndex` to use across the codebase.
* Looking for an `EventIndex`? Just look for the `EventIndexPeg` on the peg
* board. "Peg" is the literal meaning of something you hang something on. So
* you'll find a `EventIndex` hanging on the `EventIndexPeg`.
*/
class EventIndexPeg {
constructor() {
(0, _defineProperty2.default)(this, "index", null);
(0, _defineProperty2.default)(this, "error", void 0);
(0, _defineProperty2.default)(this, "_supportIsInstalled", false);
}
/**
* Initialize the EventIndexPeg and if event indexing is enabled initialize
* the event index.
*
* @return {Promise<boolean>} A promise that will resolve to true if an
* EventIndex was successfully initialized, false otherwise.
*/
async init() {
const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager();
if (!indexManager) {
_logger.logger.log("EventIndex: Platform doesn't support event indexing, not initializing.");
return false;
}
this._supportIsInstalled = await indexManager.supportsEventIndexing();
if (!this.supportIsInstalled()) {
_logger.logger.log("EventIndex: Event indexing isn't installed for the platform, not initializing.");
return false;
}
if (!_SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "enableEventIndexing")) {
_logger.logger.log("EventIndex: Event indexing is disabled, not initializing");
return false;
}
return this.initEventIndex();
}
/**
* Initialize the event index.
*
* @returns {boolean} True if the event index was successfully initialized,
* false otherwise.
*/
async initEventIndex() {
const index = new _EventIndex.default();
const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager();
const client = _MatrixClientPeg.MatrixClientPeg.get();
if (!indexManager || !client) {
throw new Error("Unable to init event index");
}
const userId = client.getUserId();
const deviceId = client.getDeviceId();
try {
await indexManager.initEventIndex(userId, deviceId);
const userVersion = await indexManager.getUserVersion();
const eventIndexIsEmpty = await indexManager.isEventIndexEmpty();
if (eventIndexIsEmpty) {
await indexManager.setUserVersion(INDEX_VERSION);
} else if (userVersion === 0 && !eventIndexIsEmpty) {
await indexManager.closeEventIndex();
await this.deleteEventIndex();
await indexManager.initEventIndex(userId, deviceId);
await indexManager.setUserVersion(INDEX_VERSION);
}
_logger.logger.log("EventIndex: Successfully initialized the event index");
await index.init();
} catch (e) {
_logger.logger.log("EventIndex: Error initializing the event index", e);
this.error = e;
return false;
}
this.index = index;
return true;
}
/**
* Check if the current platform has support for event indexing.
*
* @return {boolean} True if it has support, false otherwise. Note that this
* does not mean that support is installed.
*/
platformHasSupport() {
return _PlatformPeg.default.get()?.getEventIndexingManager() != null;
}
/**
* Check if event indexing support is installed for the platform.
*
* Event indexing might require additional optional modules to be installed,
* this tells us if those are installed. Note that this should only be
* called after the init() method was called.
*
* @return {boolean} True if support is installed, false otherwise.
*/
supportIsInstalled() {
return this._supportIsInstalled;
}
/**
* Get the current event index.
*
* @return {EventIndex} The current event index.
*/
get() {
return this.index;
}
start() {
if (this.index === null) return;
this.index.startCrawler();
}
stop() {
if (this.index === null) return;
this.index.stopCrawler();
}
/**
* Unset our event store
*
* After a call to this the init() method will need to be called again.
*
* @return {Promise} A promise that will resolve once the event index is
* closed.
*/
async unset() {
if (this.index === null) return;
await this.index.close();
this.index = null;
}
/**
* Delete our event indexer.
*
* After a call to this the init() method will need to be called again.
*
* @return {Promise} A promise that will resolve once the event index is
* deleted.
*/
async deleteEventIndex() {
const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager();
if (indexManager) {
await this.unset();
_logger.logger.log("EventIndex: Deleting event index.");
await indexManager.deleteEventIndex();
}
}
}
exports.EventIndexPeg = EventIndexPeg;
if (!window.mxEventIndexPeg) {
window.mxEventIndexPeg = new EventIndexPeg();
}
var _default = exports.default = window.mxEventIndexPeg;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9QbGF0Zm9ybVBlZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfRXZlbnRJbmRleCIsIl9NYXRyaXhDbGllbnRQZWciLCJfU2V0dGluZ3NTdG9yZSIsIl9TZXR0aW5nTGV2ZWwiLCJJTkRFWF9WRVJTSU9OIiwiRXZlbnRJbmRleFBlZyIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJpbml0IiwiaW5kZXhNYW5hZ2VyIiwiUGxhdGZvcm1QZWciLCJnZXQiLCJnZXRFdmVudEluZGV4aW5nTWFuYWdlciIsImxvZ2dlciIsImxvZyIsIl9zdXBwb3J0SXNJbnN0YWxsZWQiLCJzdXBwb3J0c0V2ZW50SW5kZXhpbmciLCJzdXBwb3J0SXNJbnN0YWxsZWQiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWVBdCIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsImluaXRFdmVudEluZGV4IiwiaW5kZXgiLCJFdmVudEluZGV4IiwiY2xpZW50IiwiTWF0cml4Q2xpZW50UGVnIiwiRXJyb3IiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJkZXZpY2VJZCIsImdldERldmljZUlkIiwidXNlclZlcnNpb24iLCJnZXRVc2VyVmVyc2lvbiIsImV2ZW50SW5kZXhJc0VtcHR5IiwiaXNFdmVudEluZGV4RW1wdHkiLCJzZXRVc2VyVmVyc2lvbiIsImNsb3NlRXZlbnRJbmRleCIsImRlbGV0ZUV2ZW50SW5kZXgiLCJlIiwiZXJyb3IiLCJwbGF0Zm9ybUhhc1N1cHBvcnQiLCJzdGFydCIsInN0YXJ0Q3Jhd2xlciIsInN0b3AiLCJzdG9wQ3Jhd2xlciIsInVuc2V0IiwiY2xvc2UiLCJleHBvcnRzIiwid2luZG93IiwibXhFdmVudEluZGV4UGVnIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhpbmcvRXZlbnRJbmRleFBlZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbi8qXG4gKiBPYmplY3QgaG9sZGluZyB0aGUgZ2xvYmFsIEV2ZW50SW5kZXggb2JqZWN0LiBDYW4gb25seSBiZSBpbml0aWFsaXplZCBpZiB0aGVcbiAqIHBsYXRmb3JtIHN1cHBvcnRzIGV2ZW50IGluZGV4aW5nLlxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IFBsYXRmb3JtUGVnIGZyb20gXCIuLi9QbGF0Zm9ybVBlZ1wiO1xuaW1wb3J0IEV2ZW50SW5kZXggZnJvbSBcIi4uL2luZGV4aW5nL0V2ZW50SW5kZXhcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGV2ZWwgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ0xldmVsXCI7XG5cbmNvbnN0IElOREVYX1ZFUlNJT04gPSAxO1xuXG4vKipcbiAqIEhvbGRzIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBgRXZlbnRJbmRleGAgdG8gdXNlIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKiBMb29raW5nIGZvciBhbiBgRXZlbnRJbmRleGA/IEp1c3QgbG9vayBmb3IgdGhlIGBFdmVudEluZGV4UGVnYCBvbiB0aGUgcGVnXG4gKiBib2FyZC4gXCJQZWdcIiBpcyB0aGUgbGl0ZXJhbCBtZWFuaW5nIG9mIHNvbWV0aGluZyB5b3UgaGFuZyBzb21ldGhpbmcgb24uIFNvXG4gKiB5b3UnbGwgZmluZCBhIGBFdmVudEluZGV4YCBoYW5naW5nIG9uIHRoZSBgRXZlbnRJbmRleFBlZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEluZGV4UGVnIHtcbiAgICBwdWJsaWMgaW5kZXg6IEV2ZW50SW5kZXggfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZXJyb3I6IHVua25vd247XG5cbiAgICBwcml2YXRlIF9zdXBwb3J0SXNJbnN0YWxsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIEV2ZW50SW5kZXhQZWcgYW5kIGlmIGV2ZW50IGluZGV4aW5nIGlzIGVuYWJsZWQgaW5pdGlhbGl6ZVxuICAgICAqIHRoZSBldmVudCBpbmRleC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB0byB0cnVlIGlmIGFuXG4gICAgICogRXZlbnRJbmRleCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGluaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBsYXRmb3JtUGVnLmdldCgpPy5nZXRFdmVudEluZGV4aW5nTWFuYWdlcigpO1xuICAgICAgICBpZiAoIWluZGV4TWFuYWdlcikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkV2ZW50SW5kZXg6IFBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBldmVudCBpbmRleGluZywgbm90IGluaXRpYWxpemluZy5cIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdXBwb3J0SXNJbnN0YWxsZWQgPSBhd2FpdCBpbmRleE1hbmFnZXIuc3VwcG9ydHNFdmVudEluZGV4aW5nKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRJc0luc3RhbGxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXZlbnQgaW5kZXhpbmcgaXNuJ3QgaW5zdGFsbGVkIGZvciB0aGUgcGxhdGZvcm0sIG5vdCBpbml0aWFsaXppbmcuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoU2V0dGluZ0xldmVsLkRFVklDRSwgXCJlbmFibGVFdmVudEluZGV4aW5nXCIpKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXZlbnQgaW5kZXhpbmcgaXMgZGlzYWJsZWQsIG5vdCBpbml0aWFsaXppbmdcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0RXZlbnRJbmRleCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGV2ZW50IGluZGV4LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGluZGV4IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBpbml0RXZlbnRJbmRleCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBuZXcgRXZlbnRJbmRleCgpO1xuICAgICAgICBjb25zdCBpbmRleE1hbmFnZXIgPSBQbGF0Zm9ybVBlZy5nZXQoKT8uZ2V0RXZlbnRJbmRleGluZ01hbmFnZXIoKTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gTWF0cml4Q2xpZW50UGVnLmdldCgpO1xuICAgICAgICBpZiAoIWluZGV4TWFuYWdlciB8fCAhY2xpZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gaW5pdCBldmVudCBpbmRleFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGNsaWVudC5nZXRVc2VySWQoKSE7XG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gY2xpZW50LmdldERldmljZUlkKCkhO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuaW5pdEV2ZW50SW5kZXgodXNlcklkLCBkZXZpY2VJZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXJWZXJzaW9uID0gYXdhaXQgaW5kZXhNYW5hZ2VyLmdldFVzZXJWZXJzaW9uKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudEluZGV4SXNFbXB0eSA9IGF3YWl0IGluZGV4TWFuYWdlci5pc0V2ZW50SW5kZXhFbXB0eSgpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRJbmRleElzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuc2V0VXNlclZlcnNpb24oSU5ERVhfVkVSU0lPTik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJWZXJzaW9uID09PSAwICYmICFldmVudEluZGV4SXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5jbG9zZUV2ZW50SW5kZXgoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUV2ZW50SW5kZXgoKTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5pbml0RXZlbnRJbmRleCh1c2VySWQsIGRldmljZUlkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuc2V0VXNlclZlcnNpb24oSU5ERVhfVkVSU0lPTik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZ2dlci5sb2coXCJFdmVudEluZGV4OiBTdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIGV2ZW50IGluZGV4XCIpO1xuICAgICAgICAgICAgYXdhaXQgaW5kZXguaW5pdCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBldmVudCBpbmRleFwiLCBlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzdXBwb3J0IGZvciBldmVudCBpbmRleGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaGFzIHN1cHBvcnQsIGZhbHNlIG90aGVyd2lzZS4gTm90ZSB0aGF0IHRoaXNcbiAgICAgKiBkb2VzIG5vdCBtZWFuIHRoYXQgc3VwcG9ydCBpcyBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgcHVibGljIHBsYXRmb3JtSGFzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtUGVnLmdldCgpPy5nZXRFdmVudEluZGV4aW5nTWFuYWdlcigpICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZXZlbnQgaW5kZXhpbmcgc3VwcG9ydCBpcyBpbnN0YWxsZWQgZm9yIHRoZSBwbGF0Zm9ybS5cbiAgICAgKlxuICAgICAqIEV2ZW50IGluZGV4aW5nIG1pZ2h0IHJlcXVpcmUgYWRkaXRpb25hbCBvcHRpb25hbCBtb2R1bGVzIHRvIGJlIGluc3RhbGxlZCxcbiAgICAgKiB0aGlzIHRlbGxzIHVzIGlmIHRob3NlIGFyZSBpbnN0YWxsZWQuIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlXG4gICAgICogY2FsbGVkIGFmdGVyIHRoZSBpbml0KCkgbWV0aG9kIHdhcyBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRJc0luc3RhbGxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRJc0luc3RhbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZXZlbnQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtFdmVudEluZGV4fSBUaGUgY3VycmVudCBldmVudCBpbmRleC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KCk6IEV2ZW50SW5kZXggfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4LnN0YXJ0Q3Jhd2xlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4LnN0b3BDcmF3bGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5zZXQgb3VyIGV2ZW50IHN0b3JlXG4gICAgICpcbiAgICAgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyB0aGUgaW5pdCgpIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkIGFnYWluLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIGV2ZW50IGluZGV4IGlzXG4gICAgICogY2xvc2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5jbG9zZSgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgb3VyIGV2ZW50IGluZGV4ZXIuXG4gICAgICpcbiAgICAgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyB0aGUgaW5pdCgpIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkIGFnYWluLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIGV2ZW50IGluZGV4IGlzXG4gICAgICogZGVsZXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlRXZlbnRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gUGxhdGZvcm1QZWcuZ2V0KCk/LmdldEV2ZW50SW5kZXhpbmdNYW5hZ2VyKCk7XG5cbiAgICAgICAgaWYgKGluZGV4TWFuYWdlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51bnNldCgpO1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkV2ZW50SW5kZXg6IERlbGV0aW5nIGV2ZW50IGluZGV4LlwiKTtcbiAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5kZWxldGVFdmVudEluZGV4KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmlmICghd2luZG93Lm14RXZlbnRJbmRleFBlZykge1xuICAgIHdpbmRvdy5teEV2ZW50SW5kZXhQZWcgPSBuZXcgRXZlbnRJbmRleFBlZygpO1xufVxuZXhwb3J0IGRlZmF1bHQgd2luZG93Lm14RXZlbnRJbmRleFBlZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFhQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxZQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7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