UNPKG

matrix-react-sdk

Version:
201 lines (161 loc) 20.9 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 _MatrixClientPeg = require("../../MatrixClientPeg"); var _MatrixClientBackedSettingsHandler = _interopRequireDefault(require("./MatrixClientBackedSettingsHandler")); var _objects = require("../../utils/objects"); var _SettingLevel = require("../SettingLevel"); /* Copyright 2017 Travis Ralston Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ const ALLOWED_WIDGETS_EVENT_TYPE = "im.vector.setting.allowed_widgets"; /** * Gets and sets settings at the "room-account" level for the current user. */ class RoomAccountSettingsHandler extends _MatrixClientBackedSettingsHandler.default { constructor(watchers /*: WatchManager*/ ) { super(); this.watchers /*:: */ = watchers /*:: */ ; (0, _defineProperty2.default)(this, "onAccountData", (event /*: MatrixEvent*/ , room /*: Room*/ , prevEvent /*: MatrixEvent*/ ) => { 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() === "org.matrix.room.color_scheme") { this.watchers.notifyUpdate("roomColor", roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, event.getContent()); } else if (event.getType() === "im.vector.web.settings") { // Figure out what changed and fire those updates const prevContent = prevEvent ? 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()); } }); } initMatrixClient(oldClient /*: MatrixClient*/ , newClient /*: MatrixClient*/ ) { if (oldClient) { oldClient.removeListener("Room.accountData", this.onAccountData); } newClient.on("Room.accountData", this.onAccountData); } getValue(settingName /*: string*/ , roomId /*: string*/ ) /*: any*/ { // 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 room color if (settingName === "roomColor") { // The event content should already be in an appropriate format, we just need // to get the right value. // don't fallback to {} because thats truthy and would imply there is an event specifying tint return this.getSettings(roomId, "org.matrix.room.color_scheme"); } // Special case allowed widgets if (settingName === "allowedWidgets") { return this.getSettings(roomId, ALLOWED_WIDGETS_EVENT_TYPE); } const settings = this.getSettings(roomId) || {}; return settings[settingName]; } setValue(settingName /*: string*/ , roomId /*: string*/ , newValue /*: any*/ ) /*: Promise<void>*/ { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings(roomId, "org.matrix.room.preview_urls") || {}; content['disable'] = !newValue; return _MatrixClientPeg.MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.preview_urls", content); } // Special case room color if (settingName === "roomColor") { // The new value should match our requirements, we just need to store it in the right place. return _MatrixClientPeg.MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.color_scheme", newValue); } // Special case allowed widgets if (settingName === "allowedWidgets") { return _MatrixClientPeg.MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue); } const content = this.getSettings(roomId) || {}; content[settingName] = newValue; return _MatrixClientPeg.MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content); } canSetValue(settingName /*: string*/ , roomId /*: string*/ ) /*: boolean*/ { const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(roomId); // If they have the room, they can set their own account data return room !== undefined && room !== null; } isSupported() /*: boolean*/ { const cli = _MatrixClientPeg.MatrixClientPeg.get(); return cli !== undefined && cli !== null && !cli.isGuest(); } getSettings(roomId /*: string*/ , eventType = "im.vector.web.settings") /*: any*/ { // TODO: [TS] Type return const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(roomId); if (!room) return null; const event = room.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9Sb29tQWNjb3VudFNldHRpbmdzSGFuZGxlci50cyJdLCJuYW1lcyI6WyJBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSIsIlJvb21BY2NvdW50U2V0dGluZ3NIYW5kbGVyIiwiTWF0cml4Q2xpZW50QmFja2VkU2V0dGluZ3NIYW5kbGVyIiwiY29uc3RydWN0b3IiLCJ3YXRjaGVycyIsImV2ZW50Iiwicm9vbSIsInByZXZFdmVudCIsInJvb21JZCIsImdldFR5cGUiLCJ2YWwiLCJnZXRDb250ZW50Iiwibm90aWZ5VXBkYXRlIiwiU2V0dGluZ0xldmVsIiwiUk9PTV9BQ0NPVU5UIiwicHJldkNvbnRlbnQiLCJjaGFuZ2VkU2V0dGluZ3MiLCJzZXR0aW5nTmFtZSIsImluaXRNYXRyaXhDbGllbnQiLCJvbGRDbGllbnQiLCJuZXdDbGllbnQiLCJyZW1vdmVMaXN0ZW5lciIsIm9uQWNjb3VudERhdGEiLCJvbiIsImdldFZhbHVlIiwiY29udGVudCIsImdldFNldHRpbmdzIiwic2V0dGluZ3MiLCJzZXRWYWx1ZSIsIm5ld1ZhbHVlIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwic2V0Um9vbUFjY291bnREYXRhIiwiY2FuU2V0VmFsdWUiLCJnZXRSb29tIiwidW5kZWZpbmVkIiwiaXNTdXBwb3J0ZWQiLCJjbGkiLCJpc0d1ZXN0IiwiZXZlbnRUeXBlIiwiZ2V0QWNjb3VudERhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBaUJBOztBQUNBOztBQUNBOztBQUNBOztBQXBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVdBLE1BQU1BLDBCQUEwQixHQUFHLG1DQUFuQztBQUVBO0FBQ0E7QUFDQTs7QUFDZSxNQUFNQywwQkFBTixTQUF5Q0MsMENBQXpDLENBQTJFO0FBQ3RGQyxFQUFBQSxXQUFXLENBQVNDO0FB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bkM7QUFDM0M7O0FBOUdxRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxNyBUcmF2aXMgUmFsc3RvblxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tICcuLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IE1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciBmcm9tIFwiLi9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXJcIjtcbmltcG9ydCB7IG9iamVjdENsb25lLCBvYmplY3RLZXlDaGFuZ2VzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdHNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IFdhdGNoTWFuYWdlciB9IGZyb20gXCIuLi9XYXRjaE1hbmFnZXJcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9jbGllbnRcIjtcbmltcG9ydCB7IE1hdHJpeEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9ldmVudFwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuXG5jb25zdCBBTExPV0VEX1dJREdFVFNfRVZFTlRfVFlQRSA9IFwiaW0udmVjdG9yLnNldHRpbmcuYWxsb3dlZF93aWRnZXRzXCI7XG5cbi8qKlxuICogR2V0cyBhbmQgc2V0cyBzZXR0aW5ncyBhdCB0aGUgXCJyb29tLWFjY291bnRcIiBsZXZlbCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUFjY291bnRTZXR0aW5nc0hhbmRsZXIgZXh0ZW5kcyBNYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgd2F0Y2hlcnM6IFdhdGNoTWFuYWdlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0TWF0cml4Q2xpZW50KG9sZENsaWVudDogTWF0cml4Q2xpZW50LCBuZXdDbGllbnQ6IE1hdHJpeENsaWVudCkge1xuICAgICAgICBpZiAob2xkQ2xpZW50KSB7XG4gICAgICAgICAgICBvbGRDbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJSb29tLmFjY291bnREYXRhXCIsIHRoaXMub25BY2NvdW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdDbGllbnQub24oXCJSb29tLmFjY291bnREYXRhXCIsIHRoaXMub25BY2NvdW50RGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkFjY291bnREYXRhID0gKGV2ZW50OiBNYXRyaXhFdmVudCwgcm9vbTogUm9vbSwgcHJldkV2ZW50OiBNYXRyaXhFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCByb29tSWQgPSByb29tLnJvb21JZDtcblxuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBcIm9yZy5tYXRyaXgucm9vbS5wcmV2aWV3X3VybHNcIikge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVsnZGlzYWJsZSddO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsKSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWwgPSAhdmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShcInVybFByZXZpZXdzRW5hYmxlZFwiLCByb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBcIm9yZy5tYXRyaXgucm9vbS5jb2xvcl9zY2hlbWVcIikge1xuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoXCJyb29tQ29sb3JcIiwgcm9vbUlkLCBTZXR0aW5nTGV2ZWwuUk9PTV9BQ0NPVU5ULCBldmVudC5nZXRDb250ZW50KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKSA9PT0gXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCIpIHtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkIGFuZCBmaXJlIHRob3NlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250ZW50ID0gcHJldkV2ZW50ID8gcHJldkV2ZW50LmdldENvbnRlbnQoKSA6IHt9O1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZFNldHRpbmdzID0gb2JqZWN0S2V5Q2hhbmdlczxSZWNvcmQ8c3RyaW5nLCBhbnk+PihwcmV2Q29udGVudCwgZXZlbnQuZ2V0Q29udGVudCgpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2V0dGluZ05hbWUgb2YgY2hhbmdlZFNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZXZlbnQuZ2V0Q29udGVudCgpW3NldHRpbmdOYW1lXTtcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShzZXR0aW5nTmFtZSwgcm9vbUlkLCBTZXR0aW5nTGV2ZWwuUk9PTV9BQ0NPVU5ULCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKSA9PT0gQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKFwiYWxsb3dlZFdpZGdldHNcIiwgcm9vbUlkLCBTZXR0aW5nTGV2ZWwuUk9PTV9BQ0NPVU5ULCBldmVudC5nZXRDb250ZW50KCkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBnZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBVUkwgcHJldmlld3NcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcInVybFByZXZpZXdzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRTZXR0aW5ncyhyb29tSWQsIFwib3JnLm1hdHJpeC5yb29tLnByZXZpZXdfdXJsc1wiKSB8fCB7fTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWN0dWFsbHkgZ290IGEgYm9vbGVhblxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY29udGVudFsnZGlzYWJsZSddKSAhPT0gXCJib29sZWFuXCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuICFjb250ZW50WydkaXNhYmxlJ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugcm9vbSBjb2xvclxuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwicm9vbUNvbG9yXCIpIHtcbiAgICAgICAgICAgIC8vIFRoZSBldmVudCBjb250ZW50IHNob3VsZCBhbHJlYWR5IGJlIGluIGFuIGFwcHJvcHJpYXRlIGZvcm1hdCwgd2UganVzdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLlxuICAgICAgICAgICAgLy8gZG9uJ3QgZmFsbGJhY2sgdG8ge30gYmVjYXVzZSB0aGF0cyB0cnV0aHkgYW5kIHdvdWxkIGltcGx5IHRoZXJlIGlzIGFuIGV2ZW50IHNwZWNpZnlpbmcgdGludFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBcIm9yZy5tYXRyaXgucm9vbS5jb2xvcl9zY2hlbWVcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgYWxsb3dlZCB3aWRnZXRzXG4gICAgICAgIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJhbGxvd2VkV2lkZ2V0c1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhyb29tSWQsIEFMTE9XRURfV0lER0VUU19FVkVOVF9UWVBFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhyb29tSWQpIHx8IHt9O1xuICAgICAgICByZXR1cm4gc2V0dGluZ3Nbc2V0dGluZ05hbWVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgVVJMIHByZXZpZXdzXG4gICAgICAgIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJ1cmxQcmV2aWV3c0VuYWJsZWRcIikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0U2V0dGluZ3Mocm9vbUlkLCBcIm9yZy5tYXRyaXgucm9vbS5wcmV2aWV3X3VybHNcIikgfHwge307XG4gICAgICAgICAgICBjb250ZW50WydkaXNhYmxlJ10gPSAhbmV3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gTWF0cml4Q2xpZW50UGVnLmdldCgpLnNldFJvb21BY2NvdW50RGF0YShyb29tSWQsIFwib3JnLm1hdHJpeC5yb29tLnByZXZpZXdfdXJsc1wiLCBjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSByb29tIGNvbG9yXG4gICAgICAgIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJyb29tQ29sb3JcIikge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyB2YWx1ZSBzaG91bGQgbWF0Y2ggb3VyIHJlcXVpcmVtZW50cywgd2UganVzdCBuZWVkIHRvIHN0b3JlIGl0IGluIHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgICAgIHJldHVybiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2V0Um9vbUFjY291bnREYXRhKHJvb21JZCwgXCJvcmcubWF0cml4LnJvb20uY29sb3Jfc2NoZW1lXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBhbGxvd2VkIHdpZGdldHNcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcImFsbG93ZWRXaWRnZXRzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2V0Um9vbUFjY291bnREYXRhKHJvb21JZCwgQUxMT1dFRF9XSURHRVRTX0VWRU5UX1RZUEUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKHJvb21JZCkgfHwge307XG4gICAgICAgIGNvbnRlbnRbc2V0dGluZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgIHJldHVybiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2V0Um9vbUFjY291bnREYXRhKHJvb21JZCwgXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCIsIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5TZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFJvb20ocm9vbUlkKTtcblxuICAgICAgICAvLyBJZiB0aGV5IGhhdmUgdGhlIHJvb20sIHRoZXkgY2FuIHNldCB0aGVpciBvd24gYWNjb3VudCBkYXRhXG4gICAgICAgIHJldHVybiByb29tICE9PSB1bmRlZmluZWQgJiYgcm9vbSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcbiAgICAgICAgcmV0dXJuIGNsaSAhPT0gdW5kZWZpbmVkICYmIGNsaSAhPT0gbnVsbCAmJiAhY2xpLmlzR3Vlc3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNldHRpbmdzKHJvb21JZDogc3RyaW5nLCBldmVudFR5cGUgPSBcImltLnZlY3Rvci53ZWIuc2V0dGluZ3NcIik6IGFueSB7IC8vIFRPRE86IFtUU10gVHlwZSByZXR1cm5cbiAgICAgICAgY29uc3Qgcm9vbSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRSb29tKHJvb21JZCk7XG4gICAgICAgIGlmICghcm9vbSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSByb29tLmdldEFjY291bnREYXRhKGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmdldENvbnRlbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBvYmplY3RDbG9uZShldmVudC5nZXRDb250ZW50KCkpOyAvLyBjbG9uZSB0byBwcmV2ZW50IG11dGF0aW9uXG4gICAgfVxufVxuIl19