UNPKG

matrix-react-sdk

Version:
200 lines (197 loc) 37.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _compoundWeb = require("@vector-im/compound-web"); var _popOut = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/pop-out")); var _signOut = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/sign-out")); var _languageHandler = require("../../../languageHandler"); var _OwnProfileStore = require("../../../stores/OwnProfileStore"); var _AvatarSetting = _interopRequireDefault(require("./AvatarSetting")); var _PosthogTrackers = _interopRequireDefault(require("../../../PosthogTrackers")); var _FormattingUtils = require("../../../utils/FormattingUtils"); var _ToastContext = require("../../../contexts/ToastContext"); var _InlineSpinner = _interopRequireDefault(require("../elements/InlineSpinner")); var _UserIdentifier = _interopRequireDefault(require("../../../customisations/UserIdentifier")); var _useId = require("../../../utils/useId"); var _CopyableText = _interopRequireDefault(require("../elements/CopyableText")); var _MatrixClientContext = require("../../../contexts/MatrixClientContext"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _LogoutDialog = _interopRequireWildcard(require("../dialogs/LogoutDialog")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _Flex = require("../../utils/Flex"); 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; } /* Copyright 2024 New Vector Ltd. Copyright 2019-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. */ const SpinnerToast = ({ children }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, null), children); const UsernameBox = ({ username }) => { const labelId = (0, _useId.useId)(); return /*#__PURE__*/_react.default.createElement("div", { className: "mx_UserProfileSettings_profile_controls_userId" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_UserProfileSettings_profile_controls_userId_label", id: labelId }, (0, _languageHandler._t)("settings|general|username")), /*#__PURE__*/_react.default.createElement(_CopyableText.default, { getTextToCopy: () => username, "aria-labelledby": labelId }, username)); }; const ManageAccountButton = ({ externalAccountManagementUrl }) => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: null, element: "a", kind: "primary", target: "_blank", rel: "noreferrer noopener", href: externalAccountManagementUrl, "data-testid": "external-account-management-link" }, /*#__PURE__*/_react.default.createElement(_popOut.default, { className: "mx_UserProfileSettings_accountmanageIcon", width: "24", height: "24" }), (0, _languageHandler._t)("settings|general|oidc_manage_button")); const SignOutButton = () => { const client = (0, _MatrixClientContext.useMatrixClientContext)(); const onClick = (0, _react.useCallback)(async () => { if (await (0, _LogoutDialog.shouldShowLogoutDialog)(client)) { _Modal.default.createDialog(_LogoutDialog.default); } else { _dispatcher.default.dispatch({ action: "logout" }); } }, [client]); return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: onClick, kind: "danger_outline" }, /*#__PURE__*/_react.default.createElement(_signOut.default, { className: "mx_UserProfileSettings_accountmanageIcon", width: "24", height: "24" }), (0, _languageHandler._t)("action|sign_out")); }; /** * A group of settings views to allow the user to set their profile information. */ const UserProfileSettings = ({ externalAccountManagementUrl, canSetDisplayName, canSetAvatar }) => { const [avatarURL, setAvatarURL] = (0, _react.useState)(_OwnProfileStore.OwnProfileStore.instance.avatarMxc); const [displayName, setDisplayName] = (0, _react.useState)(_OwnProfileStore.OwnProfileStore.instance.displayName ?? ""); const [avatarError, setAvatarError] = (0, _react.useState)(false); const [maxUploadSize, setMaxUploadSize] = (0, _react.useState)(); const [displayNameError, setDisplayNameError] = (0, _react.useState)(false); const toastRack = (0, _ToastContext.useToastContext)(); const client = (0, _MatrixClientContext.useMatrixClientContext)(); (0, _react.useEffect)(() => { (async () => { try { const mediaConfig = await client.getMediaConfig(); setMaxUploadSize(mediaConfig["m.upload.size"]); } catch (e) { _logger.logger.warn("Failed to get media config", e); } })(); }, [client]); const onAvatarRemove = (0, _react.useCallback)(async () => { const removeToast = toastRack.displayToast( /*#__PURE__*/_react.default.createElement(SpinnerToast, null, (0, _languageHandler._t)("settings|general|avatar_remove_progress"))); try { await client.setAvatarUrl(""); // use empty string as Synapse 500s on undefined setAvatarURL(""); } finally { removeToast(); } }, [toastRack, client]); const onAvatarChange = (0, _react.useCallback)(async avatarFile => { _PosthogTrackers.default.trackInteraction("WebProfileSettingsAvatarUploadButton"); _logger.logger.log(`Uploading new avatar, ${avatarFile.name} of type ${avatarFile.type}, (${avatarFile.size}) bytes`); const removeToast = toastRack.displayToast( /*#__PURE__*/_react.default.createElement(SpinnerToast, null, (0, _languageHandler._t)("settings|general|avatar_save_progress"))); try { setAvatarError(false); const { content_uri: uri } = await client.uploadContent(avatarFile); await client.setAvatarUrl(uri); setAvatarURL(uri); } catch (e) { setAvatarError(true); } finally { removeToast(); } }, [toastRack, client]); const onDisplayNameChanged = (0, _react.useCallback)(e => { setDisplayName(e.target.value); }, []); const onDisplayNameCancel = (0, _react.useCallback)(() => { setDisplayName(_OwnProfileStore.OwnProfileStore.instance.displayName ?? ""); }, []); const onDisplayNameSave = (0, _react.useCallback)(async () => { try { setDisplayNameError(false); await client.setDisplayName(displayName); } catch (e) { setDisplayNameError(true); throw e; } }, [displayName, client]); const userIdentifier = (0, _react.useMemo)(() => _UserIdentifier.default.getDisplayUserIdentifier(client.getSafeUserId(), { withDisplayName: true }), [client]); const someFieldsDisabled = !canSetDisplayName || !canSetAvatar; return /*#__PURE__*/_react.default.createElement("div", { className: "mx_UserProfileSettings" }, /*#__PURE__*/_react.default.createElement("h2", null, (0, _languageHandler._t)("common|profile")), /*#__PURE__*/_react.default.createElement("div", null, someFieldsDisabled ? (0, _languageHandler._t)("settings|general|profile_subtitle_oidc") : (0, _languageHandler._t)("settings|general|profile_subtitle")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_UserProfileSettings_profile" }, /*#__PURE__*/_react.default.createElement(_AvatarSetting.default, { avatar: avatarURL ?? undefined, avatarAltText: (0, _languageHandler._t)("common|user_avatar"), onChange: onAvatarChange, removeAvatar: avatarURL ? onAvatarRemove : undefined, placeholderName: displayName, placeholderId: client.getUserId() ?? "", disabled: !canSetAvatar }), /*#__PURE__*/_react.default.createElement(_compoundWeb.EditInPlace, { className: "mx_UserProfileSettings_profile_displayName", label: (0, _languageHandler._t)("settings|general|display_name"), value: displayName, saveButtonLabel: (0, _languageHandler._t)("common|save"), cancelButtonLabel: (0, _languageHandler._t)("common|cancel"), savedLabel: (0, _languageHandler._t)("common|saved"), savingLabel: (0, _languageHandler._t)("common|updating"), onChange: onDisplayNameChanged, onCancel: onDisplayNameCancel, onSave: onDisplayNameSave, disabled: !canSetDisplayName }, displayNameError && /*#__PURE__*/_react.default.createElement(_compoundWeb.ErrorMessage, null, (0, _languageHandler._t)("settings|general|display_name_error")))), avatarError && /*#__PURE__*/_react.default.createElement(_compoundWeb.Alert, { title: (0, _languageHandler._t)("settings|general|avatar_upload_error_title"), type: "critical" }, maxUploadSize === undefined ? (0, _languageHandler._t)("settings|general|avatar_upload_error_text_generic") : (0, _languageHandler._t)("settings|general|avatar_upload_error_text", { size: (0, _FormattingUtils.formatBytes)(maxUploadSize) })), userIdentifier && /*#__PURE__*/_react.default.createElement(UsernameBox, { username: userIdentifier }), /*#__PURE__*/_react.default.createElement(_Flex.Flex, { gap: "var(--cpd-space-4x)", className: "mx_UserProfileSettings_profile_buttons" }, externalAccountManagementUrl && /*#__PURE__*/_react.default.createElement(ManageAccountButton, { externalAccountManagementUrl: externalAccountManagementUrl }), /*#__PURE__*/_react.default.createElement(SignOutButton, null))); }; var _default = exports.default = UserProfileSettings; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2NvbXBvdW5kV2ViIiwiX3BvcE91dCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc2lnbk91dCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfT3duUHJvZmlsZVN0b3JlIiwiX0F2YXRhclNldHRpbmciLCJfUG9zdGhvZ1RyYWNrZXJzIiwiX0Zvcm1hdHRpbmdVdGlscyIsIl9Ub2FzdENvbnRleHQiLCJfSW5saW5lU3Bpbm5lciIsIl9Vc2VySWRlbnRpZmllciIsIl91c2VJZCIsIl9Db3B5YWJsZVRleHQiLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX0xvZ291dERpYWxvZyIsIl9Nb2RhbCIsIl9kaXNwYXRjaGVyIiwiX0ZsZXgiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTcGlubmVyVG9hc3QiLCJjaGlsZHJlbiIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsIlVzZXJuYW1lQm94IiwidXNlcm5hbWUiLCJsYWJlbElkIiwidXNlSWQiLCJjbGFzc05hbWUiLCJpZCIsIl90IiwiZ2V0VGV4dFRvQ29weSIsIk1hbmFnZUFjY291bnRCdXR0b24iLCJleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsIiwib25DbGljayIsImVsZW1lbnQiLCJraW5kIiwidGFyZ2V0IiwicmVsIiwiaHJlZiIsIndpZHRoIiwiaGVpZ2h0IiwiU2lnbk91dEJ1dHRvbiIsImNsaWVudCIsInVzZU1hdHJpeENsaWVudENvbnRleHQiLCJ1c2VDYWxsYmFjayIsInNob3VsZFNob3dMb2dvdXREaWFsb2ciLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIkxvZ291dERpYWxvZyIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJVc2VyUHJvZmlsZVNldHRpbmdzIiwiY2FuU2V0RGlzcGxheU5hbWUiLCJjYW5TZXRBdmF0YXIiLCJhdmF0YXJVUkwiLCJzZXRBdmF0YXJVUkwiLCJ1c2VTdGF0ZSIsIk93blByb2ZpbGVTdG9yZSIsImluc3RhbmNlIiwiYXZhdGFyTXhjIiwiZGlzcGxheU5hbWUiLCJzZXREaXNwbGF5TmFtZSIsImF2YXRhckVycm9yIiwic2V0QXZhdGFyRXJyb3IiLCJtYXhVcGxvYWRTaXplIiwic2V0TWF4VXBsb2FkU2l6ZSIsImRpc3BsYXlOYW1lRXJyb3IiLCJzZXREaXNwbGF5TmFtZUVycm9yIiwidG9hc3RSYWNrIiwidXNlVG9hc3RDb250ZXh0IiwidXNlRWZmZWN0IiwibWVkaWFDb25maWciLCJnZXRNZWRpYUNvbmZpZyIsImxvZ2dlciIsIndhcm4iLCJvbkF2YXRhclJlbW92ZSIsInJlbW92ZVRvYXN0IiwiZGlzcGxheVRvYXN0Iiwic2V0QXZhdGFyVXJsIiwib25BdmF0YXJDaGFuZ2UiLCJhdmF0YXJGaWxlIiwiUG9zdGhvZ1RyYWNrZXJzIiwidHJhY2tJbnRlcmFjdGlvbiIsImxvZyIsIm5hbWUiLCJ0eXBlIiwic2l6ZSIsImNvbnRlbnRfdXJpIiwidXJpIiwidXBsb2FkQ29udGVudCIsIm9uRGlzcGxheU5hbWVDaGFuZ2VkIiwidmFsdWUiLCJvbkRpc3BsYXlOYW1lQ2FuY2VsIiwib25EaXNwbGF5TmFtZVNhdmUiLCJ1c2VySWRlbnRpZmllciIsInVzZU1lbW8iLCJVc2VySWRlbnRpZmllckN1c3RvbWlzYXRpb25zIiwiZ2V0RGlzcGxheVVzZXJJZGVudGlmaWVyIiwiZ2V0U2FmZVVzZXJJZCIsIndpdGhEaXNwbGF5TmFtZSIsInNvbWVGaWVsZHNEaXNhYmxlZCIsImF2YXRhciIsInVuZGVmaW5lZCIsImF2YXRhckFsdFRleHQiLCJvbkNoYW5nZSIsInJlbW92ZUF2YXRhciIsInBsYWNlaG9sZGVyTmFtZSIsInBsYWNlaG9sZGVySWQiLCJnZXRVc2VySWQiLCJkaXNhYmxlZCIsIkVkaXRJblBsYWNlIiwibGFiZWwiLCJzYXZlQnV0dG9uTGFiZWwiLCJjYW5jZWxCdXR0b25MYWJlbCIsInNhdmVkTGFiZWwiLCJzYXZpbmdMYWJlbCIsIm9uQ2FuY2VsIiwib25TYXZlIiwiRXJyb3JNZXNzYWdlIiwiQWxlcnQiLCJ0aXRsZSIsImZvcm1hdEJ5dGVzIiwiRmxleCIsImdhcCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL1VzZXJQcm9maWxlU2V0dGluZ3MudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LTIwMjQgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFZGl0SW5QbGFjZSwgQWxlcnQsIEVycm9yTWVzc2FnZSB9IGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLXdlYlwiO1xuaW1wb3J0IFBvcE91dEljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL3BvcC1vdXRcIjtcbmltcG9ydCBTaWduT3V0SWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvc2lnbi1vdXRcIjtcblxuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBPd25Qcm9maWxlU3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL093blByb2ZpbGVTdG9yZVwiO1xuaW1wb3J0IEF2YXRhclNldHRpbmcgZnJvbSBcIi4vQXZhdGFyU2V0dGluZ1wiO1xuaW1wb3J0IFBvc3Rob2dUcmFja2VycyBmcm9tIFwiLi4vLi4vLi4vUG9zdGhvZ1RyYWNrZXJzXCI7XG5pbXBvcnQgeyBmb3JtYXRCeXRlcyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9Gb3JtYXR0aW5nVXRpbHNcIjtcbmltcG9ydCB7IHVzZVRvYXN0Q29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9Ub2FzdENvbnRleHRcIjtcbmltcG9ydCBJbmxpbmVTcGlubmVyIGZyb20gXCIuLi9lbGVtZW50cy9JbmxpbmVTcGlubmVyXCI7XG5pbXBvcnQgVXNlcklkZW50aWZpZXJDdXN0b21pc2F0aW9ucyBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvVXNlcklkZW50aWZpZXJcIjtcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3VzZUlkXCI7XG5pbXBvcnQgQ29weWFibGVUZXh0IGZyb20gXCIuLi9lbGVtZW50cy9Db3B5YWJsZVRleHRcIjtcbmltcG9ydCB7IHVzZU1hdHJpeENsaWVudENvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBMb2dvdXREaWFsb2csIHsgc2hvdWxkU2hvd0xvZ291dERpYWxvZyB9IGZyb20gXCIuLi9kaWFsb2dzL0xvZ291dERpYWxvZ1wiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEZsZXggfSBmcm9tIFwiLi4vLi4vdXRpbHMvRmxleFwiO1xuXG5jb25zdCBTcGlubmVyVG9hc3Q6IFJlYWN0LkZDPHsgY2hpbGRyZW4/OiBSZWFjdE5vZGUgfT4gPSAoeyBjaGlsZHJlbiB9KSA9PiAoXG4gICAgPD5cbiAgICAgICAgPElubGluZVNwaW5uZXIgLz5cbiAgICAgICAge2NoaWxkcmVufVxuICAgIDwvPlxuKTtcblxuaW50ZXJmYWNlIFVzZXJuYW1lQm94UHJvcHMge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG59XG5cbmNvbnN0IFVzZXJuYW1lQm94OiBSZWFjdC5GQzxVc2VybmFtZUJveFByb3BzPiA9ICh7IHVzZXJuYW1lIH0pID0+IHtcbiAgICBjb25zdCBsYWJlbElkID0gdXNlSWQoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1VzZXJQcm9maWxlU2V0dGluZ3NfcHJvZmlsZV9jb250cm9sc191c2VySWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVXNlclByb2ZpbGVTZXR0aW5nc19wcm9maWxlX2NvbnRyb2xzX3VzZXJJZF9sYWJlbFwiIGlkPXtsYWJlbElkfT5cbiAgICAgICAgICAgICAgICB7X3QoXCJzZXR0aW5nc3xnZW5lcmFsfHVzZXJuYW1lXCIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Q29weWFibGVUZXh0IGdldFRleHRUb0NvcHk9eygpID0+IHVzZXJuYW1lfSBhcmlhLWxhYmVsbGVkYnk9e2xhYmVsSWR9PlxuICAgICAgICAgICAgICAgIHt1c2VybmFtZX1cbiAgICAgICAgICAgIDwvQ29weWFibGVUZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuaW50ZXJmYWNlIE1hbmFnZUFjY291bnRCdXR0b25Qcm9wcyB7XG4gICAgZXh0ZXJuYWxBY2NvdW50TWFuYWdlbWVudFVybDogc3RyaW5nO1xufVxuXG5jb25zdCBNYW5hZ2VBY2NvdW50QnV0dG9uOiBSZWFjdC5GQzxNYW5hZ2VBY2NvdW50QnV0dG9uUHJvcHM+ID0gKHsgZXh0ZXJuYWxBY2NvdW50TWFuYWdlbWVudFVybCB9KSA9PiAoXG4gICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgb25DbGljaz17bnVsbH1cbiAgICAgICAgZWxlbWVudD1cImFcIlxuICAgICAgICBraW5kPVwicHJpbWFyeVwiXG4gICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIlxuICAgICAgICBocmVmPXtleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsfVxuICAgICAgICBkYXRhLXRlc3RpZD1cImV4dGVybmFsLWFjY291bnQtbWFuYWdlbWVudC1saW5rXCJcbiAgICA+XG4gICAgICAgIDxQb3BPdXRJY29uIGNsYXNzTmFtZT1cIm14X1VzZXJQcm9maWxlU2V0dGluZ3NfYWNjb3VudG1hbmFnZUljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiAvPlxuICAgICAgICB7X3QoXCJzZXR0aW5nc3xnZW5lcmFsfG9pZGNfbWFuYWdlX2J1dHRvblwiKX1cbiAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4pO1xuXG5jb25zdCBTaWduT3V0QnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSB1c2VNYXRyaXhDbGllbnRDb250ZXh0KCk7XG5cbiAgICBjb25zdCBvbkNsaWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoYXdhaXQgc2hvdWxkU2hvd0xvZ291dERpYWxvZyhjbGllbnQpKSB7XG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coTG9nb3V0RGlhbG9nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHsgYWN0aW9uOiBcImxvZ291dFwiIH0pO1xuICAgICAgICB9XG4gICAgfSwgW2NsaWVudF0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gb25DbGljaz17b25DbGlja30ga2luZD1cImRhbmdlcl9vdXRsaW5lXCI+XG4gICAgICAgICAgICA8U2lnbk91dEljb24gY2xhc3NOYW1lPVwibXhfVXNlclByb2ZpbGVTZXR0aW5nc19hY2NvdW50bWFuYWdlSWNvblwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIC8+XG4gICAgICAgICAgICB7X3QoXCJhY3Rpb258c2lnbl9vdXRcIil9XG4gICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICApO1xufTtcblxuaW50ZXJmYWNlIFVzZXJQcm9maWxlU2V0dGluZ3NQcm9wcyB7XG4gICAgLy8gVGhlIFVSTCB0byByZWRpcmVjdCB0aGUgdXNlciB0byBpbiBvcmRlciB0byBtYW5hZ2UgdGhlaXIgYWNjb3VudC5cbiAgICBleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsPzogc3RyaW5nO1xuICAgIC8vIFdoZXRoZXIgdGhlIGhvbWVzZXJ2ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIHNldCB0aGVpciBkaXNwbGF5IG5hbWUuXG4gICAgY2FuU2V0RGlzcGxheU5hbWU6IGJvb2xlYW47XG4gICAgLy8gV2hldGhlciB0aGUgaG9tZXNlcnZlciBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZWlyIGF2YXRhci5cbiAgICBjYW5TZXRBdmF0YXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBncm91cCBvZiBzZXR0aW5ncyB2aWV3cyB0byBhbGxvdyB0aGUgdXNlciB0byBzZXQgdGhlaXIgcHJvZmlsZSBpbmZvcm1hdGlvbi5cbiAqL1xuY29uc3QgVXNlclByb2ZpbGVTZXR0aW5nczogUmVhY3QuRkM8VXNlclByb2ZpbGVTZXR0aW5nc1Byb3BzPiA9ICh7XG4gICAgZXh0ZXJuYWxBY2NvdW50TWFuYWdlbWVudFVybCxcbiAgICBjYW5TZXREaXNwbGF5TmFtZSxcbiAgICBjYW5TZXRBdmF0YXIsXG59KSA9PiB7XG4gICAgY29uc3QgW2F2YXRhclVSTCwgc2V0QXZhdGFyVVJMXSA9IHVzZVN0YXRlKE93blByb2ZpbGVTdG9yZS5pbnN0YW5jZS5hdmF0YXJNeGMpO1xuICAgIGNvbnN0IFtkaXNwbGF5TmFtZSwgc2V0RGlzcGxheU5hbWVdID0gdXNlU3RhdGUoT3duUHJvZmlsZVN0b3JlLmluc3RhbmNlLmRpc3BsYXlOYW1lID8/IFwiXCIpO1xuICAgIGNvbnN0IFthdmF0YXJFcnJvciwgc2V0QXZhdGFyRXJyb3JdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGNvbnN0IFttYXhVcGxvYWRTaXplLCBzZXRNYXhVcGxvYWRTaXplXSA9IHVzZVN0YXRlPG51bWJlciB8IHVuZGVmaW5lZD4oKTtcbiAgICBjb25zdCBbZGlzcGxheU5hbWVFcnJvciwgc2V0RGlzcGxheU5hbWVFcnJvcl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgICBjb25zdCB0b2FzdFJhY2sgPSB1c2VUb2FzdENvbnRleHQoKTtcblxuICAgIGNvbnN0IGNsaWVudCA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhQ29uZmlnID0gYXdhaXQgY2xpZW50LmdldE1lZGlhQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc2V0TWF4VXBsb2FkU2l6ZShtZWRpYUNvbmZpZ1tcIm0udXBsb2FkLnNpemVcIl0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGdldCBtZWRpYSBjb25maWdcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgfSwgW2NsaWVudF0pO1xuXG4gICAgY29uc3Qgb25BdmF0YXJSZW1vdmUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW92ZVRvYXN0ID0gdG9hc3RSYWNrLmRpc3BsYXlUb2FzdChcbiAgICAgICAgICAgIDxTcGlubmVyVG9hc3Q+e190KFwic2V0dGluZ3N8Z2VuZXJhbHxhdmF0YXJfcmVtb3ZlX3Byb2dyZXNzXCIpfTwvU3Bpbm5lclRvYXN0PixcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZXRBdmF0YXJVcmwoXCJcIik7IC8vIHVzZSBlbXB0eSBzdHJpbmcgYXMgU3luYXBzZSA1MDBzIG9uIHVuZGVmaW5lZFxuICAgICAgICAgICAgc2V0QXZhdGFyVVJMKFwiXCIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVtb3ZlVG9hc3QoKTtcbiAgICAgICAgfVxuICAgIH0sIFt0b2FzdFJhY2ssIGNsaWVudF0pO1xuXG4gICAgY29uc3Qgb25BdmF0YXJDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgYXN5bmMgKGF2YXRhckZpbGU6IEZpbGUpID0+IHtcbiAgICAgICAgICAgIFBvc3Rob2dUcmFja2Vycy50cmFja0ludGVyYWN0aW9uKFwiV2ViUHJvZmlsZVNldHRpbmdzQXZhdGFyVXBsb2FkQnV0dG9uXCIpO1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICAgICAgICBgVXBsb2FkaW5nIG5ldyBhdmF0YXIsICR7YXZhdGFyRmlsZS5uYW1lfSBvZiB0eXBlICR7YXZhdGFyRmlsZS50eXBlfSwgKCR7YXZhdGFyRmlsZS5zaXplfSkgYnl0ZXNgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZVRvYXN0ID0gdG9hc3RSYWNrLmRpc3BsYXlUb2FzdChcbiAgICAgICAgICAgICAgICA8U3Bpbm5lclRvYXN0PntfdChcInNldHRpbmdzfGdlbmVyYWx8YXZhdGFyX3NhdmVfcHJvZ3Jlc3NcIil9PC9TcGlubmVyVG9hc3Q+LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc2V0QXZhdGFyRXJyb3IoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udGVudF91cmk6IHVyaSB9ID0gYXdhaXQgY2xpZW50LnVwbG9hZENvbnRlbnQoYXZhdGFyRmlsZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNldEF2YXRhclVybCh1cmkpO1xuICAgICAgICAgICAgICAgIHNldEF2YXRhclVSTCh1cmkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHNldEF2YXRhckVycm9yKHRydWUpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZW1vdmVUb2FzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbdG9hc3RSYWNrLCBjbGllbnRdLFxuICAgICk7XG5cbiAgICBjb25zdCBvbkRpc3BsYXlOYW1lQ2hhbmdlZCA9IHVzZUNhbGxiYWNrKChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBzZXREaXNwbGF5TmFtZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25EaXNwbGF5TmFtZUNhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0RGlzcGxheU5hbWUoT3duUHJvZmlsZVN0b3JlLmluc3RhbmNlLmRpc3BsYXlOYW1lID8/IFwiXCIpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG9uRGlzcGxheU5hbWVTYXZlID0gdXNlQ2FsbGJhY2soYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0RGlzcGxheU5hbWVFcnJvcihmYWxzZSk7XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXREaXNwbGF5TmFtZUVycm9yKHRydWUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH0sIFtkaXNwbGF5TmFtZSwgY2xpZW50XSk7XG5cbiAgICBjb25zdCB1c2VySWRlbnRpZmllciA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICBVc2VySWRlbnRpZmllckN1c3RvbWlzYXRpb25zLmdldERpc3BsYXlVc2VySWRlbnRpZmllcihjbGllbnQuZ2V0U2FmZVVzZXJJZCgpLCB7XG4gICAgICAgICAgICAgICAgd2l0aERpc3BsYXlOYW1lOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIFtjbGllbnRdLFxuICAgICk7XG5cbiAgICBjb25zdCBzb21lRmllbGRzRGlzYWJsZWQgPSAhY2FuU2V0RGlzcGxheU5hbWUgfHwgIWNhblNldEF2YXRhcjtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVXNlclByb2ZpbGVTZXR0aW5nc1wiPlxuICAgICAgICAgICAgPGgyPntfdChcImNvbW1vbnxwcm9maWxlXCIpfTwvaDI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtzb21lRmllbGRzRGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgPyBfdChcInNldHRpbmdzfGdlbmVyYWx8cHJvZmlsZV9zdWJ0aXRsZV9vaWRjXCIpXG4gICAgICAgICAgICAgICAgICAgIDogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfHByb2ZpbGVfc3VidGl0bGVcIil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVXNlclByb2ZpbGVTZXR0aW5nc19wcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgPEF2YXRhclNldHRpbmdcbiAgICAgICAgICAgICAgICAgICAgYXZhdGFyPXthdmF0YXJVUkwgPz8gdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICBhdmF0YXJBbHRUZXh0PXtfdChcImNvbW1vbnx1c2VyX2F2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQXZhdGFyQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICByZW1vdmVBdmF0YXI9e2F2YXRhclVSTCA/IG9uQXZhdGFyUmVtb3ZlIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlck5hbWU9e2Rpc3BsYXlOYW1lfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcklkPXtjbGllbnQuZ2V0VXNlcklkKCkgPz8gXCJcIn1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjYW5TZXRBdmF0YXJ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8RWRpdEluUGxhY2VcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfVXNlclByb2ZpbGVTZXR0aW5nc19wcm9maWxlX2Rpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8Z2VuZXJhbHxkaXNwbGF5X25hbWVcIil9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtkaXNwbGF5TmFtZX1cbiAgICAgICAgICAgICAgICAgICAgc2F2ZUJ1dHRvbkxhYmVsPXtfdChcImNvbW1vbnxzYXZlXCIpfVxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25MYWJlbD17X3QoXCJjb21tb258Y2FuY2VsXCIpfVxuICAgICAgICAgICAgICAgICAgICBzYXZlZExhYmVsPXtfdChcImNvbW1vbnxzYXZlZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgc2F2aW5nTGFiZWw9e190KFwiY29tbW9ufHVwZGF0aW5nXCIpfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25EaXNwbGF5TmFtZUNoYW5nZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXtvbkRpc3BsYXlOYW1lQ2FuY2VsfVxuICAgICAgICAgICAgICAgICAgICBvblNhdmU9e29uRGlzcGxheU5hbWVTYXZlfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhblNldERpc3BsYXlOYW1lfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2Rpc3BsYXlOYW1lRXJyb3IgJiYgPEVycm9yTWVzc2FnZT57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRpc3BsYXlfbmFtZV9lcnJvclwiKX08L0Vycm9yTWVzc2FnZT59XG4gICAgICAgICAgICAgICAgPC9FZGl0SW5QbGFjZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2F2YXRhckVycm9yICYmIChcbiAgICAgICAgICAgICAgICA8QWxlcnQgdGl0bGU9e190KFwic2V0dGluZ3N8Z2VuZXJhbHxhdmF0YXJfdXBsb2FkX2Vycm9yX3RpdGxlXCIpfSB0eXBlPVwiY3JpdGljYWxcIj5cbiAgICAgICAgICAgICAgICAgICAge21heFVwbG9hZFNpemUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfdChcInNldHRpbmdzfGdlbmVyYWx8YXZhdGFyX3VwbG9hZF9lcnJvcl90ZXh0X2dlbmVyaWNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGF2YXRhcl91cGxvYWRfZXJyb3JfdGV4dFwiLCB7IHNpemU6IGZvcm1hdEJ5dGVzKG1heFVwbG9hZFNpemUpIH0pfVxuICAgICAgICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3VzZXJJZGVudGlmaWVyICYmIDxVc2VybmFtZUJveCB1c2VybmFtZT17dXNlcklkZW50aWZpZXJ9IC8+fVxuICAgICAgICAgICAgPEZsZXggZ2FwPVwidmFyKC0tY3BkLXNwYWNlLTR4KVwiIGNsYXNzTmFtZT1cIm14X1VzZXJQcm9maWxlU2V0dGluZ3NfcHJvZmlsZV9idXR0b25zXCI+XG4gICAgICAgICAgICAgICAge2V4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmwgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8TWFuYWdlQWNjb3VudEJ1dHRvbiBleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsPXtleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsfSAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPFNpZ25PdXRCdXR0b24gLz5cbiAgICAgICAgICAgIDwvRmxleD5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJQcm9maWxlU2V0dGluZ3M7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFFQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGNBQUEsR0FBQUosc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFTLGdCQUFBLEdBQUFMLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBVSxnQkFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsYUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksY0FBQSxHQUFBUixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQWEsZUFBQSxHQUFBVCxzQkFBQSxDQUFBSixPQUFBO0FB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