matrix-react-sdk
Version:
SDK for matrix.org using React
162 lines (145 loc) • 18.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ReleaseAnnouncementStore = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _lodash = require("lodash");
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var _SettingLevel = require("../settings/SettingLevel");
var _Settings = require("../settings/Settings");
/*
* Copyright 2024 New Vector Ltd.
* Copyright 2024 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.
*/
/**
* The features are shown in the array order.
*/
const FEATURES = ["threadsActivityCentre", "pinningMessageList"];
/**
* All the features that can be shown in the release announcements.
*/
/**
* The stored settings for the release announcements.
* The boolean is at true when the user has viewed the feature
*/
/**
* The events emitted by the ReleaseAnnouncementStore.
*/
/**
* The handlers for the ReleaseAnnouncementStore events.
*/
/**
* The ReleaseAnnouncementStore is responsible for managing the release announcements.
* It keeps track of the viewed release announcements and emits events when the release announcement changes.
*/
class ReleaseAnnouncementStore extends _matrix.TypedEventEmitter {
/**
* The singleton instance of the ReleaseAnnouncementStore.
*/
static get instance() {
if (!ReleaseAnnouncementStore.internalInstance) {
ReleaseAnnouncementStore.internalInstance = new ReleaseAnnouncementStore();
}
return ReleaseAnnouncementStore.internalInstance;
}
/**
* Should be used only for testing purposes.
* @internal
*/
constructor() {
super();
/**
* The index of the feature to show.
* @private
*/
(0, _defineProperty2.default)(this, "index", 0);
_SettingsStore.default.watchSetting("releaseAnnouncementData", null, () => {
this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement());
});
}
/**
* Get the viewed release announcements from the settings.
* @private
*/
getViewedReleaseAnnouncements() {
// Clone the settings to avoid to mutate the internal stored value in the SettingsStore
return (0, _lodash.cloneDeep)(_SettingsStore.default.getValue("releaseAnnouncementData"));
}
/**
* Check if the release announcement is enabled.
* @private
*/
isReleaseAnnouncementEnabled() {
return _SettingsStore.default.getValue(_Settings.Features.ReleaseAnnouncement);
}
/**
* Get the release announcement that should be displayed
* @returns The feature to announce or null if there is no feature to announce
*/
getReleaseAnnouncement() {
// Do nothing if the release announcement is disabled
const isReleaseAnnouncementEnabled = this.isReleaseAnnouncementEnabled();
if (!isReleaseAnnouncementEnabled) return null;
const viewedReleaseAnnouncements = this.getViewedReleaseAnnouncements();
// Find the first feature that has not been viewed
for (let i = this.index; i < FEATURES.length; i++) {
if (!viewedReleaseAnnouncements[FEATURES[i]]) {
this.index = i;
return FEATURES[this.index];
}
}
// All features have been viewed
return null;
}
/**
* Mark the current release announcement as viewed.
* This will update the account settings
* @private
*/
async markReleaseAnnouncementAsViewed() {
// Do nothing if the release announcement is disabled
const isReleaseAnnouncementEnabled = this.isReleaseAnnouncementEnabled();
if (!isReleaseAnnouncementEnabled) return;
const viewedReleaseAnnouncements = this.getViewedReleaseAnnouncements();
// If the index is out of bounds, do nothing
// Normally it shouldn't happen, but it's better to be safe
const feature = FEATURES[this.index];
if (!feature) return;
// Mark the feature as viewed
viewedReleaseAnnouncements[FEATURES[this.index]] = true;
this.index++;
// Do sanity check if we can store the new value in the settings
const isSupported = _SettingsStore.default.isLevelSupported(_SettingLevel.SettingLevel.ACCOUNT);
if (!isSupported) return;
const canSetValue = _SettingsStore.default.canSetValue("releaseAnnouncementData", null, _SettingLevel.SettingLevel.ACCOUNT);
if (canSetValue) {
try {
await _SettingsStore.default.setValue("releaseAnnouncementData", null, _SettingLevel.SettingLevel.ACCOUNT, viewedReleaseAnnouncements);
} catch (e) {
_logger.logger.log("Failed to set release announcement settings", e);
}
}
}
/**
* Mark the current release announcement as viewed and move to the next release announcement.
* This will update the account settings and emit the `releaseAnnouncementChanged` event
*/
async nextReleaseAnnouncement() {
await this.markReleaseAnnouncementAsViewed();
this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement());
}
}
exports.ReleaseAnnouncementStore = ReleaseAnnouncementStore;
/**
* The singleton instance of the ReleaseAnnouncementStore.
* @private
*/
(0, _defineProperty2.default)(ReleaseAnnouncementStore, "internalInstance", void 0);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfbG9kYXNoIiwiX1NldHRpbmdzU3RvcmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1NldHRpbmdMZXZlbCIsIl9TZXR0aW5ncyIsIkZFQVRVUkVTIiwiUmVsZWFzZUFubm91bmNlbWVudFN0b3JlIiwiVHlwZWRFdmVudEVtaXR0ZXIiLCJpbnN0YW5jZSIsImludGVybmFsSW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiU2V0dGluZ3NTdG9yZSIsIndhdGNoU2V0dGluZyIsImVtaXQiLCJnZXRSZWxlYXNlQW5ub3VuY2VtZW50IiwiZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMiLCJjbG9uZURlZXAiLCJnZXRWYWx1ZSIsImlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQiLCJGZWF0dXJlcyIsIlJlbGVhc2VBbm5vdW5jZW1lbnQiLCJ2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyIsImkiLCJpbmRleCIsImxlbmd0aCIsIm1hcmtSZWxlYXNlQW5ub3VuY2VtZW50QXNWaWV3ZWQiLCJmZWF0dXJlIiwiaXNTdXBwb3J0ZWQiLCJpc0xldmVsU3VwcG9ydGVkIiwiU2V0dGluZ0xldmVsIiwiQUNDT1VOVCIsImNhblNldFZhbHVlIiwic2V0VmFsdWUiLCJlIiwibG9nZ2VyIiwibG9nIiwibmV4dFJlbGVhc2VBbm5vdW5jZW1lbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9SZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuICogQ29weXJpZ2h0IDIwMjQgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcbiAqIFBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4gKi9cblxuaW1wb3J0IHsgVHlwZWRFdmVudEVtaXR0ZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XG5cbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGV2ZWwgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ0xldmVsXCI7XG5pbXBvcnQgeyBGZWF0dXJlcyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1wiO1xuXG4vKipcbiAqIFRoZSBmZWF0dXJlcyBhcmUgc2hvd24gaW4gdGhlIGFycmF5IG9yZGVyLlxuICovXG5jb25zdCBGRUFUVVJFUyA9IFtcInRocmVhZHNBY3Rpdml0eUNlbnRyZVwiLCBcInBpbm5pbmdNZXNzYWdlTGlzdFwiXSBhcyBjb25zdDtcbi8qKlxuICogQWxsIHRoZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBzaG93biBpbiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlID0gKHR5cGVvZiBGRUFUVVJFUylbbnVtYmVyXTtcbi8qKlxuICogVGhlIHN0b3JlZCBzZXR0aW5ncyBmb3IgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50cy5cbiAqIFRoZSBib29sZWFuIGlzIGF0IHRydWUgd2hlbiB0aGUgdXNlciBoYXMgdmlld2VkIHRoZSBmZWF0dXJlXG4gKi9cbnR5cGUgU3RvcmVkU2V0dGluZ3MgPSBSZWNvcmQ8RmVhdHVyZSwgYm9vbGVhbj47XG5cbi8qKlxuICogVGhlIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUuXG4gKi9cbnR5cGUgUmVsZWFzZUFubm91bmNlbWVudFN0b3JlRXZlbnRzID0gXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiO1xuLyoqXG4gKiBUaGUgaGFuZGxlcnMgZm9yIHRoZSBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUgZXZlbnRzLlxuICovXG50eXBlIEhhbmRsZXJNYXAgPSB7XG4gICAgcmVsZWFzZUFubm91bmNlbWVudENoYW5nZWQ6IChuZXdGZWF0dXJlOiBGZWF0dXJlIHwgbnVsbCkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogVGhlIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50cy5cbiAqIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSB2aWV3ZWQgcmVsZWFzZSBhbm5vdW5jZW1lbnRzIGFuZCBlbWl0cyBldmVudHMgd2hlbiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSBleHRlbmRzIFR5cGVkRXZlbnRFbWl0dGVyPFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZUV2ZW50cywgSGFuZGxlck1hcD4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGludGVybmFsSW5zdGFuY2U6IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGZlYXR1cmUgdG8gc2hvdy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgUmVsZWFzZUFubm91bmNlbWVudFN0b3JlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSB7XG4gICAgICAgIGlmICghUmVsZWFzZUFubm91bmNlbWVudFN0b3JlLmludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZS5pbnRlcm5hbEluc3RhbmNlID0gbmV3IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUuaW50ZXJuYWxJbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG91bGQgYmUgdXNlZCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXCJyZWxlYXNlQW5ub3VuY2VtZW50RGF0YVwiLCBudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiLCB0aGlzLmdldFJlbGVhc2VBbm5vdW5jZW1lbnQoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmlld2VkIHJlbGVhc2UgYW5ub3VuY2VtZW50cyBmcm9tIHRoZSBzZXR0aW5ncy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTogU3RvcmVkU2V0dGluZ3Mge1xuICAgICAgICAvLyBDbG9uZSB0aGUgc2V0dGluZ3MgdG8gYXZvaWQgdG8gbXV0YXRlIHRoZSBpbnRlcm5hbCBzdG9yZWQgdmFsdWUgaW4gdGhlIFNldHRpbmdzU3RvcmVcbiAgICAgICAgcmV0dXJuIGNsb25lRGVlcChTZXR0aW5nc1N0b3JlLmdldFZhbHVlPFN0b3JlZFNldHRpbmdzPihcInJlbGVhc2VBbm5vdW5jZW1lbnREYXRhXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgaXMgZW5hYmxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFNldHRpbmdzU3RvcmUuZ2V0VmFsdWU8Ym9vbGVhbj4oRmVhdHVyZXMuUmVsZWFzZUFubm91bmNlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWxlYXNlIGFubm91bmNlbWVudCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZSB0byBhbm5vdW5jZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGZlYXR1cmUgdG8gYW5ub3VuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmVsZWFzZUFubm91bmNlbWVudCgpOiBGZWF0dXJlIHwgbnVsbCB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50IGlzIGRpc2FibGVkXG4gICAgICAgIGNvbnN0IGlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQgPSB0aGlzLmlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQoKTtcbiAgICAgICAgaWYgKCFpc1JlbGVhc2VBbm5vdW5jZW1lbnRFbmFibGVkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyA9IHRoaXMuZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBmZWF0dXJlIHRoYXQgaGFzIG5vdCBiZWVuIHZpZXdlZFxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IEZFQVRVUkVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzW0ZFQVRVUkVTW2ldXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFU1t0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGJlZW4gdmlld2VkXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGN1cnJlbnQgcmVsZWFzZSBhbm5vdW5jZW1lbnQgYXMgdmlld2VkLlxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFjY291bnQgc2V0dGluZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFya1JlbGVhc2VBbm5vdW5jZW1lbnRBc1ZpZXdlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgaXMgZGlzYWJsZWRcbiAgICAgICAgY29uc3QgaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCA9IHRoaXMuaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCgpO1xuICAgICAgICBpZiAoIWlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCB2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyA9IHRoaXMuZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTtcblxuICAgICAgICAvLyBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgZG8gbm90aGluZ1xuICAgICAgICAvLyBOb3JtYWxseSBpdCBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZVxuICAgICAgICBjb25zdCBmZWF0dXJlID0gRkVBVFVSRVNbdGhpcy5pbmRleF07XG4gICAgICAgIGlmICghZmVhdHVyZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1hcmsgdGhlIGZlYXR1cmUgYXMgdmlld2VkXG4gICAgICAgIHZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzW0ZFQVRVUkVTW3RoaXMuaW5kZXhdXSA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcblxuICAgICAgICAvLyBEbyBzYW5pdHkgY2hlY2sgaWYgd2UgY2FuIHN0b3JlIHRoZSBuZXcgdmFsdWUgaW4gdGhlIHNldHRpbmdzXG4gICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gU2V0dGluZ3NTdG9yZS5pc0xldmVsU3VwcG9ydGVkKFNldHRpbmdMZXZlbC5BQ0NPVU5UKTtcbiAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNhblNldFZhbHVlID0gU2V0dGluZ3NTdG9yZS5jYW5TZXRWYWx1ZShcInJlbGVhc2VBbm5vdW5jZW1lbnREYXRhXCIsIG51bGwsIFNldHRpbmdMZXZlbC5BQ0NPVU5UKTtcbiAgICAgICAgaWYgKGNhblNldFZhbHVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIFwicmVsZWFzZUFubm91bmNlbWVudERhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgU2V0dGluZ0xldmVsLkFDQ09VTlQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkZhaWxlZCB0byBzZXQgcmVsZWFzZSBhbm5vdW5jZW1lbnQgc2V0dGluZ3NcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoZSBjdXJyZW50IHJlbGVhc2UgYW5ub3VuY2VtZW50IGFzIHZpZXdlZCBhbmQgbW92ZSB0byB0aGUgbmV4dCByZWxlYXNlIGFubm91bmNlbWVudC5cbiAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhY2NvdW50IHNldHRpbmdzIGFuZCBlbWl0IHRoZSBgcmVsZWFzZUFubm91bmNlbWVudENoYW5nZWRgIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHRSZWxlYXNlQW5ub3VuY2VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm1hcmtSZWxlYXNlQW5ub3VuY2VtZW50QXNWaWV3ZWQoKTtcblxuICAgICAgICB0aGlzLmVtaXQoXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiLCB0aGlzLmdldFJlbGVhc2VBbm5vdW5jZW1lbnQoKSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVVBO0FBQ0E7QUFDQTtBQUNBLE1BQU1PLFFBQVEsR0FBRyxDQUFDLHVCQUF1QixFQUFFLG9CQUFvQixDQUFVO0FBQ3pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsd0JBQXdCLFNB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