UNPKG

matrix-react-sdk

Version:
161 lines (158 loc) 26 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 _logger = require("matrix-js-sdk/src/logger"); var MegolmExportEncryption = _interopRequireWildcard(require("../../../../utils/MegolmExportEncryption")); var _languageHandler = require("../../../../languageHandler"); var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog")); var _Field = _interopRequireDefault(require("../../../../components/views/elements/Field")); 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 2022 The Matrix.org Foundation C.I.C. Copyright 2017 Vector Creations Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function readFileAsArrayBuffer(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = e => { if (e.target?.result) { resolve(e.target.result); } else { reject(new Error("Failed to read file due to unknown error")); } }; reader.onerror = reject; reader.readAsArrayBuffer(file); }); } var Phase = /*#__PURE__*/function (Phase) { Phase["Edit"] = "edit"; Phase["Importing"] = "importing"; return Phase; }(Phase || {}); class ImportE2eKeysDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "unmounted", false); (0, _defineProperty2.default)(this, "file", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onFormChange", () => { const files = this.file.current?.files; this.setState({ enableSubmit: this.state.passphrase !== "" && !!files?.length }); }); (0, _defineProperty2.default)(this, "onPassphraseChange", ev => { this.setState({ passphrase: ev.target.value }, this.onFormChange); // update general form state too }); (0, _defineProperty2.default)(this, "onFormSubmit", ev => { ev.preventDefault(); // noinspection JSIgnoredPromiseFromCall const file = this.file.current?.files?.[0]; if (file) { this.startImport(file, this.state.passphrase); } return false; }); (0, _defineProperty2.default)(this, "onCancelClick", ev => { ev.preventDefault(); this.props.onFinished(false); return false; }); this.state = { enableSubmit: false, phase: Phase.Edit, errStr: null, passphrase: "" }; } componentWillUnmount() { this.unmounted = true; } startImport(file, passphrase) { this.setState({ errStr: null, phase: Phase.Importing }); return readFileAsArrayBuffer(file).then(arrayBuffer => { return MegolmExportEncryption.decryptMegolmKeyFile(arrayBuffer, passphrase); }).then(keys => { return this.props.matrixClient.getCrypto().importRoomKeysAsJson(keys); }).then(() => { // TODO: it would probably be nice to give some feedback about what we've imported here. this.props.onFinished(true); }).catch(e => { _logger.logger.error("Error importing e2e keys:", e); if (this.unmounted) { return; } const msg = e.friendlyText || (0, _languageHandler._t)("error|unknown"); this.setState({ errStr: msg, phase: Phase.Edit }); }); } render() { const disableForm = this.state.phase !== Phase.Edit; return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { className: "mx_importE2eKeysDialog", onFinished: this.props.onFinished, title: (0, _languageHandler._t)("settings|key_export_import|import_title") }, /*#__PURE__*/_react.default.createElement("form", { onSubmit: this.onFormSubmit }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_content" }, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|import_description_1")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_export_import|import_description_2")), /*#__PURE__*/_react.default.createElement("div", { className: "error" }, this.state.errStr), /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputTable" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputRow" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputLabel" }, /*#__PURE__*/_react.default.createElement("label", { htmlFor: "importFile" }, (0, _languageHandler._t)("settings|key_export_import|file_to_import"))), /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputCell" }, /*#__PURE__*/_react.default.createElement("input", { ref: this.file, id: "importFile", type: "file", autoFocus: true, onChange: this.onFormChange, disabled: disableForm }))), /*#__PURE__*/_react.default.createElement("div", { className: "mx_E2eKeysDialog_inputRow" }, /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("settings|key_export_import|enter_passphrase"), value: this.state.passphrase, onChange: this.onPassphraseChange, size: 64, type: "password", disabled: disableForm })))), /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_buttons" }, /*#__PURE__*/_react.default.createElement("input", { className: "mx_Dialog_primary", type: "submit", value: (0, _languageHandler._t)("action|import"), disabled: !this.state.enableSubmit || disableForm }), /*#__PURE__*/_react.default.createElement("button", { onClick: this.onCancelClick, disabled: disableForm }, (0, _languageHandler._t)("action|cancel"))))); } } exports.default = ImportE2eKeysDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiTWVnb2xtRXhwb3J0RW5jcnlwdGlvbiIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQmFzZURpYWxvZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfRmllbGQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJyZWFkRmlsZUFzQXJyYXlCdWZmZXIiLCJmaWxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwidGFyZ2V0IiwicmVzdWx0IiwiRXJyb3IiLCJvbmVycm9yIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJQaGFzZSIsIkltcG9ydEUyZUtleXNEaWFsb2ciLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwiZmlsZXMiLCJjdXJyZW50Iiwic2V0U3RhdGUiLCJlbmFibGVTdWJtaXQiLCJzdGF0ZSIsInBhc3NwaHJhc2UiLCJsZW5ndGgiLCJldiIsInZhbHVlIiwib25Gb3JtQ2hhbmdlIiwicHJldmVudERlZmF1bHQiLCJzdGFydEltcG9ydCIsIm9uRmluaXNoZWQiLCJwaGFzZSIsIkVkaXQiLCJlcnJTdHIiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVubW91bnRlZCIsIkltcG9ydGluZyIsInRoZW4iLCJhcnJheUJ1ZmZlciIsImRlY3J5cHRNZWdvbG1LZXlGaWxlIiwia2V5cyIsIm1hdHJpeENsaWVudCIsImdldENyeXB0byIsImltcG9ydFJvb21LZXlzQXNKc29uIiwiY2F0Y2giLCJsb2dnZXIiLCJlcnJvciIsIm1zZyIsImZyaWVuZGx5VGV4dCIsIl90IiwicmVuZGVyIiwiZGlzYWJsZUZvcm0iLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwidGl0bGUiLCJvblN1Ym1pdCIsIm9uRm9ybVN1Ym1pdCIsImh0bWxGb3IiLCJyZWYiLCJpZCIsInR5cGUiLCJhdXRvRm9jdXMiLCJvbkNoYW5nZSIsImRpc2FibGVkIiwibGFiZWwiLCJvblBhc3NwaHJhc2VDaGFuZ2UiLCJzaXplIiwib25DbGljayIsIm9uQ2FuY2VsQ2xpY2siLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FzeW5jLWNvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9zZWN1cml0eS9JbXBvcnRFMmVLZXlzRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTcgVmVjdG9yIENyZWF0aW9ucyBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgKiBhcyBNZWdvbG1FeHBvcnRFbmNyeXB0aW9uIGZyb20gXCIuLi8uLi8uLi8uLi91dGlscy9NZWdvbG1FeHBvcnRFbmNyeXB0aW9uXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvQmFzZURpYWxvZ1wiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkXCI7XG5cbmZ1bmN0aW9uIHJlYWRGaWxlQXNBcnJheUJ1ZmZlcihmaWxlOiBGaWxlKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCBhcyBBcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVhZCBmaWxlIGR1ZSB0byB1bmtub3duIGVycm9yXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICAgIH0pO1xufVxuXG5lbnVtIFBoYXNlIHtcbiAgICBFZGl0ID0gXCJlZGl0XCIsXG4gICAgSW1wb3J0aW5nID0gXCJpbXBvcnRpbmdcIixcbn1cblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQ7XG4gICAgb25GaW5pc2hlZChpbXBvcnRlZD86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBlbmFibGVTdWJtaXQ6IGJvb2xlYW47XG4gICAgcGhhc2U6IFBoYXNlO1xuICAgIGVyclN0cjogc3RyaW5nIHwgbnVsbDtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltcG9ydEUyZUtleXNEaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIHVubW91bnRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgZmlsZSA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlbmFibGVTdWJtaXQ6IGZhbHNlLFxuICAgICAgICAgICAgcGhhc2U6IFBoYXNlLkVkaXQsXG4gICAgICAgICAgICBlcnJTdHI6IG51bGwsXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Gb3JtQ2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZS5jdXJyZW50Py5maWxlcztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlbmFibGVTdWJtaXQ6IHRoaXMuc3RhdGUucGFzc3BocmFzZSAhPT0gXCJcIiAmJiAhIWZpbGVzPy5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUGFzc3BocmFzZUNoYW5nZSA9IChldjogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBhc3NwaHJhc2U6IGV2LnRhcmdldC52YWx1ZSB9LCB0aGlzLm9uRm9ybUNoYW5nZSk7IC8vIHVwZGF0ZSBnZW5lcmFsIGZvcm0gc3RhdGUgdG9vXG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Gb3JtU3VibWl0ID0gKGV2OiBSZWFjdC5Gb3JtRXZlbnQpOiBib29sZWFuID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTSWdub3JlZFByb21pc2VGcm9tQ2FsbFxuICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5maWxlLmN1cnJlbnQ/LmZpbGVzPy5bMF07XG4gICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SW1wb3J0KGZpbGUsIHRoaXMuc3RhdGUucGFzc3BocmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXJ0SW1wb3J0KGZpbGU6IEZpbGUsIHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIHBoYXNlOiBQaGFzZS5JbXBvcnRpbmcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZWFkRmlsZUFzQXJyYXlCdWZmZXIoZmlsZSlcbiAgICAgICAgICAgIC50aGVuKChhcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBNZWdvbG1FeHBvcnRFbmNyeXB0aW9uLmRlY3J5cHRNZWdvbG1LZXlGaWxlKGFycmF5QnVmZmVyLCBwYXNzcGhyYXNlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoa2V5cykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm1hdHJpeENsaWVudC5nZXRDcnlwdG8oKSEuaW1wb3J0Um9vbUtleXNBc0pzb24oa2V5cyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGl0IHdvdWxkIHByb2JhYmx5IGJlIG5pY2UgdG8gZ2l2ZSBzb21lIGZlZWRiYWNrIGFib3V0IHdoYXQgd2UndmUgaW1wb3J0ZWQgaGVyZS5cbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIGUyZSBrZXlzOlwiLCBlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51bm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBlLmZyaWVuZGx5VGV4dCB8fCBfdChcImVycm9yfHVua25vd25cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGVyclN0cjogbXNnLFxuICAgICAgICAgICAgICAgICAgICBwaGFzZTogUGhhc2UuRWRpdCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5jZWxDbGljayA9IChldjogUmVhY3QuTW91c2VFdmVudCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgZGlzYWJsZUZvcm0gPSB0aGlzLnN0YXRlLnBoYXNlICE9PSBQaGFzZS5FZGl0O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X2ltcG9ydEUyZUtleXNEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxpbXBvcnRfdGl0bGVcIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMub25Gb3JtU3VibWl0fT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e190KFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8aW1wb3J0X2Rlc2NyaXB0aW9uXzFcIil9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e190KFwic2V0dGluZ3N8a2V5X2V4cG9ydF9pbXBvcnR8aW1wb3J0X2Rlc2NyaXB0aW9uXzJcIil9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJlcnJvclwiPnt0aGlzLnN0YXRlLmVyclN0cn08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9FMmVLZXlzRGlhbG9nX2lucHV0Um93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dExhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cImltcG9ydEZpbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJzZXR0aW5nc3xrZXlfZXhwb3J0X2ltcG9ydHxmaWxlX3RvX2ltcG9ydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0UyZUtleXNEaWFsb2dfaW5wdXRDZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuZmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImltcG9ydEZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25Gb3JtQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlRm9ybX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRTJlS2V5c0RpYWxvZ19pbnB1dFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfGtleV9leHBvcnRfaW1wb3J0fGVudGVyX3Bhc3NwaHJhc2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzcGhyYXNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25QYXNzcGhyYXNlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17NjR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVGb3JtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0RpYWxvZ19idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EaWFsb2dfcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e190KFwiYWN0aW9ufGltcG9ydFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXRoaXMuc3RhdGUuZW5hYmxlU3VibWl0IHx8IGRpc2FibGVGb3JtfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17dGhpcy5vbkNhbmNlbENsaWNrfSBkaXNhYmxlZD17ZGlzYWJsZUZvcm19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxjYW5jZWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxzQkFBQSxHQUFBSCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUwsT0FBQTtBQUFnRSxTQUFBTyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBVCx3QkFBQVMsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENB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