UNPKG

matrix-react-sdk

Version:
250 lines (205 loc) 26.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.CommunityPrototypeStore = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _AsyncStoreWithClient = require("./AsyncStoreWithClient"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _membership = require("../utils/membership"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var utils = _interopRequireWildcard(require("matrix-js-sdk/src/utils")); var _AsyncStore = require("./AsyncStore"); var _FlairStore = _interopRequireDefault(require("./FlairStore")); var _GroupFilterOrderStore = _interopRequireDefault(require("./GroupFilterOrderStore")); var _GroupStore = _interopRequireDefault(require("./GroupStore")); /* Copyright 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. */ class CommunityPrototypeStore extends _AsyncStoreWithClient.AsyncStoreWithClient /*:: <IState>*/ { constructor() { super(_dispatcher.default, {}); } static get instance() /*: CommunityPrototypeStore*/ { return CommunityPrototypeStore.internalInstance; } static getUpdateEventName(roomId /*: string*/ ) /*: string*/ { return `${_AsyncStore.UPDATE_EVENT}:${roomId}`; } getSelectedCommunityId() /*: string*/ { if (_SettingsStore.default.getValue("feature_communities_v2_prototypes")) { return _GroupFilterOrderStore.default.getSelectedTags()[0]; } return null; // no selection as far as this function is concerned } getSelectedCommunityName() /*: string*/ { return CommunityPrototypeStore.instance.getCommunityName(this.getSelectedCommunityId()); } getSelectedCommunityGeneralChat() /*: Room*/ { const communityId = this.getSelectedCommunityId(); if (communityId) { return this.getGeneralChat(communityId); } } getCommunityName(communityId /*: string*/ ) /*: string*/ { const profile = _FlairStore.default.getGroupProfileCachedFast(this.matrixClient, communityId); return profile?.name || communityId; } getCommunityProfile(communityId /*: string*/ ) /*: { name?: string, avatarUrl?: string }*/ { return _FlairStore.default.getGroupProfileCachedFast(this.matrixClient, communityId); } getGeneralChat(communityId /*: string*/ ) /*: Room*/ { const rooms = _GroupStore.default.getGroupRooms(communityId).map(r => this.matrixClient.getRoom(r.roomId)).filter(r => !!r); let chat = rooms.find(r => { const idState = r.currentState.getStateEvents("im.vector.general_chat", ""); if (!idState || idState.getContent()['groupId'] !== communityId) return false; return true; }); if (!chat) chat = rooms[0]; return chat; // can be null } isAdminOf(communityId /*: string*/ ) /*: boolean*/ { const members = _GroupStore.default.getGroupMembers(communityId); const myMember = members.find(m => m.userId === this.matrixClient.getUserId()); return myMember?.isPrivileged; } canInviteTo(communityId /*: string*/ ) /*: boolean*/ { const generalChat = this.getGeneralChat(communityId); if (!generalChat) return this.isAdminOf(communityId); const myMember = generalChat.getMember(this.matrixClient.getUserId()); if (!myMember) return this.isAdminOf(communityId); const pl = generalChat.currentState.getStateEvents("m.room.power_levels", ""); if (!pl) return this.isAdminOf(communityId); const invitePl = (0, utils.isNullOrUndefined)(pl.invite) ? 50 : Number(pl.invite); return invitePl <= myMember.powerLevel; } async onAction(payload /*: ActionPayload*/ ) /*: Promise<any>*/ { if (!this.matrixClient || !_SettingsStore.default.getValue("feature_communities_v2_prototypes")) { return; } if (payload.action === "MatrixActions.Room.myMembership") { const room /*: Room*/ = payload.room; const membership = (0, _membership.getEffectiveMembership)(payload.membership); const oldMembership = (0, _membership.getEffectiveMembership)(payload.oldMembership); if (membership === oldMembership) return; if (membership === _membership.EffectiveMembership.Invite) { try { const path = utils.encodeUri("/rooms/$roomId/group_info", { $roomId: room.roomId }); const profile = await this.matrixClient._http.authedRequest(undefined, "GET", path, undefined, undefined, { prefix: "/_matrix/client/unstable/im.vector.custom" }); // we use global account data because per-room account data on invites is unreliable await this.matrixClient.setAccountData("im.vector.group_info." + room.roomId, profile); } catch (e) { console.warn("Non-fatal error getting group information for invite:", e); } } } else if (payload.action === "MatrixActions.accountData") { if (payload.event_type.startsWith("im.vector.group_info.")) { const roomId = payload.event_type.substring("im.vector.group_info.".length); this.emit(CommunityPrototypeStore.getUpdateEventName(roomId), roomId); } } else if (payload.action === "select_tag") { // Automatically select the general chat when switching communities const chat = this.getGeneralChat(payload.tag); if (chat) { _dispatcher.default.dispatch({ action: 'view_room', room_id: chat.roomId }); } } } getInviteProfile(roomId /*: string*/ ) /*: IRoomProfile*/ { if (!this.matrixClient) return { displayName: null, avatarMxc: null }; const room = this.matrixClient.getRoom(roomId); if (_SettingsStore.default.getValue("feature_communities_v2_prototypes")) { const data = this.matrixClient.getAccountData("im.vector.group_info." + roomId); if (data && data.getContent()) { return { displayName: data.getContent().name, avatarMxc: data.getContent().avatar_url }; } } return { displayName: room.name, avatarMxc: room.avatar_url }; } async onReady() /*: Promise<any>*/ { for (const room of this.matrixClient.getRooms()) { const myMember = room.currentState.getMembers().find(m => m.userId === this.matrixClient.getUserId()); if (!myMember) continue; if ((0, _membership.getEffectiveMembership)(myMember.membership) === _membership.EffectiveMembership.Invite) { // Fake an update for anything that might have started listening before the invite // data was available (eg: RoomPreviewBar after a refresh) this.emit(CommunityPrototypeStore.getUpdateEventName(room.roomId), room.roomId); } } } } exports.CommunityPrototypeStore = CommunityPrototypeStore; (0, _defineProperty2.default)(CommunityPrototypeStore, "internalInstance", new CommunityPrototypeStore()); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUudHMiXSwibmFtZXMiOlsiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJBc3luY1N0b3JlV2l0aENsaWVudCIsImNvbnN0cnVjdG9yIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJpbnN0YW5jZSIsImludGVybmFsSW5zdGFuY2UiLCJnZXRVcGRhdGVFdmVudE5hbWUiLCJyb29tSWQiLCJVUERBVEVfRVZFTlQiLCJnZXRTZWxlY3RlZENvbW11bml0eUlkIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiR3JvdXBGaWx0ZXJPcmRlclN0b3JlIiwiZ2V0U2VsZWN0ZWRUYWdzIiwiZ2V0U2VsZWN0ZWRDb21tdW5pdHlOYW1lIiwiZ2V0Q29tbXVuaXR5TmFtZSIsImdldFNlbGVjdGVkQ29tbXVuaXR5R2VuZXJhbENoYXQiLCJjb21tdW5pdHlJZCIsImdldEdlbmVyYWxDaGF0IiwicHJvZmlsZSIsIkZsYWlyU3RvcmUiLCJnZXRHcm91cFByb2ZpbGVDYWNoZWRGYXN0IiwibWF0cml4Q2xpZW50IiwibmFtZSIsImdldENvbW11bml0eVByb2ZpbGUiLCJyb29tcyIsIkdyb3VwU3RvcmUiLCJnZXRHcm91cFJvb21zIiwibWFwIiwiciIsImdldFJvb20iLCJmaWx0ZXIiLCJjaGF0IiwiZmluZCIsImlkU3RhdGUiLCJjdXJyZW50U3RhdGUiLCJnZXRTdGF0ZUV2ZW50cyIsImdldENvbnRlbnQiLCJpc0FkbWluT2YiLCJtZW1iZXJzIiwiZ2V0R3JvdXBNZW1iZXJzIiwibXlNZW1iZXIiLCJtIiwidXNlcklkIiwiZ2V0VXNlcklkIiwiaXNQcml2aWxlZ2VkIiwiY2FuSW52aXRlVG8iLCJnZW5lcmFsQ2hhdCIsImdldE1lbWJlciIsInBsIiwiaW52aXRlUGwiLCJpbnZpdGUiLCJOdW1iZXIiLCJwb3dlckxldmVsIiwib25BY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9uIiwicm9vbSIsIm1lbWJlcnNoaXAiLCJvbGRNZW1iZXJzaGlwIiwiRWZmZWN0aXZlTWVtYmVyc2hpcCIsIkludml0ZSIsInBhdGgiLCJ1dGlscyIsImVuY29kZVVyaSIsIiRyb29tSWQiLCJfaHR0cCIsImF1dGhlZFJlcXVlc3QiLCJ1bmRlZmluZWQiLCJwcmVmaXgiLCJzZXRBY2NvdW50RGF0YSIsImUiLCJjb25zb2xlIiwid2FybiIsImV2ZW50X3R5cGUiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiZW1pdCIsInRhZyIsImRpcyIsImRpc3BhdGNoIiwicm9vbV9pZCIsImdldEludml0ZVByb2ZpbGUiLCJkaXNwbGF5TmFtZSIsImF2YXRhck14YyIsImRhdGEiLCJnZXRBY2NvdW50RGF0YSIsImF2YXRhcl91cmwiLCJvblJlYWR5IiwiZ2V0Um9vbXMiLCJnZXRNZW1iZXJzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQTFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF5Qk8sTUFBTUEsdUJBQU4sU0FBc0NDO0FBQXRDO0FBQW1FO0FBRzlEQyxFQUFBQSxXQUFSLEdBQXNCO0FBQ2xCLFVBQU1DLG1CQUFOLEVBQXlCLEVBQXpCO0FBQ0g7O0FBRUQsYUFBa0JDLFFBQWxCO0FBQUE7QUFBc0Q7QUFDbEQsV0FBT0osdUJBQXVCLENBQUNLLGdCQUEvQjtBQUNIOztBQUVELFNBQWNDLGtCQUFkLENBQWlDQztBQUFqQztBQUFBO0FBQUE7QUFBeUQ7QUFDckQsV0FBUSxHQUFFQyx3QkFBYSxJQUFHRCxNQUFPLEVBQWpDO0FBQ0g7O0FBRU1FLEVBQUFBLHNCQUFQO0FBQUE7QUFBd0M7QUFDcEMsUUFBSUMsdUJBQWNDLFFBQWQsQ0FBdUIsbUNBQXZCLENBQUosRUFBaUU7QUFDN0QsYUFBT0MsK0JBQXNCQyxlQUF0QixHQUF3QyxDQUF4QyxD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TUFBeEU7QUFDSDtBQUNKO0FBQ0o7O0FBMUlxRTs7OzhCQUE3RFAsdUIsc0JBQ3lCLElBQUlBLHVCQUFKLEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBBc3luY1N0b3JlV2l0aENsaWVudCB9IGZyb20gXCIuL0FzeW5jU3RvcmVXaXRoQ2xpZW50XCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVNZW1iZXJzaGlwLCBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL3V0aWxzL21lbWJlcnNoaXBcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcbmltcG9ydCB7IFVQREFURV9FVkVOVCB9IGZyb20gXCIuL0FzeW5jU3RvcmVcIjtcbmltcG9ydCBGbGFpclN0b3JlIGZyb20gXCIuL0ZsYWlyU3RvcmVcIjtcbmltcG9ydCBHcm91cEZpbHRlck9yZGVyU3RvcmUgZnJvbSBcIi4vR3JvdXBGaWx0ZXJPcmRlclN0b3JlXCI7XG5pbXBvcnQgR3JvdXBTdG9yZSBmcm9tIFwiLi9Hcm91cFN0b3JlXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3V0aWxzXCI7XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIC8vIG5vdGhpbmcgb2YgdmFsdWUgLSB3ZSB1c2UgYWNjb3VudCBkYXRhXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJvb21Qcm9maWxlIHtcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAgIGF2YXRhck14Yzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUgZXh0ZW5kcyBBc3luY1N0b3JlV2l0aENsaWVudDxJU3RhdGU+IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnRlcm5hbEluc3RhbmNlID0gbmV3IENvbW11bml0eVByb3RvdHlwZVN0b3JlKCk7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihkZWZhdWx0RGlzcGF0Y2hlciwge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IENvbW11bml0eVByb3RvdHlwZVN0b3JlIHtcbiAgICAgICAgcmV0dXJuIENvbW11bml0eVByb3RvdHlwZVN0b3JlLmludGVybmFsSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRVcGRhdGVFdmVudE5hbWUocm9vbUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7VVBEQVRFX0VWRU5UfToke3Jvb21JZH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RlZENvbW11bml0eUlkKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9jb21tdW5pdGllc192Ml9wcm90b3R5cGVzXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JvdXBGaWx0ZXJPcmRlclN0b3JlLmdldFNlbGVjdGVkVGFncygpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBubyBzZWxlY3Rpb24gYXMgZmFyIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29uY2VybmVkXG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29tbXVuaXR5TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuaW5zdGFuY2UuZ2V0Q29tbXVuaXR5TmFtZSh0aGlzLmdldFNlbGVjdGVkQ29tbXVuaXR5SWQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29tbXVuaXR5R2VuZXJhbENoYXQoKTogUm9vbSB7XG4gICAgICAgIGNvbnN0IGNvbW11bml0eUlkID0gdGhpcy5nZXRTZWxlY3RlZENvbW11bml0eUlkKCk7XG4gICAgICAgIGlmIChjb21tdW5pdHlJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R2VuZXJhbENoYXQoY29tbXVuaXR5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbW11bml0eU5hbWUoY29tbXVuaXR5SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBGbGFpclN0b3JlLmdldEdyb3VwUHJvZmlsZUNhY2hlZEZhc3QodGhpcy5tYXRyaXhDbGllbnQsIGNvbW11bml0eUlkKTtcbiAgICAgICAgcmV0dXJuIHByb2ZpbGU/Lm5hbWUgfHwgY29tbXVuaXR5SWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbW11bml0eVByb2ZpbGUoY29tbXVuaXR5SWQ6IHN0cmluZyk6IHsgbmFtZT86IHN0cmluZywgYXZhdGFyVXJsPzogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4gRmxhaXJTdG9yZS5nZXRHcm91cFByb2ZpbGVDYWNoZWRGYXN0KHRoaXMubWF0cml4Q2xpZW50LCBjb21tdW5pdHlJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdlbmVyYWxDaGF0KGNvbW11bml0eUlkOiBzdHJpbmcpOiBSb29tIHtcbiAgICAgICAgY29uc3Qgcm9vbXMgPSBHcm91cFN0b3JlLmdldEdyb3VwUm9vbXMoY29tbXVuaXR5SWQpXG4gICAgICAgICAgICAubWFwKHIgPT4gdGhpcy5tYXRyaXhDbGllbnQuZ2V0Um9vbShyLnJvb21JZCkpXG4gICAgICAgICAgICAuZmlsdGVyKHIgPT4gISFyKTtcbiAgICAgICAgbGV0IGNoYXQgPSByb29tcy5maW5kKHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWRTdGF0ZSA9IHIuY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKFwiaW0udmVjdG9yLmdlbmVyYWxfY2hhdFwiLCBcIlwiKTtcbiAgICAgICAgICAgIGlmICghaWRTdGF0ZSB8fCBpZFN0YXRlLmdldENvbnRlbnQoKVsnZ3JvdXBJZCddICE9PSBjb21tdW5pdHlJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNoYXQpIGNoYXQgPSByb29tc1swXTtcbiAgICAgICAgcmV0dXJuIGNoYXQ7IC8vIGNhbiBiZSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWRtaW5PZihjb21tdW5pdHlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBHcm91cFN0b3JlLmdldEdyb3VwTWVtYmVycyhjb21tdW5pdHlJZCk7XG4gICAgICAgIGNvbnN0IG15TWVtYmVyID0gbWVtYmVycy5maW5kKG0gPT4gbS51c2VySWQgPT09IHRoaXMubWF0cml4Q2xpZW50LmdldFVzZXJJZCgpKTtcbiAgICAgICAgcmV0dXJuIG15TWVtYmVyPy5pc1ByaXZpbGVnZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkludml0ZVRvKGNvbW11bml0eUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhbENoYXQgPSB0aGlzLmdldEdlbmVyYWxDaGF0KGNvbW11bml0eUlkKTtcbiAgICAgICAgaWYgKCFnZW5lcmFsQ2hhdCkgcmV0dXJuIHRoaXMuaXNBZG1pbk9mKGNvbW11bml0eUlkKTtcblxuICAgICAgICBjb25zdCBteU1lbWJlciA9IGdlbmVyYWxDaGF0LmdldE1lbWJlcih0aGlzLm1hdHJpeENsaWVudC5nZXRVc2VySWQoKSk7XG4gICAgICAgIGlmICghbXlNZW1iZXIpIHJldHVybiB0aGlzLmlzQWRtaW5PZihjb21tdW5pdHlJZCk7XG5cbiAgICAgICAgY29uc3QgcGwgPSBnZW5lcmFsQ2hhdC5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoXCJtLnJvb20ucG93ZXJfbGV2ZWxzXCIsIFwiXCIpO1xuICAgICAgICBpZiAoIXBsKSByZXR1cm4gdGhpcy5pc0FkbWluT2YoY29tbXVuaXR5SWQpO1xuXG4gICAgICAgIGNvbnN0IGludml0ZVBsID0gaXNOdWxsT3JVbmRlZmluZWQocGwuaW52aXRlKSA/IDUwIDogTnVtYmVyKHBsLmludml0ZSk7XG4gICAgICAgIHJldHVybiBpbnZpdGVQbCA8PSBteU1lbWJlci5wb3dlckxldmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvbkFjdGlvbihwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1hdHJpeENsaWVudCB8fCAhU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfY29tbXVuaXRpZXNfdjJfcHJvdG90eXBlc1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBheWxvYWQuYWN0aW9uID09PSBcIk1hdHJpeEFjdGlvbnMuUm9vbS5teU1lbWJlcnNoaXBcIikge1xuICAgICAgICAgICAgY29uc3Qgcm9vbTogUm9vbSA9IHBheWxvYWQucm9vbTtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcnNoaXAgPSBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwKHBheWxvYWQubWVtYmVyc2hpcCk7XG4gICAgICAgICAgICBjb25zdCBvbGRNZW1iZXJzaGlwID0gZ2V0RWZmZWN0aXZlTWVtYmVyc2hpcChwYXlsb2FkLm9sZE1lbWJlcnNoaXApO1xuICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXAgPT09IG9sZE1lbWJlcnNoaXApIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXAgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHV0aWxzLmVuY29kZVVyaShcIi9yb29tcy8kcm9vbUlkL2dyb3VwX2luZm9cIiwgeyRyb29tSWQ6IHJvb20ucm9vbUlkfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLm1hdHJpeENsaWVudC5faHR0cC5hdXRoZWRSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLCBcIkdFVFwiLCBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB7cHJlZml4OiBcIi9fbWF0cml4L2NsaWVudC91bnN0YWJsZS9pbS52ZWN0b3IuY3VzdG9tXCJ9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGdsb2JhbCBhY2NvdW50IGRhdGEgYmVjYXVzZSBwZXItcm9vbSBhY2NvdW50IGRhdGEgb24gaW52aXRlcyBpcyB1bnJlbGlhYmxlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWF0cml4Q2xpZW50LnNldEFjY291bnREYXRhKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIgKyByb29tLnJvb21JZCwgcHJvZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJOb24tZmF0YWwgZXJyb3IgZ2V0dGluZyBncm91cCBpbmZvcm1hdGlvbiBmb3IgaW52aXRlOlwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5hY3Rpb24gPT09IFwiTWF0cml4QWN0aW9ucy5hY2NvdW50RGF0YVwiKSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5ldmVudF90eXBlLnN0YXJ0c1dpdGgoXCJpbS52ZWN0b3IuZ3JvdXBfaW5mby5cIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb29tSWQgPSBwYXlsb2FkLmV2ZW50X3R5cGUuc3Vic3RyaW5nKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuZ2V0VXBkYXRlRXZlbnROYW1lKHJvb21JZCksIHJvb21JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5hY3Rpb24gPT09IFwic2VsZWN0X3RhZ1wiKSB7XG4gICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgZ2VuZXJhbCBjaGF0IHdoZW4gc3dpdGNoaW5nIGNvbW11bml0aWVzXG4gICAgICAgICAgICBjb25zdCBjaGF0ID0gdGhpcy5nZXRHZW5lcmFsQ2hhdChwYXlsb2FkLnRhZyk7XG4gICAgICAgICAgICBpZiAoY2hhdCkge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3ZpZXdfcm9vbScsXG4gICAgICAgICAgICAgICAgICAgIHJvb21faWQ6IGNoYXQucm9vbUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludml0ZVByb2ZpbGUocm9vbUlkOiBzdHJpbmcpOiBJUm9vbVByb2ZpbGUge1xuICAgICAgICBpZiAoIXRoaXMubWF0cml4Q2xpZW50KSByZXR1cm4ge2Rpc3BsYXlOYW1lOiBudWxsLCBhdmF0YXJNeGM6IG51bGx9O1xuICAgICAgICBjb25zdCByb29tID0gdGhpcy5tYXRyaXhDbGllbnQuZ2V0Um9vbShyb29tSWQpO1xuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfY29tbXVuaXRpZXNfdjJfcHJvdG90eXBlc1wiKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMubWF0cml4Q2xpZW50LmdldEFjY291bnREYXRhKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIgKyByb29tSWQpO1xuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5nZXRDb250ZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2Rpc3BsYXlOYW1lOiBkYXRhLmdldENvbnRlbnQoKS5uYW1lLCBhdmF0YXJNeGM6IGRhdGEuZ2V0Q29udGVudCgpLmF2YXRhcl91cmx9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7ZGlzcGxheU5hbWU6IHJvb20ubmFtZSwgYXZhdGFyTXhjOiByb29tLmF2YXRhcl91cmx9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvblJlYWR5KCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vbSBvZiB0aGlzLm1hdHJpeENsaWVudC5nZXRSb29tcygpKSB7XG4gICAgICAgICAgICBjb25zdCBteU1lbWJlciA9IHJvb20uY3VycmVudFN0YXRlLmdldE1lbWJlcnMoKS5maW5kKG0gPT4gbS51c2VySWQgPT09IHRoaXMubWF0cml4Q2xpZW50LmdldFVzZXJJZCgpKTtcbiAgICAgICAgICAgIGlmICghbXlNZW1iZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGdldEVmZmVjdGl2ZU1lbWJlcnNoaXAobXlNZW1iZXIubWVtYmVyc2hpcCkgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFrZSBhbiB1cGRhdGUgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBzdGFydGVkIGxpc3RlbmluZyBiZWZvcmUgdGhlIGludml0ZVxuICAgICAgICAgICAgICAgIC8vIGRhdGEgd2FzIGF2YWlsYWJsZSAoZWc6IFJvb21QcmV2aWV3QmFyIGFmdGVyIGEgcmVmcmVzaClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuZ2V0VXBkYXRlRXZlbnROYW1lKHJvb20ucm9vbUlkKSwgcm9vbS5yb29tSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19