matrix-react-sdk
Version:
SDK for matrix.org using React
313 lines (265 loc) • 47 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _languageHandler = require("../../../../../languageHandler");
var _MatrixClientPeg = require("../../../../../MatrixClientPeg");
var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton"));
var _AccessibleTooltipButton = _interopRequireDefault(require("../../../elements/AccessibleTooltipButton"));
var _SdkConfig = _interopRequireDefault(require("../../../../../SdkConfig"));
var _createRoom = _interopRequireDefault(require("../../../../../createRoom"));
var _Modal = _interopRequireDefault(require("../../../../../Modal"));
var sdk = _interopRequireWildcard(require("../../../../.."));
var _PlatformPeg = _interopRequireDefault(require("../../../../../PlatformPeg"));
var KeyboardShortcuts = _interopRequireWildcard(require("../../../../../accessibility/KeyboardShortcuts"));
var _UpdateCheckButton = _interopRequireDefault(require("../../UpdateCheckButton"));
var _replaceableComponent = require("../../../../../utils/replaceableComponent");
var _strings = require("../../../../../utils/strings");
var ContextMenu = _interopRequireWildcard(require("../../../../structures/ContextMenu"));
var _dec, _class, _temp;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
let HelpUserSettingsTab = (_dec = (0, _replaceableComponent.replaceableComponent)("views.settings.tabs.user.HelpUserSettingsTab"), _dec(_class = (_temp = class HelpUserSettingsTab extends _react.default.Component
/*:: <IProps, IState>*/
{
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "closeCopiedTooltip", void 0);
(0, _defineProperty2.default)(this, "onClearCacheAndReload", e => {
if (!_PlatformPeg.default.get()) return; // Dev note: please keep this log line, it's useful when troubleshooting a MatrixClient suddenly
// stopping in the middle of the logs.
console.log("Clear cache & reload clicked");
_MatrixClientPeg.MatrixClientPeg.get().stopClient();
_MatrixClientPeg.MatrixClientPeg.get().store.deleteAllData().then(() => {
_PlatformPeg.default.get().reload();
});
});
(0, _defineProperty2.default)(this, "onBugReport", e => {
const BugReportDialog = sdk.getComponent("dialogs.BugReportDialog");
if (!BugReportDialog) {
return;
}
_Modal.default.createTrackedDialog('Bug Report Dialog', '', BugReportDialog, {});
});
(0, _defineProperty2.default)(this, "onStartBotChat", e => {
this.props.closeSettingsFn();
(0, _createRoom.default)({
dmUserId: _SdkConfig.default.get().welcomeUserId,
andView: true
});
});
(0, _defineProperty2.default)(this, "showSpoiler", event => {
const target = event.target;
target.innerHTML = target.getAttribute('data-spoiler');
const range = document.createRange();
range.selectNodeContents(target);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
});
(0, _defineProperty2.default)(this, "onAccessTokenCopyClick", async e => {
e.preventDefault();
const target = e.target; // copy target before we go async and React throws it away
const successful = await (0, _strings.copyPlaintext)(_MatrixClientPeg.MatrixClientPeg.get().getAccessToken());
const buttonRect = target.getBoundingClientRect();
const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu');
const {
close
} = ContextMenu.createMenu(GenericTextContextMenu, _objectSpread(_objectSpread({}, (0, ContextMenu.toRightOf)(buttonRect, 2)), {}, {
message: successful ? (0, _languageHandler._t)('Copied!') : (0, _languageHandler._t)('Failed to copy')
}));
this.closeCopiedTooltip = target.onmouseleave = close;
});
this.state = {
appVersion: null,
canUpdate: false
};
}
componentDidMount()
/*: void*/
{
_PlatformPeg.default.get().getAppVersion().then(ver => this.setState({
appVersion: ver
})).catch(e => {
console.error("Error getting vector version: ", e);
});
_PlatformPeg.default.get().canSelfUpdate().then(v => this.setState({
canUpdate: v
})).catch(e => {
console.error("Error getting self updatability: ", e);
});
}
componentWillUnmount() {
// if the Copied tooltip is open then get rid of it, there are ways to close the modal which wouldn't close
// the tooltip otherwise, such as pressing Escape
if (this.closeCopiedTooltip) this.closeCopiedTooltip();
}
renderLegal() {
const tocLinks = _SdkConfig.default.get().terms_and_conditions_links;
if (!tocLinks) return null;
const legalLinks = [];
for (const tocEntry of _SdkConfig.default.get().terms_and_conditions_links) {
legalLinks.push( /*#__PURE__*/_react.default.createElement("div", {
key: tocEntry.url
}, /*#__PURE__*/_react.default.createElement("a", {
href: tocEntry.url,
rel: "noreferrer noopener",
target: "_blank"
}, tocEntry.text)));
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section mx_HelpUserSettingsTab_versions"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)("Legal")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, legalLinks));
}
renderCredits() {
// Note: This is not translated because it is legal text.
// Also, is ugly but necessary.
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)("Credits")), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, "The ", /*#__PURE__*/_react.default.createElement("a", {
href: "themes/element/img/backgrounds/lake.jpg",
rel: "noreferrer noopener",
target: "_blank"
}, "default cover photo"), " is \xA9\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "https://www.flickr.com/golan",
rel: "noreferrer noopener",
target: "_blank"
}, "Jes\xFAs Roncero"), " used under the terms of\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "https://creativecommons.org/licenses/by-sa/4.0/",
rel: "noreferrer noopener",
target: "_blank"
}, "CC-BY-SA 4.0"), "."), /*#__PURE__*/_react.default.createElement("li", null, "The ", /*#__PURE__*/_react.default.createElement("a", {
href: "https://github.com/matrix-org/twemoji-colr",
rel: "noreferrer noopener",
target: "_blank"
}, "twemoji-colr"), " font is \xA9\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "https://mozilla.org",
rel: "noreferrer noopener",
target: "_blank"
}, "Mozilla Foundation"), " used under the terms of\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "http://www.apache.org/licenses/LICENSE-2.0",
rel: "noreferrer noopener",
target: "_blank"
}, "Apache 2.0"), "."), /*#__PURE__*/_react.default.createElement("li", null, "The ", /*#__PURE__*/_react.default.createElement("a", {
href: "https://twemoji.twitter.com/",
rel: "noreferrer noopener",
target: "_blank"
}, "Twemoji"), " emoji art is \xA9\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "https://twemoji.twitter.com/",
rel: "noreferrer noopener",
target: "_blank"
}, "Twitter, Inc and other contributors"), " used under the terms of\xA0", /*#__PURE__*/_react.default.createElement("a", {
href: "https://creativecommons.org/licenses/by/4.0/",
rel: "noreferrer noopener",
target: "_blank"
}, "CC-BY 4.0"), ".")));
}
render() {
const brand = _SdkConfig.default.get().brand;
let faqText = (0, _languageHandler._t)('For help with using %(brand)s, click <a>here</a>.', {
brand
}, {
'a': sub => /*#__PURE__*/_react.default.createElement("a", {
href: "https://element.io/help",
rel: "noreferrer noopener",
target: "_blank"
}, sub)
});
if (_SdkConfig.default.get().welcomeUserId && (0, _languageHandler.getCurrentLanguage)().startsWith('en')) {
faqText = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)('For help with using %(brand)s, click <a>here</a> or start a chat with our ' + 'bot using the button below.', {
brand
}, {
'a': sub => /*#__PURE__*/_react.default.createElement("a", {
href: "https://element.io/help",
rel: "noreferrer noopener",
target: "_blank"
}, sub)
}), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onStartBotChat,
kind: "primary"
}, (0, _languageHandler._t)("Chat with %(brand)s Bot", {
brand
}))));
}
const appVersion = this.state.appVersion || 'unknown';
let olmVersion = _MatrixClientPeg.MatrixClientPeg.get().olmVersion;
olmVersion = olmVersion ? `${olmVersion[0]}.${olmVersion[1]}.${olmVersion[2]}` : '<not-enabled>';
let updateButton = null;
if (this.state.canUpdate) {
updateButton = /*#__PURE__*/_react.default.createElement(_UpdateCheckButton.default, null);
}
let bugReportingSection;
if (_SdkConfig.default.get().bug_report_endpoint_url) {
bugReportingSection = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)('Bug reporting')), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, (0, _languageHandler._t)("If you've submitted a bug via GitHub, debug logs can help " + "us track down the problem. Debug logs contain application " + "usage data including your username, the IDs or aliases of " + "the rooms or groups you have visited and the usernames of " + "other users. They do not contain messages."), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_HelpUserSettingsTab_debugButton"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onBugReport,
kind: "primary"
}, (0, _languageHandler._t)("Submit debug logs"))), (0, _languageHandler._t)("To report a Matrix-related security issue, please read the Matrix.org " + "<a>Security Disclosure Policy</a>.", {}, {
a: sub => /*#__PURE__*/_react.default.createElement("a", {
href: "https://matrix.org/security-disclosure-policy/",
rel: "noreferrer noopener",
target: "_blank"
}, sub)
})));
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab mx_HelpUserSettingsTab"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_heading"
}, (0, _languageHandler._t)("Help & About")), bugReportingSection, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)("FAQ")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, faqText), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
onClick: KeyboardShortcuts.toggleDialog
}, (0, _languageHandler._t)("Keyboard Shortcuts"))), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section mx_HelpUserSettingsTab_versions"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)("Versions")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, (0, _languageHandler._t)("%(brand)s version:", {
brand
}), " ", appVersion, /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("olm version:"), " ", olmVersion, /*#__PURE__*/_react.default.createElement("br", null), updateButton)), this.renderLegal(), this.renderCredits(), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_section mx_HelpUserSettingsTab_versions"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SettingsTab_subheading"
}, (0, _languageHandler._t)("Advanced")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, (0, _languageHandler._t)("Homeserver is"), " ", /*#__PURE__*/_react.default.createElement("code", null, _MatrixClientPeg.MatrixClientPeg.get().getHomeserverUrl()), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("Identity Server is"), " ", /*#__PURE__*/_react.default.createElement("code", null, _MatrixClientPeg.MatrixClientPeg.get().getIdentityServerUrl()), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("details", null, /*#__PURE__*/_react.default.createElement("summary", null, (0, _languageHandler._t)("Access Token")), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, (0, _languageHandler._t)("Your access token gives full access to your account." + " Do not share it with anyone.")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_HelpUserSettingsTab_accessToken"
}, /*#__PURE__*/_react.default.createElement("code", null, _MatrixClientPeg.MatrixClientPeg.get().getAccessToken()), /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, {
title: (0, _languageHandler._t)("Copy"),
onClick: this.onAccessTokenCopyClick,
className: "mx_HelpUserSettingsTab_accessToken_copy"
}))), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_HelpUserSettingsTab_debugButton"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onClearCacheAndReload,
kind: "danger"
}, (0, _languageHandler._t)("Clear cache and reload"))))));
}
}, _temp)) || _class);
exports.default = HelpUserSettingsTab;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL3RhYnMvdXNlci9IZWxwVXNlclNldHRpbmdzVGFiLnRzeCJdLCJuYW1lcyI6WyJIZWxwVXNlclNldHRpbmdzVGFiIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiZSIsIlBsYXRmb3JtUGVnIiwiZ2V0IiwiY29uc29sZSIsImxvZyIsIk1hdHJpeENsaWVudFBlZyIsInN0b3BDbGllbnQiLCJzdG9yZSIsImRlbGV0ZUFsbERhdGEiLCJ0aGVuIiwicmVsb2FkIiwiQnVnUmVwb3J0RGlhbG9nIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiTW9kYWwiLCJjcmVhdGVUcmFja2VkRGlhbG9nIiwiY2xvc2VTZXR0aW5nc0ZuIiwiZG1Vc2VySWQiLCJTZGtDb25maWciLCJ3ZWxjb21lVXNlcklkIiwiYW5kVmlldyIsImV2ZW50IiwidGFyZ2V0IiwiaW5uZXJIVE1MIiwiZ2V0QXR0cmlidXRlIiwicmFuZ2UiLCJkb2N1bWVudCIsImNyZWF0ZVJhbmdlIiwic2VsZWN0Tm9kZUNvbnRlbnRzIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJwcmV2ZW50RGVmYXVsdCIsInN1Y2Nlc3NmdWwiLCJnZXRBY2Nlc3NUb2tlbiIsImJ1dHRvblJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJHZW5lcmljVGV4dENvbnRleHRNZW51IiwiY2xvc2UiLCJDb250ZXh0TWVudSIsImNyZWF0ZU1lbnUiLCJtZXNzYWdlIiwiY2xvc2VDb3BpZWRUb29sdGlwIiwib25tb3VzZWxlYXZlIiwic3RhdGUiLCJhcHBWZXJzaW9uIiwiY2FuVXBkYXRlIiwiY29tcG9uZW50RGlkTW91bnQiLCJnZXRBcHBWZXJzaW9uIiwidmVyIiwic2V0U3RhdGUiLCJjYXRjaCIsImVycm9yIiwiY2FuU2VsZlVwZGF0ZSIsInYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbmRlckxlZ2FsIiwidG9jTGlua3MiLCJ0ZXJtc19hbmRfY29uZGl0aW9uc19saW5rcyIsImxlZ2FsTGlua3MiLCJ0b2NFbnRyeSIsInB1c2giLCJ1cmwiLCJ0ZXh0IiwicmVuZGVyQ3JlZGl0cyIsInJlbmRlciIsImJyYW5kIiwiZmFxVGV4dCIsInN1YiIsInN0YXJ0c1dpdGgiLCJvblN0YXJ0Qm90Q2hhdCIsIm9sbVZlcnNpb24iLCJ1cGRhdGVCdXR0b24iLCJidWdSZXBvcnRpbmdTZWN0aW9uIiwiYnVnX3JlcG9ydF9lbmRwb2ludF91cmwiLCJvbkJ1Z1JlcG9ydCIsImEiLCJLZXlib2FyZFNob3J0Y3V0cyIsInRvZ2dsZURpYWxvZyIsImdldEhvbWVzZXJ2ZXJVcmwiLCJnZXRJZGVudGl0eVNlcnZlclVybCIsIm9uQWNjZXNzVG9rZW5Db3B5Q2xpY2siLCJvbkNsZWFyQ2FjaGVBbmRSZWxvYWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0lBYXFCQSxtQixXQURwQixnREFBcUIsOENBQXJCLEMseUJBQUQsTUFDcUJBLG1CQURyQixTQUNpREMsZUFBTUM7QUFEdkQ7QUFDaUY7QUFHN0VDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtBQURlO0FBQUEsaUVBd0JjQyxDQUFELElBQU87QUFDbkMsVUFBSSxDQUFDQyxxQkFBWUMsR0FBWixFQUFMLEVBQXdCLE9BRFcsQ0FHbkM7QUFDQTs7QUFDQUMsTUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksOEJBQVo7O0FBQ0FDLHVDQUFnQkgsR0FBaEIsR0FBc0JJLFVBQXRCOztBQUNBRCx1Q0FBZ0JILEdBQWhCLEdBQXNCSyxLQUF0QixDQUE0QkMsYUFBNUIsR0FBNENDLElBQTVDLENBQWlELE1B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QkgsR0FBaEIsR0FBc0JrQyxjQUF0QixFQUFQLENBREosZUFFSSw2QkFBQyxnQ0FBRDtBQUNJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLE1BQUgsQ0FEWDtBQUVJLE1BQUEsT0FBTyxFQUFFLEtBQUsrQyxzQkFGbEI7QUFHSSxNQUFBLFNBQVMsRUFBQztBQUhkLE1BRkosQ0FKSixDQUpKLGVBZ0JjLHdDQWhCZCxlQWlCSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsb0JBQ0ksNkJBQUMseUJBQUQ7QUFBa0IsTUFBQSxPQUFPLEVBQUUsS0FBS0MscUJBQWhDO0FBQXVELE1BQUEsSUFBSSxFQUFDO0FBQTVELE9BQ0sseUJBQUcsd0JBQUgsQ0FETCxDQURKLENBakJKLENBRkosQ0F0QkosQ0FESjtBQW1ESDs7QUFyUjRFLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge190LCBnZXRDdXJyZW50TGFuZ3VhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IEFjY2Vzc2libGVUb29sdGlwQnV0dG9uIGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL0FjY2Vzc2libGVUb29sdGlwQnV0dG9uJztcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IGNyZWF0ZVJvb20gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NyZWF0ZVJvb21cIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCAqIGFzIHNkayBmcm9tIFwiLi4vLi4vLi4vLi4vLi5cIjtcbmltcG9ydCBQbGF0Zm9ybVBlZyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vUGxhdGZvcm1QZWdcIjtcbmltcG9ydCAqIGFzIEtleWJvYXJkU2hvcnRjdXRzIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5pbXBvcnQgVXBkYXRlQ2hlY2tCdXR0b24gZnJvbSBcIi4uLy4uL1VwZGF0ZUNoZWNrQnV0dG9uXCI7XG5pbXBvcnQgeyByZXBsYWNlYWJsZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgY29weVBsYWludGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgKiBhcyBDb250ZXh0TWVudSBmcm9tIFwiLi4vLi4vLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IHsgdG9SaWdodE9mIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgY2xvc2VTZXR0aW5nc0ZuOiAoKSA9PiB7fTtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgYXBwVmVyc2lvbjogc3RyaW5nO1xuICAgIGNhblVwZGF0ZTogYm9vbGVhbjtcbn1cblxuQHJlcGxhY2VhYmxlQ29tcG9uZW50KFwidmlld3Muc2V0dGluZ3MudGFicy51c2VyLkhlbHBVc2VyU2V0dGluZ3NUYWJcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlbHBVc2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcm90ZWN0ZWQgY2xvc2VDb3BpZWRUb29sdGlwOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhcHBWZXJzaW9uOiBudWxsLFxuICAgICAgICAgICAgY2FuVXBkYXRlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgUGxhdGZvcm1QZWcuZ2V0KCkuZ2V0QXBwVmVyc2lvbigpLnRoZW4oKHZlcikgPT4gdGhpcy5zZXRTdGF0ZSh7YXBwVmVyc2lvbjogdmVyfSkpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZ2V0dGluZyB2ZWN0b3IgdmVyc2lvbjogXCIsIGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgUGxhdGZvcm1QZWcuZ2V0KCkuY2FuU2VsZlVwZGF0ZSgpLnRoZW4oKHYpID0+IHRoaXMuc2V0U3RhdGUoe2NhblVwZGF0ZTogdn0pKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGdldHRpbmcgc2VsZiB1cGRhdGFiaWxpdHk6IFwiLCBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIC8vIGlmIHRoZSBDb3BpZWQgdG9vbHRpcCBpcyBvcGVuIHRoZW4gZ2V0IHJpZCBvZiBpdCwgdGhlcmUgYXJlIHdheXMgdG8gY2xvc2UgdGhlIG1vZGFsIHdoaWNoIHdvdWxkbid0IGNsb3NlXG4gICAgICAgIC8vIHRoZSB0b29sdGlwIG90aGVyd2lzZSwgc3VjaCBhcyBwcmVzc2luZyBFc2NhcGVcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VDb3BpZWRUb29sdGlwKSB0aGlzLmNsb3NlQ29waWVkVG9vbHRpcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbGVhckNhY2hlQW5kUmVsb2FkID0gKGUpID0+IHtcbiAgICAgICAgaWYgKCFQbGF0Zm9ybVBlZy5nZXQoKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIERldiBub3RlOiBwbGVhc2Uga2VlcCB0aGlzIGxvZyBsaW5lLCBpdCdzIHVzZWZ1bCB3aGVuIHRyb3VibGVzaG9vdGluZyBhIE1hdHJpeENsaWVudCBzdWRkZW5seVxuICAgICAgICAvLyBzdG9wcGluZyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsb2dzLlxuICAgICAgICBjb25zb2xlLmxvZyhcIkNsZWFyIGNhY2hlICYgcmVsb2FkIGNsaWNrZWRcIik7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5zdG9wQ2xpZW50KCk7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5zdG9yZS5kZWxldGVBbGxEYXRhKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBQbGF0Zm9ybVBlZy5nZXQoKS5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25CdWdSZXBvcnQgPSAoZSkgPT4ge1xuICAgICAgICBjb25zdCBCdWdSZXBvcnREaWFsb2cgPSBzZGsuZ2V0Q29tcG9uZW50KFwiZGlhbG9ncy5CdWdSZXBvcnREaWFsb2dcIik7XG4gICAgICAgIGlmICghQnVnUmVwb3J0RGlhbG9nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZygnQnVnIFJlcG9ydCBEaWFsb2cnLCAnJywgQnVnUmVwb3J0RGlhbG9nLCB7fSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25TdGFydEJvdENoYXQgPSAoZSkgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLmNsb3NlU2V0dGluZ3NGbigpO1xuICAgICAgICBjcmVhdGVSb29tKHtcbiAgICAgICAgICAgIGRtVXNlcklkOiBTZGtDb25maWcuZ2V0KCkud2VsY29tZVVzZXJJZCxcbiAgICAgICAgICAgIGFuZFZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNob3dTcG9pbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdGFyZ2V0LmlubmVySFRNTCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3BvaWxlcicpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRhcmdldCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVuZGVyTGVnYWwoKSB7XG4gICAgICAgIGNvbnN0IHRvY0xpbmtzID0gU2RrQ29uZmlnLmdldCgpLnRlcm1zX2FuZF9jb25kaXRpb25zX2xpbmtzO1xuICAgICAgICBpZiAoIXRvY0xpbmtzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBsZWdhbExpbmtzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdG9jRW50cnkgb2YgU2RrQ29uZmlnLmdldCgpLnRlcm1zX2FuZF9jb25kaXRpb25zX2xpbmtzKSB7XG4gICAgICAgICAgICBsZWdhbExpbmtzLnB1c2goPGRpdiBrZXk9e3RvY0VudHJ5LnVybH0+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj17dG9jRW50cnkudXJsfSByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3RvY0VudHJ5LnRleHR9PC9hPlxuICAgICAgICAgICAgPC9kaXY+KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc2VjdGlvbiBteF9IZWxwVXNlclNldHRpbmdzVGFiX3ZlcnNpb25zJz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3N1YmhlYWRpbmcnPntfdChcIkxlZ2FsXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc3Vic2VjdGlvblRleHQnPlxuICAgICAgICAgICAgICAgICAgICB7bGVnYWxMaW5rc31cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ3JlZGl0cygpIHtcbiAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBub3QgdHJhbnNsYXRlZCBiZWNhdXNlIGl0IGlzIGxlZ2FsIHRleHQuXG4gICAgICAgIC8vIEFsc28sICZuYnNwOyBpcyB1Z2x5IGJ1dCBuZWNlc3NhcnkuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc2VjdGlvbic+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdteF9TZXR0aW5nc1RhYl9zdWJoZWFkaW5nJz57X3QoXCJDcmVkaXRzXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSA8YSBocmVmPVwidGhlbWVzL2VsZW1lbnQvaW1nL2JhY2tncm91bmRzL2xha2UuanBnXCIgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+ZGVmYXVsdCBjb3ZlciBwaG90bzwvYT4gaXMgwqkmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL3d3dy5mbGlja3IuY29tL2dvbGFuXCIgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+SmVzw7pzIFJvbmNlcm88L2E+IHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC9cIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5DQy1CWS1TQSA0LjA8L2E+LlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGUgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9tYXRyaXgtb3JnL3R3ZW1vamktY29sclwiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPnR3ZW1vamktY29scjwvYT4gZm9udCBpcyDCqSZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vbW96aWxsYS5vcmdcIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5Nb3ppbGxhIEZvdW5kYXRpb248L2E+IHVzZWQgdW5kZXIgdGhlIHRlcm1zIG9mJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXCIgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+QXBhY2hlIDIuMDwvYT4uXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSA8YSBocmVmPVwiaHR0cHM6Ly90d2Vtb2ppLnR3aXR0ZXIuY29tL1wiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPlR3ZW1vamk8L2E+IGVtb2ppIGFydCBpcyDCqSZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vdHdlbW9qaS50d2l0dGVyLmNvbS9cIiByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5Ud2l0dGVyLCBJbmMgYW5kIG90aGVyIGNvbnRyaWJ1dG9yczwvYT4gdXNlZCB1bmRlciB0aGUgdGVybXMgb2YmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvNC4wL1wiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPkNDLUJZIDQuMDwvYT4uXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uQWNjZXNzVG9rZW5Db3B5Q2xpY2sgPSBhc3luYyAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0OyAvLyBjb3B5IHRhcmdldCBiZWZvcmUgd2UgZ28gYXN5bmMgYW5kIFJlYWN0IHRocm93cyBpdCBhd2F5XG5cbiAgICAgICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IGF3YWl0IGNvcHlQbGFpbnRleHQoTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldEFjY2Vzc1Rva2VuKCkpO1xuICAgICAgICBjb25zdCBidXR0b25SZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBHZW5lcmljVGV4dENvbnRleHRNZW51ID0gc2RrLmdldENvbXBvbmVudCgnY29udGV4dF9tZW51cy5HZW5lcmljVGV4dENvbnRleHRNZW51Jyk7XG4gICAgICAgIGNvbnN0IHtjbG9zZX0gPSBDb250ZXh0TWVudS5jcmVhdGVNZW51KEdlbmVyaWNUZXh0Q29udGV4dE1lbnUsIHtcbiAgICAgICAgICAgIC4uLnRvUmlnaHRPZihidXR0b25SZWN0LCAyKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN1Y2Nlc3NmdWwgPyBfdCgnQ29waWVkIScpIDogX3QoJ0ZhaWxlZCB0byBjb3B5JyksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQ29waWVkVG9vbHRpcCA9IHRhcmdldC5vbm1vdXNlbGVhdmUgPSBjbG9zZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gU2RrQ29uZmlnLmdldCgpLmJyYW5kO1xuXG4gICAgICAgIGxldCBmYXFUZXh0ID0gX3QoXG4gICAgICAgICAgICAnRm9yIGhlbHAgd2l0aCB1c2luZyAlKGJyYW5kKXMsIGNsaWNrIDxhPmhlcmU8L2E+LicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdhJzogKHN1YikgPT4gPGFcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vZWxlbWVudC5pby9oZWxwXCJcbiAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgIDwvYT4sXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBpZiAoU2RrQ29uZmlnLmdldCgpLndlbGNvbWVVc2VySWQgJiYgZ2V0Q3VycmVudExhbmd1YWdlKCkuc3RhcnRzV2l0aCgnZW4nKSkge1xuICAgICAgICAgICAgZmFxVGV4dCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yIGhlbHAgd2l0aCB1c2luZyAlKGJyYW5kKXMsIGNsaWNrIDxhPmhlcmU8L2E+IG9yIHN0YXJ0IGEgY2hhdCB3aXRoIG91ciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdib3QgdXNpbmcgdGhlIGJ1dHRvbiBiZWxvdy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSc6IChzdWIpID0+IDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2VsZW1lbnQuaW8vaGVscFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD0nbm9yZWZlcnJlciBub29wZW5lcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSdfYmxhbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gb25DbGljaz17dGhpcy5vblN0YXJ0Qm90Q2hhdH0ga2luZD0ncHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiQ2hhdCB3aXRoICUoYnJhbmQpcyBCb3RcIiwgeyBicmFuZCB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwVmVyc2lvbiA9IHRoaXMuc3RhdGUuYXBwVmVyc2lvbiB8fCAndW5rbm93bic7XG5cbiAgICAgICAgbGV0IG9sbVZlcnNpb24gPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCkub2xtVmVyc2lvbjtcbiAgICAgICAgb2xtVmVyc2lvbiA9IG9sbVZlcnNpb24gPyBgJHtvbG1WZXJzaW9uWzBdfS4ke29sbVZlcnNpb25bMV19LiR7b2xtVmVyc2lvblsyXX1gIDogJzxub3QtZW5hYmxlZD4nO1xuXG4gICAgICAgIGxldCB1cGRhdGVCdXR0b24gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5jYW5VcGRhdGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbiA9IDxVcGRhdGVDaGVja0J1dHRvbiAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidWdSZXBvcnRpbmdTZWN0aW9uO1xuICAgICAgICBpZiAoU2RrQ29uZmlnLmdldCgpLmJ1Z19yZXBvcnRfZW5kcG9pbnRfdXJsKSB7XG4gICAgICAgICAgICBidWdSZXBvcnRpbmdTZWN0aW9uID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU2V0dGluZ3NUYWJfc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3N1YmhlYWRpbmcnPntfdCgnQnVnIHJlcG9ydGluZycpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3N1YnNlY3Rpb25UZXh0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIHlvdSd2ZSBzdWJtaXR0ZWQgYSBidWcgdmlhIEdpdEh1YiwgZGVidWcgbG9ncyBjYW4gaGVscCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ1cyB0cmFjayBkb3duIHRoZSBwcm9ibGVtLiBEZWJ1ZyBsb2dzIGNvbnRhaW4gYXBwbGljYXRpb24gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidXNhZ2UgZGF0YSBpbmNsdWRpbmcgeW91ciB1c2VybmFtZSwgdGhlIElEcyBvciBhbGlhc2VzIG9mIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRoZSByb29tcyBvciBncm91cHMgeW91IGhhdmUgdmlzaXRlZCBhbmQgdGhlIHVzZXJuYW1lcyBvZiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvdGhlciB1c2Vycy4gVGhleSBkbyBub3QgY29udGFpbiBtZXNzYWdlcy5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfSGVscFVzZXJTZXR0aW5nc1RhYl9kZWJ1Z0J1dHRvbic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gb25DbGljaz17dGhpcy5vbkJ1Z1JlcG9ydH0ga2luZD0ncHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcIlN1Ym1pdCBkZWJ1ZyBsb2dzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVG8gcmVwb3J0IGEgTWF0cml4LXJlbGF0ZWQgc2VjdXJpdHkgaXNzdWUsIHBsZWFzZSByZWFkIHRoZSBNYXRyaXgub3JnIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxhPlNlY3VyaXR5IERpc2Nsb3N1cmUgUG9saWN5PC9hPi5cIiwge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiBzdWIgPT4gPGEgaHJlZj1cImh0dHBzOi8vbWF0cml4Lm9yZy9zZWN1cml0eS1kaXNjbG9zdXJlLXBvbGljeS9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57c3VifTwvYT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzVGFiIG14X0hlbHBVc2VyU2V0dGluZ3NUYWJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzVGFiX2hlYWRpbmdcIj57X3QoXCJIZWxwICYgQWJvdXRcIil9PC9kaXY+XG4gICAgICAgICAgICAgICAgeyBidWdSZXBvcnRpbmdTZWN0aW9uIH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc2VjdGlvbic+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc3ViaGVhZGluZyc+e190KFwiRkFRXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3N1YnNlY3Rpb25UZXh0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtmYXFUZXh0fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24ga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXtLZXlib2FyZFNob3J0Y3V0cy50b2dnbGVEaWFsb2d9PlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBfdChcIktleWJvYXJkIFNob3J0Y3V0c1wiKSB9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc2VjdGlvbiBteF9IZWxwVXNlclNldHRpbmdzVGFiX3ZlcnNpb25zJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdteF9TZXR0aW5nc1RhYl9zdWJoZWFkaW5nJz57X3QoXCJWZXJzaW9uc1wiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdteF9TZXR0aW5nc1RhYl9zdWJzZWN0aW9uVGV4dCc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCIlKGJyYW5kKXMgdmVyc2lvbjpcIiwgeyBicmFuZCB9KX0ge2FwcFZlcnNpb259PGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJvbG0gdmVyc2lvbjpcIil9IHtvbG1WZXJzaW9ufTxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAge3VwZGF0ZUJ1dHRvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyTGVnYWwoKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJDcmVkaXRzKCl9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3NlY3Rpb24gbXhfSGVscFVzZXJTZXR0aW5nc1RhYl92ZXJzaW9ucyc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc3ViaGVhZGluZyc+e190KFwiQWR2YW5jZWRcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfU2V0dGluZ3NUYWJfc3Vic2VjdGlvblRleHQnPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiSG9tZXNlcnZlciBpc1wiKX0gPGNvZGU+e01hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRIb21lc2VydmVyVXJsKCl9PC9jb2RlPjxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiSWRlbnRpdHkgU2VydmVyIGlzXCIpfSA8Y29kZT57TWF0cml4Q2xpZW50UGVnLmdldCgpLmdldElkZW50aXR5U2VydmVyVXJsKCl9PC9jb2RlPjxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT57X3QoXCJBY2Nlc3MgVG9rZW5cIil9PC9zdW1tYXJ5PjxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPntfdChcIllvdXIgYWNjZXNzIHRva2VuIGdpdmVzIGZ1bGwgYWNjZXNzIHRvIHlvdXIgYWNjb3VudC5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXCIgRG8gbm90IHNoYXJlIGl0IHdpdGggYW55b25lLlwiICl9PC9iPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfSGVscFVzZXJTZXR0aW5nc1RhYl9hY2Nlc3NUb2tlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT57TWF0cml4Q2xpZW50UGVnLmdldCgpLmdldEFjY2Vzc1Rva2VuKCl9PC9jb2RlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcIkNvcHlcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uQWNjZXNzVG9rZW5Db3B5Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9IZWxwVXNlclNldHRpbmdzVGFiX2FjY2Vzc1Rva2VuX2NvcHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPjxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J214X0hlbHBVc2VyU2V0dGluZ3NUYWJfZGVidWdCdXR0b24nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25DbGVhckNhY2hlQW5kUmVsb2FkfSBraW5kPSdkYW5nZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJDbGVhciBjYWNoZSBhbmQgcmVsb2FkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==