matrix-react-sdk
Version:
SDK for matrix.org using React
277 lines (273 loc) • 61.1 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 _languageHandler = require("../../../../../languageHandler");
var _SettingsStore = _interopRequireDefault(require("../../../../../settings/SettingsStore"));
var _Field = _interopRequireDefault(require("../../../elements/Field"));
var _Dropdown = _interopRequireDefault(require("../../../elements/Dropdown"));
var _SettingLevel = require("../../../../../settings/SettingLevel");
var _SettingsFlag = _interopRequireDefault(require("../../../elements/SettingsFlag"));
var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton"));
var _dispatcher = _interopRequireDefault(require("../../../../../dispatcher/dispatcher"));
var _UserTab = require("../../../dialogs/UserTab");
var _actions = require("../../../../../dispatcher/actions");
var _SdkConfig = _interopRequireDefault(require("../../../../../SdkConfig"));
var _UserOnboardingPage = require("../../../user-onboarding/UserOnboardingPage");
var _SettingsSubsection = _interopRequireDefault(require("../../shared/SettingsSubsection"));
var _SettingsTab = _interopRequireDefault(require("../SettingsTab"));
var _SettingsSection = require("../../shared/SettingsSection");
var _LanguageDropdown = _interopRequireDefault(require("../../../elements/LanguageDropdown"));
var _PlatformPeg = _interopRequireDefault(require("../../../../../PlatformPeg"));
var _Keyboard = require("../../../../../Keyboard");
var _SpellCheckSettings = _interopRequireDefault(require("../../SpellCheckSettings"));
var _LabelledToggleSwitch = _interopRequireDefault(require("../../../elements/LabelledToggleSwitch"));
var TimezoneHandler = _interopRequireWildcard(require("../../../../../TimezoneHandler"));
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 2019-2023 The Matrix.org Foundation C.I.C.
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const LanguageSection = () => {
const [language, setLanguage] = (0, _react.useState)((0, _languageHandler.getCurrentLanguage)());
const onLanguageChange = (0, _react.useCallback)(newLanguage => {
if (language === newLanguage) return;
_SettingsStore.default.setValue("language", null, _SettingLevel.SettingLevel.DEVICE, newLanguage);
setLanguage(newLanguage);
const platform = _PlatformPeg.default.get();
if (platform) {
platform.setLanguage([newLanguage]);
platform.reload();
}
}, [language]);
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsSubsection_dropdown"
}, (0, _languageHandler._t)("settings|general|application_language"), /*#__PURE__*/_react.default.createElement(_LanguageDropdown.default, {
onOptionChange: onLanguageChange,
value: language
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PreferencesUserSettingsTab_section_hint"
}, (0, _languageHandler._t)("settings|general|application_language_reload_hint")));
};
const SpellCheckSection = () => {
const [spellCheckEnabled, setSpellCheckEnabled] = (0, _react.useState)();
const [spellCheckLanguages, setSpellCheckLanguages] = (0, _react.useState)();
(0, _react.useEffect)(() => {
(async () => {
const plaf = _PlatformPeg.default.get();
const [enabled, langs] = await Promise.all([plaf?.getSpellCheckEnabled(), plaf?.getSpellCheckLanguages()]);
setSpellCheckEnabled(enabled);
setSpellCheckLanguages(langs || undefined);
})();
}, []);
const onSpellCheckEnabledChange = (0, _react.useCallback)(enabled => {
setSpellCheckEnabled(enabled);
_PlatformPeg.default.get()?.setSpellCheckEnabled(enabled);
}, []);
const onSpellCheckLanguagesChange = (0, _react.useCallback)(languages => {
setSpellCheckLanguages(languages);
_PlatformPeg.default.get()?.setSpellCheckLanguages(languages);
}, []);
if (!_PlatformPeg.default.get()?.supportsSpellCheckSettings()) return null;
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, {
label: (0, _languageHandler._t)("settings|general|allow_spellcheck"),
value: Boolean(spellCheckEnabled),
onChange: onSpellCheckEnabledChange
}), spellCheckEnabled && spellCheckLanguages !== undefined && !_Keyboard.IS_MAC && /*#__PURE__*/_react.default.createElement(_SpellCheckSettings.default, {
languages: spellCheckLanguages,
onLanguagesChange: onSpellCheckLanguagesChange
}));
};
class PreferencesUserSettingsTab extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "onTimezoneChange", tz => {
this.setState({
timezone: tz
});
TimezoneHandler.setUserTimezone(tz);
});
/**
* If present filter the time zones matching the search term
*/
(0, _defineProperty2.default)(this, "onTimezoneSearchChange", search => {
const timezoneSearch = search.toLowerCase();
const timezones = timezoneSearch ? TimezoneHandler.getAllTimezones().filter(tz => {
return tz.toLowerCase().includes(timezoneSearch);
}) : TimezoneHandler.getAllTimezones();
this.setState({
timezones,
timezoneSearch
});
});
(0, _defineProperty2.default)(this, "onAutocompleteDelayChange", e => {
this.setState({
autocompleteDelay: e.target.value
});
_SettingsStore.default.setValue("autocompleteDelay", null, _SettingLevel.SettingLevel.DEVICE, e.target.value);
});
(0, _defineProperty2.default)(this, "onReadMarkerInViewThresholdMs", e => {
this.setState({
readMarkerInViewThresholdMs: e.target.value
});
_SettingsStore.default.setValue("readMarkerInViewThresholdMs", null, _SettingLevel.SettingLevel.DEVICE, e.target.value);
});
(0, _defineProperty2.default)(this, "onReadMarkerOutOfViewThresholdMs", e => {
this.setState({
readMarkerOutOfViewThresholdMs: e.target.value
});
_SettingsStore.default.setValue("readMarkerOutOfViewThresholdMs", null, _SettingLevel.SettingLevel.DEVICE, e.target.value);
});
(0, _defineProperty2.default)(this, "onKeyboardShortcutsClicked", () => {
_dispatcher.default.dispatch({
action: _actions.Action.ViewUserSettings,
initialTabId: _UserTab.UserTab.Keyboard
});
});
this.state = {
timezone: TimezoneHandler.getUserTimezone(),
timezones: TimezoneHandler.getAllTimezones(),
timezoneSearch: undefined,
autocompleteDelay: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "autocompleteDelay").toString(10),
readMarkerInViewThresholdMs: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "readMarkerInViewThresholdMs").toString(10),
readMarkerOutOfViewThresholdMs: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "readMarkerOutOfViewThresholdMs").toString(10)
};
}
renderGroup(settingIds, level = _SettingLevel.SettingLevel.ACCOUNT) {
return settingIds.map(i => /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
key: i,
name: i,
level: level
}));
}
render() {
const useCase = _SettingsStore.default.getValue("FTUE.useCaseSelection");
const roomListSettings = PreferencesUserSettingsTab.ROOM_LIST_SETTINGS
// Only show the user onboarding setting if the user should see the user onboarding page
.filter(it => it !== "FTUE.userOnboardingButton" || (0, _UserOnboardingPage.showUserOnboardingPage)(useCase));
const browserTimezoneLabel = (0, _languageHandler._t)("settings|preferences|default_timezone", {
timezone: TimezoneHandler.shortBrowserTimezone()
});
// Always Preprend the default option
const timezones = this.state.timezones.map(tz => {
return /*#__PURE__*/_react.default.createElement("div", {
key: tz
}, tz);
});
timezones.unshift( /*#__PURE__*/_react.default.createElement("div", {
key: ""
}, browserTimezoneLabel));
return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, {
"data-testid": "mx_PreferencesUserSettingsTab"
}, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|general|language_section")
}, /*#__PURE__*/_react.default.createElement(LanguageSection, null), /*#__PURE__*/_react.default.createElement(SpellCheckSection, null)), roomListSettings.length > 0 && /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|room_list_heading")
}, this.renderGroup(roomListSettings)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("common|spaces")
}, this.renderGroup(PreferencesUserSettingsTab.SPACES_SETTINGS, _SettingLevel.SettingLevel.ACCOUNT)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|keyboard_heading"),
description: (0, _languageHandler._t)("settings|preferences|keyboard_view_shortcuts_button", {}, {
a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "link_inline",
onClick: this.onKeyboardShortcutsClicked
}, sub)
})
}, this.renderGroup(PreferencesUserSettingsTab.KEYBINDINGS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|time_heading")
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsSubsection_dropdown"
}, (0, _languageHandler._t)("settings|preferences|user_timezone"), /*#__PURE__*/_react.default.createElement(_Dropdown.default, {
id: "mx_dropdownUserTimezone",
className: "mx_dropdownUserTimezone",
"data-testid": "mx_dropdownUserTimezone",
searchEnabled: true,
value: this.state.timezone,
label: (0, _languageHandler._t)("settings|preferences|user_timezone"),
placeholder: browserTimezoneLabel,
onOptionChange: this.onTimezoneChange,
onSearchChange: this.onTimezoneSearchChange
}, timezones)), this.renderGroup(PreferencesUserSettingsTab.TIME_SETTINGS), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "userTimezonePublish",
level: _SettingLevel.SettingLevel.DEVICE
})), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("common|presence"),
description: (0, _languageHandler._t)("settings|preferences|presence_description")
}, this.renderGroup(PreferencesUserSettingsTab.PRESENCE_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|composer_heading")
}, this.renderGroup(PreferencesUserSettingsTab.COMPOSER_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|code_blocks_heading")
}, this.renderGroup(PreferencesUserSettingsTab.CODE_BLOCKS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|media_heading")
}, this.renderGroup(PreferencesUserSettingsTab.IMAGES_AND_VIDEOS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("common|timeline")
}, this.renderGroup(PreferencesUserSettingsTab.TIMELINE_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("settings|preferences|room_directory_heading")
}, this.renderGroup(PreferencesUserSettingsTab.ROOM_DIRECTORY_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, {
heading: (0, _languageHandler._t)("common|general"),
stretchContent: true
}, this.renderGroup(PreferencesUserSettingsTab.GENERAL_SETTINGS), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Electron.showTrayIcon",
level: _SettingLevel.SettingLevel.PLATFORM,
hideIfCannotSet: true
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Electron.enableHardwareAcceleration",
level: _SettingLevel.SettingLevel.PLATFORM,
hideIfCannotSet: true,
label: (0, _languageHandler._t)("settings|preferences|Electron.enableHardwareAcceleration", {
appName: _SdkConfig.default.get().brand
})
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Electron.alwaysShowMenuBar",
level: _SettingLevel.SettingLevel.PLATFORM,
hideIfCannotSet: true
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Electron.autoLaunch",
level: _SettingLevel.SettingLevel.PLATFORM,
hideIfCannotSet: true
}), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, {
name: "Electron.warnBeforeExit",
level: _SettingLevel.SettingLevel.PLATFORM,
hideIfCannotSet: true
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
label: (0, _languageHandler._t)("settings|preferences|autocomplete_delay"),
type: "number",
value: this.state.autocompleteDelay,
onChange: this.onAutocompleteDelayChange
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
label: (0, _languageHandler._t)("settings|preferences|rm_lifetime"),
type: "number",
value: this.state.readMarkerInViewThresholdMs,
onChange: this.onReadMarkerInViewThresholdMs
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
label: (0, _languageHandler._t)("settings|preferences|rm_lifetime_offscreen"),
type: "number",
value: this.state.readMarkerOutOfViewThresholdMs,
onChange: this.onReadMarkerOutOfViewThresholdMs
}))));
}
}
exports.default = PreferencesUserSettingsTab;
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "ROOM_LIST_SETTINGS", ["breadcrumbs", "FTUE.userOnboardingButton"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "SPACES_SETTINGS", ["Spaces.allRoomsInHome"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "KEYBINDINGS_SETTINGS", ["ctrlFForSearch"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "PRESENCE_SETTINGS", ["sendReadReceipts", "sendTypingNotifications"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "COMPOSER_SETTINGS", ["MessageComposerInput.autoReplaceEmoji", "MessageComposerInput.useMarkdown", "MessageComposerInput.suggestEmoji", "MessageComposerInput.ctrlEnterToSend", "MessageComposerInput.surroundWith", "MessageComposerInput.showStickersButton", "MessageComposerInput.insertTrailingColon"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "TIME_SETTINGS", ["showTwelveHourTimestamps", "alwaysShowTimestamps"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "CODE_BLOCKS_SETTINGS", ["enableSyntaxHighlightLanguageDetection", "expandCodeByDefault", "showCodeLineNumbers"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "IMAGES_AND_VIDEOS_SETTINGS", ["urlPreviewsEnabled", "autoplayGifs", "autoplayVideo", "showImages"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "TIMELINE_SETTINGS", ["showTypingNotifications", "showRedactions", "showReadReceipts", "showJoinLeaves", "showDisplaynameChanges", "showChatEffects", "showAvatarChanges", "Pill.shouldShowPillAvatar", "TextualBody.enableBigEmoji", "scrollToBottomOnMessageSent", "useOnlyCurrentProfiles"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "ROOM_DIRECTORY_SETTINGS", ["SpotlightSearch.showNsfwPublicRooms"]);
(0, _defineProperty2.default)(PreferencesUserSettingsTab, "GENERAL_SETTINGS", ["promptBeforeInviteUnknownUsers"
// Start automatically after startup (electron-only)
// Autocomplete delay (niche text box)
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1NldHRpbmdzU3RvcmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0ZpZWxkIiwiX0Ryb3Bkb3duIiwiX1NldHRpbmdMZXZlbCIsIl9TZXR0aW5nc0ZsYWciLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9kaXNwYXRjaGVyIiwiX1VzZXJUYWIiLCJfYWN0aW9ucyIsIl9TZGtDb25maWciLCJfVXNlck9uYm9hcmRpbmdQYWdlIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9TZXR0aW5nc1RhYiIsIl9TZXR0aW5nc1NlY3Rpb24iLCJfTGFuZ3VhZ2VEcm9wZG93biIsIl9QbGF0Zm9ybVBlZyIsIl9LZXlib2FyZCIsIl9TcGVsbENoZWNrU2V0dGluZ3MiLCJfTGFiZWxsZWRUb2dnbGVTd2l0Y2giLCJUaW1lem9uZUhhbmRsZXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJMYW5ndWFnZVNlY3Rpb24iLCJsYW5ndWFnZSIsInNldExhbmd1YWdlIiwidXNlU3RhdGUiLCJnZXRDdXJyZW50TGFuZ3VhZ2UiLCJvbkxhbmd1YWdlQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJuZXdMYW5ndWFnZSIsIlNldHRpbmdzU3RvcmUiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsInBsYXRmb3JtIiwiUGxhdGZvcm1QZWciLCJyZWxvYWQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiX3QiLCJvbk9wdGlvbkNoYW5nZSIsInZhbHVlIiwiU3BlbGxDaGVja1NlY3Rpb24iLCJzcGVsbENoZWNrRW5hYmxlZCIsInNldFNwZWxsQ2hlY2tFbmFibGVkIiwic3BlbGxDaGVja0xhbmd1YWdlcyIsInNldFNwZWxsQ2hlY2tMYW5ndWFnZXMiLCJ1c2VFZmZlY3QiLCJwbGFmIiwiZW5hYmxlZCIsImxhbmdzIiwiUHJvbWlzZSIsImFsbCIsImdldFNwZWxsQ2hlY2tFbmFibGVkIiwiZ2V0U3BlbGxDaGVja0xhbmd1YWdlcyIsInVuZGVmaW5lZCIsIm9uU3BlbGxDaGVja0VuYWJsZWRDaGFuZ2UiLCJvblNwZWxsQ2hlY2tMYW5ndWFnZXNDaGFuZ2UiLCJsYW5ndWFnZXMiLCJzdXBwb3J0c1NwZWxsQ2hlY2tTZXR0aW5ncyIsIkZyYWdtZW50IiwibGFiZWwiLCJCb29sZWFuIiwib25DaGFuZ2UiLCJJU19NQUMiLCJvbkxhbmd1YWdlc0NoYW5nZSIsIlByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsInR6Iiwic2V0U3RhdGUiLCJ0aW1lem9uZSIsInNldFVzZXJUaW1lem9uZSIsInNlYXJjaCIsInRpbWV6b25lU2VhcmNoIiwidG9Mb3dlckNhc2UiLCJ0aW1lem9uZXMiLCJnZXRBbGxUaW1lem9uZXMiLCJmaWx0ZXIiLCJpbmNsdWRlcyIsImF1dG9jb21wbGV0ZURlbGF5IiwidGFyZ2V0IiwicmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zIiwicmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3VXNlclNldHRpbmdzIiwiaW5pdGlhbFRhYklkIiwiVXNlclRhYiIsIktleWJvYXJkIiwic3RhdGUiLCJnZXRVc2VyVGltZXpvbmUiLCJnZXRWYWx1ZUF0IiwidG9TdHJpbmciLCJyZW5kZXJHcm91cCIsInNldHRpbmdJZHMiLCJsZXZlbCIsIkFDQ09VTlQiLCJtYXAiLCJrZXkiLCJuYW1lIiwicmVuZGVyIiwidXNlQ2FzZSIsImdldFZhbHVlIiwicm9vbUxpc3RTZXR0aW5ncyIsIlJPT01fTElTVF9TRVRUSU5HUyIsIml0Iiwic2hvd1VzZXJPbmJvYXJkaW5nUGFnZSIsImJyb3dzZXJUaW1lem9uZUxhYmVsIiwic2hvcnRCcm93c2VyVGltZXpvbmUiLCJ1bnNoaWZ0IiwiU2V0dGluZ3NTZWN0aW9uIiwiaGVhZGluZyIsImxlbmd0aCIsIlNQQUNFU19TRVRUSU5HUyIsImRlc2NyaXB0aW9uIiwic3ViIiwia2luZCIsIm9uQ2xpY2siLCJvbktleWJvYXJkU2hvcnRjdXRzQ2xpY2tlZCIsIktFWUJJTkRJTkdTX1NFVFRJTkdTIiwiaWQiLCJzZWFyY2hFbmFibGVkIiwicGxhY2Vob2xkZXIiLCJvblRpbWV6b25lQ2hhbmdlIiwib25TZWFyY2hDaGFuZ2UiLCJvblRpbWV6b25lU2VhcmNoQ2hhbmdlIiwiVElNRV9TRVRUSU5HUyIsIlBSRVNFTkNFX1NFVFRJTkdTIiwiQ09NUE9TRVJfU0VUVElOR1MiLCJDT0RFX0JMT0NLU19TRVRUSU5HUyIsIklNQUdFU19BTkRfVklERU9TX1NFVFRJTkdTIiwiVElNRUxJTkVfU0VUVElOR1MiLCJST09NX0RJUkVDVE9SWV9TRVRUSU5HUyIsInN0cmV0Y2hDb250ZW50IiwiR0VORVJBTF9TRVRUSU5HUyIsIlBMQVRGT1JNIiwiaGlkZUlmQ2Fubm90U2V0IiwiYXBwTmFtZSIsIlNka0NvbmZpZyIsImJyYW5kIiwidHlwZSIsIm9uQXV0b2NvbXBsZXRlRGVsYXlDaGFuZ2UiLCJvblJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNcyIsIm9uUmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL3RhYnMvdXNlci9QcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBSZWFjdEVsZW1lbnQsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IE5vbkVtcHR5QXJyYXkgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vQHR5cGVzL2NvbW1vblwiO1xuaW1wb3J0IHsgX3QsIGdldEN1cnJlbnRMYW5ndWFnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IFVzZUNhc2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvZW51bXMvVXNlQ2FzZVwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvRmllbGRcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvRHJvcGRvd25cIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBTZXR0aW5nc0ZsYWcgZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL1NldHRpbmdzRmxhZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgVXNlclRhYiB9IGZyb20gXCIuLi8uLi8uLi9kaWFsb2dzL1VzZXJUYWJcIjtcbmltcG9ydCB7IE9wZW5Ub1RhYlBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9PcGVuVG9UYWJQYXlsb2FkXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9TZGtDb25maWdcIjtcbmltcG9ydCB7IHNob3dVc2VyT25ib2FyZGluZ1BhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXNlci1vbmJvYXJkaW5nL1VzZXJPbmJvYXJkaW5nUGFnZVwiO1xuaW1wb3J0IFNldHRpbmdzU3Vic2VjdGlvbiBmcm9tIFwiLi4vLi4vc2hhcmVkL1NldHRpbmdzU3Vic2VjdGlvblwiO1xuaW1wb3J0IFNldHRpbmdzVGFiIGZyb20gXCIuLi9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBMYW5ndWFnZURyb3Bkb3duIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9MYW5ndWFnZURyb3Bkb3duXCI7XG5pbXBvcnQgUGxhdGZvcm1QZWcgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1BsYXRmb3JtUGVnXCI7XG5pbXBvcnQgeyBJU19NQUMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vS2V5Ym9hcmRcIjtcbmltcG9ydCBTcGVsbENoZWNrU2V0dGluZ3MgZnJvbSBcIi4uLy4uL1NwZWxsQ2hlY2tTZXR0aW5nc1wiO1xuaW1wb3J0IExhYmVsbGVkVG9nZ2xlU3dpdGNoIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9MYWJlbGxlZFRvZ2dsZVN3aXRjaFwiO1xuaW1wb3J0ICogYXMgVGltZXpvbmVIYW5kbGVyIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9UaW1lem9uZUhhbmRsZXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgY2xvc2VTZXR0aW5nc0ZuKHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICB0aW1lem9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRpbWV6b25lczogc3RyaW5nW107XG4gICAgdGltZXpvbmVTZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhdXRvY29tcGxldGVEZWxheTogc3RyaW5nO1xuICAgIHJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNczogc3RyaW5nO1xuICAgIHJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNczogc3RyaW5nO1xufVxuXG5jb25zdCBMYW5ndWFnZVNlY3Rpb246IFJlYWN0LkZDID0gKCkgPT4ge1xuICAgIGNvbnN0IFtsYW5ndWFnZSwgc2V0TGFuZ3VhZ2VdID0gdXNlU3RhdGUoZ2V0Q3VycmVudExhbmd1YWdlKCkpO1xuXG4gICAgY29uc3Qgb25MYW5ndWFnZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAobmV3TGFuZ3VhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09PSBuZXdMYW5ndWFnZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibGFuZ3VhZ2VcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgbmV3TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm0gPSBQbGF0Zm9ybVBlZy5nZXQoKTtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSkge1xuICAgICAgICAgICAgICAgIHBsYXRmb3JtLnNldExhbmd1YWdlKFtuZXdMYW5ndWFnZV0pO1xuICAgICAgICAgICAgICAgIHBsYXRmb3JtLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbbGFuZ3VhZ2VdLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzU3Vic2VjdGlvbl9kcm9wZG93blwiPlxuICAgICAgICAgICAge190KFwic2V0dGluZ3N8Z2VuZXJhbHxhcHBsaWNhdGlvbl9sYW5ndWFnZVwiKX1cbiAgICAgICAgICAgIDxMYW5ndWFnZURyb3Bkb3duIG9uT3B0aW9uQ2hhbmdlPXtvbkxhbmd1YWdlQ2hhbmdlfSB2YWx1ZT17bGFuZ3VhZ2V9IC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiX3NlY3Rpb25faGludFwiPlxuICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfGdlbmVyYWx8YXBwbGljYXRpb25fbGFuZ3VhZ2VfcmVsb2FkX2hpbnRcIil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmNvbnN0IFNwZWxsQ2hlY2tTZWN0aW9uOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBbc3BlbGxDaGVja0VuYWJsZWQsIHNldFNwZWxsQ2hlY2tFbmFibGVkXSA9IHVzZVN0YXRlPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCk7XG4gICAgY29uc3QgW3NwZWxsQ2hlY2tMYW5ndWFnZXMsIHNldFNwZWxsQ2hlY2tMYW5ndWFnZXNdID0gdXNlU3RhdGU8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhZiA9IFBsYXRmb3JtUGVnLmdldCgpO1xuICAgICAgICAgICAgY29uc3QgW2VuYWJsZWQsIGxhbmdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwbGFmPy5nZXRTcGVsbENoZWNrRW5hYmxlZCgpLCBwbGFmPy5nZXRTcGVsbENoZWNrTGFuZ3VhZ2VzKCldKTtcblxuICAgICAgICAgICAgc2V0U3BlbGxDaGVja0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICAgICAgICBzZXRTcGVsbENoZWNrTGFuZ3VhZ2VzKGxhbmdzIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25TcGVsbENoZWNrRW5hYmxlZENoYW5nZSA9IHVzZUNhbGxiYWNrKChlbmFibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHNldFNwZWxsQ2hlY2tFbmFibGVkKGVuYWJsZWQpO1xuICAgICAgICBQbGF0Zm9ybVBlZy5nZXQoKT8uc2V0U3BlbGxDaGVja0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25TcGVsbENoZWNrTGFuZ3VhZ2VzQ2hhbmdlID0gdXNlQ2FsbGJhY2soKGxhbmd1YWdlczogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgICAgICAgc2V0U3BlbGxDaGVja0xhbmd1YWdlcyhsYW5ndWFnZXMpO1xuICAgICAgICBQbGF0Zm9ybVBlZy5nZXQoKT8uc2V0U3BlbGxDaGVja0xhbmd1YWdlcyhsYW5ndWFnZXMpO1xuICAgIH0sIFtdKTtcblxuICAgIGlmICghUGxhdGZvcm1QZWcuZ2V0KCk/LnN1cHBvcnRzU3BlbGxDaGVja1NldHRpbmdzKCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfGdlbmVyYWx8YWxsb3dfc3BlbGxjaGVja1wiKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Qm9vbGVhbihzcGVsbENoZWNrRW5hYmxlZCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uU3BlbGxDaGVja0VuYWJsZWRDaGFuZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3NwZWxsQ2hlY2tFbmFibGVkICYmIHNwZWxsQ2hlY2tMYW5ndWFnZXMgIT09IHVuZGVmaW5lZCAmJiAhSVNfTUFDICYmIChcbiAgICAgICAgICAgICAgICA8U3BlbGxDaGVja1NldHRpbmdzIGxhbmd1YWdlcz17c3BlbGxDaGVja0xhbmd1YWdlc30gb25MYW5ndWFnZXNDaGFuZ2U9e29uU3BlbGxDaGVja0xhbmd1YWdlc0NoYW5nZX0gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgc3RhdGljIFJPT01fTElTVF9TRVRUSU5HUyA9IFtcImJyZWFkY3J1bWJzXCIsIFwiRlRVRS51c2VyT25ib2FyZGluZ0J1dHRvblwiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIFNQQUNFU19TRVRUSU5HUyA9IFtcIlNwYWNlcy5hbGxSb29tc0luSG9tZVwiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIEtFWUJJTkRJTkdTX1NFVFRJTkdTID0gW1wiY3RybEZGb3JTZWFyY2hcIl07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBQUkVTRU5DRV9TRVRUSU5HUyA9IFtcInNlbmRSZWFkUmVjZWlwdHNcIiwgXCJzZW5kVHlwaW5nTm90aWZpY2F0aW9uc1wiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIENPTVBPU0VSX1NFVFRJTkdTID0gW1xuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LmF1dG9SZXBsYWNlRW1vamlcIixcbiAgICAgICAgXCJNZXNzYWdlQ29tcG9zZXJJbnB1dC51c2VNYXJrZG93blwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnN1Z2dlc3RFbW9qaVwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LmN0cmxFbnRlclRvU2VuZFwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnN1cnJvdW5kV2l0aFwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnNob3dTdGlja2Vyc0J1dHRvblwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0Lmluc2VydFRyYWlsaW5nQ29sb25cIixcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgVElNRV9TRVRUSU5HUyA9IFtcInNob3dUd2VsdmVIb3VyVGltZXN0YW1wc1wiLCBcImFsd2F5c1Nob3dUaW1lc3RhbXBzXCJdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgQ09ERV9CTE9DS1NfU0VUVElOR1MgPSBbXG4gICAgICAgIFwiZW5hYmxlU3ludGF4SGlnaGxpZ2h0TGFuZ3VhZ2VEZXRlY3Rpb25cIixcbiAgICAgICAgXCJleHBhbmRDb2RlQnlEZWZhdWx0XCIsXG4gICAgICAgIFwic2hvd0NvZGVMaW5lTnVtYmVyc1wiLFxuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBJTUFHRVNfQU5EX1ZJREVPU19TRVRUSU5HUyA9IFtcInVybFByZXZpZXdzRW5hYmxlZFwiLCBcImF1dG9wbGF5R2lmc1wiLCBcImF1dG9wbGF5VmlkZW9cIiwgXCJzaG93SW1hZ2VzXCJdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgVElNRUxJTkVfU0VUVElOR1MgPSBbXG4gICAgICAgIFwic2hvd1R5cGluZ05vdGlmaWNhdGlvbnNcIixcbiAgICAgICAgXCJzaG93UmVkYWN0aW9uc1wiLFxuICAgICAgICBcInNob3dSZWFkUmVjZWlwdHNcIixcbiAgICAgICAgXCJzaG93Sm9pbkxlYXZlc1wiLFxuICAgICAgICBcInNob3dEaXNwbGF5bmFtZUNoYW5nZXNcIixcbiAgICAgICAgXCJzaG93Q2hhdEVmZmVjdHNcIixcbiAgICAgICAgXCJzaG93QXZhdGFyQ2hhbmdlc1wiLFxuICAgICAgICBcIlBpbGwuc2hvdWxkU2hvd1BpbGxBdmF0YXJcIixcbiAgICAgICAgXCJUZXh0dWFsQm9keS5lbmFibGVCaWdFbW9qaVwiLFxuICAgICAgICBcInNjcm9sbFRvQm90dG9tT25NZXNzYWdlU2VudFwiLFxuICAgICAgICBcInVzZU9ubHlDdXJyZW50UHJvZmlsZXNcIixcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgUk9PTV9ESVJFQ1RPUllfU0VUVElOR1MgPSBbXCJTcG90bGlnaHRTZWFyY2guc2hvd05zZndQdWJsaWNSb29tc1wiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIEdFTkVSQUxfU0VUVElOR1MgPSBbXG4gICAgICAgIFwicHJvbXB0QmVmb3JlSW52aXRlVW5rbm93blVzZXJzXCIsXG4gICAgICAgIC8vIFN0YXJ0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnR1cCAoZWxlY3Ryb24tb25seSlcbiAgICAgICAgLy8gQXV0b2NvbXBsZXRlIGRlbGF5IChuaWNoZSB0ZXh0IGJveClcbiAgICBdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aW1lem9uZTogVGltZXpvbmVIYW5kbGVyLmdldFVzZXJUaW1lem9uZSgpLFxuICAgICAgICAgICAgdGltZXpvbmVzOiBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCksXG4gICAgICAgICAgICB0aW1lem9uZVNlYXJjaDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlRGVsYXk6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWVBdChTZXR0aW5nTGV2ZWwuREVWSUNFLCBcImF1dG9jb21wbGV0ZURlbGF5XCIpLnRvU3RyaW5nKDEwKSxcbiAgICAgICAgICAgIHJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNczogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZUF0KFxuICAgICAgICAgICAgICAgIFNldHRpbmdMZXZlbC5ERVZJQ0UsXG4gICAgICAgICAgICAgICAgXCJyZWFkTWFya2VySW5WaWV3VGhyZXNob2xkTXNcIixcbiAgICAgICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICAgICAgcmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoXG4gICAgICAgICAgICAgICAgU2V0dGluZ0xldmVsLkRFVklDRSxcbiAgICAgICAgICAgICAgICBcInJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNc1wiLFxuICAgICAgICAgICAgKS50b1N0cmluZygxMCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRpbWV6b25lQ2hhbmdlID0gKHR6OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRpbWV6b25lOiB0eiB9KTtcbiAgICAgICAgVGltZXpvbmVIYW5kbGVyLnNldFVzZXJUaW1lem9uZSh0eik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQgZmlsdGVyIHRoZSB0aW1lIHpvbmVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggdGVybVxuICAgICAqL1xuICAgIHByaXZhdGUgb25UaW1lem9uZVNlYXJjaENoYW5nZSA9IChzZWFyY2g6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB0aW1lem9uZVNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1lem9uZXMgPSB0aW1lem9uZVNlYXJjaFxuICAgICAgICAgICAgPyBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCkuZmlsdGVyKCh0eikgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHR6LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGltZXpvbmVTZWFyY2gpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRpbWV6b25lcywgdGltZXpvbmVTZWFyY2ggfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BdXRvY29tcGxldGVEZWxheUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgYXV0b2NvbXBsZXRlRGVsYXk6IGUudGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwiYXV0b2NvbXBsZXRlRGVsYXlcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyByZWFkTWFya2VySW5WaWV3VGhyZXNob2xkTXM6IGUudGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwicmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zXCIsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNcyA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgcmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zOiBlLnRhcmdldC52YWx1ZSB9KTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcInJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNc1wiLCBudWxsLCBTZXR0aW5nTGV2ZWwuREVWSUNFLCBlLnRhcmdldC52YWx1ZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVuZGVyR3JvdXAoc2V0dGluZ0lkczogc3RyaW5nW10sIGxldmVsID0gU2V0dGluZ0xldmVsLkFDQ09VTlQpOiBSZWFjdC5SZWFjdE5vZGVBcnJheSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nSWRzLm1hcCgoaSkgPT4gPFNldHRpbmdzRmxhZyBrZXk9e2l9IG5hbWU9e2l9IGxldmVsPXtsZXZlbH0gLz4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25LZXlib2FyZFNob3J0Y3V0c0NsaWNrZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRpcy5kaXNwYXRjaDxPcGVuVG9UYWJQYXlsb2FkPih7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlclNldHRpbmdzLFxuICAgICAgICAgICAgaW5pdGlhbFRhYklkOiBVc2VyVGFiLktleWJvYXJkLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB1c2VDYXNlID0gU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZTxVc2VDYXNlIHwgbnVsbD4oXCJGVFVFLnVzZUNhc2VTZWxlY3Rpb25cIik7XG4gICAgICAgIGNvbnN0IHJvb21MaXN0U2V0dGluZ3MgPSBQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5ST09NX0xJU1RfU0VUVElOR1NcbiAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgdXNlciBvbmJvYXJkaW5nIHNldHRpbmcgaWYgdGhlIHVzZXIgc2hvdWxkIHNlZSB0aGUgdXNlciBvbmJvYXJkaW5nIHBhZ2VcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gXCJGVFVFLnVzZXJPbmJvYXJkaW5nQnV0dG9uXCIgfHwgc2hvd1VzZXJPbmJvYXJkaW5nUGFnZSh1c2VDYXNlKSk7XG5cbiAgICAgICAgY29uc3QgYnJvd3NlclRpbWV6b25lTGFiZWw6IHN0cmluZyA9IF90KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8ZGVmYXVsdF90aW1lem9uZVwiLCB7XG4gICAgICAgICAgICB0aW1lem9uZTogVGltZXpvbmVIYW5kbGVyLnNob3J0QnJvd3NlclRpbWV6b25lKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFsd2F5cyBQcmVwcmVuZCB0aGUgZGVmYXVsdCBvcHRpb25cbiAgICAgICAgY29uc3QgdGltZXpvbmVzID0gdGhpcy5zdGF0ZS50aW1lem9uZXMubWFwKCh0eikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYga2V5PXt0en0+e3R6fTwvZGl2PjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWV6b25lcy51bnNoaWZ0KDxkaXYga2V5PVwiXCI+e2Jyb3dzZXJUaW1lem9uZUxhYmVsfTwvZGl2Pik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxTZXR0aW5nc1RhYiBkYXRhLXRlc3RpZD1cIm14X1ByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiXCI+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgey8qIFRoZSBoZWFkaW5nIHN0cmluZyBpcyBzdGlsbCAnZ2VuZXJhbCcgZnJvbSB3aGVyZSBpdCB3YXMgbW92ZWQsIGJ1dCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlY29tZSAnZ2VuZXJhbCcgKi99XG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGxhbmd1YWdlX3NlY3Rpb25cIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPExhbmd1YWdlU2VjdGlvbiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWxsQ2hlY2tTZWN0aW9uIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIHtyb29tTGlzdFNldHRpbmdzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJvb21fbGlzdF9oZWFkaW5nXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChyb29tTGlzdFNldHRpbmdzKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJjb21tb258c3BhY2VzXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLlNQQUNFU19TRVRUSU5HUywgU2V0dGluZ0xldmVsLkFDQ09VTlQpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfGtleWJvYXJkX2hlYWRpbmdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xrZXlib2FyZF92aWV3X3Nob3J0Y3V0c19idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IChzdWIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJsaW5rX2lubGluZVwiIG9uQ2xpY2s9e3RoaXMub25LZXlib2FyZFNob3J0Y3V0c0NsaWNrZWR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLktFWUJJTkRJTkdTX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHRpbWVfaGVhZGluZ1wiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzU3Vic2VjdGlvbl9kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHVzZXJfdGltZXpvbmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibXhfZHJvcGRvd25Vc2VyVGltZXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9kcm9wZG93blVzZXJUaW1lem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibXhfZHJvcGRvd25Vc2VyVGltZXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hFbmFibGVkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS50aW1lem9uZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8dXNlcl90aW1lem9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2Jyb3dzZXJUaW1lem9uZUxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk9wdGlvbkNoYW5nZT17dGhpcy5vblRpbWV6b25lQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlYXJjaENoYW5nZT17dGhpcy5vblRpbWV6b25lU2VhcmNoQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpbWV6b25lcyBhcyBOb25FbXB0eUFycmF5PFJlYWN0RWxlbWVudCAmIHsga2V5OiBzdHJpbmcgfT59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5USU1FX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cInVzZXJUaW1lem9uZVB1Ymxpc2hcIiBsZXZlbD17U2V0dGluZ0xldmVsLkRFVklDRX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZz17X3QoXCJjb21tb258cHJlc2VuY2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xwcmVzZW5jZV9kZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuUFJFU0VOQ0VfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8Y29tcG9zZXJfaGVhZGluZ1wiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5DT01QT1NFUl9TRVRUSU5HUyl9XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xjb2RlX2Jsb2Nrc19oZWFkaW5nXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLkNPREVfQkxPQ0tTX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfG1lZGlhX2hlYWRpbmdcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuSU1BR0VTX0FORF9WSURFT1NfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwiY29tbW9ufHRpbWVsaW5lXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLlRJTUVMSU5FX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJvb21fZGlyZWN0b3J5X2hlYWRpbmdcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuUk9PTV9ESVJFQ1RPUllfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwiY29tbW9ufGdlbmVyYWxcIil9IHN0cmV0Y2hDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuR0VORVJBTF9TRVRUSU5HUyl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cIkVsZWN0cm9uLnNob3dUcmF5SWNvblwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJFbGVjdHJvbi5lbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9e1NldHRpbmdMZXZlbC5QTEFURk9STX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlSWZDYW5ub3RTZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xFbGVjdHJvbi5lbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IFNka0NvbmZpZy5nZXQoKS5icmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NGbGFnIG5hbWU9XCJFbGVjdHJvbi5hbHdheXNTaG93TWVudUJhclwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiRWxlY3Ryb24uYXV0b0xhdW5jaFwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiRWxlY3Ryb24ud2FybkJlZm9yZUV4aXRcIiBsZXZlbD17U2V0dGluZ0xldmVsLlBMQVRGT1JNfSBoaWRlSWZDYW5ub3RTZXQgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8YXV0b2NvbXBsZXRlX2RlbGF5XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmF1dG9jb21wbGV0ZURlbGF5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQXV0b2NvbXBsZXRlRGVsYXlDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8cm1fbGlmZXRpbWVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uUmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJtX2xpZmV0aW1lX29mZnNjcmVlblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5yZWFkTWFya2VyT3V0T2ZWaWV3VGhyZXNob2xkTXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25SZWFkTWFya2VyT3V0T2ZWaWV3VGhyZXNob2xkTXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgIDwvU2V0dGluZ3NUYWI+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxjQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxhQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxhQUFBLEdBQUFKLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUSxpQkFBQSxHQUFBTCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVMsV0FBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBVixPQUFBO0FBRUEsSUFBQVcsUUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksVUFBQSxHQUFBVCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQWEsbUJBQUEsR0FBQWIsT0FBQTtBQUNBLElBQUFjLG1CQUFBLEdBQUFYLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBZSxZQUFBLEdBQUFaLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBZ0IsZ0JBQUEsR0FBQWhCLE9BQUE7QUFDQSxJQUFBaUIsaUJBQUEsR0FBQWQsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFrQixZQUFBLEdBQUFmLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBbUIsU0FBQSxHQUFBbkIsT0FBQTtBQUNBLElBQUFvQixtQkFBQSxHQUFBakIsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFxQixxQkFBQSxHQUFBbEIsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFzQixlQUFBLEdBQUF2Qix1QkFBQSxDQUFBQyxPQUFBO0FBQWtFLFNBQUF1Qix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBekIsd0JBQUF5QixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsQ0FBQUgsT0FBQSxHQUFBTCxDQUFBLEVBQUFHLENBQUEsSUFBQUEsQ0FBQSxDQUFBZSxHQUFBLENBQUFsQixDQUFBLEVBQUFRLENBQUEsR0FBQUEsQ0FBQTtBQWxDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUEwQ0EsTUFBTVcsZUFBeUIsR0FBR0EsQ0FBQSxLQUFNO0VBQ3BDLE1BQU0sQ0FBQ0MsUUFBUSxFQUFFQyxXQUFXLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQUMsSUFBQUMsbUNBQWtCLEVBQUMsQ0FBQyxDQUFDO0VBRTlELE1BQU1DLGdCQUFnQixHQUFHLElBQUFDLGtCQUFXLEVBQy9CQyxXQUFtQixJQUFLO0lBQ3JCLElBQUlOLFFBQVEsS0FBS00sV0FBVyxFQUFFO0lBRTlCQyxzQkFBYSxDQUFDQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRUMsMEJBQVksQ0FBQ0MsTUFBTSxFQUFFSixXQUFXLENBQUM7SUFDMUVMLFdBQVcsQ0FBQ0ssV0FBVyxDQUFDO0lBQ3hCLE1BQU1LLFFBQVEsR0FBR0Msb0JBQVcsQ0FBQ3pCLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUl3QixRQUFRLEVBQUU7TUFDVkEsUUFBUSxDQUFDVixXQUFXLENBQUMsQ0FBQ0ssV0FBVyxDQUFDLENBQUM7TUFDbkNLLFFBQVEsQ0FBQ0UsTUFBTSxDQUFDLENBQUM7SUFDckI7RUFDSixDQUFDLEVBQ0QsQ0FBQ2IsUUFBUSxDQUNiLENBQUM7RUFFRCxvQkFDSTlDLE1BQUEsQ0FBQStCLE9BQUEsQ0FBQTZCLGFBQUE7SUFBS0MsU0FBUyxFQUFDO0VBQWdDLEdBQzFDLElBQUFDLG1CQUFFLEVBQUMsdUNBQXVDLENBQUMsZUFDNUM5RCxNQUFBLENBQUErQixPQUFBLENBQUE2QixhQUFBLENBQUN6QyxpQkFBQSxDQUFBWSxPQUFnQjtJQUFDZ0MsY0FBYyxFQUFFYixnQkFBaUI7SUFBQ2MsS0FBSyxFQUFFbEI7RUFBUyxDQUFFLENBQUMsZUFDdkU5QyxNQUFBLENBQUErQixPQUFBLENBQUE2QixhQUFBO0lBQUtDLFNBQVMsRUFBQztFQUE0QyxHQUN0RCxJQUFBQyxtQkFBRSxFQUFDLG1EQUFtRCxDQUN0RCxDQUNKLENBQUM7QUFFZCxDQUFDO0FBRUQsTUFBTUcsaUJBQTJCLEdBQUdBLENBQUEsS0FBTTtFQUN0QyxNQUFNLENBQUNDLGlCQUFpQixFQUFFQyxvQkFBb0IsQ0FBQyxHQUFHLElBQUFuQixlQUFRLEVBQXNCLENBQUM7RUFDakYsTUFBTSxDQUFDb0IsbUJBQW1CLEVBQUVDLHNCQUFzQixDQUFDLEdBQUcsSUFBQXJCLGVBQVEsRUFBdUIsQ0FBQztFQUV0RixJQUFBc0IsZ0JBQVMsRUFBQyxNQUFNO0lBQ1osQ0FBQyxZQUFZO01BQ1QsTUFBTUMsSUFBSSxHQUFHYixvQkFBVyxDQUFDekIsR0FBRyxDQUFDLENBQUM7TUFDOUIsTUFBTSxDQUFDdUMsT0FBTyxFQUFFQyxLQUFLLENBQUMsR0FBRyxNQUFNQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDSixJQUFJLEVBQUVLLG9CQUFvQixDQUFDLENBQUMsRUFBRUwsSUFBSSxFQUFFTSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUUxR1Ysb0JBQW9CLENBQUNLLE9BQU8sQ0FBQztNQUM3Qkgsc0JBQXNCLENBQUNJLEtBQUssSUFBSUssU0FBUyxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDO0VBQ1IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLE1BQU1DLHlCQUF5QixHQUFHLElBQUE1QixrQkFBVyxFQUFFcUIsT0FBZ0IsSUFBSztJQUNoRUwsb0JBQW9CLENBQUNLLE9BQU8sQ0FBQztJQUM3QmQsb0JBQVcsQ0FBQ3pCLEdBQUcsQ0FBQyxDQUFDLEVBQUVrQyxvQkFBb0IsQ0FBQ0ssT0FBTyxDQUFDO0VBQ3BELENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixNQUFNUSwyQkFBMkIsR0FBRyxJQUFBN0Isa0JBQVcsRUFBRThCLFNBQW1CLElBQVc7SUFDM0VaLHNCQUFzQixDQUFDWSxTQUFTLENBQUM7SUFDakN2QixvQkFBVyxDQUFDekIsR0FBRyxDQUFDLENBQUMsRUFBRW9DLHNCQUFzQixDQUFDWSxTQUFTLENBQUM7RUFDeEQsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQUksQ0FBQ3ZCLG9CQUFXLENBQUN6QixHQUFHLENBQUMsQ0FBQyxFQUFFaUQsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUVqRSxvQkFDSWxGLE1BQUEsQ0FBQStCLE9BQUEsQ0FBQTZCLGFBQUEsQ0FBQTVELE1BQUEsQ0FBQStCLE9BQUEsQ0FBQW9ELFFBQUEscUJBQ0luRixNQUFBLENBQUErQixPQUFBLENBQUE2QixhQUFBLENBQUNyQyxxQkFBQSxDQUFBUSxPQUFvQjtJQUNqQnFELEtBQUssRUFBRSxJQUFBdEIsbUJBQUUsRUFBQyxtQ0FBbUMsQ0FBRTtJQUMvQ0UsS0FBSyxFQUFFcUIsT0FBTyxDQUFDbkIsaUJBQWlCLENBQUU7SUFDbENvQixRQUFRLEVBQUVQO0VBQTBCLENBQ3ZDLENBQUMsRUFDRGIsaUJBQWlCLElBQUlFLG1CQUFtQixLQUFLVSxTQUFTLElBQUksQ0FBQ1MsZ0JBQU0saUJBQzlEdkYsTUFBQSxDQUFBK0IsT0FBQSxDQUFBNkIsYUFBQSxDQUFDdEMsbUJBQUEsQ0FBQVMsT0FBa0I7SUFBQ2tELFNBQVMsRUFBRWIsbUJBQW9CO0lBQUNvQixpQkFBaUIsRUFBRVI7RUFBNEIsQ0FBRSxDQUUzRyxDQUFDO0FBRVgsQ0FBQztBQUVjLE1BQU1TLDBCQUEwQixTQUFTQyxjQUFLLENBQUNDLFNBQVMsQ0FBaUI7RUFtRDdFQyxXQUFXQSxDQUFDQyxLQUFhLEVBQUU7SUFDOUIsS0FBSyxDQUFDQSxLQUFLLENBQUM7SUFBQyxJQUFBQyxnQkFBQSxDQUFBL0QsT0FBQSw0QkFrQldnRSxFQUFVLElBQVc7TUFDN0MsSUFBSSxDQUFDQyxRQUFRLENBQUM7UUFBRUMsUUFBUSxFQUFFRjtNQUFHLENBQUMsQ0FBQztNQUMvQnZFLGVBQWUsQ0FBQzBFLGVBQWUsQ0FBQ0gsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDtBQUNKO0FBQ0E7SUFGSSxJQUFBRCxnQkFBQSxDQUFBL0QsT0FBQSxrQ0FHa0NvRSxNQUFjLElBQVc7TUFDdkQsTUFBTUMsY0FBYyxHQUFHRCxNQUFNLENBQUNFLFdBQVcsQ0FBQyxDQUFDO01BQzNDLE1BQU1DLFNBQVMsR0FBR0YsY0FBYyxHQUMxQjVFLGVBQWUsQ0FBQytFLGVBQWUsQ0FBQyxDQUFDLENBQUNDLE1