UNPKG

matrix-react-sdk

Version:
260 lines (223 loc) 35 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 = _interopRequireDefault(require("react")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _PersistedElement = _interopRequireDefault(require("../elements/PersistedElement")); var _QuestionDialog = _interopRequireDefault(require("./QuestionDialog")); var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig")); var _classnames = _interopRequireDefault(require("classnames")); var _languageHandler = require("../../../languageHandler"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _HostSignupStore = require("../../../stores/HostSignupStore"); var _OwnProfileStore = require("../../../stores/OwnProfileStore"); var _HostSignupDialogTypes = require("./HostSignupDialogTypes"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _temp; const HOST_SIGNUP_KEY = "host_signup"; let HostSignupDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.HostSignupDialog"), _dec(_class = (_temp = class HostSignupDialog extends _react.default.PureComponent /*:: <IProps, IState>*/ { constructor(props /*: IProps*/ ) { super(props); (0, _defineProperty2.default)(this, "iframeRef", /*#__PURE__*/_react.default.createRef()); (0, _defineProperty2.default)(this, "config", void 0); (0, _defineProperty2.default)(this, "messageHandler", async (message /*: IPostmessage*/ ) => { if (!this.config.url.startsWith(message.origin)) { return; } switch (message.data.action) { case _HostSignupDialogTypes.PostmessageAction.HostSignupAccountDetailsRequest: this.onAccountDetailsRequest(); break; case _HostSignupDialogTypes.PostmessageAction.Maximize: this.setState({ minimized: false }); break; case _HostSignupDialogTypes.PostmessageAction.Minimize: this.setState({ minimized: true }); break; case _HostSignupDialogTypes.PostmessageAction.SetupComplete: this.setState({ completed: true }); break; case _HostSignupDialogTypes.PostmessageAction.CloseDialog: return this.closeDialog(); } }); (0, _defineProperty2.default)(this, "maximizeDialog", () => { this.setState({ minimized: false }); // Send this action to the iframe so it can act accordingly this.sendMessage({ action: _HostSignupDialogTypes.PostmessageAction.Maximize }); }); (0, _defineProperty2.default)(this, "minimizeDialog", () => { this.setState({ minimized: true }); // Send this action to the iframe so it can act accordingly this.sendMessage({ action: _HostSignupDialogTypes.PostmessageAction.Minimize }); }); (0, _defineProperty2.default)(this, "closeDialog", async () => { window.removeEventListener("message", this.messageHandler); // Ensure we destroy the host signup persisted element _PersistedElement.default.destroyElement("host_signup"); // Finally clear the flag in return _HostSignupStore.HostSignupStore.instance.setHostSignupActive(false); }); (0, _defineProperty2.default)(this, "onCloseClick", async () => { if (this.state.completed) { // We're done, close return this.closeDialog(); } else { _Modal.default.createDialog(_QuestionDialog.default, { title: (0, _languageHandler._t)("Confirm abort of host creation"), description: (0, _languageHandler._t)("Are you sure you wish to abort creation of the host? The process cannot be continued."), button: (0, _languageHandler._t)("Abort"), onFinished: result => { if (result) { return this.closeDialog(); } } }); } }); (0, _defineProperty2.default)(this, "sendMessage", (message /*: IPostmessageResponseData*/ ) => { this.iframeRef.current.contentWindow.postMessage(message, this.config.url); }); (0, _defineProperty2.default)(this, "onAccountDetailsDialogFinished", async result => { if (result) { return this.sendAccountDetails(); } return this.closeDialog(); }); (0, _defineProperty2.default)(this, "onAccountDetailsRequest", () => { const textComponent = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Continuing temporarily allows the %(hostSignupBrand)s setup process to access your " + "account to fetch verified email addresses. This data is not stored.", { hostSignupBrand: this.config.brand })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Learn more in our <privacyPolicyLink />, <termsOfServiceLink /> and <cookiePolicyLink />.", {}, { cookiePolicyLink: () => /*#__PURE__*/_react.default.createElement("a", { href: this.config.cookiePolicyUrl, target: "_blank", rel: "noreferrer noopener" }, (0, _languageHandler._t)("Cookie Policy")), privacyPolicyLink: () => /*#__PURE__*/_react.default.createElement("a", { href: this.config.privacyPolicyUrl, target: "_blank", rel: "noreferrer noopener" }, (0, _languageHandler._t)("Privacy Policy")), termsOfServiceLink: () => /*#__PURE__*/_react.default.createElement("a", { href: this.config.termsOfServiceUrl, target: "_blank", rel: "noreferrer noopener" }, (0, _languageHandler._t)("Terms of Service")) }))); _Modal.default.createDialog(_QuestionDialog.default, { title: (0, _languageHandler._t)("You should know"), description: textComponent, button: (0, _languageHandler._t)("Continue"), onFinished: this.onAccountDetailsDialogFinished }); }); this.state = { completed: false, error: null, minimized: false }; this.config = _SdkConfig.default.get().hostSignup; } async sendAccountDetails() { const openIdToken = await _MatrixClientPeg.MatrixClientPeg.get().getOpenIdToken(); if (!openIdToken || !openIdToken.access_token) { console.warn("Failed to connect to homeserver for OpenID token."); this.setState({ completed: true, error: (0, _languageHandler._t)("Failed to connect to your homeserver. Please close this dialog and try again.") }); return; } this.sendMessage({ action: _HostSignupDialogTypes.PostmessageAction.HostSignupAccountDetails, account: { accessToken: await _MatrixClientPeg.MatrixClientPeg.get().getAccessToken(), name: _OwnProfileStore.OwnProfileStore.instance.displayName, openIdToken: openIdToken.access_token, serverName: await _MatrixClientPeg.MatrixClientPeg.get().getDomain(), userLocalpart: await _MatrixClientPeg.MatrixClientPeg.get().getUserIdLocalpart(), termsAccepted: true } }); } componentDidMount() { window.addEventListener("message", this.messageHandler); } componentWillUnmount() { if (_HostSignupStore.HostSignupStore.instance.isHostSignupActive) { // Run the close dialog actions if we're still active, otherwise good to go return this.closeDialog(); } } render() /*: React.ReactNode*/ { return /*#__PURE__*/_react.default.createElement("div", { className: "mx_HostSignup_persisted" }, /*#__PURE__*/_react.default.createElement(_PersistedElement.default, { key: HOST_SIGNUP_KEY, persistKey: HOST_SIGNUP_KEY }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)({ "mx_Dialog_wrapper": !this.state.minimized }) }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)("mx_Dialog", { "mx_HostSignupDialog_minimized": this.state.minimized, "mx_HostSignupDialog": !this.state.minimized }) }, this.state.minimized && /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_header mx_Dialog_headerWithButton" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_title" }, (0, _languageHandler._t)("%(hostSignupBrand)s Setup", { hostSignupBrand: this.config.brand })), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_HostSignup_maximize_button", onClick: this.maximizeDialog, "aria-label": (0, _languageHandler._t)("Maximize dialog"), title: (0, _languageHandler._t)("Maximize dialog") })), !this.state.minimized && /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_header mx_Dialog_headerWithCancel" }, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.minimizeDialog, className: "mx_HostSignup_minimize_button", "aria-label": (0, _languageHandler._t)("Minimize dialog"), title: (0, _languageHandler._t)("Minimize dialog") }), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onCloseClick, className: "mx_Dialog_cancelButton", "aria-label": (0, _languageHandler._t)("Close dialog"), title: (0, _languageHandler._t)("Close dialog") })), this.state.error && /*#__PURE__*/_react.default.createElement("div", null, this.state.error), !this.state.error && /*#__PURE__*/_react.default.createElement("iframe", { src: this.config.url, ref: this.iframeRef, sandbox: "allow-forms allow-scripts allow-same-origin allow-popups" }))))); } }, _temp)) || _class); exports.default = HostSignupDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvSG9zdFNpZ251cERpYWxvZy50c3giXSwibmFtZXMiOlsiSE9TVF9TSUdOVVBfS0VZIiwiSG9zdFNpZ251cERpYWxvZyIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjcmVhdGVSZWYiLCJtZXNzYWdlIiwiY29uZmlnIiwidXJsIiwic3RhcnRzV2l0aCIsIm9yaWdpbiIsImRhdGEiLCJhY3Rpb24iLCJQb3N0bWVzc2FnZUFjdGlvbiIsIkhvc3RTaWdudXBBY2NvdW50RGV0YWlsc1JlcXVlc3QiLCJvbkFjY291bnREZXRhaWxzUmVxdWVzdCIsIk1heGltaXplIiwic2V0U3RhdGUiLCJtaW5pbWl6ZWQiLCJNaW5pbWl6ZSIsIlNldHVwQ29tcGxldGUiLCJjb21wbGV0ZWQiLCJDbG9zZURpYWxvZyIsImNsb3NlRGlhbG9nIiwic2VuZE1lc3NhZ2UiLCJ3aW5kb3ciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibWVzc2FnZUhhbmRsZXIiLCJQZXJzaXN0ZWRFbGVtZW50IiwiZGVzdHJveUVsZW1lbnQiLCJIb3N0U2lnbnVwU3RvcmUiLCJpbnN0YW5jZSIsInNldEhvc3RTaWdudXBBY3RpdmUiLCJzdGF0ZSIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiUXVlc3Rpb25EaWFsb2ciLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYnV0dG9uIiwib25GaW5pc2hlZCIsInJlc3VsdCIsImlmcmFtZVJlZiIsImN1cnJlbnQiLCJjb250ZW50V2luZG93IiwicG9zdE1lc3NhZ2UiLCJzZW5kQWNjb3VudERldGFpbHMiLCJ0ZXh0Q29tcG9uZW50IiwiaG9zdFNpZ251cEJyYW5kIiwiYnJhbmQiLCJjb29raWVQb2xpY3lMaW5rIiwiY29va2llUG9saWN5VXJsIiwicHJpdmFjeVBvbGljeUxpbmsiLCJwcml2YWN5UG9saWN5VXJsIiwidGVybXNPZlNlcnZpY2VMaW5rIiwidGVybXNPZlNlcnZpY2VVcmwiLCJvbkFjY291bnREZXRhaWxzRGlhbG9nRmluaXNoZWQiLCJlcnJvciIsIlNka0NvbmZpZyIsImdldCIsImhvc3RTaWdudXAiLCJvcGVuSWRUb2tlbiIsIk1hdHJpeENsaWVudFBlZyIsImdldE9wZW5JZFRva2VuIiwiYWNjZXNzX3Rva2VuIiwiY29uc29sZSIsIndhcm4iLCJIb3N0U2lnbnVwQWNjb3VudERldGFpbHMiLCJhY2NvdW50IiwiYWNjZXNzVG9rZW4iLCJnZXRBY2Nlc3NUb2tlbiIsIm5hbWUiLCJPd25Qcm9maWxlU3RvcmUiLCJkaXNwbGF5TmFtZSIsInNlcnZlck5hbWUiLCJnZXREb21haW4iLCJ1c2VyTG9jYWxwYXJ0IiwiZ2V0VXNlcklkTG9jYWxwYXJ0IiwidGVybXNBY2NlcHRlZCIsImNvbXBvbmVudERpZE1vdW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiaXNIb3N0U2lnbnVwQWN0aXZlIiwicmVuZGVyIiwibWF4aW1pemVEaWFsb2ciLCJtaW5pbWl6ZURpYWxvZyIsIm9uQ2xvc2VDbGljayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUE7Ozs7QUFFQSxNQUFNQSxlQUFlLEdBQUcsYUFBeEI7SUFXcUJDLGdCLFdBRHBCLGdEQUFxQixnQ0FBckIsQyx5QkFBRCxNQUNxQkEsZ0JBRHJCLFNBQzhDQyxlQUFNQztBQURwRDtBQUNrRjtBQUk5RUMsRUFBQUEsV0FBVyxDQUFDQztBQUFEO0FBQUEsSUFBZ0I7QUFDdkIsVUFBTUEsS0FBTjtBQUR1QixrRUFINkJILGVBQU1JLFNBQU4sRUFHN0I7QUFBQTtBQUFBLDBEQVlGLE9BQU9DO0FBQVA7QUFBQSxTQUFpQztBQUN0RCxVQUFJLENBQUMsS0FBS0MsTUFBTCxDQUFZQyxHQUFaLENBQWdCQyxVQUFoQixDQUEyQkgsT0FBTyxDQUFD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QUFDLHdCQUZkO0FBR0ksb0JBQVkseUJBQUcsY0FBSCxDQUhoQjtBQUlJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLGNBQUg7QUFKWCxNQVBKLENBeEJSLEVBdUNLLEtBQUtyRCxLQUFMLENBQVd3QixLQUFYLGlCQUNHLDBDQUNLLEtBQUt4QixLQUFMLENBQVd3QixLQURoQixDQXhDUixFQTRDSyxDQUFDLEtBQUt4QixLQUFMLENBQVd3QixLQUFaLGlCQUNHO0FBQ0ksTUFBQSxHQUFHLEVBQUUsS0FBS2xELE1BQUwsQ0FBWUMsR0FEckI7QUFFSSxNQUFBLEdBQUcsRUFBRSxLQUFLa0MsU0FGZDtBQUdJLE1BQUEsT0FBTyxFQUFDO0FBSFosTUE3Q1IsQ0FESixDQURKLENBREosQ0FESjtBQTRESDs7QUFyUDZFLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFBlcnNpc3RlZEVsZW1lbnQgZnJvbSBcIi4uL2VsZW1lbnRzL1BlcnNpc3RlZEVsZW1lbnRcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tICcuL1F1ZXN0aW9uRGlhbG9nJztcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgSG9zdFNpZ251cFN0b3JlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9Ib3N0U2lnbnVwU3RvcmVcIjtcbmltcG9ydCB7IE93blByb2ZpbGVTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvT3duUHJvZmlsZVN0b3JlXCI7XG5pbXBvcnQge1xuICAgIElIb3N0U2lnbnVwQ29uZmlnLFxuICAgIElQb3N0bWVzc2FnZSxcbiAgICBJUG9zdG1lc3NhZ2VSZXNwb25zZURhdGEsXG4gICAgUG9zdG1lc3NhZ2VBY3Rpb24sXG59IGZyb20gXCIuL0hvc3RTaWdudXBEaWFsb2dUeXBlc1wiO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbmNvbnN0IEhPU1RfU0lHTlVQX0tFWSA9IFwiaG9zdF9zaWdudXBcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7fVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gICAgZXJyb3I6IHN0cmluZztcbiAgICBtaW5pbWl6ZWQ6IGJvb2xlYW47XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmRpYWxvZ3MuSG9zdFNpZ251cERpYWxvZ1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9zdFNpZ251cERpYWxvZyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIGlmcmFtZVJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxJRnJhbWVFbGVtZW50PiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBJSG9zdFNpZ251cENvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICBtaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gU2RrQ29uZmlnLmdldCgpLmhvc3RTaWdudXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXNzYWdlSGFuZGxlciA9IGFzeW5jIChtZXNzYWdlOiBJUG9zdG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy51cmwuc3RhcnRzV2l0aChtZXNzYWdlLm9yaWdpbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuZGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgUG9zdG1lc3NhZ2VBY3Rpb24uSG9zdFNpZ251cEFjY291bnREZXRhaWxzUmVxdWVzdDpcbiAgICAgICAgICAgICAgICB0aGlzLm9uQWNjb3VudERldGFpbHNSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBvc3RtZXNzYWdlQWN0aW9uLk1heGltaXplOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBtaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQb3N0bWVzc2FnZUFjdGlvbi5NaW5pbWl6ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pemVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQb3N0bWVzc2FnZUFjdGlvbi5TZXR1cENvbXBsZXRlOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBvc3RtZXNzYWdlQWN0aW9uLkNsb3NlRGlhbG9nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1heGltaXplRGlhbG9nID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG1pbmltaXplZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZW5kIHRoaXMgYWN0aW9uIHRvIHRoZSBpZnJhbWUgc28gaXQgY2FuIGFjdCBhY2NvcmRpbmdseVxuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICAgIGFjdGlvbjogUG9zdG1lc3NhZ2VBY3Rpb24uTWF4aW1pemUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWluaW1pemVEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbWluaW1pemVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2VuZCB0aGlzIGFjdGlvbiB0byB0aGUgaWZyYW1lIHNvIGl0IGNhbiBhY3QgYWNjb3JkaW5nbHlcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgICBhY3Rpb246IFBvc3RtZXNzYWdlQWN0aW9uLk1pbmltaXplLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3NlRGlhbG9nID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5tZXNzYWdlSGFuZGxlcik7XG4gICAgICAgIC8vIEVuc3VyZSB3ZSBkZXN0cm95IHRoZSBob3N0IHNpZ251cCBwZXJzaXN0ZWQgZWxlbWVudFxuICAgICAgICBQZXJzaXN0ZWRFbGVtZW50LmRlc3Ryb3lFbGVtZW50KFwiaG9zdF9zaWdudXBcIik7XG4gICAgICAgIC8vIEZpbmFsbHkgY2xlYXIgdGhlIGZsYWcgaW5cbiAgICAgICAgcmV0dXJuIEhvc3RTaWdudXBTdG9yZS5pbnN0YW5jZS5zZXRIb3N0U2lnbnVwQWN0aXZlKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuY29tcGxldGVkKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lLCBjbG9zZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhcbiAgICAgICAgICAgICAgICBRdWVzdGlvbkRpYWxvZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcIkNvbmZpcm0gYWJvcnQgb2YgaG9zdCBjcmVhdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdpc2ggdG8gYWJvcnQgY3JlYXRpb24gb2YgdGhlIGhvc3Q/IFRoZSBwcm9jZXNzIGNhbm5vdCBiZSBjb250aW51ZWQuXCIsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbjogX3QoXCJBYm9ydFwiKSxcbiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2hlZDogcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kTWVzc2FnZSA9IChtZXNzYWdlOiBJUG9zdG1lc3NhZ2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgdGhpcy5pZnJhbWVSZWYuY3VycmVudC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRoaXMuY29uZmlnLnVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZW5kQWNjb3VudERldGFpbHMoKSB7XG4gICAgICAgIGNvbnN0IG9wZW5JZFRva2VuID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldE9wZW5JZFRva2VuKCk7XG4gICAgICAgIGlmICghb3BlbklkVG9rZW4gfHwgIW9wZW5JZFRva2VuLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9tZXNlcnZlciBmb3IgT3BlbklEIHRva2VuLlwiKVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgY29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBfdChcIkZhaWxlZCB0byBjb25uZWN0IHRvIHlvdXIgaG9tZXNlcnZlci4gUGxlYXNlIGNsb3NlIHRoaXMgZGlhbG9nIGFuZCB0cnkgYWdhaW4uXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgICBhY3Rpb246IFBvc3RtZXNzYWdlQWN0aW9uLkhvc3RTaWdudXBBY2NvdW50RGV0YWlscyxcbiAgICAgICAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogYXdhaXQgTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldEFjY2Vzc1Rva2VuKCksXG4gICAgICAgICAgICAgICAgbmFtZTogT3duUHJvZmlsZVN0b3JlLmluc3RhbmNlLmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgICAgIG9wZW5JZFRva2VuOiBvcGVuSWRUb2tlbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgc2VydmVyTmFtZTogYXdhaXQgTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldERvbWFpbigpLFxuICAgICAgICAgICAgICAgIHVzZXJMb2NhbHBhcnQ6IGF3YWl0IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRVc2VySWRMb2NhbHBhcnQoKSxcbiAgICAgICAgICAgICAgICB0ZXJtc0FjY2VwdGVkOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkFjY291bnREZXRhaWxzRGlhbG9nRmluaXNoZWQgPSBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRBY2NvdW50RGV0YWlscygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkFjY291bnREZXRhaWxzUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGV4dENvbXBvbmVudCA9IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcIkNvbnRpbnVpbmcgdGVtcG9yYXJpbHkgYWxsb3dzIHRoZSAlKGhvc3RTaWdudXBCcmFuZClzIHNldHVwIHByb2Nlc3MgdG8gYWNjZXNzIHlvdXIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY2NvdW50IHRvIGZldGNoIHZlcmlmaWVkIGVtYWlsIGFkZHJlc3Nlcy4gVGhpcyBkYXRhIGlzIG5vdCBzdG9yZWQuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RTaWdudXBCcmFuZDogdGhpcy5jb25maWcuYnJhbmQsXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAge190KFwiTGVhcm4gbW9yZSBpbiBvdXIgPHByaXZhY3lQb2xpY3lMaW5rIC8+LCA8dGVybXNPZlNlcnZpY2VMaW5rIC8+IGFuZCA8Y29va2llUG9saWN5TGluayAvPi5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZVBvbGljeUxpbms6ICgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj17dGhpcy5jb25maWcuY29va2llUG9saWN5VXJsfSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJDb29raWUgUG9saWN5XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5UG9saWN5TGluazogKCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPXt0aGlzLmNvbmZpZy5wcml2YWN5UG9saWN5VXJsfSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJQcml2YWN5IFBvbGljeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXNPZlNlcnZpY2VMaW5rOiAoKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9e3RoaXMuY29uZmlnLnRlcm1zT2ZTZXJ2aWNlVXJsfSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJUZXJtcyBvZiBTZXJ2aWNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhcbiAgICAgICAgICAgIFF1ZXN0aW9uRGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcIllvdSBzaG91bGQga25vd1wiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGV4dENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBidXR0b246IF90KFwiQ29udGludWVcIiksXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZDogdGhpcy5vbkFjY291bnREZXRhaWxzRGlhbG9nRmluaXNoZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKEhvc3RTaWdudXBTdG9yZS5pbnN0YW5jZS5pc0hvc3RTaWdudXBBY3RpdmUpIHtcbiAgICAgICAgICAgIC8vIFJ1biB0aGUgY2xvc2UgZGlhbG9nIGFjdGlvbnMgaWYgd2UncmUgc3RpbGwgYWN0aXZlLCBvdGhlcndpc2UgZ29vZCB0byBnb1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfSG9zdFNpZ251cF9wZXJzaXN0ZWRcIj5cbiAgICAgICAgICAgICAgICA8UGVyc2lzdGVkRWxlbWVudCBrZXk9e0hPU1RfU0lHTlVQX0tFWX0gcGVyc2lzdEtleT17SE9TVF9TSUdOVVBfS0VZfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZXMoeyBcIm14X0RpYWxvZ193cmFwcGVyXCI6ICF0aGlzLnN0YXRlLm1pbmltaXplZCB9KX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfRGlhbG9nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibXhfSG9zdFNpZ251cERpYWxvZ19taW5pbWl6ZWRcIjogdGhpcy5zdGF0ZS5taW5pbWl6ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm14X0hvc3RTaWdudXBEaWFsb2dcIjogIXRoaXMuc3RhdGUubWluaW1pemVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUubWluaW1pemVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2hlYWRlciBteF9EaWFsb2dfaGVhZGVyV2l0aEJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCIlKGhvc3RTaWdudXBCcmFuZClzIFNldHVwXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFNpZ251cEJyYW5kOiB0aGlzLmNvbmZpZy5icmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Ib3N0U2lnbnVwX21heGltaXplX2J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5tYXhpbWl6ZURpYWxvZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtfdChcIk1heGltaXplIGRpYWxvZ1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJNYXhpbWl6ZSBkaWFsb2dcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyF0aGlzLnN0YXRlLm1pbmltaXplZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0RpYWxvZ19oZWFkZXIgbXhfRGlhbG9nX2hlYWRlcldpdGhDYW5jZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5taW5pbWl6ZURpYWxvZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Ib3N0U2lnbnVwX21pbmltaXplX2J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17X3QoXCJNaW5pbWl6ZSBkaWFsb2dcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwiTWluaW1pemUgZGlhbG9nXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vbkNsb3NlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2NhbmNlbEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17X3QoXCJDbG9zZSBkaWFsb2dcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwiQ2xvc2UgZGlhbG9nXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5lcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHshdGhpcy5zdGF0ZS5lcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e3RoaXMuY29uZmlnLnVybH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5pZnJhbWVSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5kYm94PVwiYWxsb3ctZm9ybXMgYWxsb3ctc2NyaXB0cyBhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1BlcnNpc3RlZEVsZW1lbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=