matrix-react-sdk
Version:
SDK for matrix.org using React
153 lines (149 loc) • 21.2 kB
JavaScript
;
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 = _interopRequireDefault(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientPeg = require("../../../../MatrixClientPeg");
var _languageHandler = require("../../../../languageHandler");
var _SecurityManager = require("../../../../SecurityManager");
var _Spinner = _interopRequireDefault(require("../../../../components/views/elements/Spinner"));
var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog"));
var _DialogButtons = _interopRequireDefault(require("../../../../components/views/elements/DialogButtons"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Copyright 2018, 2019 New Vector Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
var Phase = /*#__PURE__*/function (Phase) {
Phase["BackingUp"] = "backing_up";
Phase["Done"] = "done";
return Phase;
}(Phase || {});
/**
* Walks the user through the process of setting up e2e key backups to a new backup, and storing the decryption key in
* SSSS.
*
* Uses {@link accessSecretStorage}, which means that if 4S is not already configured, it will be bootstrapped (which
* involves displaying an {@link CreateSecretStorageDialog} so the user can enter a passphrase and/or download the 4S
* key).
*/
class CreateKeyBackupDialog extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "createBackup", async () => {
this.setState({
error: undefined
});
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
try {
// Check if 4S already set up
const secretStorageAlreadySetup = await cli.hasSecretStorageKey();
if (!secretStorageAlreadySetup) {
// bootstrap secret storage; that will also create a backup version
await (0, _SecurityManager.accessSecretStorage)(async () => {
// do nothing, all is now set up correctly
});
} else {
await (0, _SecurityManager.withSecretStorageKeyCache)(async () => {
const crypto = cli.getCrypto();
if (!crypto) {
throw new Error("End-to-end encryption is disabled - unable to create backup.");
}
// Before we reset the backup, let's make sure we can access secret storage, to
// reduce the chance of us getting into a broken state where we have an outdated
// secret in secret storage.
// `SecretStorage.get` will ask the user to enter their passphrase/key if necessary;
// it will then be cached for the actual backup reset operation.
await cli.secretStorage.get("m.megolm_backup.v1");
// We now know we can store the new backup key in secret storage, so it is safe to
// go ahead with the reset.
await crypto.resetKeyBackup();
});
}
this.setState({
phase: Phase.Done
});
} catch (e) {
_logger.logger.error("Error creating key backup", e);
// TODO: If creating a version succeeds, but backup fails, should we
// delete the version, disable backup, or do nothing? If we just
// disable without deleting, we'll enable on next app reload since
// it is trusted.
this.setState({
error: true
});
}
});
(0, _defineProperty2.default)(this, "onCancel", () => {
this.props.onFinished(false);
});
(0, _defineProperty2.default)(this, "onDone", () => {
this.props.onFinished(true);
});
this.state = {
phase: Phase.BackingUp,
passPhrase: "",
passPhraseValid: false,
passPhraseConfirm: "",
copied: false,
downloaded: false
};
}
componentDidMount() {
this.createBackup();
}
renderBusyPhase() {
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Spinner.default, null));
}
renderPhaseDone() {
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_backup|backup_in_progress")), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|ok"),
onPrimaryButtonClick: this.onDone,
hasCancel: false
}));
}
titleForPhase(phase) {
switch (phase) {
case Phase.BackingUp:
return (0, _languageHandler._t)("settings|key_backup|backup_starting");
case Phase.Done:
return (0, _languageHandler._t)("settings|key_backup|backup_success");
default:
return (0, _languageHandler._t)("settings|key_backup|create_title");
}
}
render() {
let content;
if (this.state.error) {
content = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|key_backup|cannot_create_backup")), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|retry"),
onPrimaryButtonClick: this.createBackup,
hasCancel: true,
onCancel: this.onCancel
}));
} else {
switch (this.state.phase) {
case Phase.BackingUp:
content = this.renderBusyPhase();
break;
case Phase.Done:
content = this.renderPhaseDone();
break;
}
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_CreateKeyBackupDialog",
onFinished: this.props.onFinished,
title: this.titleForPhase(this.state.phase),
hasCancel: [Phase.Done].includes(this.state.phase)
}, /*#__PURE__*/_react.default.createElement("div", null, content));
}
}
exports.default = CreateKeyBackupDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfTWF0cml4Q2xpZW50UGVnIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9TZWN1cml0eU1hbmFnZXIiLCJfU3Bpbm5lciIsIl9CYXNlRGlhbG9nIiwiX0RpYWxvZ0J1dHRvbnMiLCJQaGFzZSIsIkNyZWF0ZUtleUJhY2t1cERpYWxvZyIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsInNldFN0YXRlIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0Iiwic2VjcmV0U3RvcmFnZUFscmVhZHlTZXR1cCIsImhhc1NlY3JldFN0b3JhZ2VLZXkiLCJhY2Nlc3NTZWNyZXRTdG9yYWdlIiwid2l0aFNlY3JldFN0b3JhZ2VLZXlDYWNoZSIsImNyeXB0byIsImdldENyeXB0byIsIkVycm9yIiwic2VjcmV0U3RvcmFnZSIsImdldCIsInJlc2V0S2V5QmFja3VwIiwicGhhc2UiLCJEb25lIiwiZSIsImxvZ2dlciIsIm9uRmluaXNoZWQiLCJzdGF0ZSIsIkJhY2tpbmdVcCIsInBhc3NQaHJhc2UiLCJwYXNzUGhyYXNlVmFsaWQiLCJwYXNzUGhyYXNlQ29uZmlybSIsImNvcGllZCIsImRvd25sb2FkZWQiLCJjb21wb25lbnREaWRNb3VudCIsImNyZWF0ZUJhY2t1cCIsInJlbmRlckJ1c3lQaGFzZSIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXJQaGFzZURvbmUiLCJfdCIsInByaW1hcnlCdXR0b24iLCJvblByaW1hcnlCdXR0b25DbGljayIsIm9uRG9uZSIsImhhc0NhbmNlbCIsInRpdGxlRm9yUGhhc2UiLCJyZW5kZXIiLCJjb250ZW50Iiwib25DYW5jZWwiLCJjbGFzc05hbWUiLCJ0aXRsZSIsImluY2x1ZGVzIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hc3luYy1jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3Mvc2VjdXJpdHkvQ3JlYXRlS2V5QmFja3VwRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTgsIDIwMTkgTmV3IFZlY3RvciBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IGFjY2Vzc1NlY3JldFN0b3JhZ2UsIHdpdGhTZWNyZXRTdG9yYWdlS2V5Q2FjaGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vU2VjdXJpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi4vLi4vLi4vLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi4vLi4vLi4vLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0RpYWxvZ0J1dHRvbnNcIjtcblxuZW51bSBQaGFzZSB7XG4gICAgQmFja2luZ1VwID0gXCJiYWNraW5nX3VwXCIsXG4gICAgRG9uZSA9IFwiZG9uZVwiLFxufVxuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBvbkZpbmlzaGVkKGRvbmU/OiBib29sZWFuKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgcGhhc2U6IFBoYXNlO1xuICAgIHBhc3NQaHJhc2U6IHN0cmluZztcbiAgICBwYXNzUGhyYXNlVmFsaWQ6IGJvb2xlYW47XG4gICAgcGFzc1BocmFzZUNvbmZpcm06IHN0cmluZztcbiAgICBjb3BpZWQ6IGJvb2xlYW47XG4gICAgZG93bmxvYWRlZDogYm9vbGVhbjtcbiAgICBlcnJvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIHVzZXIgdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIGUyZSBrZXkgYmFja3VwcyB0byBhIG5ldyBiYWNrdXAsIGFuZCBzdG9yaW5nIHRoZSBkZWNyeXB0aW9uIGtleSBpblxuICogU1NTUy5cbiAqXG4gKiBVc2VzIHtAbGluayBhY2Nlc3NTZWNyZXRTdG9yYWdlfSwgd2hpY2ggbWVhbnMgdGhhdCBpZiA0UyBpcyBub3QgYWxyZWFkeSBjb25maWd1cmVkLCBpdCB3aWxsIGJlIGJvb3RzdHJhcHBlZCAod2hpY2hcbiAqIGludm9sdmVzIGRpc3BsYXlpbmcgYW4ge0BsaW5rIENyZWF0ZVNlY3JldFN0b3JhZ2VEaWFsb2d9IHNvIHRoZSB1c2VyIGNhbiBlbnRlciBhIHBhc3NwaHJhc2UgYW5kL29yIGRvd25sb2FkIHRoZSA0U1xuICoga2V5KS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3JlYXRlS2V5QmFja3VwRGlhbG9nIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgcGhhc2U6IFBoYXNlLkJhY2tpbmdVcCxcbiAgICAgICAgICAgIHBhc3NQaHJhc2U6IFwiXCIsXG4gICAgICAgICAgICBwYXNzUGhyYXNlVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgcGFzc1BocmFzZUNvbmZpcm06IFwiXCIsXG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZG93bmxvYWRlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUJhY2t1cCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQmFja3VwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgNFMgYWxyZWFkeSBzZXQgdXBcbiAgICAgICAgICAgIGNvbnN0IHNlY3JldFN0b3JhZ2VBbHJlYWR5U2V0dXAgPSBhd2FpdCBjbGkuaGFzU2VjcmV0U3RvcmFnZUtleSgpO1xuXG4gICAgICAgICAgICBpZiAoIXNlY3JldFN0b3JhZ2VBbHJlYWR5U2V0dXApIHtcbiAgICAgICAgICAgICAgICAvLyBib290c3RyYXAgc2VjcmV0IHN0b3JhZ2U7IHRoYXQgd2lsbCBhbHNvIGNyZWF0ZSBhIGJhY2t1cCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgYXdhaXQgYWNjZXNzU2VjcmV0U3RvcmFnZShhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGFsbCBpcyBub3cgc2V0IHVwIGNvcnJlY3RseVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3aXRoU2VjcmV0U3RvcmFnZUtleUNhY2hlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3J5cHRvID0gY2xpLmdldENyeXB0bygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyeXB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5kLXRvLWVuZCBlbmNyeXB0aW9uIGlzIGRpc2FibGVkIC0gdW5hYmxlIHRvIGNyZWF0ZSBiYWNrdXAuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmVmb3JlIHdlIHJlc2V0IHRoZSBiYWNrdXAsIGxldCdzIG1ha2Ugc3VyZSB3ZSBjYW4gYWNjZXNzIHNlY3JldCBzdG9yYWdlLCB0b1xuICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgdGhlIGNoYW5jZSBvZiB1cyBnZXR0aW5nIGludG8gYSBicm9rZW4gc3RhdGUgd2hlcmUgd2UgaGF2ZSBhbiBvdXRkYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBzZWNyZXQgaW4gc2VjcmV0IHN0b3JhZ2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIGBTZWNyZXRTdG9yYWdlLmdldGAgd2lsbCBhc2sgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgcGFzc3BocmFzZS9rZXkgaWYgbmVjZXNzYXJ5O1xuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYmUgY2FjaGVkIGZvciB0aGUgYWN0dWFsIGJhY2t1cCByZXNldCBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaS5zZWNyZXRTdG9yYWdlLmdldChcIm0ubWVnb2xtX2JhY2t1cC52MVwiKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBub3cga25vdyB3ZSBjYW4gc3RvcmUgdGhlIG5ldyBiYWNrdXAga2V5IGluIHNlY3JldCBzdG9yYWdlLCBzbyBpdCBpcyBzYWZlIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIHdpdGggdGhlIHJlc2V0LlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcnlwdG8ucmVzZXRLZXlCYWNrdXAoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgcGhhc2U6IFBoYXNlLkRvbmUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgY3JlYXRpbmcga2V5IGJhY2t1cFwiLCBlKTtcbiAgICAgICAgICAgIC8vIFRPRE86IElmIGNyZWF0aW5nIGEgdmVyc2lvbiBzdWNjZWVkcywgYnV0IGJhY2t1cCBmYWlscywgc2hvdWxkIHdlXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHZlcnNpb24sIGRpc2FibGUgYmFja3VwLCBvciBkbyBub3RoaW5nPyAgSWYgd2UganVzdFxuICAgICAgICAgICAgLy8gZGlzYWJsZSB3aXRob3V0IGRlbGV0aW5nLCB3ZSdsbCBlbmFibGUgb24gbmV4dCBhcHAgcmVsb2FkIHNpbmNlXG4gICAgICAgICAgICAvLyBpdCBpcyB0cnVzdGVkLlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlbmRlckJ1c3lQaGFzZSgpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBoYXNlRG9uZSgpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwPntfdChcInNldHRpbmdzfGtleV9iYWNrdXB8YmFja3VwX2luX3Byb2dyZXNzXCIpfTwvcD5cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9ucyBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxva1wiKX0gb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMub25Eb25lfSBoYXNDYW5jZWw9e2ZhbHNlfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0aXRsZUZvclBoYXNlKHBoYXNlOiBQaGFzZSk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAocGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgUGhhc2UuQmFja2luZ1VwOlxuICAgICAgICAgICAgICAgIHJldHVybiBfdChcInNldHRpbmdzfGtleV9iYWNrdXB8YmFja3VwX3N0YXJ0aW5nXCIpO1xuICAgICAgICAgICAgY2FzZSBQaGFzZS5Eb25lOlxuICAgICAgICAgICAgICAgIHJldHVybiBfdChcInNldHRpbmdzfGtleV9iYWNrdXB8YmFja3VwX3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfdChcInNldHRpbmdzfGtleV9iYWNrdXB8Y3JlYXRlX3RpdGxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e190KFwic2V0dGluZ3N8a2V5X2JhY2t1cHxjYW5ub3RfY3JlYXRlX2JhY2t1cFwiKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxEaWFsb2dCdXR0b25zXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxyZXRyeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJpbWFyeUJ1dHRvbkNsaWNrPXt0aGlzLmNyZWF0ZUJhY2t1cH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXt0aGlzLm9uQ2FuY2VsfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5waGFzZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgUGhhc2UuQmFja2luZ1VwOlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5yZW5kZXJCdXN5UGhhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQaGFzZS5Eb25lOlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5yZW5kZXJQaGFzZURvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9DcmVhdGVLZXlCYWNrdXBEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy50aXRsZUZvclBoYXNlKHRoaXMuc3RhdGUucGhhc2UpfVxuICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17W1BoYXNlLkRvbmVdLmluY2x1ZGVzKHRoaXMuc3RhdGUucGhhc2UpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXY+e2NvbnRlbnR9PC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLGNBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQWpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEEsSUFtQktRLEtBQUssMEJBQUxBLEtBQUs7RUFBTEEsS0FBSztFQUFMQSxLQUFLO0VBQUEsT0FBTEEsS0FBSztBQUFBLEVBQUxBLEtBQUs7QUFtQlY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU1DLHFCQUFxQixTQUFTQyxjQUFLLENBQUNDLGFBQWEsQ0FBaUI7RUFDNUVDLFdBQVdBLENBQUNDLEtBQWEsRUFBRTtJQUM5QixLQUFLLENBQUNBLEtBQUssQ0FBQztJQUFDLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsd0JBZ0JN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