UNPKG

matrix-react-sdk

Version:
211 lines (207 loc) 30.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 _react = _interopRequireWildcard(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _languageHandler = require("../../../languageHandler"); var _Validation = _interopRequireDefault(require("./Validation")); var _Field = _interopRequireDefault(require("./Field")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); 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-2021 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. */ // Controlled form component wrapping Field for inputting a room alias scoped to a given domain class RoomAliasField extends _react.default.PureComponent { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "fieldRef", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onChange", ev => { this.props.onChange?.(this.asFullAlias(ev.target.value)); }); (0, _defineProperty2.default)(this, "onValidate", async fieldState => { const result = await this.validationRules(fieldState); this.setState({ isValid: !!result.valid }); return result; }); (0, _defineProperty2.default)(this, "validationRules", (0, _Validation.default)({ rules: [{ key: "hasDomain", test: async ({ value }) => { // Ignore if we have passed domain if (!value || this.props.domain) { return true; } if (value.split(":").length < 2) { return false; } return true; }, invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_has_domain_invalid") }, { key: "hasLocalpart", test: async ({ value }) => { if (!value || this.props.domain) { return true; } const split = value.split(":"); if (split.length < 2) { return true; // hasDomain check will fail here instead } // Define the value invalid if there's no first part (roomname) if (split[0].length < 1) { return false; } return true; }, invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_has_localpart_invalid") }, { key: "safeLocalpart", test: async ({ value }) => { if (!value) { return true; } if (!this.props.domain) { return true; } else { const fullAlias = this.asFullAlias(value); const hasColon = this.props.domain ? !value.includes(":") : true; // XXX: FIXME https://github.com/matrix-org/matrix-doc/issues/668 // NOTE: We could probably use linkifyjs to parse those aliases here? return !value.includes("#") && hasColon && !value.includes(",") && encodeURI(fullAlias) === fullAlias; } }, invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_safe_localpart_invalid") }, { key: "required", test: async ({ value, allowEmpty }) => allowEmpty || !!value, invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_required_invalid") }, this.props.roomId ? { key: "matches", final: true, test: async ({ value }) => { if (!value) { return true; } const client = this.context; try { const result = await client.getRoomIdForAlias(this.asFullAlias(value)); return result.room_id === this.props.roomId; } catch (err) { console.log(err); return false; } }, invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_matches_invalid") } : { key: "taken", final: true, test: async ({ value }) => { if (!value) { return true; } const client = this.context; try { await client.getRoomIdForAlias(this.asFullAlias(value)); // we got a room id, so the alias is taken return false; } catch (err) { console.log(err); // any server error code will do, // either it M_NOT_FOUND or the alias is invalid somehow, // in which case we don't want to show the invalid message return err instanceof _matrix.MatrixError; } }, valid: () => (0, _languageHandler._t)("room_settings|general|alias_field_taken_valid"), invalid: () => this.props.domain ? (0, _languageHandler._t)("room_settings|general|alias_field_taken_invalid_domain") : (0, _languageHandler._t)("room_settings|general|alias_field_taken_invalid") }] })); this.state = { isValid: true }; } asFullAlias(localpart) { const hashAlias = `#${localpart}`; if (this.props.domain) { return `${hashAlias}:${this.props.domain}`; } return hashAlias; } get domainProps() { const { domain } = this.props; const prefix = /*#__PURE__*/_react.default.createElement("span", null, "#"); const postfix = domain ? /*#__PURE__*/_react.default.createElement("span", { title: `:${domain}` }, `:${domain}`) : /*#__PURE__*/_react.default.createElement("span", null); const maxlength = domain ? 255 - domain.length - 2 : 255 - 1; // 2 for # and : const value = domain ? this.props.value.substring(1, this.props.value.length - domain.length - 1) : this.props.value.substring(1); return { prefix, postfix, value, maxlength }; } render() { const { prefix, postfix, value, maxlength } = this.domainProps; return /*#__PURE__*/_react.default.createElement(_Field.default, { label: this.props.label || (0, _languageHandler._t)("room_settings|general|alias_heading"), className: "mx_RoomAliasField", prefixComponent: prefix, postfixComponent: postfix, ref: this.fieldRef, onValidate: this.onValidate, placeholder: this.props.placeholder || (0, _languageHandler._t)("room_settings|general|alias_field_placeholder_default"), onChange: this.onChange, value: value, maxLength: maxlength, disabled: this.props.disabled, autoComplete: "off", onKeyDown: this.props.onKeyDown }); } get isValid() { return this.state.isValid; } async validate(options) { const val = await this.fieldRef.current?.validate(options); return val ?? false; } focus() { this.fieldRef.current?.focus(); } } exports.default = RoomAliasField; (0, _defineProperty2.default)(RoomAliasField, "contextType", _MatrixClientContext.default); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9WYWxpZGF0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9GaWVsZCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUm9vbUFsaWFzRmllbGQiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY29udGV4dCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJldiIsIm9uQ2hhbmdlIiwiYXNGdWxsQWxpYXMiLCJ0YXJnZXQiLCJ2YWx1ZSIsImZpZWxkU3RhdGUiLCJyZXN1bHQiLCJ2YWxpZGF0aW9uUnVsZXMiLCJzZXRTdGF0ZSIsImlzVmFsaWQiLCJ2YWxpZCIsIndpdGhWYWxpZGF0aW9uIiwicnVsZXMiLCJrZXkiLCJ0ZXN0IiwiZG9tYWluIiwic3BsaXQiLCJsZW5ndGgiLCJpbnZhbGlkIiwiX3QiLCJmdWxsQWxpYXMiLCJoYXNDb2xvbiIsImluY2x1ZGVzIiwiZW5jb2RlVVJJIiwiYWxsb3dFbXB0eSIsInJvb21JZCIsImZpbmFsIiwiY2xpZW50IiwiZ2V0Um9vbUlkRm9yQWxpYXMiLCJyb29tX2lkIiwiZXJyIiwiY29uc29sZSIsImxvZyIsIk1hdHJpeEVycm9yIiwic3RhdGUiLCJsb2NhbHBhcnQiLCJoYXNoQWxpYXMiLCJkb21haW5Qcm9wcyIsInByZWZpeCIsImNyZWF0ZUVsZW1lbnQiLCJwb3N0Zml4IiwidGl0bGUiLCJtYXhsZW5ndGgiLCJzdWJzdHJpbmciLCJyZW5kZXIiLCJsYWJlbCIsImNsYXNzTmFtZSIsInByZWZpeENvbXBvbmVudCIsInBvc3RmaXhDb21wb25lbnQiLCJyZWYiLCJmaWVsZFJlZiIsIm9uVmFsaWRhdGUiLCJwbGFjZWhvbGRlciIsIm1heExlbmd0aCIsImRpc2FibGVkIiwiYXV0b0NvbXBsZXRlIiwib25LZXlEb3duIiwidmFsaWRhdGUiLCJvcHRpb25zIiwidmFsIiwiY3VycmVudCIsImZvY3VzIiwiZXhwb3J0cyIsIk1hdHJpeENsaWVudENvbnRleHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9Sb29tQWxpYXNGaWVsZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlUmVmLCBLZXlib2FyZEV2ZW50SGFuZGxlciB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4RXJyb3IgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHdpdGhWYWxpZGF0aW9uLCB7IElGaWVsZFN0YXRlLCBJVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCBGaWVsZCwgeyBJVmFsaWRhdGVPcHRzIH0gZnJvbSBcIi4vRmllbGRcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICAvLyBpZiByb29tSWQgaXMgcGFzc2VkIHRoZW4gdGhlIGVudGVyZWQgYWxpYXMgaXMgY2hlY2tlZCB0byBwb2ludCB0byB0aGlzIHJvb21JZCwgZWxzZSBtdXN0IGJlIHVuYXNzaWduZWRcbiAgICByb29tSWQ/OiBzdHJpbmc7XG4gICAgb25LZXlEb3duPzogS2V5Ym9hcmRFdmVudEhhbmRsZXI7XG4gICAgb25DaGFuZ2U/KHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xufVxuXG4vLyBDb250cm9sbGVkIGZvcm0gY29tcG9uZW50IHdyYXBwaW5nIEZpZWxkIGZvciBpbnB1dHRpbmcgYSByb29tIGFsaWFzIHNjb3BlZCB0byBhIGdpdmVuIGRvbWFpblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUFsaWFzRmllbGQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHVibGljIHN0YXRpYyBjb250ZXh0VHlwZSA9IE1hdHJpeENsaWVudENvbnRleHQ7XG4gICAgcHVibGljIGRlY2xhcmUgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+O1xuXG4gICAgcHJpdmF0ZSBmaWVsZFJlZiA9IGNyZWF0ZVJlZjxGaWVsZD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzLCBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMsIGNvbnRleHQpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXNGdWxsQWxpYXMobG9jYWxwYXJ0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoYXNoQWxpYXMgPSBgIyR7bG9jYWxwYXJ0fWA7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2hhc2hBbGlhc306JHt0aGlzLnByb3BzLmRvbWFpbn1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoQWxpYXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZG9tYWluUHJvcHMoKToge1xuICAgICAgICBwcmVmaXg6IEpTWC5FbGVtZW50O1xuICAgICAgICBwb3N0Zml4OiBKU1guRWxlbWVudDtcbiAgICAgICAgdmFsdWU6IHN0cmluZztcbiAgICAgICAgbWF4bGVuZ3RoOiBudW1iZXI7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IHsgZG9tYWluIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCBwcmVmaXggPSA8c3Bhbj4jPC9zcGFuPjtcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IGRvbWFpbiA/IDxzcGFuIHRpdGxlPXtgOiR7ZG9tYWlufWB9PntgOiR7ZG9tYWlufWB9PC9zcGFuPiA6IDxzcGFuIC8+O1xuICAgICAgICBjb25zdCBtYXhsZW5ndGggPSBkb21haW4gPyAyNTUgLSBkb21haW4ubGVuZ3RoIC0gMiA6IDI1NSAtIDE7IC8vIDIgZm9yICMgYW5kIDpcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkb21haW5cbiAgICAgICAgICAgID8gdGhpcy5wcm9wcy52YWx1ZS5zdWJzdHJpbmcoMSwgdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggLSBkb21haW4ubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIDogdGhpcy5wcm9wcy52YWx1ZS5zdWJzdHJpbmcoMSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcHJlZml4LCBwb3N0Zml4LCB2YWx1ZSwgbWF4bGVuZ3RoIH07XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB7IHByZWZpeCwgcG9zdGZpeCwgdmFsdWUsIG1heGxlbmd0aCB9ID0gdGhpcy5kb21haW5Qcm9wcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgIGxhYmVsPXt0aGlzLnByb3BzLmxhYmVsIHx8IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2hlYWRpbmdcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbUFsaWFzRmllbGRcIlxuICAgICAgICAgICAgICAgIHByZWZpeENvbXBvbmVudD17cHJlZml4fVxuICAgICAgICAgICAgICAgIHBvc3RmaXhDb21wb25lbnQ9e3Bvc3RmaXh9XG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLmZpZWxkUmVmfVxuICAgICAgICAgICAgICAgIG9uVmFsaWRhdGU9e3RoaXMub25WYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlciB8fCBfdChcInJvb21fc2V0dGluZ3N8Z2VuZXJhbHxhbGlhc19maWVsZF9wbGFjZWhvbGRlcl9kZWZhdWx0XCIpfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICBtYXhMZW5ndGg9e21heGxlbmd0aH1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5wcm9wcy5vbktleURvd259XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DaGFuZ2UgPSAoZXY6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/Lih0aGlzLmFzRnVsbEFsaWFzKGV2LnRhcmdldC52YWx1ZSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmFsaWRhdGUgPSBhc3luYyAoZmllbGRTdGF0ZTogSUZpZWxkU3RhdGUpOiBQcm9taXNlPElWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGlvblJ1bGVzKGZpZWxkU3RhdGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNWYWxpZDogISFyZXN1bHQudmFsaWQgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdmFsaWRhdGlvblJ1bGVzID0gd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICBydWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJoYXNEb21haW5cIixcbiAgICAgICAgICAgICAgICB0ZXN0OiBhc3luYyAoeyB2YWx1ZSB9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiB3ZSBoYXZlIHBhc3NlZCBkb21haW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCI6XCIpLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludmFsaWQ6ICgpID0+IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2ZpZWxkX2hhc19kb21haW5faW52YWxpZFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBcImhhc0xvY2FscGFydFwiLFxuICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBoYXNEb21haW4gY2hlY2sgd2lsbCBmYWlsIGhlcmUgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmaW5lIHRoZSB2YWx1ZSBpbnZhbGlkIGlmIHRoZXJlJ3Mgbm8gZmlyc3QgcGFydCAocm9vbW5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiBfdChcInJvb21fc2V0dGluZ3N8Z2VuZXJhbHxhbGlhc19maWVsZF9oYXNfbG9jYWxwYXJ0X2ludmFsaWRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJzYWZlTG9jYWxwYXJ0XCIsXG4gICAgICAgICAgICAgICAgdGVzdDogYXN5bmMgKHsgdmFsdWUgfSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJvcHMuZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxBbGlhcyA9IHRoaXMuYXNGdWxsQWxpYXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQ29sb24gPSB0aGlzLnByb3BzLmRvbWFpbiA/ICF2YWx1ZS5pbmNsdWRlcyhcIjpcIikgOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYOiBGSVhNRSBodHRwczovL2dpdGh1Yi5jb20vbWF0cml4LW9yZy9tYXRyaXgtZG9jL2lzc3Vlcy82NjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIGNvdWxkIHByb2JhYmx5IHVzZSBsaW5raWZ5anMgdG8gcGFyc2UgdGhvc2UgYWxpYXNlcyBoZXJlP1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdmFsdWUuaW5jbHVkZXMoXCIjXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29sb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdmFsdWUuaW5jbHVkZXMoXCIsXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZ1bGxBbGlhcykgPT09IGZ1bGxBbGlhc1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfc2FmZV9sb2NhbHBhcnRfaW52YWxpZFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBcInJlcXVpcmVkXCIsXG4gICAgICAgICAgICAgICAgdGVzdDogYXN5bmMgKHsgdmFsdWUsIGFsbG93RW1wdHkgfSkgPT4gYWxsb3dFbXB0eSB8fCAhIXZhbHVlLFxuICAgICAgICAgICAgICAgIGludmFsaWQ6ICgpID0+IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2ZpZWxkX3JlcXVpcmVkX2ludmFsaWRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5yb29tSWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibWF0Y2hlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmdldFJvb21JZEZvckFsaWFzKHRoaXMuYXNGdWxsQWxpYXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm9vbV9pZCA9PT0gdGhpcy5wcm9wcy5yb29tSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfbWF0Y2hlc19pbnZhbGlkXCIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJ0YWtlblwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmdldFJvb21JZEZvckFsaWFzKHRoaXMuYXNGdWxsQWxpYXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCBhIHJvb20gaWQsIHNvIHRoZSBhbGlhcyBpcyB0YWtlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgc2VydmVyIGVycm9yIGNvZGUgd2lsbCBkbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBpdCBNX05PVF9GT1VORCBvciB0aGUgYWxpYXMgaXMgaW52YWxpZCBzb21laG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCB3YW50IHRvIHNob3cgdGhlIGludmFsaWQgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIE1hdHJpeEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5fdmFsaWRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5kb21haW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5faW52YWxpZF9kb21haW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5faW52YWxpZFwiKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzVmFsaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKG9wdGlvbnM6IElWYWxpZGF0ZU9wdHMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgdGhpcy5maWVsZFJlZi5jdXJyZW50Py52YWxpZGF0ZShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHZhbCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmllbGRSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFKLE9BQUE7QUFBd0UsU0FBQU8seUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENB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