UNPKG

matrix-react-sdk

Version:
332 lines (270 loc) 38.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.useWidgets = void 0; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _useIsEncrypted = require("../../../hooks/useIsEncrypted"); var _BaseCard = _interopRequireWildcard(require("./BaseCard")); var _languageHandler = require("../../../languageHandler"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); var _RightPanelStorePhases = require("../../../stores/RightPanelStorePhases"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _ShareDialog = _interopRequireDefault(require("../dialogs/ShareDialog")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _WidgetUtils = _interopRequireDefault(require("../../../utils/WidgetUtils")); var _IntegrationManagers = require("../../../integrations/IntegrationManagers"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _TextWithTooltip = _interopRequireDefault(require("../elements/TextWithTooltip")); var _WidgetAvatar = _interopRequireDefault(require("../avatars/WidgetAvatar")); var _AccessibleTooltipButton = _interopRequireDefault(require("../elements/AccessibleTooltipButton")); var _WidgetStore = _interopRequireDefault(require("../../../stores/WidgetStore")); var _ShieldUtils = require("../../../utils/ShieldUtils"); var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext")); var _UIFeature = require("../../../settings/UIFeature"); var _ContextMenu = require("../../structures/ContextMenu"); var _WidgetContextMenu = _interopRequireDefault(require("../context_menus/WidgetContextMenu")); var _useRoomMembers = require("../../../hooks/useRoomMembers"); var _WidgetLayoutStore = require("../../../stores/widgets/WidgetLayoutStore"); /* Copyright 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ const Button /*: React.FC<IButtonProps>*/ = ({ children, className, onClick }) => { return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: (0, _classnames.default)("mx_BaseCard_Button mx_RoomSummaryCard_Button", className), onClick: onClick }, children); }; const useWidgets = (room /*: Room*/ ) => { const [apps, setApps] = (0, _react.useState)(_WidgetStore.default.instance.getApps(room.roomId)); const updateApps = (0, _react.useCallback)(() => { // Copy the array so that we always trigger a re-render, as some updates mutate the array of apps/settings setApps([..._WidgetStore.default.instance.getApps(room.roomId)]); }, [room]); (0, _react.useEffect)(updateApps, [room, updateApps]); (0, _useEventEmitter.useEventEmitter)(_WidgetStore.default.instance, room.roomId, updateApps); (0, _useEventEmitter.useEventEmitter)(_WidgetLayoutStore.WidgetLayoutStore.instance, _WidgetLayoutStore.WidgetLayoutStore.emissionForRoom(room), updateApps); return apps; }; exports.useWidgets = useWidgets; const AppRow /*: React.FC<IAppRowProps>*/ = ({ app, room }) => { const name = _WidgetUtils.default.getWidgetName(app); const dataTitle = _WidgetUtils.default.getWidgetDataTitle(app); const subtitle = dataTitle && " - " + dataTitle; const onOpenWidgetClick = () => { _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.Widget, refireParams: { widgetId: app.id } }); }; const isPinned = _WidgetLayoutStore.WidgetLayoutStore.instance.isInContainer(room, app, _WidgetLayoutStore.Container.Top); const togglePin = isPinned ? () => { _WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, _WidgetLayoutStore.Container.Right); } : () => { _WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, _WidgetLayoutStore.Container.Top); }; const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); let contextMenu; if (menuDisplayed) { const rect = handle.current.getBoundingClientRect(); contextMenu = /*#__PURE__*/_react.default.createElement(_WidgetContextMenu.default, { chevronFace: _ContextMenu.ChevronFace.None, right: window.innerWidth - rect.right, bottom: window.innerHeight - rect.top, onFinished: closeMenu, app: app }); } const cannotPin = !isPinned && !_WidgetLayoutStore.WidgetLayoutStore.instance.canAddToContainer(room, _WidgetLayoutStore.Container.Top); let pinTitle /*: string*/ ; if (cannotPin) { pinTitle = (0, _languageHandler._t)("You can only pin up to %(count)s widgets", { count: _WidgetLayoutStore.MAX_PINNED }); } else { pinTitle = isPinned ? (0, _languageHandler._t)("Unpin") : (0, _languageHandler._t)("Pin"); } const classes = (0, _classnames.default)("mx_BaseCard_Button mx_RoomSummaryCard_Button", { mx_RoomSummaryCard_Button_pinned: isPinned }); return /*#__PURE__*/_react.default.createElement("div", { className: classes, ref: handle }, /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, { className: "mx_RoomSummaryCard_icon_app", onClick: onOpenWidgetClick // only show a tooltip if the widget is pinned , title: isPinned ? (0, _languageHandler._t)("Unpin a widget to view it in this panel") : "", forceHide: !isPinned, disabled: isPinned, yOffset: -48 }, /*#__PURE__*/_react.default.createElement(_WidgetAvatar.default, { app: app }), /*#__PURE__*/_react.default.createElement("span", null, name), subtitle), /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { className: "mx_RoomSummaryCard_app_options", isExpanded: menuDisplayed, onClick: openMenu, title: (0, _languageHandler._t)("Options"), yOffset: -24 }), /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, { className: "mx_RoomSummaryCard_app_pinToggle", onClick: togglePin, title: pinTitle, disabled: cannotPin, yOffset: -24 }), contextMenu); }; const AppsSection /*: React.FC<IAppsSectionProps>*/ = ({ room }) => { const apps = useWidgets(room); const onManageIntegrations = () => { const managers = _IntegrationManagers.IntegrationManagers.sharedInstance(); if (!managers.hasManager()) { managers.openNoManagerDialog(); } else { if (_SettingsStore.default.getValue("feature_many_integration_managers")) { managers.openAll(room); } else { managers.getPrimaryManager().open(room); } } }; let copyLayoutBtn = null; if (apps.length > 0 && _WidgetLayoutStore.WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) { copyLayoutBtn = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link", onClick: () => _WidgetLayoutStore.WidgetLayoutStore.instance.copyLayoutToRoom(room) }, (0, _languageHandler._t)("Set my room layout for everyone")); } return /*#__PURE__*/_react.default.createElement(_BaseCard.Group, { className: "mx_RoomSummaryCard_appsGroup", title: (0, _languageHandler._t)("Widgets") }, apps.map(app => /*#__PURE__*/_react.default.createElement(AppRow, { key: app.id, app: app, room: room })), copyLayoutBtn, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link", onClick: onManageIntegrations }, apps.length > 0 ? (0, _languageHandler._t)("Edit widgets, bridges & bots") : (0, _languageHandler._t)("Add widgets, bridges & bots"))); }; const onRoomMembersClick = () => { _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.RoomMemberList }); }; const onRoomFilesClick = () => { _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.FilePanel }); }; const onRoomSettingsClick = () => { _dispatcher.default.dispatch({ action: "open_room_settings" }); }; const RoomSummaryCard /*: React.FC<IProps>*/ = ({ room, onClose }) => { const cli = (0, _react.useContext)(_MatrixClientContext.default); const onShareRoomClick = () => { _Modal.default.createTrackedDialog('share room dialog', '', _ShareDialog.default, { target: room }); }; const isRoomEncrypted = (0, _useIsEncrypted.useIsEncrypted)(cli, room); const roomContext = (0, _react.useContext)(_RoomContext.default); const e2eStatus = roomContext.e2eStatus; const alias = room.getCanonicalAlias() || room.getAltAliases()[0] || ""; const header = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomSummaryCard_avatar", role: "presentation" }, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { room: room, height: 54, width: 54, viewAvatarOnClick: true }), /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, { tooltip: isRoomEncrypted ? (0, _languageHandler._t)("Encrypted") : (0, _languageHandler._t)("Not encrypted"), class: (0, _classnames.default)("mx_RoomSummaryCard_e2ee", { mx_RoomSummaryCard_e2ee_normal: isRoomEncrypted, mx_RoomSummaryCard_e2ee_warning: isRoomEncrypted && e2eStatus === _ShieldUtils.E2EStatus.Warning, mx_RoomSummaryCard_e2ee_verified: isRoomEncrypted && e2eStatus === _ShieldUtils.E2EStatus.Verified }) })), /*#__PURE__*/_react.default.createElement("h2", { title: room.name }, room.name), /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomSummaryCard_alias", title: alias }, alias)); const memberCount = (0, _useRoomMembers.useRoomMemberCount)(room); return /*#__PURE__*/_react.default.createElement(_BaseCard.default, { header: header, className: "mx_RoomSummaryCard", onClose: onClose }, /*#__PURE__*/_react.default.createElement(_BaseCard.Group, { title: (0, _languageHandler._t)("About"), className: "mx_RoomSummaryCard_aboutGroup" }, /*#__PURE__*/_react.default.createElement(Button, { className: "mx_RoomSummaryCard_icon_people", onClick: onRoomMembersClick }, (0, _languageHandler._t)("%(count)s people", { count: memberCount })), /*#__PURE__*/_react.default.createElement(Button, { className: "mx_RoomSummaryCard_icon_files", onClick: onRoomFilesClick }, (0, _languageHandler._t)("Show files")), /*#__PURE__*/_react.default.createElement(Button, { className: "mx_RoomSummaryCard_icon_share", onClick: onShareRoomClick }, (0, _languageHandler._t)("Share room")), /*#__PURE__*/_react.default.createElement(Button, { className: "mx_RoomSummaryCard_icon_settings", onClick: onRoomSettingsClick }, (0, _languageHandler._t)("Room settings"))), _SettingsStore.default.getValue(_UIFeature.UIFeature.Widgets) && /*#__PURE__*/_react.default.createElement(AppsSection, { room: room })); }; var _default = RoomSummaryCard; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3JpZ2h0X3BhbmVsL1Jvb21TdW1tYXJ5Q2FyZC50c3giXSwibmFtZXMiOlsiQnV0dG9uIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwidXNlV2lkZ2V0cyIsInJvb20iLCJhcHBzIiwic2V0QXBwcyIsIldpZGdldFN0b3JlIiwiaW5zdGFuY2UiLCJnZXRBcHBzIiwicm9vbUlkIiwidXBkYXRlQXBwcyIsIldpZGdldExheW91dFN0b3JlIiwiZW1pc3Npb25Gb3JSb29tIiwiQXBwUm93IiwiYXBwIiwibmFtZSIsIldpZGdldFV0aWxzIiwiZ2V0V2lkZ2V0TmFtZSIsImRhdGFUaXRsZSIsImdldFdpZGdldERhdGFUaXRsZSIsInN1YnRpdGxlIiwib25PcGVuV2lkZ2V0Q2xpY2siLCJkZWZhdWx0RGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiU2V0UmlnaHRQYW5lbFBoYXNlIiwicGhhc2UiLCJSaWdodFBhbmVsUGhhc2VzIiwiV2lkZ2V0IiwicmVmaXJlUGFyYW1zIiwid2lkZ2V0SWQiLCJpZCIsImlzUGlubmVkIiwiaXNJbkNvbnRhaW5lciIsIkNvbnRhaW5lciIsIlRvcCIsInRvZ2dsZVBpbiIsIm1vdmVUb0NvbnRhaW5lciIsIlJpZ2h0IiwibWVudURpc3BsYXllZCIsImhhbmRsZSIsIm9wZW5NZW51IiwiY2xvc2VNZW51IiwiY29udGV4dE1lbnUiLCJyZWN0IiwiY3VycmVudCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIkNoZXZyb25GYWNlIiwiTm9uZSIsIndpbmRvdyIsImlubmVyV2lkdGgiLCJyaWdodCIsImlubmVySGVpZ2h0IiwidG9wIiwiY2Fubm90UGluIiwiY2FuQWRkVG9Db250YWluZXIiLCJwaW5UaXRsZSIsImNvdW50IiwiTUFYX1BJTk5FRCIsImNsYXNzZXMiLCJteF9Sb29tU3VtbWFyeUNhcmRfQnV0dG9uX3Bpbm5lZCIsIkFwcHNTZWN0aW9uIiwib25NYW5hZ2VJbnRlZ3JhdGlvbnMiLCJtYW5hZ2VycyIsIkludGVncmF0aW9uTWFuYWdlcnMiLCJzaGFyZWRJbnN0YW5jZSIsImhhc01hbmFnZXIiLCJvcGVuTm9NYW5hZ2VyRGlhbG9nIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwib3BlbkFsbCIsImdldFByaW1hcnlNYW5hZ2VyIiwib3BlbiIsImNvcHlMYXlvdXRCdG4iLCJsZW5ndGgiLCJjYW5Db3B5TGF5b3V0VG9Sb29tIiwiY29weUxheW91dFRvUm9vbSIsIm1hcCIsIm9uUm9vbU1lbWJlcnNDbGljayIsIlJvb21NZW1iZXJMaXN0Iiwib25Sb29tRmlsZXNDbGljayIsIkZpbGVQYW5lbCIsIm9uUm9vbVNldHRpbmdzQ2xpY2siLCJSb29tU3VtbWFyeUNhcmQiLCJvbkNsb3NlIiwiY2xpIiwiTWF0cml4Q2xpZW50Q29udGV4dCIsIm9uU2hhcmVSb29tQ2xpY2siLCJNb2RhbCIsImNyZWF0ZVRyYWNrZWREaWFsb2ciLCJTaGFyZURpYWxvZyIsInRhcmdldCIsImlzUm9vbUVuY3J5cHRlZCIsInJvb21Db250ZXh0IiwiUm9vbUNvbnRleHQiLCJlMmVTdGF0dXMiLCJhbGlhcyIsImdldENhbm9uaWNhbEFsaWFzIiwiZ2V0QWx0QWxpYXNlcyIsImhlYWRlciIsIm14X1Jvb21TdW1tYXJ5Q2FyZF9lMmVlX25vcm1hbCIsIm14X1Jvb21TdW1tYXJ5Q2FyZF9lMmVlX3dhcm5pbmciLCJFMkVTdGF0dXMiLCJXYXJuaW5nIiwibXhfUm9vbVN1bW1hcnlDYXJkX2UyZWVfdmVyaWZpZWQiLCJWZXJpZmllZCIsIm1lbWJlckNvdW50IiwiVUlGZWF0dXJlIiwiV2lkZ2V0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FB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QUFBLFNBQVMsRUFBQyxnQ0FBbEI7QUFBbUQsSUFBQSxPQUFPLEVBQUVOO0FBQTVELEtBQ0sseUJBQUcsa0JBQUgsRUFBdUI7QUFBRXJCLElBQUFBLEtBQUssRUFBRWlEO0FBQVQsR0FBdkIsQ0FETCxDQURKLGVBSUksNkJBQUMsTUFBRDtBQUFRLElBQUEsU0FBUyxFQUFDLCtCQUFsQjtBQUFrRCxJQUFBLE9BQU8sRUFBRTFCO0FBQTNELEtBQ0sseUJBQUcsWUFBSCxDQURMLENBSkosZUFPSSw2QkFBQyxNQUFEO0FBQVEsSUFBQSxTQUFTLEVBQUMsK0JBQWxCO0FBQWtELElBQUEsT0FBTyxFQUFFTztBQUEzRCxLQUNLLHlCQUFHLFlBQUgsQ0FETCxDQVBKLGVBVUksNkJBQUMsTUFBRDtBQUFRLElBQUEsU0FBUyxFQUFDLGtDQUFsQjtBQUFxRCxJQUFBLE9BQU8sRUFBRUw7QUFBOUQsS0FDSyx5QkFBRyxlQUFILENBREwsQ0FWSixDQURHLEVBZ0JEZCx1QkFBY0MsUUFBZCxDQUF1QnNDLHFCQUFVQyxPQUFqQyxrQkFBNkMsNkJBQUMsV0FBRDtBQUFhLElBQUEsSUFBSSxFQUFFMUc7QUFBbkIsSUFoQjVDLENBQVA7QUFrQkgsQ0FyREQ7O2VBdURlaUYsZSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDb250ZXh0fSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQge1Jvb219IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuXG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlSXNFbmNyeXB0ZWQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VJc0VuY3J5cHRlZCc7XG5pbXBvcnQgQmFzZUNhcmQsIHsgR3JvdXAgfSBmcm9tIFwiLi9CYXNlQ2FyZFwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IFJvb21BdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvUm9vbUF2YXRhclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHtSaWdodFBhbmVsUGhhc2VzfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1JpZ2h0UGFuZWxTdG9yZVBoYXNlc1wiO1xuaW1wb3J0IHtTZXRSaWdodFBhbmVsUGhhc2VQYXlsb2FkfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9TZXRSaWdodFBhbmVsUGhhc2VQYXlsb2FkXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgU2hhcmVEaWFsb2cgZnJvbSAnLi4vZGlhbG9ncy9TaGFyZURpYWxvZyc7XG5pbXBvcnQge3VzZUV2ZW50RW1pdHRlcn0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IFdpZGdldFV0aWxzIGZyb20gXCIuLi8uLi8uLi91dGlscy9XaWRnZXRVdGlsc1wiO1xuaW1wb3J0IHtJbnRlZ3JhdGlvbk1hbmFnZXJzfSBmcm9tIFwiLi4vLi4vLi4vaW50ZWdyYXRpb25zL0ludGVncmF0aW9uTWFuYWdlcnNcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgVGV4dFdpdGhUb29sdGlwIGZyb20gXCIuLi9lbGVtZW50cy9UZXh0V2l0aFRvb2x0aXBcIjtcbmltcG9ydCBXaWRnZXRBdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvV2lkZ2V0QXZhdGFyXCI7XG5pbXBvcnQgQWNjZXNzaWJsZVRvb2x0aXBCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVUb29sdGlwQnV0dG9uXCI7XG5pbXBvcnQgV2lkZ2V0U3RvcmUsIHtJQXBwfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1dpZGdldFN0b3JlXCI7XG5pbXBvcnQgeyBFMkVTdGF0dXMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvU2hpZWxkVXRpbHNcIjtcbmltcG9ydCBSb29tQ29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvUm9vbUNvbnRleHRcIjtcbmltcG9ydCB7VUlGZWF0dXJlfSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvVUlGZWF0dXJlXCI7XG5pbXBvcnQge0NoZXZyb25GYWNlLCBDb250ZXh0TWVudVRvb2x0aXBCdXR0b24sIHVzZUNvbnRleHRNZW51fSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IFdpZGdldENvbnRleHRNZW51IGZyb20gXCIuLi9jb250ZXh0X21lbnVzL1dpZGdldENvbnRleHRNZW51XCI7XG5pbXBvcnQge3VzZVJvb21NZW1iZXJDb3VudH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZVJvb21NZW1iZXJzXCI7XG5pbXBvcnQgeyBDb250YWluZXIsIE1BWF9QSU5ORUQsIFdpZGdldExheW91dFN0b3JlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy93aWRnZXRzL1dpZGdldExheW91dFN0b3JlXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgb25DbG9zZSgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSUFwcHNTZWN0aW9uUHJvcHMge1xuICAgIHJvb206IFJvb207XG59XG5cbmludGVyZmFjZSBJQnV0dG9uUHJvcHMge1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIG9uQ2xpY2soKTogdm9pZDtcbn1cblxuY29uc3QgQnV0dG9uOiBSZWFjdC5GQzxJQnV0dG9uUHJvcHM+ID0gKHsgY2hpbGRyZW4sIGNsYXNzTmFtZSwgb25DbGljayB9KSA9PiB7XG4gICAgcmV0dXJuIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcIm14X0Jhc2VDYXJkX0J1dHRvbiBteF9Sb29tU3VtbWFyeUNhcmRfQnV0dG9uXCIsIGNsYXNzTmFtZSl9XG4gICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICA8L0FjY2Vzc2libGVCdXR0b24+O1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVdpZGdldHMgPSAocm9vbTogUm9vbSkgPT4ge1xuICAgIGNvbnN0IFthcHBzLCBzZXRBcHBzXSA9IHVzZVN0YXRlPElBcHBbXT4oV2lkZ2V0U3RvcmUuaW5zdGFuY2UuZ2V0QXBwcyhyb29tLnJvb21JZCkpO1xuXG4gICAgY29uc3QgdXBkYXRlQXBwcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgLy8gQ29weSB0aGUgYXJyYXkgc28gdGhhdCB3ZSBhbHdheXMgdHJpZ2dlciBhIHJlLXJlbmRlciwgYXMgc29tZSB1cGRhdGVzIG11dGF0ZSB0aGUgYXJyYXkgb2YgYXBwcy9zZXR0aW5nc1xuICAgICAgICBzZXRBcHBzKFsuLi5XaWRnZXRTdG9yZS5pbnN0YW5jZS5nZXRBcHBzKHJvb20ucm9vbUlkKV0pO1xuICAgIH0sIFtyb29tXSk7XG5cbiAgICB1c2VFZmZlY3QodXBkYXRlQXBwcywgW3Jvb20sIHVwZGF0ZUFwcHNdKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoV2lkZ2V0U3RvcmUuaW5zdGFuY2UsIHJvb20ucm9vbUlkLCB1cGRhdGVBcHBzKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UsIFdpZGdldExheW91dFN0b3JlLmVtaXNzaW9uRm9yUm9vbShyb29tKSwgdXBkYXRlQXBwcyk7XG5cbiAgICByZXR1cm4gYXBwcztcbn07XG5cbmludGVyZmFjZSBJQXBwUm93UHJvcHMge1xuICAgIGFwcDogSUFwcDtcbiAgICByb29tOiBSb29tO1xufVxuXG5jb25zdCBBcHBSb3c6IFJlYWN0LkZDPElBcHBSb3dQcm9wcz4gPSAoeyBhcHAsIHJvb20gfSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBXaWRnZXRVdGlscy5nZXRXaWRnZXROYW1lKGFwcCk7XG4gICAgY29uc3QgZGF0YVRpdGxlID0gV2lkZ2V0VXRpbHMuZ2V0V2lkZ2V0RGF0YVRpdGxlKGFwcCk7XG4gICAgY29uc3Qgc3VidGl0bGUgPSBkYXRhVGl0bGUgJiYgXCIgLSBcIiArIGRhdGFUaXRsZTtcblxuICAgIGNvbnN0IG9uT3BlbldpZGdldENsaWNrID0gKCkgPT4ge1xuICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaDxTZXRSaWdodFBhbmVsUGhhc2VQYXlsb2FkPih7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5TZXRSaWdodFBhbmVsUGhhc2UsXG4gICAgICAgICAgICBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5XaWRnZXQsXG4gICAgICAgICAgICByZWZpcmVQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB3aWRnZXRJZDogYXBwLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlzUGlubmVkID0gV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UuaXNJbkNvbnRhaW5lcihyb29tLCBhcHAsIENvbnRhaW5lci5Ub3ApO1xuICAgIGNvbnN0IHRvZ2dsZVBpbiA9IGlzUGlubmVkXG4gICAgICAgID8gKCkgPT4geyBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5tb3ZlVG9Db250YWluZXIocm9vbSwgYXBwLCBDb250YWluZXIuUmlnaHQpOyB9XG4gICAgICAgIDogKCkgPT4geyBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5tb3ZlVG9Db250YWluZXIocm9vbSwgYXBwLCBDb250YWluZXIuVG9wKTsgfTtcblxuICAgIGNvbnN0IFttZW51RGlzcGxheWVkLCBoYW5kbGUsIG9wZW5NZW51LCBjbG9zZU1lbnVdID0gdXNlQ29udGV4dE1lbnU8SFRNTERpdkVsZW1lbnQ+KCk7XG4gICAgbGV0IGNvbnRleHRNZW51O1xuICAgIGlmIChtZW51RGlzcGxheWVkKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBoYW5kbGUuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29udGV4dE1lbnUgPSA8V2lkZ2V0Q29udGV4dE1lbnVcbiAgICAgICAgICAgIGNoZXZyb25GYWNlPXtDaGV2cm9uRmFjZS5Ob25lfVxuICAgICAgICAgICAgcmlnaHQ9e3dpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5yaWdodH1cbiAgICAgICAgICAgIGJvdHRvbT17d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3B9XG4gICAgICAgICAgICBvbkZpbmlzaGVkPXtjbG9zZU1lbnV9XG4gICAgICAgICAgICBhcHA9e2FwcH1cbiAgICAgICAgLz47XG4gICAgfVxuXG4gICAgY29uc3QgY2Fubm90UGluID0gIWlzUGlubmVkICYmICFXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5jYW5BZGRUb0NvbnRhaW5lcihyb29tLCBDb250YWluZXIuVG9wKTtcblxuICAgIGxldCBwaW5UaXRsZTogc3RyaW5nO1xuICAgIGlmIChjYW5ub3RQaW4pIHtcbiAgICAgICAgcGluVGl0bGUgPSBfdChcIllvdSBjYW4gb25seSBwaW4gdXAgdG8gJShjb3VudClzIHdpZGdldHNcIiwgeyBjb3VudDogTUFYX1BJTk5FRCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwaW5UaXRsZSA9IGlzUGlubmVkID8gX3QoXCJVbnBpblwiKSA6IF90KFwiUGluXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfQmFzZUNhcmRfQnV0dG9uIG14X1Jvb21TdW1tYXJ5Q2FyZF9CdXR0b25cIiwge1xuICAgICAgICBteF9Sb29tU3VtbWFyeUNhcmRfQnV0dG9uX3Bpbm5lZDogaXNQaW5uZWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzZXN9IHJlZj17aGFuZGxlfT5cbiAgICAgICAgPEFjY2Vzc2libGVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Sb29tU3VtbWFyeUNhcmRfaWNvbl9hcHBcIlxuICAgICAgICAgICAgb25DbGljaz17b25PcGVuV2lkZ2V0Q2xpY2t9XG4gICAgICAgICAgICAvLyBvbmx5IHNob3cgYSB0b29sdGlwIGlmIHRoZSB3aWRnZXQgaXMgcGlubmVkXG4gICAgICAgICAgICB0aXRsZT17aXNQaW5uZWQgPyBfdChcIlVucGluIGEgd2lkZ2V0IHRvIHZpZXcgaXQgaW4gdGhpcyBwYW5lbFwiKSA6IFwiXCJ9XG4gICAgICAgICAgICBmb3JjZUhpZGU9eyFpc1Bpbm5lZH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtpc1Bpbm5lZH1cbiAgICAgICAgICAgIHlPZmZzZXQ9ey00OH1cbiAgICAgICAgPlxuICAgICAgICAgICAgPFdpZGdldEF2YXRhciBhcHA9e2FwcH0gLz5cbiAgICAgICAgICAgIDxzcGFuPntuYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgIHsgc3VidGl0bGUgfVxuICAgICAgICA8L0FjY2Vzc2libGVUb29sdGlwQnV0dG9uPlxuXG4gICAgICAgIDxDb250ZXh0TWVudVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9hcHBfb3B0aW9uc1wiXG4gICAgICAgICAgICBpc0V4cGFuZGVkPXttZW51RGlzcGxheWVkfVxuICAgICAgICAgICAgb25DbGljaz17b3Blbk1lbnV9XG4gICAgICAgICAgICB0aXRsZT17X3QoXCJPcHRpb25zXCIpfVxuICAgICAgICAgICAgeU9mZnNldD17LTI0fVxuICAgICAgICAvPlxuXG4gICAgICAgIDxBY2Nlc3NpYmxlVG9vbHRpcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX2FwcF9waW5Ub2dnbGVcIlxuICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlUGlufVxuICAgICAgICAgICAgdGl0bGU9e3BpblRpdGxlfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e2Nhbm5vdFBpbn1cbiAgICAgICAgICAgIHlPZmZzZXQ9ey0yNH1cbiAgICAgICAgLz5cblxuICAgICAgICB7IGNvbnRleHRNZW51IH1cbiAgICA8L2Rpdj47XG59O1xuXG5jb25zdCBBcHBzU2VjdGlvbjogUmVhY3QuRkM8SUFwcHNTZWN0aW9uUHJvcHM+ID0gKHsgcm9vbSB9KSA9PiB7XG4gICAgY29uc3QgYXBwcyA9IHVzZVdpZGdldHMocm9vbSk7XG5cbiAgICBjb25zdCBvbk1hbmFnZUludGVncmF0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFuYWdlcnMgPSBJbnRlZ3JhdGlvbk1hbmFnZXJzLnNoYXJlZEluc3RhbmNlKCk7XG4gICAgICAgIGlmICghbWFuYWdlcnMuaGFzTWFuYWdlcigpKSB7XG4gICAgICAgICAgICBtYW5hZ2Vycy5vcGVuTm9NYW5hZ2VyRGlhbG9nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfbWFueV9pbnRlZ3JhdGlvbl9tYW5hZ2Vyc1wiKSkge1xuICAgICAgICAgICAgICAgIG1hbmFnZXJzLm9wZW5BbGwocm9vbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hbmFnZXJzLmdldFByaW1hcnlNYW5hZ2VyKCkub3Blbihyb29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgY29weUxheW91dEJ0biA9IG51bGw7XG4gICAgaWYgKGFwcHMubGVuZ3RoID4gMCAmJiBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5jYW5Db3B5TGF5b3V0VG9Sb29tKHJvb20pKSB7XG4gICAgICAgIGNvcHlMYXlvdXRCdG4gPSAoXG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBraW5kPVwibGlua1wiIG9uQ2xpY2s9eygpID0+IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmNvcHlMYXlvdXRUb1Jvb20ocm9vbSl9PlxuICAgICAgICAgICAgICAgIHsgX3QoXCJTZXQgbXkgcm9vbSBsYXlvdXQgZm9yIGV2ZXJ5b25lXCIpIH1cbiAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gPEdyb3VwIGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9hcHBzR3JvdXBcIiB0aXRsZT17X3QoXCJXaWRnZXRzXCIpfT5cbiAgICAgICAgeyBhcHBzLm1hcChhcHAgPT4gPEFwcFJvdyBrZXk9e2FwcC5pZH0gYXBwPXthcHB9IHJvb209e3Jvb219IC8+KSB9XG4gICAgICAgIHsgY29weUxheW91dEJ0biB9XG4gICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJsaW5rXCIgb25DbGljaz17b25NYW5hZ2VJbnRlZ3JhdGlvbnN9PlxuICAgICAgICAgICAgeyBhcHBzLmxlbmd0aCA+IDAgPyBfdChcIkVkaXQgd2lkZ2V0cywgYnJpZGdlcyAmIGJvdHNcIikgOiBfdChcIkFkZCB3aWRnZXRzLCBicmlkZ2VzICYgYm90c1wiKSB9XG4gICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICA8L0dyb3VwPjtcbn07XG5cbmNvbnN0IG9uUm9vbU1lbWJlcnNDbGljayA9ICgpID0+IHtcbiAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaDxTZXRSaWdodFBhbmVsUGhhc2VQYXlsb2FkPih7XG4gICAgICAgIGFjdGlvbjogQWN0aW9uLlNldFJpZ2h0UGFuZWxQaGFzZSxcbiAgICAgICAgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckxpc3QsXG4gICAgfSk7XG59O1xuXG5jb25zdCBvblJvb21GaWxlc0NsaWNrID0gKCkgPT4ge1xuICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFNldFJpZ2h0UGFuZWxQaGFzZVBheWxvYWQ+KHtcbiAgICAgICAgYWN0aW9uOiBBY3Rpb24uU2V0UmlnaHRQYW5lbFBoYXNlLFxuICAgICAgICBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5GaWxlUGFuZWwsXG4gICAgfSk7XG59O1xuXG5jb25zdCBvblJvb21TZXR0aW5nc0NsaWNrID0gKCkgPT4ge1xuICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHsgYWN0aW9uOiBcIm9wZW5fcm9vbV9zZXR0aW5nc1wiIH0pO1xufTtcblxuY29uc3QgUm9vbVN1bW1hcnlDYXJkOiBSZWFjdC5GQzxJUHJvcHM+ID0gKHsgcm9vbSwgb25DbG9zZSB9KSA9PiB7XG4gICAgY29uc3QgY2xpID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcblxuICAgIGNvbnN0IG9uU2hhcmVSb29tQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIE1vZGFsLmNyZWF0ZVRyYWNrZWREaWFsb2coJ3NoYXJlIHJvb20gZGlhbG9nJywgJycsIFNoYXJlRGlhbG9nLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IHJvb20sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBpc1Jvb21FbmNyeXB0ZWQgPSB1c2VJc0VuY3J5cHRlZChjbGksIHJvb20pO1xuICAgIGNvbnN0IHJvb21Db250ZXh0ID0gdXNlQ29udGV4dChSb29tQ29udGV4dCk7XG4gICAgY29uc3QgZTJlU3RhdHVzID0gcm9vbUNvbnRleHQuZTJlU3RhdHVzO1xuXG4gICAgY29uc3QgYWxpYXMgPSByb29tLmdldENhbm9uaWNhbEFsaWFzKCkgfHwgcm9vbS5nZXRBbHRBbGlhc2VzKClbMF0gfHwgXCJcIjtcbiAgICBjb25zdCBoZWFkZXIgPSA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX2F2YXRhclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgIDxSb29tQXZhdGFyIHJvb209e3Jvb219IGhlaWdodD17NTR9IHdpZHRoPXs1NH0gdmlld0F2YXRhck9uQ2xpY2sgLz5cbiAgICAgICAgICAgIDxUZXh0V2l0aFRvb2x0aXBcbiAgICAgICAgICAgICAgICB0b29sdGlwPXtpc1Jvb21FbmNyeXB0ZWQgPyBfdChcIkVuY3J5cHRlZFwiKSA6IF90KFwiTm90IGVuY3J5cHRlZFwiKX1cbiAgICAgICAgICAgICAgICBjbGFzcz17Y2xhc3NOYW1lcyhcIm14X1Jvb21TdW1tYXJ5Q2FyZF9lMmVlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgbXhfUm9vbVN1bW1hcnlDYXJkX2UyZWVfbm9ybWFsOiBpc1Jvb21FbmNyeXB0ZWQsXG4gICAgICAgICAgICAgICAgICAgIG14X1Jvb21TdW1tYXJ5Q2FyZF9lMmVlX3dhcm5pbmc6IGlzUm9vbUVuY3J5cHRlZCAmJiBlMmVTdGF0dXMgPT09IEUyRVN0YXR1cy5XYXJuaW5nLFxuICAgICAgICAgICAgICAgICAgICBteF9Sb29tU3VtbWFyeUNhcmRfZTJlZV92ZXJpZmllZDogaXNSb29tRW5jcnlwdGVkICYmIGUyZVN0YXR1cyA9PT0gRTJFU3RhdHVzLlZlcmlmaWVkLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGgyIHRpdGxlPXtyb29tLm5hbWV9Pnsgcm9vbS5uYW1lIH08L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9hbGlhc1wiIHRpdGxlPXthbGlhc30+XG4gICAgICAgICAgICB7IGFsaWFzIH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9SZWFjdC5GcmFnbWVudD47XG5cbiAgICBjb25zdCBtZW1iZXJDb3VudCA9IHVzZVJvb21NZW1iZXJDb3VudChyb29tKTtcblxuICAgIHJldHVybiA8QmFzZUNhcmQgaGVhZGVyPXtoZWFkZXJ9IGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZFwiIG9uQ2xvc2U9e29uQ2xvc2V9PlxuICAgICAgICA8R3JvdXAgdGl0bGU9e190KFwiQWJvdXRcIil9IGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9hYm91dEdyb3VwXCI+XG4gICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9pY29uX3Blb3BsZVwiIG9uQ2xpY2s9e29uUm9vbU1lbWJlcnNDbGlja30+XG4gICAgICAgICAgICAgICAge190KFwiJShjb3VudClzIHBlb3BsZVwiLCB7IGNvdW50OiBtZW1iZXJDb3VudCB9KX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJteF9Sb29tU3VtbWFyeUNhcmRfaWNvbl9maWxlc1wiIG9uQ2xpY2s9e29uUm9vbUZpbGVzQ2xpY2t9PlxuICAgICAgICAgICAgICAgIHtfdChcIlNob3cgZmlsZXNcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX2ljb25fc2hhcmVcIiBvbkNsaWNrPXtvblNoYXJlUm9vbUNsaWNrfT5cbiAgICAgICAgICAgICAgICB7X3QoXCJTaGFyZSByb29tXCIpfVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9pY29uX3NldHRpbmdzXCIgb25DbGljaz17b25Sb29tU2V0dGluZ3NDbGlja30+XG4gICAgICAgICAgICAgICAge190KFwiUm9vbSBzZXR0aW5nc1wiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L0dyb3VwPlxuXG4gICAgICAgIHsgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShVSUZlYXR1cmUuV2lkZ2V0cykgJiYgPEFwcHNTZWN0aW9uIHJvb209e3Jvb219IC8+IH1cbiAgICA8L0Jhc2VDYXJkPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvb21TdW1tYXJ5Q2FyZDtcbiJdfQ==