matrix-react-sdk
Version:
SDK for matrix.org using React
128 lines (120 loc) • 19.5 kB
JavaScript
"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 _matrix = require("matrix-js-sdk/src/matrix");
var _utils = require("matrix-js-sdk/src/utils");
var _MatrixClientBackedSettingsHandler = _interopRequireDefault(require("./MatrixClientBackedSettingsHandler"));
var _objects = require("../../utils/objects");
var _SettingLevel = require("../SettingLevel");
/*
Copyright 2024 New Vector Ltd.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Copyright 2017 Travis Ralston
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const ALLOWED_WIDGETS_EVENT_TYPE = "im.vector.setting.allowed_widgets";
const DEFAULT_SETTINGS_EVENT_TYPE = "im.vector.web.settings";
/**
* Gets and sets settings at the "room-account" level for the current user.
*/
class RoomAccountSettingsHandler extends _MatrixClientBackedSettingsHandler.default {
constructor(watchers) {
super();
(0, _defineProperty2.default)(this, "onAccountData", (event, room, prevEvent) => {
const roomId = room.roomId;
if (event.getType() === "org.matrix.room.preview_urls") {
let val = event.getContent()["disable"];
if (typeof val !== "boolean") {
val = null;
} else {
val = !val;
}
this.watchers.notifyUpdate("urlPreviewsEnabled", roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, val);
} else if (event.getType() === DEFAULT_SETTINGS_EVENT_TYPE) {
// Figure out what changed and fire those updates
const prevContent = prevEvent?.getContent() ?? {};
const changedSettings = (0, _objects.objectKeyChanges)(prevContent, event.getContent());
for (const settingName of changedSettings) {
const val = event.getContent()[settingName];
this.watchers.notifyUpdate(settingName, roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, val);
}
} else if (event.getType() === ALLOWED_WIDGETS_EVENT_TYPE) {
this.watchers.notifyUpdate("allowedWidgets", roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, event.getContent());
}
});
this.watchers = watchers;
}
initMatrixClient(oldClient, newClient) {
if (oldClient) {
oldClient.removeListener(_matrix.RoomEvent.AccountData, this.onAccountData);
}
newClient.on(_matrix.RoomEvent.AccountData, this.onAccountData);
}
getValue(settingName, roomId) {
// Special case URL previews
if (settingName === "urlPreviewsEnabled") {
const content = this.getSettings(roomId, "org.matrix.room.preview_urls") || {};
// Check to make sure that we actually got a boolean
if (typeof content["disable"] !== "boolean") return null;
return !content["disable"];
}
// Special case allowed widgets
if (settingName === "allowedWidgets") {
return this.getSettings(roomId, ALLOWED_WIDGETS_EVENT_TYPE);
}
const settings = this.getSettings(roomId) || {};
return settings[settingName];
}
// helper function to send room account data then await it being echoed back
async setRoomAccountData(roomId, eventType, field, value) {
let content;
if (field === null) {
content = value;
} else {
content = this.getSettings(roomId, eventType) || {};
content[field] = value;
}
await this.client.setRoomAccountData(roomId, eventType, content);
const deferred = (0, _utils.defer)();
const handler = (event, room) => {
if (room.roomId !== roomId || event.getType() !== eventType) return;
if (field !== null && event.getContent()[field] !== value) return;
this.client.off(_matrix.RoomEvent.AccountData, handler);
deferred.resolve();
};
this.client.on(_matrix.RoomEvent.AccountData, handler);
await deferred.promise;
}
setValue(settingName, roomId, newValue) {
switch (settingName) {
// Special case URL previews
case "urlPreviewsEnabled":
return this.setRoomAccountData(roomId, "org.matrix.room.preview_urls", "disable", !newValue);
// Special case allowed widgets
case "allowedWidgets":
return this.setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, null, newValue);
default:
return this.setRoomAccountData(roomId, DEFAULT_SETTINGS_EVENT_TYPE, settingName, newValue);
}
}
canSetValue(settingName, roomId) {
// If they have the room, they can set their own account data
return !!this.client.getRoom(roomId);
}
isSupported() {
return this.client && !this.client.isGuest();
}
getSettings(roomId, eventType = DEFAULT_SETTINGS_EVENT_TYPE) {
// TODO: [TS] Type return
const event = this.client.getRoom(roomId)?.getAccountData(eventType);
if (!event || !event.getContent()) return null;
return (0, _objects.objectClone)(event.getContent()); // clone to prevent mutation
}
}
exports.default = RoomAccountSettingsHandler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl91dGlscyIsIl9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX29iamVjdHMiLCJfU2V0dGluZ0xldmVsIiwiQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUiLCJERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUiLCJSb29tQWNjb3VudFNldHRpbmdzSGFuZGxlciIsIk1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciIsImNvbnN0cnVjdG9yIiwid2F0Y2hlcnMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImV2ZW50Iiwicm9vbSIsInByZXZFdmVudCIsInJvb21JZCIsImdldFR5cGUiLCJ2YWwiLCJnZXRDb250ZW50Iiwibm90aWZ5VXBkYXRlIiwiU2V0dGluZ0xldmVsIiwiUk9PTV9BQ0NPVU5UIiwicHJldkNvbnRlbnQiLCJjaGFuZ2VkU2V0dGluZ3MiLCJvYmplY3RLZXlDaGFuZ2VzIiwic2V0dGluZ05hbWUiLCJpbml0TWF0cml4Q2xpZW50Iiwib2xkQ2xpZW50IiwibmV3Q2xpZW50IiwicmVtb3ZlTGlzdGVuZXIiLCJSb29tRXZlbnQiLCJBY2NvdW50RGF0YSIsIm9uQWNjb3VudERhdGEiLCJvbiIsImdldFZhbHVlIiwiY29udGVudCIsImdldFNldHRpbmdzIiwic2V0dGluZ3MiLCJzZXRSb29tQWNjb3VudERhdGEiLCJldmVudFR5cGUiLCJmaWVsZCIsInZhbHVlIiwiY2xpZW50IiwiZGVmZXJyZWQiLCJkZWZlciIsImhhbmRsZXIiLCJvZmYiLCJyZXNvbHZlIiwicHJvbWlzZSIsInNldFZhbHVlIiwibmV3VmFsdWUiLCJjYW5TZXRWYWx1ZSIsImdldFJvb20iLCJpc1N1cHBvcnRlZCIsImlzR3Vlc3QiLCJnZXRBY2NvdW50RGF0YSIsIm9iamVjdENsb25lIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9Sb29tQWNjb3VudFNldHRpbmdzSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTcgVHJhdmlzIFJhbHN0b25cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50LCBNYXRyaXhFdmVudCwgUm9vbSwgUm9vbUV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgZGVmZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcblxuaW1wb3J0IE1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciBmcm9tIFwiLi9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXJcIjtcbmltcG9ydCB7IG9iamVjdENsb25lLCBvYmplY3RLZXlDaGFuZ2VzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdHNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IFdhdGNoTWFuYWdlciB9IGZyb20gXCIuLi9XYXRjaE1hbmFnZXJcIjtcblxuY29uc3QgQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUgPSBcImltLnZlY3Rvci5zZXR0aW5nLmFsbG93ZWRfd2lkZ2V0c1wiO1xuY29uc3QgREVGQVVMVF9TRVRUSU5HU19FVkVOVF9UWVBFID0gXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCI7XG5cbi8qKlxuICogR2V0cyBhbmQgc2V0cyBzZXR0aW5ncyBhdCB0aGUgXCJyb29tLWFjY291bnRcIiBsZXZlbCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUFjY291bnRTZXR0aW5nc0hhbmRsZXIgZXh0ZW5kcyBNYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgd2F0Y2hlcnM6IFdhdGNoTWFuYWdlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0TWF0cml4Q2xpZW50KG9sZENsaWVudDogTWF0cml4Q2xpZW50LCBuZXdDbGllbnQ6IE1hdHJpeENsaWVudCk6IHZvaWQge1xuICAgICAgICBpZiAob2xkQ2xpZW50KSB7XG4gICAgICAgICAgICBvbGRDbGllbnQucmVtb3ZlTGlzdGVuZXIoUm9vbUV2ZW50LkFjY291bnREYXRhLCB0aGlzLm9uQWNjb3VudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2xpZW50Lm9uKFJvb21FdmVudC5BY2NvdW50RGF0YSwgdGhpcy5vbkFjY291bnREYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWNjb3VudERhdGEgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50LCByb29tOiBSb29tLCBwcmV2RXZlbnQ/OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByb29tSWQgPSByb29tLnJvb21JZDtcblxuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBcIm9yZy5tYXRyaXgucm9vbS5wcmV2aWV3X3VybHNcIikge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVtcImRpc2FibGVcIl07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAhdmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShcInVybFByZXZpZXdzRW5hYmxlZFwiLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkIGFuZCBmaXJlIHRob3NlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250ZW50ID0gcHJldkV2ZW50Py5nZXRDb250ZW50KCkgPz8ge307XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkU2V0dGluZ3MgPSBvYmplY3RLZXlDaGFuZ2VzPFJlY29yZDxzdHJpbmcsIGFueT4+KHByZXZDb250ZW50LCBldmVudC5nZXRDb250ZW50KCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nTmFtZSBvZiBjaGFuZ2VkU2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBldmVudC5nZXRDb250ZW50KClbc2V0dGluZ05hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKHNldHRpbmdOYW1lLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSkge1xuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoXCJhbGxvd2VkV2lkZ2V0c1wiLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIGV2ZW50LmdldENvbnRlbnQoKSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIGdldFZhbHVlKHNldHRpbmdOYW1lOiBzdHJpbmcsIHJvb21JZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIFVSTCBwcmV2aWV3c1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwidXJsUHJldmlld3NFbmFibGVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKHJvb21JZCwgXCJvcmcubWF0cml4LnJvb20ucHJldmlld191cmxzXCIpIHx8IHt9O1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhY3R1YWxseSBnb3QgYSBib29sZWFuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRbXCJkaXNhYmxlXCJdICE9PSBcImJvb2xlYW5cIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gIWNvbnRlbnRbXCJkaXNhYmxlXCJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGFsbG93ZWQgd2lkZ2V0c1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwiYWxsb3dlZFdpZGdldHNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkKSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzW3NldHRpbmdOYW1lXTtcbiAgICB9XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gc2VuZCByb29tIGFjY291bnQgZGF0YSB0aGVuIGF3YWl0IGl0IGJlaW5nIGVjaG9lZCBiYWNrXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRSb29tQWNjb3VudERhdGEoXG4gICAgICAgIHJvb21JZDogc3RyaW5nLFxuICAgICAgICBldmVudFR5cGU6IHN0cmluZyxcbiAgICAgICAgZmllbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIHZhbHVlOiBhbnksXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBjb250ZW50OiBSZXR1cm5UeXBlPFJvb21BY2NvdW50U2V0dGluZ3NIYW5kbGVyW1wiZ2V0U2V0dGluZ3NcIl0+O1xuXG4gICAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGVudCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBldmVudFR5cGUpIHx8IHt9O1xuICAgICAgICAgICAgY29udGVudFtmaWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNldFJvb21BY2NvdW50RGF0YShyb29tSWQsIGV2ZW50VHlwZSwgY29udGVudCk7XG5cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcjx2b2lkPigpO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiBNYXRyaXhFdmVudCwgcm9vbTogUm9vbSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKHJvb20ucm9vbUlkICE9PSByb29tSWQgfHwgZXZlbnQuZ2V0VHlwZSgpICE9PSBldmVudFR5cGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBldmVudC5nZXRDb250ZW50KClbZmllbGRdICE9PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jbGllbnQub2ZmKFJvb21FdmVudC5BY2NvdW50RGF0YSwgaGFuZGxlcik7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKFJvb21FdmVudC5BY2NvdW50RGF0YSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc3dpdGNoIChzZXR0aW5nTmFtZSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIFVSTCBwcmV2aWV3c1xuICAgICAgICAgICAgY2FzZSBcInVybFByZXZpZXdzRW5hYmxlZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFJvb21BY2NvdW50RGF0YShyb29tSWQsIFwib3JnLm1hdHJpeC5yb29tLnByZXZpZXdfdXJsc1wiLCBcImRpc2FibGVcIiwgIW5ld1ZhbHVlKTtcblxuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGFsbG93ZWQgd2lkZ2V0c1xuICAgICAgICAgICAgY2FzZSBcImFsbG93ZWRXaWRnZXRzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Um9vbUFjY291bnREYXRhKHJvb21JZCwgQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUsIG51bGwsIG5ld1ZhbHVlKTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRSb29tQWNjb3VudERhdGEocm9vbUlkLCBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUsIHNldHRpbmdOYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuU2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgdGhleSBoYXZlIHRoZSByb29tLCB0aGV5IGNhbiBzZXQgdGhlaXIgb3duIGFjY291bnQgZGF0YVxuICAgICAgICByZXR1cm4gISF0aGlzLmNsaWVudC5nZXRSb29tKHJvb21JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQgJiYgIXRoaXMuY2xpZW50LmlzR3Vlc3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNldHRpbmdzKHJvb21JZDogc3RyaW5nLCBldmVudFR5cGUgPSBERUZBVUxUX1NFVFRJTkdTX0VWRU5UX1RZUEUpOiBhbnkge1xuICAgICAgICAvLyBUT0RPOiBbVFNdIFR5cGUgcmV0dXJuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jbGllbnQuZ2V0Um9vbShyb29tSWQpPy5nZXRBY2NvdW50RGF0YShldmVudFR5cGUpO1xuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5nZXRDb250ZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gb2JqZWN0Q2xvbmUoZXZlbnQuZ2V0Q29udGVudCgpKTsgLy8gY2xvbmUgdG8gcHJldmVudCBtdXRhdGlvblxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxrQ0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFVQSxNQUFNTSwwQkFBMEIsR0FBRyxtQ0FBbUM7QUFDdEUsTUFBTUMsMkJBQTJCLEdBQUcsd0JBQXdCOztBQUU1RDtBQUNBO0FBQ0E7QUFDZSxNQUFNQywwQkFBMEIsU0FBU0MsMENBQWlDLENBQUM7RUFDL0VDLFdBQVdBLENBQWlCQyxRQUFzQixFQUFFO0lBQ3ZELEtBQUssQ0FBQyxDQUFDO0lBQUMsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSx5QkFXWSxDQUFDQyxLQUFrQixFQUFFQyxJQUFVLEVBQUVDLFNBQXVCLEtBQVc7TUFDdkYsTUFBTUMsTUFBTSxHQUFHRixJQUFJLENBQUNF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