matrix-react-sdk
Version:
SDK for matrix.org using React
227 lines (221 loc) • 35.5 kB
JavaScript
"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 _logger = require("matrix-js-sdk/src/logger");
var _AutoDiscoveryUtils = _interopRequireDefault(require("../../../utils/AutoDiscoveryUtils"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _languageHandler = require("../../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _Field = _interopRequireDefault(require("../elements/Field"));
var _StyledRadioButton = _interopRequireDefault(require("../elements/StyledRadioButton"));
var _TextWithTooltip = _interopRequireDefault(require("../elements/TextWithTooltip"));
var _Validation = _interopRequireDefault(require("../elements/Validation"));
var _ExternalLink = _interopRequireDefault(require("../elements/ExternalLink"));
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 2020, 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.
*/
class ServerPickerDialog extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "defaultServer", void 0);
(0, _defineProperty2.default)(this, "fieldRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "validatedConf", void 0);
(0, _defineProperty2.default)(this, "onDefaultChosen", () => {
this.setState({
defaultChosen: true
});
});
(0, _defineProperty2.default)(this, "onOtherChosen", () => {
this.setState({
defaultChosen: false
});
});
(0, _defineProperty2.default)(this, "onHomeserverChange", ev => {
this.setState({
otherHomeserver: ev.target.value
});
});
(0, _defineProperty2.default)(this, "validate", (0, _Validation.default)({
deriveData: async ({
value
}) => {
let hsUrl = (value ?? "").trim(); // trim to account for random whitespace
// if the URL has no protocol, try validate it as a serverName via well-known
if (!hsUrl.includes("://")) {
try {
const discoveryResult = await _matrix.AutoDiscovery.findClientConfig(hsUrl);
this.validatedConf = await _AutoDiscoveryUtils.default.buildValidatedConfigFromDiscovery(hsUrl, discoveryResult);
return {}; // we have a validated config, we don't need to try the other paths
} catch (e) {
_logger.logger.error(`Attempted ${hsUrl} as a server_name but it failed`, e);
}
}
// if we got to this stage then either the well-known failed or the URL had a protocol specified,
// so validate statically only. If the URL has no protocol, default to https.
if (!hsUrl.includes("://")) {
hsUrl = "https://" + hsUrl;
}
try {
this.validatedConf = await _AutoDiscoveryUtils.default.validateServerConfigWithStaticUrls(hsUrl);
return {};
} catch (e) {
_logger.logger.error(e);
const stateForError = _AutoDiscoveryUtils.default.authComponentStateForError(e);
if (stateForError.serverErrorIsFatal) {
let error = (0, _languageHandler._t)("auth|server_picker_failed_validate_homeserver");
if (e instanceof _languageHandler.UserFriendlyError && e.translatedMessage) {
error = e.translatedMessage;
}
return {
error
};
}
// try to carry on anyway
try {
this.validatedConf = await _AutoDiscoveryUtils.default.validateServerConfigWithStaticUrls(hsUrl, undefined, true);
return {};
} catch (e) {
_logger.logger.error(e);
return {
error: (0, _languageHandler._t)("auth|server_picker_invalid_url")
};
}
}
},
rules: [{
key: "required",
test: ({
value,
allowEmpty
}) => allowEmpty || !!value,
invalid: () => (0, _languageHandler._t)("auth|server_picker_required")
}, {
key: "valid",
test: async function ({
value
}, {
error
}) {
if (!value) return true;
return !error;
},
invalid: function ({
error
}) {
return error ?? null;
}
}]
}));
(0, _defineProperty2.default)(this, "onHomeserverValidate", fieldState => this.validate(fieldState));
(0, _defineProperty2.default)(this, "onSubmit", async ev => {
ev.preventDefault();
if (this.state.defaultChosen) {
this.props.onFinished(this.defaultServer);
return;
}
const valid = await this.fieldRef.current?.validate({
allowEmpty: false
});
if (!valid) {
this.fieldRef.current?.focus();
this.fieldRef.current?.validate({
allowEmpty: false,
focused: true
});
return;
}
this.props.onFinished(this.validatedConf);
});
const config = _SdkConfig.default.get();
this.defaultServer = config["validated_server_config"];
const {
serverConfig
} = this.props;
let otherHomeserver = "";
if (!serverConfig.isDefault) {
if (serverConfig.isNameResolvable && serverConfig.hsName) {
otherHomeserver = serverConfig.hsName;
} else {
otherHomeserver = serverConfig.hsUrl;
}
}
this.state = {
defaultChosen: serverConfig.isDefault,
otherHomeserver
};
}
render() {
let text;
if (this.defaultServer.hsName === "matrix.org") {
text = (0, _languageHandler._t)("auth|server_picker_matrix.org");
}
let defaultServerName = this.defaultServer.hsName;
if (this.defaultServer.hsNameIsDifferent) {
defaultServerName = /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, {
className: "mx_Login_underlinedServerName",
tooltip: this.defaultServer.hsUrl
}, this.defaultServer.hsName);
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: this.props.title || (0, _languageHandler._t)("auth|server_picker_title"),
className: "mx_ServerPickerDialog",
contentId: "mx_ServerPickerDialog",
onFinished: this.props.onFinished,
fixedWidth: false,
hasCancel: true
}, /*#__PURE__*/_react.default.createElement("form", {
className: "mx_Dialog_content",
id: "mx_ServerPickerDialog",
onSubmit: this.onSubmit
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("auth|server_picker_intro"), " ", text), /*#__PURE__*/_react.default.createElement(_StyledRadioButton.default, {
name: "defaultChosen",
value: "true",
checked: this.state.defaultChosen,
onChange: this.onDefaultChosen,
"data-testid": "defaultHomeserver"
}, defaultServerName), /*#__PURE__*/_react.default.createElement(_StyledRadioButton.default, {
name: "defaultChosen",
value: "false",
className: "mx_ServerPickerDialog_otherHomeserverRadio",
checked: !this.state.defaultChosen,
onChange: this.onOtherChosen,
childrenInLabel: false,
"aria-label": (0, _languageHandler._t)("auth|server_picker_custom")
}, /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "text",
className: "mx_ServerPickerDialog_otherHomeserver",
label: (0, _languageHandler._t)("auth|server_picker_custom"),
onChange: this.onHomeserverChange,
onFocus: this.onOtherChosen,
ref: this.fieldRef,
onValidate: this.onHomeserverValidate,
value: this.state.otherHomeserver,
validateOnChange: false,
validateOnFocus: false,
autoFocus: true,
id: "mx_homeserverInput"
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("auth|server_picker_explainer")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_ServerPickerDialog_continue",
kind: "primary",
onClick: this.onSubmit
}, (0, _languageHandler._t)("action|continue")), /*#__PURE__*/_react.default.createElement("h2", null, (0, _languageHandler._t)("action|learn_more")), /*#__PURE__*/_react.default.createElement(_ExternalLink.default, {
href: "https://matrix.org/docs/matrix-concepts/elements-of-matrix/#homeserver",
target: "_blank",
rel: "noreferrer noopener"
}, (0, _languageHandler._t)("auth|server_picker_learn_more"))));
}
}
exports.default = ServerPickerDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xvZ2dlciIsIl9BdXRvRGlzY292ZXJ5VXRpbHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0Jhc2VEaWFsb2ciLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfU2RrQ29uZmlnIiwiX0ZpZWxkIiwiX1N0eWxlZFJhZGlvQnV0dG9uIiwiX1RleHRXaXRoVG9vbHRpcCIsIl9WYWxpZGF0aW9uIiwiX0V4dGVybmFsTGluayIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlNlcnZlclBpY2tlckRpYWxvZyIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwic2V0U3RhdGUiLCJkZWZhdWx0Q2hvc2VuIiwiZXYiLCJvdGhlckhvbWVzZXJ2ZXIiLCJ0YXJnZXQiLCJ2YWx1ZSIsIndpdGhWYWxpZGF0aW9uIiwiZGVyaXZlRGF0YSIsImhzVXJsIiwidHJpbSIsImluY2x1ZGVzIiwiZGlzY292ZXJ5UmVzdWx0IiwiQXV0b0Rpc2NvdmVyeSIsImZpbmRDbGllbnRDb25maWciLCJ2YWxpZGF0ZWRDb25mIiwiQXV0b0Rpc2NvdmVyeVV0aWxzIiwiYnVpbGRWYWxpZGF0ZWRDb25maWdGcm9tRGlzY292ZXJ5IiwibG9nZ2VyIiwiZXJyb3IiLCJ2YWxpZGF0ZVNlcnZlckNvbmZpZ1dpdGhTdGF0aWNVcmxzIiwic3RhdGVGb3JFcnJvciIsImF1dGhDb21wb25lbnRTdGF0ZUZvckVycm9yIiwic2VydmVyRXJyb3JJc0ZhdGFsIiwiX3QiLCJVc2VyRnJpZW5kbHlFcnJvciIsInRyYW5zbGF0ZWRNZXNzYWdlIiwidW5kZWZpbmVkIiwicnVsZXMiLCJrZXkiLCJ0ZXN0IiwiYWxsb3dFbXB0eSIsImludmFsaWQiLCJmaWVsZFN0YXRlIiwidmFsaWRhdGUiLCJwcmV2ZW50RGVmYXVsdCIsInN0YXRlIiwib25GaW5pc2hlZCIsImRlZmF1bHRTZXJ2ZXIiLCJ2YWxpZCIsImZpZWxkUmVmIiwiY3VycmVudCIsImZvY3VzIiwiZm9jdXNlZCIsImNvbmZpZyIsIlNka0NvbmZpZyIsInNlcnZlckNvbmZpZyIsImlzRGVmYXVsdCIsImlzTmFtZVJlc29sdmFibGUiLCJoc05hbWUiLCJyZW5kZXIiLCJ0ZXh0IiwiZGVmYXVsdFNlcnZlck5hbWUiLCJoc05hbWVJc0RpZmZlcmVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0b29sdGlwIiwidGl0bGUiLCJjb250ZW50SWQiLCJmaXhlZFdpZHRoIiwiaGFzQ2FuY2VsIiwiaWQiLCJvblN1Ym1pdCIsIm5hbWUiLCJjaGVja2VkIiwib25DaGFuZ2UiLCJvbkRlZmF1bHRDaG9zZW4iLCJvbk90aGVyQ2hvc2VuIiwiY2hpbGRyZW5JbkxhYmVsIiwidHlwZSIsImxhYmVsIiwib25Ib21lc2VydmVyQ2hhbmdlIiwib25Gb2N1cyIsInJlZiIsIm9uVmFsaWRhdGUiLCJvbkhvbWVzZXJ2ZXJWYWxpZGF0ZSIsInZhbGlkYXRlT25DaGFuZ2UiLCJ2YWxpZGF0ZU9uRm9jdXMiLCJhdXRvRm9jdXMiLCJraW5kIiwib25DbGljayIsImhyZWYiLCJyZWwiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9TZXJ2ZXJQaWNrZXJEaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwLCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDaGFuZ2VFdmVudCwgY3JlYXRlUmVmLCBTeW50aGV0aWNFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgQXV0b0Rpc2NvdmVyeSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IEF1dG9EaXNjb3ZlcnlVdGlscyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvQXV0b0Rpc2NvdmVyeVV0aWxzXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgeyBfdCwgVXNlckZyaWVuZGx5RXJyb3IgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vLi4vLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4uL2VsZW1lbnRzL0ZpZWxkXCI7XG5pbXBvcnQgU3R5bGVkUmFkaW9CdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL1N0eWxlZFJhZGlvQnV0dG9uXCI7XG5pbXBvcnQgVGV4dFdpdGhUb29sdGlwIGZyb20gXCIuLi9lbGVtZW50cy9UZXh0V2l0aFRvb2x0aXBcIjtcbmltcG9ydCB3aXRoVmFsaWRhdGlvbiwgeyBJRmllbGRTdGF0ZSwgSVZhbGlkYXRpb25SZXN1bHQgfSBmcm9tIFwiLi4vZWxlbWVudHMvVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGVkU2VydmVyQ29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1ZhbGlkYXRlZFNlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IEV4dGVybmFsTGluayBmcm9tIFwiLi4vZWxlbWVudHMvRXh0ZXJuYWxMaW5rXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcnZlckNvbmZpZzogVmFsaWRhdGVkU2VydmVyQ29uZmlnO1xuICAgIG9uRmluaXNoZWQoY29uZmlnPzogVmFsaWRhdGVkU2VydmVyQ29uZmlnKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgZGVmYXVsdENob3NlbjogYm9vbGVhbjtcbiAgICBvdGhlckhvbWVzZXJ2ZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyUGlja2VyRGlhbG9nIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNlcnZlcjogVmFsaWRhdGVkU2VydmVyQ29uZmlnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmllbGRSZWYgPSBjcmVhdGVSZWY8RmllbGQ+KCk7XG4gICAgcHJpdmF0ZSB2YWxpZGF0ZWRDb25mPzogVmFsaWRhdGVkU2VydmVyQ29uZmlnO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IFNka0NvbmZpZy5nZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VydmVyID0gY29uZmlnW1widmFsaWRhdGVkX3NlcnZlcl9jb25maWdcIl0hO1xuICAgICAgICBjb25zdCB7IHNlcnZlckNvbmZpZyB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBsZXQgb3RoZXJIb21lc2VydmVyID0gXCJcIjtcbiAgICAgICAgaWYgKCFzZXJ2ZXJDb25maWcuaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBpZiAoc2VydmVyQ29uZmlnLmlzTmFtZVJlc29sdmFibGUgJiYgc2VydmVyQ29uZmlnLmhzTmFtZSkge1xuICAgICAgICAgICAgICAgIG90aGVySG9tZXNlcnZlciA9IHNlcnZlckNvbmZpZy5oc05hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG90aGVySG9tZXNlcnZlciA9IHNlcnZlckNvbmZpZy5oc1VybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkZWZhdWx0Q2hvc2VuOiBzZXJ2ZXJDb25maWcuaXNEZWZhdWx0LFxuICAgICAgICAgICAgb3RoZXJIb21lc2VydmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EZWZhdWx0Q2hvc2VuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZGVmYXVsdENob3NlbjogdHJ1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk90aGVyQ2hvc2VuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZGVmYXVsdENob3NlbjogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Ib21lc2VydmVyQ2hhbmdlID0gKGV2OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3RoZXJIb21lc2VydmVyOiBldi50YXJnZXQudmFsdWUgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdmFsaWRhdGUgPSB3aXRoVmFsaWRhdGlvbjx0aGlzLCB7IGVycm9yPzogc3RyaW5nIH0+KHtcbiAgICAgICAgZGVyaXZlRGF0YTogYXN5bmMgKHsgdmFsdWUgfSk6IFByb21pc2U8eyBlcnJvcj86IHN0cmluZyB9PiA9PiB7XG4gICAgICAgICAgICBsZXQgaHNVcmwgPSAodmFsdWUgPz8gXCJcIikudHJpbSgpOyAvLyB0cmltIHRvIGFjY291bnQgZm9yIHJhbmRvbSB3aGl0ZXNwYWNlXG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBVUkwgaGFzIG5vIHByb3RvY29sLCB0cnkgdmFsaWRhdGUgaXQgYXMgYSBzZXJ2ZXJOYW1lIHZpYSB3ZWxsLWtub3duXG4gICAgICAgICAgICBpZiAoIWhzVXJsLmluY2x1ZGVzKFwiOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzY292ZXJ5UmVzdWx0ID0gYXdhaXQgQXV0b0Rpc2NvdmVyeS5maW5kQ2xpZW50Q29uZmlnKGhzVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZWRDb25mID0gYXdhaXQgQXV0b0Rpc2NvdmVyeVV0aWxzLmJ1aWxkVmFsaWRhdGVkQ29uZmlnRnJvbURpc2NvdmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIGhzVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXJ5UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307IC8vIHdlIGhhdmUgYSB2YWxpZGF0ZWQgY29uZmlnLCB3ZSBkb24ndCBuZWVkIHRvIHRyeSB0aGUgb3RoZXIgcGF0aHNcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgQXR0ZW1wdGVkICR7aHNVcmx9IGFzIGEgc2VydmVyX25hbWUgYnV0IGl0IGZhaWxlZGAsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgd2UgZ290IHRvIHRoaXMgc3RhZ2UgdGhlbiBlaXRoZXIgdGhlIHdlbGwta25vd24gZmFpbGVkIG9yIHRoZSBVUkwgaGFkIGEgcHJvdG9jb2wgc3BlY2lmaWVkLFxuICAgICAgICAgICAgLy8gc28gdmFsaWRhdGUgc3RhdGljYWxseSBvbmx5LiBJZiB0aGUgVVJMIGhhcyBubyBwcm90b2NvbCwgZGVmYXVsdCB0byBodHRwcy5cbiAgICAgICAgICAgIGlmICghaHNVcmwuaW5jbHVkZXMoXCI6Ly9cIikpIHtcbiAgICAgICAgICAgICAgICBoc1VybCA9IFwiaHR0cHM6Ly9cIiArIGhzVXJsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkQ29uZiA9IGF3YWl0IEF1dG9EaXNjb3ZlcnlVdGlscy52YWxpZGF0ZVNlcnZlckNvbmZpZ1dpdGhTdGF0aWNVcmxzKGhzVXJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVGb3JFcnJvciA9IEF1dG9EaXNjb3ZlcnlVdGlscy5hdXRoQ29tcG9uZW50U3RhdGVGb3JFcnJvcihlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVGb3JFcnJvci5zZXJ2ZXJFcnJvcklzRmF0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3QoXCJhdXRofHNlcnZlcl9waWNrZXJfZmFpbGVkX3ZhbGlkYXRlX2hvbWVzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVXNlckZyaWVuZGx5RXJyb3IgJiYgZS50cmFuc2xhdGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlLnRyYW5zbGF0ZWRNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNhcnJ5IG9uIGFueXdheVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkQ29uZiA9IGF3YWl0IEF1dG9EaXNjb3ZlcnlVdGlscy52YWxpZGF0ZVNlcnZlckNvbmZpZ1dpdGhTdGF0aWNVcmxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgaHNVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBfdChcImF1dGh8c2VydmVyX3BpY2tlcl9pbnZhbGlkX3VybFwiKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgICB0ZXN0OiAoeyB2YWx1ZSwgYWxsb3dFbXB0eSB9KSA9PiBhbGxvd0VtcHR5IHx8ICEhdmFsdWUsXG4gICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJhdXRofHNlcnZlcl9waWNrZXJfcmVxdWlyZWRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jIGZ1bmN0aW9uICh7IHZhbHVlIH0sIHsgZXJyb3IgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlcnJvcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludmFsaWQ6IGZ1bmN0aW9uICh7IGVycm9yIH0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIG9uSG9tZXNlcnZlclZhbGlkYXRlID0gKGZpZWxkU3RhdGU6IElGaWVsZFN0YXRlKTogUHJvbWlzZTxJVmFsaWRhdGlvblJlc3VsdD4gPT4gdGhpcy52YWxpZGF0ZShmaWVsZFN0YXRlKTtcblxuICAgIHByaXZhdGUgb25TdWJtaXQgPSBhc3luYyAoZXY6IFN5bnRoZXRpY0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZGVmYXVsdENob3Nlbikge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRoaXMuZGVmYXVsdFNlcnZlcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IHRoaXMuZmllbGRSZWYuY3VycmVudD8udmFsaWRhdGUoeyBhbGxvd0VtcHR5OiBmYWxzZSB9KTtcblxuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkUmVmLmN1cnJlbnQ/LnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UsIGZvY3VzZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodGhpcy52YWxpZGF0ZWRDb25mKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgdGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0U2VydmVyLmhzTmFtZSA9PT0gXCJtYXRyaXgub3JnXCIpIHtcbiAgICAgICAgICAgIHRleHQgPSBfdChcImF1dGh8c2VydmVyX3BpY2tlcl9tYXRyaXgub3JnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlZmF1bHRTZXJ2ZXJOYW1lOiBSZWFjdC5SZWFjdE5vZGUgPSB0aGlzLmRlZmF1bHRTZXJ2ZXIuaHNOYW1lO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0U2VydmVyLmhzTmFtZUlzRGlmZmVyZW50KSB7XG4gICAgICAgICAgICBkZWZhdWx0U2VydmVyTmFtZSA9IChcbiAgICAgICAgICAgICAgICA8VGV4dFdpdGhUb29sdGlwIGNsYXNzTmFtZT1cIm14X0xvZ2luX3VuZGVybGluZWRTZXJ2ZXJOYW1lXCIgdG9vbHRpcD17dGhpcy5kZWZhdWx0U2VydmVyLmhzVXJsfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuZGVmYXVsdFNlcnZlci5oc05hbWV9XG4gICAgICAgICAgICAgICAgPC9UZXh0V2l0aFRvb2x0aXA+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICAgICAgdGl0bGU9e3RoaXMucHJvcHMudGl0bGUgfHwgX3QoXCJhdXRofHNlcnZlcl9waWNrZXJfdGl0bGVcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU2VydmVyUGlja2VyRGlhbG9nXCJcbiAgICAgICAgICAgICAgICBjb250ZW50SWQ9XCJteF9TZXJ2ZXJQaWNrZXJEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICBmaXhlZFdpZHRoPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBoYXNDYW5jZWw9e3RydWV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPVwibXhfRGlhbG9nX2NvbnRlbnRcIiBpZD1cIm14X1NlcnZlclBpY2tlckRpYWxvZ1wiIG9uU3VibWl0PXt0aGlzLm9uU3VibWl0fT5cbiAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhdXRofHNlcnZlcl9waWNrZXJfaW50cm9cIil9IHt0ZXh0fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFJhZGlvQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZGVmYXVsdENob3NlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5zdGF0ZS5kZWZhdWx0Q2hvc2VufVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25EZWZhdWx0Q2hvc2VufVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWZhdWx0SG9tZXNlcnZlclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0U2VydmVyTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRSYWRpb0J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkUmFkaW9CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZWZhdWx0Q2hvc2VuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU2VydmVyUGlja2VyRGlhbG9nX290aGVySG9tZXNlcnZlclJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9eyF0aGlzLnN0YXRlLmRlZmF1bHRDaG9zZW59XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vbk90aGVyQ2hvc2VufVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5JbkxhYmVsPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiYXV0aHxzZXJ2ZXJfcGlja2VyX2N1c3RvbVwiKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1NlcnZlclBpY2tlckRpYWxvZ19vdGhlckhvbWVzZXJ2ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImF1dGh8c2VydmVyX3BpY2tlcl9jdXN0b21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25Ib21lc2VydmVyQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e3RoaXMub25PdGhlckNob3Nlbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuZmllbGRSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWxpZGF0ZT17dGhpcy5vbkhvbWVzZXJ2ZXJWYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5vdGhlckhvbWVzZXJ2ZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPbkNoYW5nZT17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPbkZvY3VzPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJteF9ob21lc2VydmVySW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRSYWRpb0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e190KFwiYXV0aHxzZXJ2ZXJfcGlja2VyX2V4cGxhaW5lclwiKX08L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gY2xhc3NOYW1lPVwibXhfU2VydmVyUGlja2VyRGlhbG9nX2NvbnRpbnVlXCIga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXt0aGlzLm9uU3VibWl0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxjb250aW51ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxoMj57X3QoXCJhY3Rpb258bGVhcm5fbW9yZVwiKX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9tYXRyaXgub3JnL2RvY3MvbWF0cml4LWNvbmNlcHRzL2VsZW1lbnRzLW9mLW1hdHJpeC8jaG9tZXNlcnZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImF1dGh8c2VydmVyX3BpY2tlcl9sZWFybl9tb3JlXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0V4dGVybmFsTGluaz5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLG1CQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQUgsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFRLFVBQUEsR0FBQUosc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQUwsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFVLGtCQUFBLEdBQUFOLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBVyxnQkFBQSxHQUFBUCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVksV0FBQSxHQUFBUixzQkFBQSxDQUFBSixPQUFBO0FBRUEsSUFBQWEsYUFBQSxHQUFBVCxzQkFBQSxDQUFBSixPQUFBO0FBQW9ELFNBQUFjLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFoQix3QkFBQWdCLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBdEJwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUE2QmUsTUFBTVcsa0JBQWtCLFNBQVNDLGNBQUssQ0FBQ0MsYUFBYSxDQUFpQjtFQUt6RUMsV0FBV0EsQ0FBQ0MsS0FBYSxFQUFFO0lBQzlCLEtBQUssQ0FBQ0EsS0FBSyxDQUFDO0lBQUMsSUFBQUMsZ0JBQUEsQ0FBQW5CLE9BQUE7SUFBQSxJQUFBbUIsZ0JBQUEsQ0FBQW5CLE9BQUEsaUNBSlcsSUFBQW9CLGdCQUFTLEVBQVEsQ0FBQztJQUFBLElBQUFELGdCQUFBLENBQUFuQixPQUFBO0lBQUEsSUFBQW1CLGdCQUFBLENBQUFuQixPQUFBLDJCQXlCcEIsTUFBWTtNQUNsQyxJQUFJLENBQUNxQixRQUFRLENBQUM7UUFBRUMsYUFBYSxFQUFFO01BQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFBQSxJQUFBSCxnQkFBQSxDQUFBbkIsT0FBQSx5QkFFdUIsTUFBWTtNQUNoQyxJQUFJLENBQUNxQixRQUFRLENBQUM7UUFBRUMsYUFBYSxFQUFFO01BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQSxJQUFBSCxnQkFBQSxDQUFBbkIsT0FBQSw4QkFFNkJ1QixFQUFpQyxJQUFXO01BQ3RFLElBQUksQ0FBQ0YsUUFBUSxDQUFDO1FBQUVHLGVBQWUsRUFBRUQsRUFBRSxDQUFDRSxNQUFNLENBQUNDO01BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFBQSxJQUFBUCxnQkFBQSxDQUFBbkIsT0FBQSxvQkFFa0IsSUFBQTJCLG1CQUFjLEVBQTJCO01BQ3hEQyxVQUFVLEVBQUUsTUFBQUEsQ0FBTztRQUFFRjtNQUFNLENBQUMsS0FBa0M7UUFDMUQsSUFBSUcsS0FBSyxHQUFHLENBQUNILEtBQUssSUFBSSxFQUFFLEVBQUVJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFbEM7UUFDQSxJQUFJLENBQUNELEtBQUssQ0FBQ0UsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3hCLElBQUk7WUFDQSxNQUFNQyxlQUFlLEdBQUcsTUFBTUMscUJBQWEsQ0FBQ0MsZ0JBQWdCLENBQUNMLEtBQUssQ0FBQztZQUNuRSxJQUFJLENBQUNNLGFBQWEsR0FBRyxNQUFNQywyQkFBa0IsQ0FBQ0MsaUNBQWlDLENBQzNFUixLQUFLLEVBQ0xHLGVBQ0osQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNmLENBQUMsQ0FBQyxPQUFPckMsQ0FBQyxFQUFFO1lBQ1IyQyxjQUFNLENBQUNDLEtBQUssQ0FBQyxhQUFhVixLQUFLLGlDQUFpQyxFQUFFbEMsQ0FBQyxDQUFDO1VBQ3hFO1FBQ0o7O1FBRUE7UUFDQTtRQUNBLElBQUksQ0FBQ2tDLEtBQUssQ0FBQ0UsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3hCRixLQUFLLEdBQUcsVUFBVSxHQUFHQSxLQUFLO1FBQzlCO1FBRUEsSUFBSTtVQUNBLElBQUksQ0FBQ00sYUFBYSxHQUFHLE1BQU1DLDJCQUFrQixDQUFDSSxrQ0FBa0MsQ0FBQ1gsS0FBSyxDQUFDO1VBQ3ZGLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLE9BQU9sQyxDQUFDLEVBQUU7VUFDUjJDLGNBQU0sQ0FBQ0MsS0FBSyxDQUFDNUMsQ0FBQyxDQUFDO1VBRWYsTUFBTThDLGFBQWEsR0FBR0wsMkJBQWtCLENBQUNNLDBCQUEwQixDQUFDL0MsQ0FBQyxDQUFDO1VBQ3RFLElBQUk4QyxhQUFhLENBQUNFLGtCQUFrQixFQUFFO1lBQ2xDLElBQUlKLEtBQUssR0FBRyxJQUFBSyxtQkFBRSxFQUFDLCtDQUErQyxDQUFDO1lBQy9ELElBQUlqRCxDQUFDLFlBQVlrRCxrQ0FBaUIsSUFBSWxELENBQUMsQ0FBQ21ELGlCQUFpQixFQUFFO2NBQ3ZEUCxLQUFLLEdBQUc1QyxDQUFDLENBQUNtRCxpQkFBaUI7WUFDL0I7WUFDQSxPQUFPO2NBQUVQO1lBQU0sQ0FBQztVQUNwQjs7VUFFQTtVQUNBLElBQUk7WUFDQSxJQUFJLENBQUNKLGFBQWEsR0FBRyxNQUFNQywyQkFBa0IsQ0FBQ0ksa0NBQWtDLENBQzVFWCxLQUFLLEVBQ0xrQixTQUFTLEVBQ1QsSUFDSixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7VUFDYixDQUFDLENBQUMsT0FBT3BELENBQUMsRUFBRTtZQUNSMkMsY0FBTSxDQUFDQyxLQUFLLENBQUM1QyxDQUFDLENBQUM7WUFDZixPQUFPO2NBQUU0QyxLQUFLLEVBQUUsSUFBQUssbUJBQUUsRUFBQyxnQ0FBZ0M7WUFBRSxDQUFDO1VBQzFEO1FBQ0o7TUFDSixDQUFDO01BQ0RJLEtBQUssRUFBRSxDQUNIO1FBQ0lDLEdBQUcsRUFBRSxVQUFVO1FBQ2ZDLElBQUksRUFBRUEsQ0FBQztVQUFFeEIsS0FBSztVQUFFeUI7UUFBVyxDQUFDLEtBQUtBLFVBQVUsSUFBSSxDQUFDLENBQUN6QixLQUFLO1FBQ3REMEIsT0FBTyxFQUFFQSxDQUFBLEtBQU0sSUFBQVIsbUJBQUUsRUFBQyw2QkFBNkI7TUFDbkQsQ0FBQyxFQUNEO1FBQ0lLLEdBQUcsRUFBRSxPQUFPO1FBQ1pDLElBQUksRUFBRSxlQUFBQSxDQUFnQjtVQUFFeEI7UUFBTSxDQUFDLEVBQUU7VUFBRWE7UUFBTSxDQUFDLEVBQW9CO1VBQzFELElBQUksQ0FBQ2IsS0FBSyxFQUFFLE9BQU8sSUFBSTtVQUN2QixPQUFPLENBQUNhLEtBQUs7UUFDakIsQ0FBQztRQUNEYSxPQUFPLEVBQUUsU0FBQUEsQ0FBVTtVQUFFYjtRQUFNLENBQUMsRUFBRTtVQUMxQixPQUFPQSxLQUFLLElBQUksSUFBSTtRQUN4QjtNQUNKLENBQUM7SUFFVCxDQUFDLENBQUM7SUFBQSxJQUFBcEIsZ0JBQUEsQ0FBQW5CLE9BQUEsZ0NBRThCcUQsVUFBdUIsSUFBaUMsSUFBSSxDQUFDQyxRQUFRLENBQUNELFVBQVUsQ0FBQztJQUFBLElBQUFsQyxnQkFBQSxDQUFBbkIsT0FBQSxvQkFFOUYsTUFBT3VCLEVBQWtCLElBQW9CO01BQzVEQSxFQUFFLENBQUNnQyxjQUFjLENBQUMsQ0FBQztNQUVuQixJQUFJLElBQUksQ0FBQ0MsS0FBSyxDQUFDbEMsYUFBYSxFQUFFO1FBQzFCLElBQUksQ0FBQ0osS0FBSyxDQUFDdUMsVUFBVSxDQUFDLElBQUksQ0FBQ0MsYUFBYSxDQUFDO1FBQ3pDO01BQ0o7TUFFQSxNQUFNQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUNDLFFBQVEsQ0FBQ0MsT0FBTyxFQUFFUCxRQUFRLENBQUM7UUFBRUgsVUFBVSxFQUFFO01BQU0sQ0FBQyxDQUFDO01BRTFFLElBQUksQ0FBQ1EsS0FBSyxFQUFFO1FBQ1IsSUFBSSxDQUFDQyxRQUFRLENBQUNDLE9BQU8sRUFBRUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDRixRQUFRLENBQUNDLE9BQU8sRUFBRVAsUUFBUSxDQUFDO1VBQUVILFVBQVUsRUFBRSxLQUFLO1VBQUVZLE9BQU8sRUFBRTtRQUFLLENBQUMsQ0FBQztRQUNyRTtNQUNKO01BRUEsSUFBSSxDQUFDN0MsS0FBSyxDQUFDdUMsVUFBVSxDQUFDLElBQUksQ0FBQ3RCLGFBQWEsQ0FBQztJQUM3QyxDQUFDO0lBMUhHLE1BQU02QixNQUFNLEdBQUdDLGtCQUFTLENBQUMvRCxHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUN3RCxhQUFhLEdBQUdNLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBRTtJQUN2RCxNQUFNO01BQUVFO0lBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQ2hELEtBQUs7SUFFbkMsSUFBSU0sZUFBZSxHQUFHLEVBQUU7SUFDeEIsSUFBSSxDQUFDMEMsWUFBWSxDQUFDQyxTQUFTLEVBQUU7TUFDekIsSUFBSUQsWUFBWSxDQUFDRSxnQkFBZ0IsSUFBSUYsWUFBWSxDQUFDRyxNQUFNLEVBQUU7UUFDdEQ3QyxlQUFlLEdBQUcwQyxZQUFZLENBQUNHLE1BQU07TUFDekMsQ0FBQyxNQUFNO1FBQ0g3QyxlQUFlLEdBQUcwQyxZQUFZLENBQUNyQyxLQUFLO01BQ3hDO0lBQ0o7SUFFQSxJQUFJLENBQUMyQixLQUFLLEdBQUc7TUFDVGxDLGFBQWEsRUFBRTRDLFlBQVksQ0FBQ0MsU0FBUztNQUNyQzNDO0lBQ0osQ0FBQztFQUNMO0VBMkdPOEMsTUFBTUEsQ0FBQSxFQUFvQjtJQUM3QixJQUFJQyxJQUF3QjtJQUM1QixJQUFJLElBQUksQ0FBQ2IsYUFBYSxDQUFDVyxNQUFNLEtBQUssWUFBWSxFQUFFO01BQzVDRSxJQUFJLEdBQUcsSUFBQTNCLG1CQUFFLEVBQUMsK0JBQStCLENBQUM7SUFDOUM7SUFFQSxJQUFJNEIsaUJBQWtDLEdBQUcsSUFBSSxDQUFDZCxhQUFhLENBQUNXLE1BQU07SUFDbEUsSUFBSSxJQUFJLENBQUNYLGFBQWEsQ0FBQ2UsaUJBQWlCLEVBQUU7TUFDdENELGlCQUFpQixnQkFDYjlGLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsQ0FBQ25GLGdCQUFBLENBQUFTLE9BQWU7UUFBQzJFLFNBQVMsRUFBQywrQkFBK0I7UUFBQ0MsT0FBTyxFQUFFLElBQUksQ0FBQ2xCLGFBQWEsQ0FBQzdCO01BQU0sR0FDeEYsSUFBSSxDQUFDNkIsYUFBYSxDQUFDVyxNQUNQLENBQ3BCO0lBQ0w7SUFFQSxvQkFDSTNGLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsQ0FBQ3pGLFdBQUEsQ0FBQWUsT0FBVTtNQUNQNkUsS0FBSyxFQUFFLElBQUksQ0FBQzNELEtBQUssQ0FBQzJELEtBQUssSUFBSSxJQUFBakMsbUJBQUUsRUFBQywwQkFBMEIsQ0FBRTtNQUMxRCtCLFNBQVMsRUFBQyx1QkFBdUI7TUFDakNHLFNBQVMsRUFBQyx1QkFBdUI7TUFDakNyQixVQUFVLEVBQUUsSUFBSSxDQUFDdkMsS0FBSyxDQUFDdUMsVUFBVztNQUNsQ3NCLFVBQVUsRUFBRSxLQUFNO01BQ2xCQyxTQUFTLEVBQUU7SUFBSyxnQkFFaEJ0RyxNQUFBLENBQUFzQixPQUFBLENBQUEwRSxhQUFBO01BQU1DLFNBQVMsRUFBQyxtQkFBbUI7TUFBQ00sRUFBRSxFQUFDLHVCQUF1QjtNQUFDQyxRQUFRLEVBQUUsSUFBSSxDQUFDQTtJQUFTLGdCQUNuRnhHLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsWUFDSyxJQUFBOUIsbUJBQUUsRUFBQywwQkFBMEIsQ0FBQyxFQUFDLEdBQUMsRUFBQzJCLElBQ25DLENBQUMsZUFFSjdGLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsQ0FBQ3BGLGtCQUFBLENBQUFVLE9BQWlCO01BQ2RtRixJQUFJLEVBQUMsZUFBZTtNQUNwQnpELEtBQUssRUFBQyxNQUFNO01BQ1owRCxPQUFPLEVBQUUsSUFBSSxDQUFDNUIsS0FBSyxDQUFDbEMsYUFBYztNQUNsQytELFFBQVEsRUFBRSxJQUFJLENBQUNDLGVBQWdCO01BQy9CLGVBQVk7SUFBbUIsR0FFOUJkLGlCQUNjLENBQUMsZUFFcEI5RixNQUFBLENBQUFzQixPQUFBLENBQUEwRSxhQUFBLENBQUNwRixrQkFBQSxDQUFBVSxPQUFpQjtNQUNkbUYsSUFBSSxFQUFDLGVBQWU7TUFDcEJ6RCxLQUFLLEVBQUMsT0FBTztNQUNiaUQsU0FBUyxFQUFDLDRDQUE0QztNQUN0RFMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDNUIsS0FBSyxDQUFDbEMsYUFBYztNQUNuQytELFFBQVEsRUFBRSxJQUFJLENBQUNFLGFBQWM7TUFDN0JDLGVBQWUsRUFBRSxLQUFNO01BQ3ZCLGNBQVksSUFBQTVDLG1CQUFFLEVBQUMsMkJBQTJCO0lBQUUsZ0JBRTVDbEUsTUFBQSxDQUFBc0IsT0FBQSxDQUFBMEUsYUFBQSxDQUFDckYsTUFBQSxDQUFBVyxPQUFLO01BQ0Z5RixJQUFJLEVBQUMsTUFBTTtNQUNYZCxTQUFTLEVBQUMsdUNBQXVDO01BQ2pEZSxLQUFLLEVBQUUsSUFBQTlDLG1CQUFFLEVBQUMsMkJBQTJCLENBQUU7TUFDdkN5QyxRQUFRLEVBQUUsSUFBSSxDQUFDTSxrQkFBbUI7TUFDbENDLE9BQU8sRUFBRSxJQUFJLENBQUNMLGFBQWM7TUFDNUJNLEdBQUcsRUFBRSxJQUFJLENBQUNqQyxRQUFTO01BQ25Ca0MsVUFBVSxFQUFFLElBQUksQ0FBQ0Msb0JBQXFCO01BQ3RDckUsS0FBSyxFQUFFLElBQUksQ0FBQzhCLEtBQUssQ0FBQ2hDLGVBQWdCO01BQ2xDd0UsZ0JBQWdCLEVBQUUsS0FBTTtNQUN4QkMsZUFBZSxFQUFFLEtBQU07TUFDdkJDLFNBQVMsRUFBRSxJQUFLO01BQ2hCakIsRUFBRSxFQUFDO0lBQW9CLENBQzFCLENBQ2MsQ0FBQyxlQUNwQnZHLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsWUFBSSxJQUFBOUIsbUJBQUUsRUFBQyw4QkFBOEIsQ0FBSyxDQUFDLGVBRTNDbEUsTUFBQSxDQUFBc0IsT0FBQSxDQUFBMEUsYUFBQSxDQUFDdkYsaUJBQUEsQ0FBQWEsT0FBZ0I7TUFBQzJFLFNBQVMsRUFBQyxnQ0FBZ0M7TUFBQ3dCLElBQUksRUFBQyxTQUFTO01BQUNDLE9BQU8sRUFBRSxJQUFJLENBQUNsQjtJQUFTLEdBQzlGLElBQUF0QyxtQkFBRSxFQUFDLGlCQUFpQixDQUNQLENBQUMsZUFFbkJsRSxNQUFBLENBQUFzQixPQUFBLENBQUEwRSxhQUFBLGFBQUssSUFBQTlCLG1CQUFFLEVBQUMsbUJBQW1CLENBQU0sQ0FBQyxlQUNsQ2xFLE1BQUEsQ0FBQXNCLE9BQUEsQ0FBQTBFLGFBQUEsQ0FBQ2pGLGFBQUEsQ0FBQU8sT0FBWTtNQUNUcUcsSUFBSSxFQUFDLHdFQUF3RTtNQUM3RTVFLE1BQU0sRUFBQyxRQUFRO01BQ2Y2RSxHQUFHLEVBQUM7SUFBcUIsR0FFeEIsSUFBQTFELG1CQUFFLEVBQUMsK0JBQStCLENBQ3pCLENBQ1osQ0FDRSxDQUFDO0VBRXJCO0FBQ0o7QUFBQzJELE9BQUEsQ0FBQXZHLE9BQUEsR0FBQWMsa0JBQUEiLCJpZ25vcmVMaXN0IjpbXX0=