UNPKG

matrix-react-sdk

Version:
229 lines (215 loc) 34 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ProxiedModuleApi = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var Matrix = _interopRequireWildcard(require("matrix-js-sdk/src/matrix")); var _Modal = _interopRequireDefault(require("../Modal")); var _languageHandler = require("../languageHandler"); var _ModuleUiDialog = require("../components/views/dialogs/ModuleUiDialog"); var _SdkConfig = _interopRequireDefault(require("../SdkConfig")); var _PlatformPeg = _interopRequireDefault(require("../PlatformPeg")); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _navigator = require("../utils/permalinks/navigator"); var _Permalinks = require("../utils/permalinks/Permalinks"); var _MatrixClientPeg = require("../MatrixClientPeg"); var _RoomAliasCache = require("../RoomAliasCache"); var _actions = require("../dispatcher/actions"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _WidgetStore = _interopRequireDefault(require("../stores/WidgetStore")); var _WidgetLayoutStore = require("../stores/widgets/WidgetLayoutStore"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2022 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. */ /** * Glue between the `ModuleApi` interface and the react-sdk. Anticipates one instance * to be assigned to a single module. */ class ProxiedModuleApi { constructor() { (0, _defineProperty2.default)(this, "cachedTranslations", void 0); (0, _defineProperty2.default)(this, "overrideLoginResolve", void 0); (0, _defineProperty2.default)(this, "onAction", payload => { if (payload.action === _actions.Action.OnLoggedIn) { this.overrideLoginResolve?.(); } }); _dispatcher.default.register(this.onAction); } /** * All custom translations used by the associated module. */ get translations() { return this.cachedTranslations; } /** * @override */ registerTranslations(translations) { this.cachedTranslations = translations; } /** * @override */ translateString(s, variables) { return (0, _languageHandler._t)(s, variables); } /** * @override */ openDialog(initialTitleOrOptions, body, props) { const initialOptions = typeof initialTitleOrOptions === "string" ? { title: initialTitleOrOptions } : initialTitleOrOptions; return new Promise(resolve => { _Modal.default.createDialog(_ModuleUiDialog.ModuleUiDialog, { initialOptions, contentFactory: body, moduleApi: this, additionalContentProps: props }, "mx_CompoundDialog").finished.then(([didOkOrSubmit, model]) => { resolve({ didOkOrSubmit: !!didOkOrSubmit, model: model }); }); }); } /** * @override */ async registerSimpleAccount(username, password, displayName) { const hsUrl = _SdkConfig.default.get("validated_server_config")?.hsUrl; if (!hsUrl) throw new Error("Could not get homeserver url"); const client = Matrix.createClient({ baseUrl: hsUrl }); const deviceName = _SdkConfig.default.get("default_device_display_name") || _PlatformPeg.default.get()?.getDefaultDeviceDisplayName(); const req = { username, password, initial_device_display_name: deviceName, auth: undefined, inhibit_login: false }; const creds = await client.registerRequest(req).catch(resp => client.registerRequest(_objectSpread(_objectSpread({}, req), {}, { auth: { session: resp.data.session, type: "m.login.dummy" } }))); if (displayName) { const profileClient = Matrix.createClient({ baseUrl: hsUrl, userId: creds.user_id, deviceId: creds.device_id, accessToken: creds.access_token }); await profileClient.setDisplayName(displayName); } return { homeserverUrl: hsUrl, userId: creds.user_id, deviceId: creds.device_id, accessToken: creds.access_token }; } /** * @override */ async overwriteAccountAuth(accountInfo) { // We want to wait for the new login to complete before returning. // See `Action.OnLoggedIn` in dispatcher. const awaitNewLogin = new Promise(resolve => { this.overrideLoginResolve = resolve; }); _dispatcher.default.dispatch({ action: _actions.Action.OverwriteLogin, credentials: _objectSpread(_objectSpread({}, accountInfo), {}, { guest: false }) }, true); // require to be sync to match inherited interface behaviour // wait for login to complete await awaitNewLogin; } /** * @override */ async navigatePermalink(uri, andJoin) { (0, _navigator.navigateToPermalink)(uri); const parts = (0, _Permalinks.parsePermalink)(uri); if (parts?.roomIdOrAlias && andJoin) { let roomId = parts.roomIdOrAlias; let servers = parts.viaServers; if (roomId.startsWith("#")) { roomId = (0, _RoomAliasCache.getCachedRoomIDForAlias)(parts.roomIdOrAlias); if (!roomId) { // alias resolution failed const result = await _MatrixClientPeg.MatrixClientPeg.safeGet().getRoomIdForAlias(parts.roomIdOrAlias); roomId = result.room_id; if (!servers) servers = result.servers; // use provided servers first, if available } } _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: roomId, via_servers: servers }); if (andJoin) { _dispatcher.default.dispatch({ action: _actions.Action.JoinRoom, canAskToJoin: _SettingsStore.default.getValue("feature_ask_to_join") }); } } } /** * @override */ getConfigValue(namespace, key) { // Force cast to `any` because the namespace won't be known to the SdkConfig types const maybeObj = _SdkConfig.default.get(namespace); if (!maybeObj || !(typeof maybeObj === "object")) return undefined; return maybeObj[key]; } /** * @override */ getApps(roomId) { return _WidgetStore.default.instance.getApps(roomId); } /** * @override */ getAppAvatarUrl(app, width, height, resizeMethod) { if (!app.avatar_url) return null; // eslint-disable-next-line no-restricted-properties return _MatrixClientPeg.MatrixClientPeg.safeGet().mxcUrlToHttp(app.avatar_url, width, height, resizeMethod); } /** * @override */ isAppInContainer(app, container, roomId) { const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(roomId); if (!room) return false; return _WidgetLayoutStore.WidgetLayoutStore.instance.isInContainer(room, app, container); } /** * @override */ moveAppToContainer(app, container, roomId) { const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(roomId); if (!room) return; _WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, container); } } exports.ProxiedModuleApi = ProxiedModuleApi; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXRyaXgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfTW9kYWwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Nb2R1bGVVaURpYWxvZyIsIl9TZGtDb25maWciLCJfUGxhdGZvcm1QZWciLCJfZGlzcGF0Y2hlciIsIl9uYXZpZ2F0b3IiLCJfUGVybWFsaW5rcyIsIl9NYXRyaXhDbGllbnRQZWciLCJfUm9vbUFsaWFzQ2FjaGUiLCJfYWN0aW9ucyIsIl9TZXR0aW5nc1N0b3JlIiwiX1dpZGdldFN0b3JlIiwiX1dpZGdldExheW91dFN0b3JlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiUHJveGllZE1vZHVsZUFwaSIsImNvbnN0cnVjdG9yIiwicGF5bG9hZCIsImFjdGlvbiIsIkFjdGlvbiIsIk9uTG9nZ2VkSW4iLCJvdmVycmlkZUxvZ2luUmVzb2x2ZSIsImRpc3BhdGNoZXIiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwidHJhbnNsYXRpb25zIiwiY2FjaGVkVHJhbnNsYXRpb25zIiwicmVnaXN0ZXJUcmFuc2xhdGlvbnMiLCJ0cmFuc2xhdGVTdHJpbmciLCJzIiwidmFyaWFibGVzIiwiX3QiLCJvcGVuRGlhbG9nIiwiaW5pdGlhbFRpdGxlT3JPcHRpb25zIiwiYm9keSIsInByb3BzIiwiaW5pdGlhbE9wdGlvbnMiLCJ0aXRsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJNb2R1bGVVaURpYWxvZyIsImNvbnRlbnRGYWN0b3J5IiwibW9kdWxlQXBpIiwiYWRkaXRpb25hbENvbnRlbnRQcm9wcyIsImZpbmlzaGVkIiwidGhlbiIsImRpZE9rT3JTdWJtaXQiLCJtb2RlbCIsInJlZ2lzdGVyU2ltcGxlQWNjb3VudCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkaXNwbGF5TmFtZSIsImhzVXJsIiwiU2RrQ29uZmlnIiwiRXJyb3IiLCJjbGllbnQiLCJjcmVhdGVDbGllbnQiLCJiYXNlVXJsIiwiZGV2aWNlTmFtZSIsIlBsYXRmb3JtUGVnIiwiZ2V0RGVmYXVsdERldmljZURpc3BsYXlOYW1lIiwicmVxIiwiaW5pdGlhbF9kZXZpY2VfZGlzcGxheV9uYW1lIiwiYXV0aCIsInVuZGVmaW5lZCIsImluaGliaXRfbG9naW4iLCJjcmVkcyIsInJlZ2lzdGVyUmVxdWVzdCIsImNhdGNoIiwicmVzcCIsInNlc3Npb24iLCJkYXRhIiwidHlwZSIsInByb2ZpbGVDbGllbnQiLCJ1c2VySWQiLCJ1c2VyX2lkIiwiZGV2aWNlSWQiLCJkZXZpY2VfaWQiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsInNldERpc3BsYXlOYW1lIiwiaG9tZXNlcnZlclVybCIsIm92ZXJ3cml0ZUFjY291bnRBdXRoIiwiYWNjb3VudEluZm8iLCJhd2FpdE5ld0xvZ2luIiwiZGlzcGF0Y2giLCJPdmVyd3JpdGVMb2dpbiIsImNyZWRlbnRpYWxzIiwiZ3Vlc3QiLCJuYXZpZ2F0ZVBlcm1hbGluayIsInVyaSIsImFuZEpvaW4iLCJuYXZpZ2F0ZVRvUGVybWFsaW5rIiwicGFydHMiLCJwYXJzZVBlcm1hbGluayIsInJvb21JZE9yQWxpYXMiLCJyb29tSWQiLCJzZXJ2ZXJzIiwidmlhU2VydmVycyIsInN0YXJ0c1dpdGgiLCJnZXRDYWNoZWRSb29tSURGb3JBbGlhcyIsInJlc3VsdCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRSb29tSWRGb3JBbGlhcyIsInJvb21faWQiLCJWaWV3Um9vbSIsInZpYV9zZXJ2ZXJzIiwiSm9pblJvb20iLCJjYW5Bc2tUb0pvaW4iLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJnZXRDb25maWdWYWx1ZSIsIm5hbWVzcGFjZSIsImtleSIsIm1heWJlT2JqIiwiZ2V0QXBwcyIsIldpZGdldFN0b3JlIiwiaW5zdGFuY2UiLCJnZXRBcHBBdmF0YXJVcmwiLCJhcHAiLCJ3aWR0aCIsImhlaWdodCIsInJlc2l6ZU1ldGhvZCIsImF2YXRhcl91cmwiLCJteGNVcmxUb0h0dHAiLCJpc0FwcEluQ29udGFpbmVyIiwiY29udGFpbmVyIiwicm9vbSIsImdldFJvb20iLCJXaWRnZXRMYXlvdXRTdG9yZSIsImlzSW5Db250YWluZXIiLCJtb3ZlQXBwVG9Db250YWluZXIiLCJtb3ZlVG9Db250YWluZXIiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvUHJveGllZE1vZHVsZUFwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBNb2R1bGVBcGkgfSBmcm9tIFwiQG1hdHJpeC1vcmcvcmVhY3Qtc2RrLW1vZHVsZS1hcGkvbGliL01vZHVsZUFwaVwiO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TdHJpbmdzT2JqZWN0LCBQbGFpblN1YnN0aXR1dGlvbiB9IGZyb20gXCJAbWF0cml4LW9yZy9yZWFjdC1zZGstbW9kdWxlLWFwaS9saWIvdHlwZXMvdHJhbnNsYXRpb25zXCI7XG5pbXBvcnQgeyBPcHRpb25hbCB9IGZyb20gXCJtYXRyaXgtZXZlbnRzLXNka1wiO1xuaW1wb3J0IHsgRGlhbG9nQ29udGVudCwgRGlhbG9nUHJvcHMgfSBmcm9tIFwiQG1hdHJpeC1vcmcvcmVhY3Qtc2RrLW1vZHVsZS1hcGkvbGliL2NvbXBvbmVudHMvRGlhbG9nQ29udGVudFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgQWNjb3VudEF1dGhJbmZvIH0gZnJvbSBcIkBtYXRyaXgtb3JnL3JlYWN0LXNkay1tb2R1bGUtYXBpL2xpYi90eXBlcy9BY2NvdW50QXV0aEluZm9cIjtcbmltcG9ydCAqIGFzIE1hdHJpeCBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0UGFyYW1zIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgTW9kdWxlVWlEaWFsb2dPcHRpb25zIH0gZnJvbSBcIkBtYXRyaXgtb3JnL3JlYWN0LXNkay1tb2R1bGUtYXBpL2xpYi90eXBlcy9Nb2R1bGVVaURpYWxvZ09wdGlvbnNcIjtcblxuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi9Nb2RhbFwiO1xuaW1wb3J0IHsgX3QsIFRyYW5zbGF0aW9uS2V5IH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgTW9kdWxlVWlEaWFsb2cgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL01vZHVsZVVpRGlhbG9nXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi9TZGtDb25maWdcIjtcbmltcG9ydCBQbGF0Zm9ybVBlZyBmcm9tIFwiLi4vUGxhdGZvcm1QZWdcIjtcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IG5hdmlnYXRlVG9QZXJtYWxpbmsgfSBmcm9tIFwiLi4vdXRpbHMvcGVybWFsaW5rcy9uYXZpZ2F0b3JcIjtcbmltcG9ydCB7IHBhcnNlUGVybWFsaW5rIH0gZnJvbSBcIi4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rc1wiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgZ2V0Q2FjaGVkUm9vbUlERm9yQWxpYXMgfSBmcm9tIFwiLi4vUm9vbUFsaWFzQ2FjaGVcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IE92ZXJ3cml0ZUxvZ2luUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL092ZXJ3cml0ZUxvZ2luUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IFdpZGdldFN0b3JlLCB7IElBcHAgfSBmcm9tIFwiLi4vc3RvcmVzL1dpZGdldFN0b3JlXCI7XG5pbXBvcnQgeyBDb250YWluZXIsIFdpZGdldExheW91dFN0b3JlIH0gZnJvbSBcIi4uL3N0b3Jlcy93aWRnZXRzL1dpZGdldExheW91dFN0b3JlXCI7XG5cbi8qKlxuICogR2x1ZSBiZXR3ZWVuIHRoZSBgTW9kdWxlQXBpYCBpbnRlcmZhY2UgYW5kIHRoZSByZWFjdC1zZGsuIEFudGljaXBhdGVzIG9uZSBpbnN0YW5jZVxuICogdG8gYmUgYXNzaWduZWQgdG8gYSBzaW5nbGUgbW9kdWxlLlxuICovXG5leHBvcnQgY2xhc3MgUHJveGllZE1vZHVsZUFwaSBpbXBsZW1lbnRzIE1vZHVsZUFwaSB7XG4gICAgcHJpdmF0ZSBjYWNoZWRUcmFuc2xhdGlvbnM6IE9wdGlvbmFsPFRyYW5zbGF0aW9uU3RyaW5nc09iamVjdD47XG5cbiAgICBwcml2YXRlIG92ZXJyaWRlTG9naW5SZXNvbHZlPzogKCkgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWN0aW9uID0gKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHBheWxvYWQuYWN0aW9uID09PSBBY3Rpb24uT25Mb2dnZWRJbikge1xuICAgICAgICAgICAgdGhpcy5vdmVycmlkZUxvZ2luUmVzb2x2ZT8uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWxsIGN1c3RvbSB0cmFuc2xhdGlvbnMgdXNlZCBieSB0aGUgYXNzb2NpYXRlZCBtb2R1bGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2xhdGlvbnMoKTogT3B0aW9uYWw8VHJhbnNsYXRpb25TdHJpbmdzT2JqZWN0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFRyYW5zbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvblN0cmluZ3NPYmplY3QpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZWRUcmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zbGF0ZVN0cmluZyhzOiBUcmFuc2xhdGlvbktleSwgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgUGxhaW5TdWJzdGl0dXRpb24+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIF90KHMsIHZhcmlhYmxlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIG9wZW5EaWFsb2c8TSBleHRlbmRzIG9iamVjdCwgUCBleHRlbmRzIERpYWxvZ1Byb3BzLCBDIGV4dGVuZHMgRGlhbG9nQ29udGVudDxQPj4oXG4gICAgICAgIGluaXRpYWxUaXRsZU9yT3B0aW9uczogc3RyaW5nIHwgTW9kdWxlVWlEaWFsb2dPcHRpb25zLFxuICAgICAgICBib2R5OiAocHJvcHM6IFAsIHJlZjogUmVhY3QuUmVmT2JqZWN0PEM+KSA9PiBSZWFjdC5SZWFjdE5vZGUsXG4gICAgICAgIHByb3BzPzogT21pdDxQLCBrZXlvZiBEaWFsb2dQcm9wcz4sXG4gICAgKTogUHJvbWlzZTx7IGRpZE9rT3JTdWJtaXQ6IGJvb2xlYW47IG1vZGVsOiBNIH0+IHtcbiAgICAgICAgY29uc3QgaW5pdGlhbE9wdGlvbnM6IE1vZHVsZVVpRGlhbG9nT3B0aW9ucyA9XG4gICAgICAgICAgICB0eXBlb2YgaW5pdGlhbFRpdGxlT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8geyB0aXRsZTogaW5pdGlhbFRpdGxlT3JPcHRpb25zIH0gOiBpbml0aWFsVGl0bGVPck9wdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHsgZGlkT2tPclN1Ym1pdDogYm9vbGVhbjsgbW9kZWw6IE0gfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhcbiAgICAgICAgICAgICAgICBNb2R1bGVVaURpYWxvZzxQLCBDPixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RmFjdG9yeTogYm9keSxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlQXBpOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQ29udGVudFByb3BzOiBwcm9wcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibXhfQ29tcG91bmREaWFsb2dcIixcbiAgICAgICAgICAgICkuZmluaXNoZWQudGhlbigoW2RpZE9rT3JTdWJtaXQsIG1vZGVsXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyBkaWRPa09yU3VibWl0OiAhIWRpZE9rT3JTdWJtaXQsIG1vZGVsOiBtb2RlbCBhcyBNIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlclNpbXBsZUFjY291bnQoXG4gICAgICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8QWNjb3VudEF1dGhJbmZvPiB7XG4gICAgICAgIGNvbnN0IGhzVXJsID0gU2RrQ29uZmlnLmdldChcInZhbGlkYXRlZF9zZXJ2ZXJfY29uZmlnXCIpPy5oc1VybDtcbiAgICAgICAgaWYgKCFoc1VybCkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCBob21lc2VydmVyIHVybFwiKTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gTWF0cml4LmNyZWF0ZUNsaWVudCh7IGJhc2VVcmw6IGhzVXJsIH0pO1xuICAgICAgICBjb25zdCBkZXZpY2VOYW1lID1cbiAgICAgICAgICAgIFNka0NvbmZpZy5nZXQoXCJkZWZhdWx0X2RldmljZV9kaXNwbGF5X25hbWVcIikgfHwgUGxhdGZvcm1QZWcuZ2V0KCk/LmdldERlZmF1bHREZXZpY2VEaXNwbGF5TmFtZSgpO1xuICAgICAgICBjb25zdCByZXE6IElSZWdpc3RlclJlcXVlc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgaW5pdGlhbF9kZXZpY2VfZGlzcGxheV9uYW1lOiBkZXZpY2VOYW1lLFxuICAgICAgICAgICAgYXV0aDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5oaWJpdF9sb2dpbjogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNyZWRzID0gYXdhaXQgY2xpZW50LnJlZ2lzdGVyUmVxdWVzdChyZXEpLmNhdGNoKChyZXNwKSA9PlxuICAgICAgICAgICAgY2xpZW50LnJlZ2lzdGVyUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgLi4ucmVxLFxuICAgICAgICAgICAgICAgIGF1dGg6IHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogcmVzcC5kYXRhLnNlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibS5sb2dpbi5kdW1teVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVDbGllbnQgPSBNYXRyaXguY3JlYXRlQ2xpZW50KHtcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBoc1VybCxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGNyZWRzLnVzZXJfaWQsXG4gICAgICAgICAgICAgICAgZGV2aWNlSWQ6IGNyZWRzLmRldmljZV9pZCxcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBwcm9maWxlQ2xpZW50LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBob21lc2VydmVyVXJsOiBoc1VybCxcbiAgICAgICAgICAgIHVzZXJJZDogY3JlZHMudXNlcl9pZCEsXG4gICAgICAgICAgICBkZXZpY2VJZDogY3JlZHMuZGV2aWNlX2lkISxcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkcy5hY2Nlc3NfdG9rZW4hLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBvdmVyd3JpdGVBY2NvdW50QXV0aChhY2NvdW50SW5mbzogQWNjb3VudEF1dGhJbmZvKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gd2FpdCBmb3IgdGhlIG5ldyBsb2dpbiB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLlxuICAgICAgICAvLyBTZWUgYEFjdGlvbi5PbkxvZ2dlZEluYCBpbiBkaXNwYXRjaGVyLlxuICAgICAgICBjb25zdCBhd2FpdE5ld0xvZ2luID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVMb2dpblJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoPE92ZXJ3cml0ZUxvZ2luUGF5bG9hZD4oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uT3ZlcndyaXRlTG9naW4sXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYWNjb3VudEluZm8sXG4gICAgICAgICAgICAgICAgICAgIGd1ZXN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICk7IC8vIHJlcXVpcmUgdG8gYmUgc3luYyB0byBtYXRjaCBpbmhlcml0ZWQgaW50ZXJmYWNlIGJlaGF2aW91clxuXG4gICAgICAgIC8vIHdhaXQgZm9yIGxvZ2luIHRvIGNvbXBsZXRlXG4gICAgICAgIGF3YWl0IGF3YWl0TmV3TG9naW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5hdmlnYXRlUGVybWFsaW5rKHVyaTogc3RyaW5nLCBhbmRKb2luPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBuYXZpZ2F0ZVRvUGVybWFsaW5rKHVyaSk7XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZVBlcm1hbGluayh1cmkpO1xuICAgICAgICBpZiAocGFydHM/LnJvb21JZE9yQWxpYXMgJiYgYW5kSm9pbikge1xuICAgICAgICAgICAgbGV0IHJvb21JZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcGFydHMucm9vbUlkT3JBbGlhcztcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gcGFydHMudmlhU2VydmVycztcbiAgICAgICAgICAgIGlmIChyb29tSWQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgICAgICByb29tSWQgPSBnZXRDYWNoZWRSb29tSURGb3JBbGlhcyhwYXJ0cy5yb29tSWRPckFsaWFzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvb21JZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGlhcyByZXNvbHV0aW9uIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFJvb21JZEZvckFsaWFzKHBhcnRzLnJvb21JZE9yQWxpYXMpO1xuICAgICAgICAgICAgICAgICAgICByb29tSWQgPSByZXN1bHQucm9vbV9pZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXJ2ZXJzKSBzZXJ2ZXJzID0gcmVzdWx0LnNlcnZlcnM7IC8vIHVzZSBwcm92aWRlZCBzZXJ2ZXJzIGZpcnN0LCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgICAgICByb29tX2lkOiByb29tSWQsXG4gICAgICAgICAgICAgICAgdmlhX3NlcnZlcnM6IHNlcnZlcnMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFuZEpvaW4pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uSm9pblJvb20sXG4gICAgICAgICAgICAgICAgICAgIGNhbkFza1RvSm9pbjogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfYXNrX3RvX2pvaW5cIiksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZmlnVmFsdWU8VD4obmFtZXNwYWNlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEZvcmNlIGNhc3QgdG8gYGFueWAgYmVjYXVzZSB0aGUgbmFtZXNwYWNlIHdvbid0IGJlIGtub3duIHRvIHRoZSBTZGtDb25maWcgdHlwZXNcbiAgICAgICAgY29uc3QgbWF5YmVPYmogPSBTZGtDb25maWcuZ2V0KG5hbWVzcGFjZSBhcyBhbnkpO1xuICAgICAgICBpZiAoIW1heWJlT2JqIHx8ICEodHlwZW9mIG1heWJlT2JqID09PSBcIm9iamVjdFwiKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG1heWJlT2JqW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIGdldEFwcHMocm9vbUlkOiBzdHJpbmcpOiBJQXBwW10ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0U3RvcmUuaW5zdGFuY2UuZ2V0QXBwcyhyb29tSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBcHBBdmF0YXJVcmwoYXBwOiBJQXBwLCB3aWR0aD86IG51bWJlciwgaGVpZ2h0PzogbnVtYmVyLCByZXNpemVNZXRob2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFhcHAuYXZhdGFyX3VybCkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcbiAgICAgICAgcmV0dXJuIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkubXhjVXJsVG9IdHRwKGFwcC5hdmF0YXJfdXJsLCB3aWR0aCwgaGVpZ2h0LCByZXNpemVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FwcEluQ29udGFpbmVyKGFwcDogSUFwcCwgY29udGFpbmVyOiBDb250YWluZXIsIHJvb21JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvb20gPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFJvb20ocm9vbUlkKTtcbiAgICAgICAgaWYgKCFyb29tKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5pc0luQ29udGFpbmVyKHJvb20sIGFwcCwgY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUFwcFRvQ29udGFpbmVyKGFwcDogSUFwcCwgY29udGFpbmVyOiBDb250YWluZXIsIHJvb21JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJvb20gPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFJvb20ocm9vbUlkKTtcbiAgICAgICAgaWYgKCFyb29tKSByZXR1cm47XG4gICAgICAgIFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLm1vdmVUb0NvbnRhaW5lcihyb29tLCBhcHAsIGNvbnRhaW5lcik7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWNBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUlBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxlQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxVQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxXQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxVQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxXQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxnQkFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsZUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksUUFBQSxHQUFBWixPQUFBO0FBR0EsSUFBQWEsY0FBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWMsWUFBQSxHQUFBWixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWUsa0JBQUEsR0FBQWYsT0FBQTtBQUFtRixTQUFBZ0IseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWxCLHdCQUFBa0IsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFK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