UNPKG

matrix-react-sdk

Version:
223 lines (220 loc) 45.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../../languageHandler"); var _BaseTool = _interopRequireWildcard(require("./BaseTool")); var _AccessibleButton = _interopRequireDefault(require("../../elements/AccessibleButton")); var _SettingsStore = _interopRequireWildcard(require("../../../../settings/SettingsStore")); var _Settings = require("../../../../settings/Settings"); var _Field = _interopRequireDefault(require("../../elements/Field")); 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 2018-2023 The Matrix.org Foundation C.I.C. Copyright 2022 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 SettingExplorer = ({ onBack }) => { const [setting, setSetting] = (0, _react.useState)(null); const [editing, setEditing] = (0, _react.useState)(false); if (setting && editing) { const onBack = () => { setEditing(false); }; return /*#__PURE__*/_react.default.createElement(EditSetting, { setting: setting, onBack: onBack }); } else if (setting) { const onBack = () => { setSetting(null); }; const onEdit = async () => { setEditing(true); }; return /*#__PURE__*/_react.default.createElement(ViewSetting, { setting: setting, onBack: onBack, onEdit: onEdit }); } else { const onView = setting => { setSetting(setting); }; const onEdit = setting => { setSetting(setting); setEditing(true); }; return /*#__PURE__*/_react.default.createElement(SettingsList, { onBack: onBack, onView: onView, onEdit: onEdit }); } }; var _default = exports.default = SettingExplorer; const CanEditLevelField = ({ setting, roomId, level }) => { const canEdit = _SettingsStore.default.canSetValue(setting, roomId ?? null, level); const className = canEdit ? "mx_DevTools_SettingsExplorer_mutable" : "mx_DevTools_SettingsExplorer_immutable"; return /*#__PURE__*/_react.default.createElement("td", { className: className }, /*#__PURE__*/_react.default.createElement("code", null, canEdit.toString())); }; function renderExplicitSettingValues(setting, roomId) { const vals = {}; for (const level of _SettingsStore.LEVEL_ORDER) { try { vals[level] = _SettingsStore.default.getValueAt(level, setting, roomId, true, true); if (vals[level] === undefined) { vals[level] = null; } } catch (e) { _logger.logger.warn(e); } } return JSON.stringify(vals, null, 4); } const EditSetting = ({ setting, onBack }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); const [explicitValue, setExplicitValue] = (0, _react.useState)(renderExplicitSettingValues(setting)); const [explicitRoomValue, setExplicitRoomValue] = (0, _react.useState)(renderExplicitSettingValues(setting, context.room.roomId)); const onSave = async () => { try { const parsedExplicit = JSON.parse(explicitValue); const parsedExplicitRoom = JSON.parse(explicitRoomValue); for (const level of Object.keys(parsedExplicit)) { _logger.logger.log(`[Devtools] Setting value of ${setting} at ${level} from user input`); try { const val = parsedExplicit[level]; await _SettingsStore.default.setValue(setting, null, level, val); } catch (e) { _logger.logger.warn(e); } } const roomId = context.room.roomId; for (const level of Object.keys(parsedExplicit)) { _logger.logger.log(`[Devtools] Setting value of ${setting} at ${level} in ${roomId} from user input`); try { const val = parsedExplicitRoom[level]; await _SettingsStore.default.setValue(setting, roomId, level, val); } catch (e) { _logger.logger.warn(e); } } onBack(); } catch (e) { return (0, _languageHandler._t)("devtools|failed_to_save") + (e instanceof Error ? ` (${e.message})` : ""); } }; return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack, actionLabel: (0, _languageHandler._td)("devtools|save_setting_values"), onAction: onSave }, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("devtools|setting_colon"), " ", /*#__PURE__*/_react.default.createElement("code", null, setting)), /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevTools_SettingsExplorer_warning" }, /*#__PURE__*/_react.default.createElement("strong", null, (0, _languageHandler._t)("devtools|caution_colon")), " ", (0, _languageHandler._t)("devtools|use_at_own_risk")), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|setting_definition"), /*#__PURE__*/_react.default.createElement("pre", null, /*#__PURE__*/_react.default.createElement("code", null, JSON.stringify(_Settings.SETTINGS[setting], null, 4)))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("table", null, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|level")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|settable_global")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|settable_room")))), /*#__PURE__*/_react.default.createElement("tbody", null, _SettingsStore.LEVEL_ORDER.map(lvl => /*#__PURE__*/_react.default.createElement("tr", { key: lvl }, /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement("code", null, lvl)), /*#__PURE__*/_react.default.createElement(CanEditLevelField, { setting: setting, level: lvl }), /*#__PURE__*/_react.default.createElement(CanEditLevelField, { setting: setting, roomId: context.room.roomId, level: lvl })))))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Field.default, { id: "valExpl", label: (0, _languageHandler._t)("devtools|values_explicit"), type: "text", className: "mx_DevTools_textarea", element: "textarea", autoComplete: "off", value: explicitValue, onChange: e => setExplicitValue(e.target.value) })), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Field.default, { id: "valExpl", label: (0, _languageHandler._t)("devtools|values_explicit_room"), type: "text", className: "mx_DevTools_textarea", element: "textarea", autoComplete: "off", value: explicitRoomValue, onChange: e => setExplicitRoomValue(e.target.value) }))); }; const ViewSetting = ({ setting, onEdit, onBack }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack, actionLabel: (0, _languageHandler._td)("devtools|edit_values"), onAction: onEdit }, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("devtools|setting_colon"), " ", /*#__PURE__*/_react.default.createElement("code", null, setting)), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|setting_definition"), /*#__PURE__*/_react.default.createElement("pre", null, /*#__PURE__*/_react.default.createElement("code", null, JSON.stringify(_Settings.SETTINGS[setting], null, 4)))), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|value_colon"), "\xA0", /*#__PURE__*/_react.default.createElement("code", null, renderSettingValue(_SettingsStore.default.getValue(setting)))), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|value_this_room_colon"), "\xA0", /*#__PURE__*/_react.default.createElement("code", null, renderSettingValue(_SettingsStore.default.getValue(setting, context.room.roomId)))), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|values_explicit_colon"), /*#__PURE__*/_react.default.createElement("pre", null, /*#__PURE__*/_react.default.createElement("code", null, renderExplicitSettingValues(setting)))), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|values_explicit_this_room_colon"), /*#__PURE__*/_react.default.createElement("pre", null, /*#__PURE__*/_react.default.createElement("code", null, renderExplicitSettingValues(setting, context.room.roomId))))); }; function renderSettingValue(val) { // Note: we don't .toString() a string because we want JSON.stringify to inject quotes for us const toStringTypes = ["boolean", "number"]; if (toStringTypes.includes(typeof val)) { return val.toString(); } else { return JSON.stringify(val); } } const SettingsList = ({ onBack, onView, onEdit }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); const [query, setQuery] = (0, _react.useState)(""); const allSettings = (0, _react.useMemo)(() => { let allSettings = Object.keys(_Settings.SETTINGS); if (query) { const lcQuery = query.toLowerCase(); allSettings = allSettings.filter(setting => setting.toLowerCase().includes(lcQuery)); } return allSettings; }, [query]); return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack, className: "mx_DevTools_SettingsExplorer" }, /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("common|filter_results"), autoFocus: true, size: 64, type: "text", autoComplete: "off", value: query, onChange: ev => setQuery(ev.target.value), className: "mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" }), /*#__PURE__*/_react.default.createElement("table", null, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|setting_id")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|value")), /*#__PURE__*/_react.default.createElement("th", null, (0, _languageHandler._t)("devtools|value_in_this_room")))), /*#__PURE__*/_react.default.createElement("tbody", null, allSettings.map(i => /*#__PURE__*/_react.default.createElement("tr", { key: i }, /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link_inline", className: "mx_DevTools_SettingsExplorer_setting", onClick: () => onView(i) }, /*#__PURE__*/_react.default.createElement("code", null, i)), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { alt: (0, _languageHandler._t)("devtools|edit_setting"), onClick: () => onEdit(i), className: "mx_DevTools_SettingsExplorer_edit" }, "\u270F")), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement("code", null, renderSettingValue(_SettingsStore.default.getValue(i)))), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement("code", null, renderSettingValue(_SettingsStore.default.getValue(i, context.room.roomId))))))))); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9CYXNlVG9vbCIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9TZXR0aW5nc1N0b3JlIiwiX1NldHRpbmdzIiwiX0ZpZWxkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU2V0dGluZ0V4cGxvcmVyIiwib25CYWNrIiwic2V0dGluZyIsInNldFNldHRpbmciLCJ1c2VTdGF0ZSIsImVkaXRpbmciLCJzZXRFZGl0aW5nIiwiY3JlYXRlRWxlbWVudCIsIkVkaXRTZXR0aW5nIiwib25FZGl0IiwiVmlld1NldHRpbmciLCJvblZpZXciLCJTZXR0aW5nc0xpc3QiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJDYW5FZGl0TGV2ZWxGaWVsZCIsInJvb21JZCIsImxldmVsIiwiY2FuRWRpdCIsIlNldHRpbmdzU3RvcmUiLCJjYW5TZXRWYWx1ZSIsImNsYXNzTmFtZSIsInRvU3RyaW5nIiwicmVuZGVyRXhwbGljaXRTZXR0aW5nVmFsdWVzIiwidmFscyIsIkxFVkVMX09SREVSIiwiZ2V0VmFsdWVBdCIsInVuZGVmaW5lZCIsImxvZ2dlciIsIndhcm4iLCJKU09OIiwic3RyaW5naWZ5IiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJEZXZ0b29sc0NvbnRleHQiLCJleHBsaWNpdFZhbHVlIiwic2V0RXhwbGljaXRWYWx1ZSIsImV4cGxpY2l0Um9vbVZhbHVlIiwic2V0RXhwbGljaXRSb29tVmFsdWUiLCJyb29tIiwib25TYXZlIiwicGFyc2VkRXhwbGljaXQiLCJwYXJzZSIsInBhcnNlZEV4cGxpY2l0Um9vbSIsImtleXMiLCJsb2ciLCJ2YWwiLCJzZXRWYWx1ZSIsIl90IiwiRXJyb3IiLCJtZXNzYWdlIiwiYWN0aW9uTGFiZWwiLCJfdGQiLCJvbkFjdGlvbiIsIlNFVFRJTkdTIiwibWFwIiwibHZsIiwia2V5IiwiaWQiLCJsYWJlbCIsInR5cGUiLCJlbGVtZW50IiwiYXV0b0NvbXBsZXRlIiwidmFsdWUiLCJvbkNoYW5nZSIsInRhcmdldCIsInJlbmRlclNldHRpbmdWYWx1ZSIsImdldFZhbHVlIiwidG9TdHJpbmdUeXBlcyIsImluY2x1ZGVzIiwicXVlcnkiLCJzZXRRdWVyeSIsImFsbFNldHRpbmdzIiwidXNlTWVtbyIsImxjUXVlcnkiLCJ0b0xvd2VyQ2FzZSIsImZpbHRlciIsImF1dG9Gb2N1cyIsInNpemUiLCJldiIsImtpbmQiLCJvbkNsaWNrIiwiYWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9kZXZ0b29scy9TZXR0aW5nRXhwbG9yZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE4LTIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDIyIE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgQ2hhbmdlRXZlbnQsIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQmFzZVRvb2wsIHsgRGV2dG9vbHNDb250ZXh0LCBJRGV2dG9vbHNQcm9wcyB9IGZyb20gXCIuL0Jhc2VUb29sXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUsIHsgTEVWRUxfT1JERVIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgU2V0dGluZ0xldmVsIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdMZXZlbFwiO1xuaW1wb3J0IHsgU0VUVElOR1MgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vLi4vZWxlbWVudHMvRmllbGRcIjtcblxuY29uc3QgU2V0dGluZ0V4cGxvcmVyOiBSZWFjdC5GQzxJRGV2dG9vbHNQcm9wcz4gPSAoeyBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IFtzZXR0aW5nLCBzZXRTZXR0aW5nXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtlZGl0aW5nLCBzZXRFZGl0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGlmIChzZXR0aW5nICYmIGVkaXRpbmcpIHtcbiAgICAgICAgY29uc3Qgb25CYWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc2V0RWRpdGluZyhmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiA8RWRpdFNldHRpbmcgc2V0dGluZz17c2V0dGluZ30gb25CYWNrPXtvbkJhY2t9IC8+O1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZykge1xuICAgICAgICBjb25zdCBvbkJhY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzZXRTZXR0aW5nKG51bGwpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVkaXQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBzZXRFZGl0aW5nKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gPFZpZXdTZXR0aW5nIHNldHRpbmc9e3NldHRpbmd9IG9uQmFjaz17b25CYWNrfSBvbkVkaXQ9e29uRWRpdH0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb25WaWV3ID0gKHNldHRpbmc6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc2V0U2V0dGluZyhzZXR0aW5nKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FZGl0ID0gKHNldHRpbmc6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc2V0U2V0dGluZyhzZXR0aW5nKTtcbiAgICAgICAgICAgIHNldEVkaXRpbmcodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiA8U2V0dGluZ3NMaXN0IG9uQmFjaz17b25CYWNrfSBvblZpZXc9e29uVmlld30gb25FZGl0PXtvbkVkaXR9IC8+O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNldHRpbmdFeHBsb3JlcjtcblxuaW50ZXJmYWNlIElDYW5FZGl0TGV2ZWxGaWVsZFByb3BzIHtcbiAgICBzZXR0aW5nOiBzdHJpbmc7XG4gICAgbGV2ZWw6IFNldHRpbmdMZXZlbDtcbiAgICByb29tSWQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENhbkVkaXRMZXZlbEZpZWxkOiBSZWFjdC5GQzxJQ2FuRWRpdExldmVsRmllbGRQcm9wcz4gPSAoeyBzZXR0aW5nLCByb29tSWQsIGxldmVsIH0pID0+IHtcbiAgICBjb25zdCBjYW5FZGl0ID0gU2V0dGluZ3NTdG9yZS5jYW5TZXRWYWx1ZShzZXR0aW5nLCByb29tSWQgPz8gbnVsbCwgbGV2ZWwpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNhbkVkaXQgPyBcIm14X0RldlRvb2xzX1NldHRpbmdzRXhwbG9yZXJfbXV0YWJsZVwiIDogXCJteF9EZXZUb29sc19TZXR0aW5nc0V4cGxvcmVyX2ltbXV0YWJsZVwiO1xuICAgIHJldHVybiAoXG4gICAgICAgIDx0ZCBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgICAgICA8Y29kZT57Y2FuRWRpdC50b1N0cmluZygpfTwvY29kZT5cbiAgICAgICAgPC90ZD5cbiAgICApO1xufTtcblxuZnVuY3Rpb24gcmVuZGVyRXhwbGljaXRTZXR0aW5nVmFsdWVzKHNldHRpbmc6IHN0cmluZywgcm9vbUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWxzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBudWxsPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgTEVWRUxfT1JERVIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHNbbGV2ZWxdID0gU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZUF0KGxldmVsLCBzZXR0aW5nLCByb29tSWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHZhbHNbbGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YWxzW2xldmVsXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWxzLCBudWxsLCA0KTtcbn1cblxuaW50ZXJmYWNlIElFZGl0U2V0dGluZ1Byb3BzIGV4dGVuZHMgUGljazxJRGV2dG9vbHNQcm9wcywgXCJvbkJhY2tcIj4ge1xuICAgIHNldHRpbmc6IHN0cmluZztcbn1cblxuY29uc3QgRWRpdFNldHRpbmc6IFJlYWN0LkZDPElFZGl0U2V0dGluZ1Byb3BzPiA9ICh7IHNldHRpbmcsIG9uQmFjayB9KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRGV2dG9vbHNDb250ZXh0KTtcbiAgICBjb25zdCBbZXhwbGljaXRWYWx1ZSwgc2V0RXhwbGljaXRWYWx1ZV0gPSB1c2VTdGF0ZShyZW5kZXJFeHBsaWNpdFNldHRpbmdWYWx1ZXMoc2V0dGluZykpO1xuICAgIGNvbnN0IFtleHBsaWNpdFJvb21WYWx1ZSwgc2V0RXhwbGljaXRSb29tVmFsdWVdID0gdXNlU3RhdGUoXG4gICAgICAgIHJlbmRlckV4cGxpY2l0U2V0dGluZ1ZhbHVlcyhzZXR0aW5nLCBjb250ZXh0LnJvb20ucm9vbUlkKSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25TYXZlID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRFeHBsaWNpdCA9IEpTT04ucGFyc2UoZXhwbGljaXRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRFeHBsaWNpdFJvb20gPSBKU09OLnBhcnNlKGV4cGxpY2l0Um9vbVZhbHVlKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgT2JqZWN0LmtleXMocGFyc2VkRXhwbGljaXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgW0RldnRvb2xzXSBTZXR0aW5nIHZhbHVlIG9mICR7c2V0dGluZ30gYXQgJHtsZXZlbH0gZnJvbSB1c2VyIGlucHV0YCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gcGFyc2VkRXhwbGljaXRbbGV2ZWxdO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKHNldHRpbmcsIG51bGwsIGxldmVsIGFzIFNldHRpbmdMZXZlbCwgdmFsKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgcm9vbUlkID0gY29udGV4dC5yb29tLnJvb21JZDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgT2JqZWN0LmtleXMocGFyc2VkRXhwbGljaXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgW0RldnRvb2xzXSBTZXR0aW5nIHZhbHVlIG9mICR7c2V0dGluZ30gYXQgJHtsZXZlbH0gaW4gJHtyb29tSWR9IGZyb20gdXNlciBpbnB1dGApO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlZEV4cGxpY2l0Um9vbVtsZXZlbF07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoc2V0dGluZywgcm9vbUlkLCBsZXZlbCBhcyBTZXR0aW5nTGV2ZWwsIHZhbCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkJhY2soKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90KFwiZGV2dG9vbHN8ZmFpbGVkX3RvX3NhdmVcIikgKyAoZSBpbnN0YW5jZW9mIEVycm9yID8gYCAoJHtlLm1lc3NhZ2V9KWAgOiBcIlwiKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9IGFjdGlvbkxhYmVsPXtfdGQoXCJkZXZ0b29sc3xzYXZlX3NldHRpbmdfdmFsdWVzXCIpfSBvbkFjdGlvbj17b25TYXZlfT5cbiAgICAgICAgICAgIDxoMz5cbiAgICAgICAgICAgICAgICB7X3QoXCJkZXZ0b29sc3xzZXR0aW5nX2NvbG9uXCIpfSA8Y29kZT57c2V0dGluZ308L2NvZGU+XG4gICAgICAgICAgICA8L2gzPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0RldlRvb2xzX1NldHRpbmdzRXhwbG9yZXJfd2FybmluZ1wiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e190KFwiZGV2dG9vbHN8Y2F1dGlvbl9jb2xvblwiKX08L3N0cm9uZz4ge190KFwiZGV2dG9vbHN8dXNlX2F0X293bl9yaXNrXCIpfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge190KFwiZGV2dG9vbHN8c2V0dGluZ19kZWZpbml0aW9uXCIpfVxuICAgICAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgICAgICAgIDxjb2RlPntKU09OLnN0cmluZ2lmeShTRVRUSU5HU1tzZXR0aW5nXSwgbnVsbCwgNCl9PC9jb2RlPlxuICAgICAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHRhYmxlPlxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPntfdChcImRldnRvb2xzfGxldmVsXCIpfTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPntfdChcImRldnRvb2xzfHNldHRhYmxlX2dsb2JhbFwiKX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57X3QoXCJkZXZ0b29sc3xzZXR0YWJsZV9yb29tXCIpfTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICB7TEVWRUxfT1JERVIubWFwKChsdmwpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIga2V5PXtsdmx9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT57bHZsfTwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENhbkVkaXRMZXZlbEZpZWxkIHNldHRpbmc9e3NldHRpbmd9IGxldmVsPXtsdmx9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYW5FZGl0TGV2ZWxGaWVsZCBzZXR0aW5nPXtzZXR0aW5nfSByb29tSWQ9e2NvbnRleHQucm9vbS5yb29tSWR9IGxldmVsPXtsdmx9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ2YWxFeHBsXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiZGV2dG9vbHN8dmFsdWVzX2V4cGxpY2l0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0RldlRvb2xzX3RleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudD1cInRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2V4cGxpY2l0VmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0RXhwbGljaXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICBpZD1cInZhbEV4cGxcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJkZXZ0b29sc3x2YWx1ZXNfZXhwbGljaXRfcm9vbVwiKX1cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EZXZUb29sc190ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9XCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtleHBsaWNpdFJvb21WYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRFeHBsaWNpdFJvb21WYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0Jhc2VUb29sPlxuICAgICk7XG59O1xuXG5pbnRlcmZhY2UgSVZpZXdTZXR0aW5nUHJvcHMgZXh0ZW5kcyBQaWNrPElEZXZ0b29sc1Byb3BzLCBcIm9uQmFja1wiPiB7XG4gICAgc2V0dGluZzogc3RyaW5nO1xuICAgIG9uRWRpdCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5jb25zdCBWaWV3U2V0dGluZzogUmVhY3QuRkM8SVZpZXdTZXR0aW5nUHJvcHM+ID0gKHsgc2V0dGluZywgb25FZGl0LCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERldnRvb2xzQ29udGV4dCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9IGFjdGlvbkxhYmVsPXtfdGQoXCJkZXZ0b29sc3xlZGl0X3ZhbHVlc1wiKX0gb25BY3Rpb249e29uRWRpdH0+XG4gICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgICAge190KFwiZGV2dG9vbHN8c2V0dGluZ19jb2xvblwiKX0gPGNvZGU+e3NldHRpbmd9PC9jb2RlPlxuICAgICAgICAgICAgPC9oMz5cblxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7X3QoXCJkZXZ0b29sc3xzZXR0aW5nX2RlZmluaXRpb25cIil9XG4gICAgICAgICAgICAgICAgPHByZT5cbiAgICAgICAgICAgICAgICAgICAgPGNvZGU+e0pTT04uc3RyaW5naWZ5KFNFVFRJTkdTW3NldHRpbmddLCBudWxsLCA0KX08L2NvZGU+XG4gICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7X3QoXCJkZXZ0b29sc3x2YWx1ZV9jb2xvblwiKX0mbmJzcDtcbiAgICAgICAgICAgICAgICA8Y29kZT57cmVuZGVyU2V0dGluZ1ZhbHVlKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoc2V0dGluZykpfTwvY29kZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcImRldnRvb2xzfHZhbHVlX3RoaXNfcm9vbV9jb2xvblwiKX0mbmJzcDtcbiAgICAgICAgICAgICAgICA8Y29kZT57cmVuZGVyU2V0dGluZ1ZhbHVlKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoc2V0dGluZywgY29udGV4dC5yb29tLnJvb21JZCkpfTwvY29kZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcImRldnRvb2xzfHZhbHVlc19leHBsaWNpdF9jb2xvblwiKX1cbiAgICAgICAgICAgICAgICA8cHJlPlxuICAgICAgICAgICAgICAgICAgICA8Y29kZT57cmVuZGVyRXhwbGljaXRTZXR0aW5nVmFsdWVzKHNldHRpbmcpfTwvY29kZT5cbiAgICAgICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcImRldnRvb2xzfHZhbHVlc19leHBsaWNpdF90aGlzX3Jvb21fY29sb25cIil9XG4gICAgICAgICAgICAgICAgPHByZT5cbiAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3JlbmRlckV4cGxpY2l0U2V0dGluZ1ZhbHVlcyhzZXR0aW5nLCBjb250ZXh0LnJvb20ucm9vbUlkKX08L2NvZGU+XG4gICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9CYXNlVG9vbD5cbiAgICApO1xufTtcblxuZnVuY3Rpb24gcmVuZGVyU2V0dGluZ1ZhbHVlKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICAvLyBOb3RlOiB3ZSBkb24ndCAudG9TdHJpbmcoKSBhIHN0cmluZyBiZWNhdXNlIHdlIHdhbnQgSlNPTi5zdHJpbmdpZnkgdG8gaW5qZWN0IHF1b3RlcyBmb3IgdXNcbiAgICBjb25zdCB0b1N0cmluZ1R5cGVzID0gW1wiYm9vbGVhblwiLCBcIm51bWJlclwiXTtcbiAgICBpZiAodG9TdHJpbmdUeXBlcy5pbmNsdWRlcyh0eXBlb2YgdmFsKSkge1xuICAgICAgICByZXR1cm4gdmFsLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgSVNldHRpbmdzTGlzdFByb3BzIGV4dGVuZHMgUGljazxJRGV2dG9vbHNQcm9wcywgXCJvbkJhY2tcIj4ge1xuICAgIG9uVmlldyhzZXR0aW5nOiBzdHJpbmcpOiB2b2lkO1xuICAgIG9uRWRpdChzZXR0aW5nOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5jb25zdCBTZXR0aW5nc0xpc3Q6IFJlYWN0LkZDPElTZXR0aW5nc0xpc3RQcm9wcz4gPSAoeyBvbkJhY2ssIG9uVmlldywgb25FZGl0IH0pID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChEZXZ0b29sc0NvbnRleHQpO1xuICAgIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gdXNlU3RhdGUoXCJcIik7XG5cbiAgICBjb25zdCBhbGxTZXR0aW5ncyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBsZXQgYWxsU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhTRVRUSU5HUyk7XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgbGNRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBhbGxTZXR0aW5ncyA9IGFsbFNldHRpbmdzLmZpbHRlcigoc2V0dGluZykgPT4gc2V0dGluZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxjUXVlcnkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsU2V0dGluZ3M7XG4gICAgfSwgW3F1ZXJ5XSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9IGNsYXNzTmFtZT1cIm14X0RldlRvb2xzX1NldHRpbmdzRXhwbG9yZXJcIj5cbiAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImNvbW1vbnxmaWx0ZXJfcmVzdWx0c1wiKX1cbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM9e3RydWV9XG4gICAgICAgICAgICAgICAgc2l6ZT17NjR9XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3F1ZXJ5fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXY6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiBzZXRRdWVyeShldi50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1RleHRJbnB1dERpYWxvZ19pbnB1dCBteF9EZXZUb29sc19Sb29tU3RhdGVFeHBsb3Jlcl9xdWVyeVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHRhYmxlPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPntfdChcImRldnRvb2xzfHNldHRpbmdfaWRcIil9PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57X3QoXCJkZXZ0b29sc3x2YWx1ZVwiKX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPntfdChcImRldnRvb2xzfHZhbHVlX2luX3RoaXNfcm9vbVwiKX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7YWxsU2V0dGluZ3MubWFwKChpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwibGlua19pbmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRGV2VG9vbHNfU2V0dGluZ3NFeHBsb3Jlcl9zZXR0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uVmlldyhpKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e2l9PC9jb2RlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9e190KFwiZGV2dG9vbHN8ZWRpdF9zZXR0aW5nXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25FZGl0KGkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRGV2VG9vbHNfU2V0dGluZ3NFeHBsb3Jlcl9lZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pyPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3JlbmRlclNldHRpbmdWYWx1ZShTZXR0aW5nc1N0b3JlLmdldFZhbHVlKGkpKX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPntyZW5kZXJTZXR0aW5nVmFsdWUoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShpLCBjb250ZXh0LnJvb20ucm9vbUlkKSl9PC9jb2RlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9CYXNlVG9vbD5cbiAgICApO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sY0FBQSxHQUFBUCx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU8sU0FBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsTUFBQSxHQUFBSCxzQkFBQSxDQUFBTCxPQUFBO0FBQXlDLFNBQUFTLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFYLHdCQUFBVyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFB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