UNPKG

matrix-react-sdk

Version:
307 lines (304 loc) 51.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.SpaceItem = exports.SpaceButton = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _matrix = require("matrix-js-sdk/src/matrix"); var _types = require("matrix-js-sdk/src/types"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _SpaceStore = _interopRequireDefault(require("../../../stores/spaces/SpaceStore")); var _SpaceTreeLevelLayoutStore = _interopRequireDefault(require("../../../stores/spaces/SpaceTreeLevelLayoutStore")); var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge")); var _languageHandler = require("../../../languageHandler"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); var _ContextMenuTooltipButton = require("../../../accessibility/context_menu/ContextMenuTooltipButton"); var _ContextMenu = require("../../structures/ContextMenu"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState"); var _NotificationLevel = require("../../../stores/notifications/NotificationLevel"); var _KeyBindingsManager = require("../../../KeyBindingsManager"); var _SpaceContextMenu = _interopRequireDefault(require("../context_menus/SpaceContextMenu")); var _RovingTabIndex = require("../../../accessibility/RovingTabIndex"); var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts"); const _excluded = ["space", "spaceKey", "className", "selected", "label", "contextMenuTooltip", "notificationState", "size", "isNarrow", "children", "innerRef", "ContextMenuComponent"], _excluded2 = ["space", "activeSpaces", "isNested", "isPanelCollapsed", "onExpand", "parents", "innerRef", "dragHandleProps"], _excluded3 = ["tabIndex"]; /* Copyright 2024 New Vector Ltd. Copyright 2021-2023 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ 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; } const SpaceButton = _ref => { let { space, spaceKey: _spaceKey, className, selected, label, contextMenuTooltip, notificationState, size, isNarrow, children, innerRef, ContextMenuComponent } = _ref, props = (0, _objectWithoutProperties2.default)(_ref, _excluded); const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(innerRef); const [onFocus, isActive] = (0, _RovingTabIndex.useRovingTabIndex)(handle); const tabIndex = isActive ? 0 : -1; const spaceKey = _spaceKey ?? space?.roomId; let avatar = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_avatarPlaceholder" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_icon" })); if (space) { avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { size: size, room: space, type: "square" }); } let notifBadge; if (spaceKey && notificationState) { let ariaLabel = (0, _languageHandler._t)("a11y_jump_first_unread_room"); if (space?.getMyMembership() === _types.KnownMembership.Invite) { ariaLabel = (0, _languageHandler._t)("a11y|jump_first_invite"); } const jumpToNotification = ev => { ev.stopPropagation(); ev.preventDefault(); _SpaceStore.default.instance.setActiveRoomInSpace(spaceKey); }; notifBadge = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpacePanel_badgeContainer" }, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, { onClick: jumpToNotification, notification: notificationState, "aria-label": ariaLabel, tabIndex: tabIndex, showUnsentTooltip: true })); } let contextMenu; if (menuDisplayed && handle.current && ContextMenuComponent) { contextMenu = /*#__PURE__*/_react.default.createElement(ContextMenuComponent, (0, _extends2.default)({}, (0, _ContextMenu.toRightOf)(handle.current.getBoundingClientRect(), 0), { space: space, onFinished: closeMenu })); } const viewSpaceHome = () => // space is set here because of the assignment condition of onClick _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: space.roomId }); const activateSpace = () => { if (spaceKey) _SpaceStore.default.instance.setActiveSpace(spaceKey); }; const onClick = props.onClick ?? (selected && space ? viewSpaceHome : activateSpace); return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({}, props, { className: (0, _classnames.default)("mx_SpaceButton", className, { mx_SpaceButton_active: selected, mx_SpaceButton_hasMenuOpen: menuDisplayed, mx_SpaceButton_narrow: isNarrow }), "aria-label": label, title: !isNarrow || menuDisplayed ? undefined : label, onClick: onClick, onContextMenu: openMenu, ref: handle, tabIndex: tabIndex, onFocus: onFocus }), children, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_selectionWrapper" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_avatarWrapper" }, avatar, notifBadge), !isNarrow && /*#__PURE__*/_react.default.createElement("span", { className: "mx_SpaceButton_name" }, label), ContextMenuComponent && /*#__PURE__*/_react.default.createElement(_ContextMenuTooltipButton.ContextMenuTooltipButton, { className: "mx_SpaceButton_menuButton", onClick: openMenu, title: contextMenuTooltip, isExpanded: menuDisplayed }), contextMenu)); }; exports.SpaceButton = SpaceButton; class SpaceItem extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "buttonRef", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onSpaceUpdate", () => { this.setState({ childSpaces: this.childSpaces }); }); (0, _defineProperty2.default)(this, "onRoomNameChange", () => { this.setState({ name: this.props.space.name }); }); (0, _defineProperty2.default)(this, "toggleCollapse", evt => { if (this.props.onExpand && this.isCollapsed) { this.props.onExpand(); } const newCollapsedState = !this.isCollapsed; _SpaceTreeLevelLayoutStore.default.instance.setSpaceCollapsedState(this.props.space.roomId, this.props.parents, newCollapsedState); this.setState({ collapsed: newCollapsedState }); // don't bubble up so encapsulating button for space // doesn't get triggered evt.stopPropagation(); }); (0, _defineProperty2.default)(this, "onKeyDown", ev => { let handled = true; const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getRoomListAction(ev); const hasChildren = this.state.childSpaces?.length; switch (action) { case _KeyboardShortcuts.KeyBindingAction.CollapseRoomListSection: if (hasChildren && !this.isCollapsed) { this.toggleCollapse(ev); } else { const parentItem = this.buttonRef?.current?.parentElement?.parentElement; const parentButton = parentItem?.previousElementSibling; parentButton?.focus(); } break; case _KeyboardShortcuts.KeyBindingAction.ExpandRoomListSection: if (hasChildren) { if (this.isCollapsed) { this.toggleCollapse(ev); } else { const childLevel = this.buttonRef?.current?.nextElementSibling; const firstSpaceItemChild = childLevel?.querySelector(".mx_SpaceItem"); firstSpaceItemChild?.querySelector(".mx_SpaceButton")?.focus(); } } break; default: handled = false; } if (handled) { ev.stopPropagation(); ev.preventDefault(); } }); const collapsed = _SpaceTreeLevelLayoutStore.default.instance.getSpaceCollapsedState(props.space.roomId, this.props.parents, !props.isNested // default to collapsed for root items ); this.state = { name: this.props.space.name, collapsed, childSpaces: this.childSpaces }; _SpaceStore.default.instance.on(this.props.space.roomId, this.onSpaceUpdate); this.props.space.on(_matrix.RoomEvent.Name, this.onRoomNameChange); } componentWillUnmount() { _SpaceStore.default.instance.off(this.props.space.roomId, this.onSpaceUpdate); this.props.space.off(_matrix.RoomEvent.Name, this.onRoomNameChange); } get childSpaces() { return _SpaceStore.default.instance.getChildSpaces(this.props.space.roomId).filter(s => !this.props.parents?.has(s.roomId)); } get isCollapsed() { return this.state.collapsed || !!this.props.isPanelCollapsed; } render() { // eslint-disable-next-line @typescript-eslint/no-unused-vars const _this$props = this.props, { space, activeSpaces, isNested, isPanelCollapsed, onExpand, parents, innerRef, dragHandleProps } = _this$props, otherProps = (0, _objectWithoutProperties2.default)(_this$props, _excluded2); const collapsed = this.isCollapsed; const itemClasses = (0, _classnames.default)(this.props.className, { mx_SpaceItem: true, mx_SpaceItem_narrow: isPanelCollapsed, collapsed: collapsed, hasSubSpaces: this.state.childSpaces?.length }); const isInvite = space.getMyMembership() === _types.KnownMembership.Invite; const notificationState = isInvite ? _StaticNotificationState.StaticNotificationState.forSymbol("!", _NotificationLevel.NotificationLevel.Highlight) : _SpaceStore.default.instance.getNotificationState(space.roomId); const hasChildren = this.state.childSpaces?.length; let childItems; if (hasChildren && !collapsed) { childItems = /*#__PURE__*/_react.default.createElement(SpaceTreeLevel, { spaces: this.state.childSpaces, activeSpaces: activeSpaces, isNested: true, parents: new Set(parents).add(space.roomId) }); } const toggleCollapseButton = hasChildren ? /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_SpaceButton_toggleCollapse", onClick: this.toggleCollapse, tabIndex: -1, "aria-label": collapsed ? (0, _languageHandler._t)("action|expand") : (0, _languageHandler._t)("action|collapse") }) : null; // eslint-disable-next-line @typescript-eslint/no-unused-vars const _ref2 = dragHandleProps || {}, { tabIndex } = _ref2, restDragHandleProps = (0, _objectWithoutProperties2.default)(_ref2, _excluded3); const selected = activeSpaces.includes(space.roomId); return /*#__PURE__*/_react.default.createElement("li", (0, _extends2.default)({}, otherProps, { className: itemClasses, ref: innerRef, "aria-expanded": hasChildren ? !collapsed : undefined, "aria-selected": selected, role: "treeitem" }), /*#__PURE__*/_react.default.createElement(SpaceButton, (0, _extends2.default)({}, restDragHandleProps, { space: space, className: isInvite ? "mx_SpaceButton_invite" : undefined, selected: selected, label: this.state.name, contextMenuTooltip: (0, _languageHandler._t)("space|context_menu|options"), notificationState: notificationState, isNarrow: isPanelCollapsed, size: isNested ? "24px" : "32px", onKeyDown: this.onKeyDown, ContextMenuComponent: this.props.space.getMyMembership() === _types.KnownMembership.Join ? _SpaceContextMenu.default : undefined }), toggleCollapseButton), childItems); } } exports.SpaceItem = SpaceItem; const SpaceTreeLevel = ({ spaces, activeSpaces, isNested, parents }) => { return /*#__PURE__*/_react.default.createElement("ul", { className: "mx_SpaceTreeLevel", role: "group" }, spaces.map(s => { return /*#__PURE__*/_react.default.createElement(SpaceItem, { key: s.roomId, activeSpaces: activeSpaces, space: s, isNested: isNested, parents: parents }); })); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWF0cml4IiwiX3R5cGVzIiwiX1Jvb21BdmF0YXIiLCJfU3BhY2VTdG9yZSIsIl9TcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIiwiX05vdGlmaWNhdGlvbkJhZGdlIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIiwiX0NvbnRleHRNZW51IiwiX0FjY2Vzc2libGVCdXR0b24iLCJfU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJfTm90aWZpY2F0aW9uTGV2ZWwiLCJfS2V5QmluZGluZ3NNYW5hZ2VyIiwiX1NwYWNlQ29udGV4dE1lbnUiLCJfUm92aW5nVGFiSW5kZXgiLCJfS2V5Ym9hcmRTaG9ydGN1dHMiLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX2V4Y2x1ZGVkMyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlNwYWNlQnV0dG9uIiwiX3JlZiIsInNwYWNlIiwic3BhY2VLZXkiLCJfc3BhY2VLZXkiLCJjbGFzc05hbWUiLCJzZWxlY3RlZCIsImxhYmVsIiwiY29udGV4dE1lbnVUb29sdGlwIiwibm90aWZpY2F0aW9uU3RhdGUiLCJzaXplIiwiaXNOYXJyb3ciLCJjaGlsZHJlbiIsImlubmVyUmVmIiwiQ29udGV4dE1lbnVDb21wb25lbnQiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJtZW51RGlzcGxheWVkIiwiaGFuZGxlIiwib3Blbk1lbnUiLCJjbG9zZU1lbnUiLCJ1c2VDb250ZXh0TWVudSIsIm9uRm9jdXMiLCJpc0FjdGl2ZSIsInVzZVJvdmluZ1RhYkluZGV4IiwidGFiSW5kZXgiLCJyb29tSWQiLCJhdmF0YXIiLCJjcmVhdGVFbGVtZW50Iiwicm9vbSIsInR5cGUiLCJub3RpZkJhZGdlIiwiYXJpYUxhYmVsIiwiX3QiLCJnZXRNeU1lbWJlcnNoaXAiLCJLbm93bk1lbWJlcnNoaXAiLCJJbnZpdGUiLCJqdW1wVG9Ob3RpZmljYXRpb24iLCJldiIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiU3BhY2VTdG9yZSIsImluc3RhbmNlIiwic2V0QWN0aXZlUm9vbUluU3BhY2UiLCJvbkNsaWNrIiwibm90aWZpY2F0aW9uIiwic2hvd1Vuc2VudFRvb2x0aXAiLCJjb250ZXh0TWVudSIsImN1cnJlbnQiLCJfZXh0ZW5kczIiLCJ0b1JpZ2h0T2YiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvbkZpbmlzaGVkIiwidmlld1NwYWNlSG9tZSIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3Um9vbSIsInJvb21faWQiLCJhY3RpdmF0ZVNwYWNlIiwic2V0QWN0aXZlU3BhY2UiLCJjbGFzc05hbWVzIiwibXhfU3BhY2VCdXR0b25fYWN0aXZlIiwibXhfU3BhY2VCdXR0b25faGFzTWVudU9wZW4iLCJteF9TcGFjZUJ1dHRvbl9uYXJyb3ciLCJ0aXRsZSIsInVuZGVmaW5lZCIsIm9uQ29udGV4dE1lbnUiLCJyZWYiLCJDb250ZXh0TWVudVRvb2x0aXBCdXR0b24iLCJpc0V4cGFuZGVkIiwiZXhwb3J0cyIsIlNwYWNlSXRlbSIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInNldFN0YXRlIiwiY2hpbGRTcGFjZXMiLCJuYW1lIiwiZXZ0Iiwib25FeHBhbmQiLCJpc0NvbGxhcHNlZCIsIm5ld0NvbGxhcHNlZFN0YXRlIiwiU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZSIsInNldFNwYWNlQ29sbGFwc2VkU3RhdGUiLCJwYXJlbnRzIiwiY29sbGFwc2VkIiwiaGFuZGxlZCIsImdldEtleUJpbmRpbmdzTWFuYWdlciIsImdldFJvb21MaXN0QWN0aW9uIiwiaGFzQ2hpbGRyZW4iLCJzdGF0ZSIsImxlbmd0aCIsIktleUJpbmRpbmdBY3Rpb24iLCJDb2xsYXBzZVJvb21MaXN0U2VjdGlvbiIsInRvZ2dsZUNvbGxhcHNlIiwicGFyZW50SXRlbSIsImJ1dHRvblJlZiIsInBhcmVudEVsZW1lbnQiLCJwYXJlbnRCdXR0b24iLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiZm9jdXMiLCJFeHBhbmRSb29tTGlzdFNlY3Rpb24iLCJjaGlsZExldmVsIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZmlyc3RTcGFjZUl0ZW1DaGlsZCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRTcGFjZUNvbGxhcHNlZFN0YXRlIiwiaXNOZXN0ZWQiLCJvbiIsIm9uU3BhY2VVcGRhdGUiLCJSb29tRXZlbnQiLCJOYW1lIiwib25Sb29tTmFtZUNoYW5nZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwiZ2V0Q2hpbGRTcGFjZXMiLCJmaWx0ZXIiLCJzIiwiaXNQYW5lbENvbGxhcHNlZCIsInJlbmRlciIsIl90aGlzJHByb3BzIiwiYWN0aXZlU3BhY2VzIiwiZHJhZ0hhbmRsZVByb3BzIiwib3RoZXJQcm9wcyIsIml0ZW1DbGFzc2VzIiwibXhfU3BhY2VJdGVtIiwibXhfU3BhY2VJdGVtX25hcnJvdyIsImhhc1N1YlNwYWNlcyIsImlzSW52aXRlIiwiU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJmb3JTeW1ib2wiLCJOb3RpZmljYXRpb25MZXZlbCIsIkhpZ2hsaWdodCIsImdldE5vdGlmaWNhdGlvblN0YXRlIiwiY2hpbGRJdGVtcyIsIlNwYWNlVHJlZUxldmVsIiwic3BhY2VzIiwiU2V0IiwiYWRkIiwidG9nZ2xlQ29sbGFwc2VCdXR0b24iLCJfcmVmMiIsInJlc3REcmFnSGFuZGxlUHJvcHMiLCJpbmNsdWRlcyIsInJvbGUiLCJvbktleURvd24iLCJKb2luIiwiU3BhY2VDb250ZXh0TWVudSIsIm1hcCIsImtleSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NwYWNlcy9TcGFjZVRyZWVMZXZlbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEtMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHtcbiAgICBNb3VzZUV2ZW50LFxuICAgIENvbXBvbmVudFByb3BzLFxuICAgIENvbXBvbmVudFR5cGUsXG4gICAgY3JlYXRlUmVmLFxuICAgIElucHV0SFRNTEF0dHJpYnV0ZXMsXG4gICAgTGVnYWN5UmVmLFxuICAgIFJlZk9iamVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgUm9vbSwgUm9vbUV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgS25vd25NZW1iZXJzaGlwIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBEcmFnZ2FibGVQcm92aWRlZERyYWdIYW5kbGVQcm9wcyB9IGZyb20gXCJyZWFjdC1iZWF1dGlmdWwtZG5kXCI7XG5cbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL1Jvb21BdmF0YXJcIjtcbmltcG9ydCBTcGFjZVN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvc3BhY2VzL1NwYWNlU3RvcmVcIjtcbmltcG9ydCB7IFNwYWNlS2V5IH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9zcGFjZXNcIjtcbmltcG9ydCBTcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvc3BhY2VzL1NwYWNlVHJlZUxldmVsTGF5b3V0U3RvcmVcIjtcbmltcG9ydCBOb3RpZmljYXRpb25CYWRnZSBmcm9tIFwiLi4vcm9vbXMvTm90aWZpY2F0aW9uQmFkZ2VcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IENvbnRleHRNZW51VG9vbHRpcEJ1dHRvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L2NvbnRleHRfbWVudS9Db250ZXh0TWVudVRvb2x0aXBCdXR0b25cIjtcbmltcG9ydCB7IHRvUmlnaHRPZiwgdXNlQ29udGV4dE1lbnUgfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgU3RhdGljTm90aWZpY2F0aW9uU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvU3RhdGljTm90aWZpY2F0aW9uU3RhdGVcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkxldmVsIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkxldmVsXCI7XG5pbXBvcnQgeyBnZXRLZXlCaW5kaW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vS2V5QmluZGluZ3NNYW5hZ2VyXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25TdGF0ZVwiO1xuaW1wb3J0IFNwYWNlQ29udGV4dE1lbnUgZnJvbSBcIi4uL2NvbnRleHRfbWVudXMvU3BhY2VDb250ZXh0TWVudVwiO1xuaW1wb3J0IHsgdXNlUm92aW5nVGFiSW5kZXggfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9Sb3ZpbmdUYWJJbmRleFwiO1xuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5cbnR5cGUgQnV0dG9uUHJvcHM8VCBleHRlbmRzIGtleW9mIEpTWC5JbnRyaW5zaWNFbGVtZW50cz4gPSBPbWl0PFxuICAgIENvbXBvbmVudFByb3BzPHR5cGVvZiBBY2Nlc3NpYmxlQnV0dG9uPFQ+PixcbiAgICBcInRpdGxlXCIgfCBcIm9uQ2xpY2tcIiB8IFwic2l6ZVwiIHwgXCJlbGVtZW50XCJcbj4gJiB7XG4gICAgc3BhY2U/OiBSb29tO1xuICAgIHNwYWNlS2V5PzogU3BhY2VLZXk7XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbnRleHRNZW51VG9vbHRpcD86IHN0cmluZztcbiAgICBub3RpZmljYXRpb25TdGF0ZT86IE5vdGlmaWNhdGlvblN0YXRlO1xuICAgIGlzTmFycm93PzogYm9vbGVhbjtcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgaW5uZXJSZWY/OiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xuICAgIENvbnRleHRNZW51Q29tcG9uZW50PzogQ29tcG9uZW50VHlwZTxDb21wb25lbnRQcm9wczx0eXBlb2YgU3BhY2VDb250ZXh0TWVudT4+O1xuICAgIG9uQ2xpY2s/KGV2PzogQnV0dG9uRXZlbnQpOiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IFNwYWNlQnV0dG9uID0gPFQgZXh0ZW5kcyBrZXlvZiBKU1guSW50cmluc2ljRWxlbWVudHM+KHtcbiAgICBzcGFjZSxcbiAgICBzcGFjZUtleTogX3NwYWNlS2V5LFxuICAgIGNsYXNzTmFtZSxcbiAgICBzZWxlY3RlZCxcbiAgICBsYWJlbCxcbiAgICBjb250ZXh0TWVudVRvb2x0aXAsXG4gICAgbm90aWZpY2F0aW9uU3RhdGUsXG4gICAgc2l6ZSxcbiAgICBpc05hcnJvdyxcbiAgICBjaGlsZHJlbixcbiAgICBpbm5lclJlZixcbiAgICBDb250ZXh0TWVudUNvbXBvbmVudCxcbiAgICAuLi5wcm9wc1xufTogQnV0dG9uUHJvcHM8VD4pOiBKU1guRWxlbWVudCA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGhhbmRsZSwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudTxIVE1MRWxlbWVudD4oaW5uZXJSZWYpO1xuICAgIGNvbnN0IFtvbkZvY3VzLCBpc0FjdGl2ZV0gPSB1c2VSb3ZpbmdUYWJJbmRleChoYW5kbGUpO1xuICAgIGNvbnN0IHRhYkluZGV4ID0gaXNBY3RpdmUgPyAwIDogLTE7XG5cbiAgICBjb25zdCBzcGFjZUtleSA9IF9zcGFjZUtleSA/PyBzcGFjZT8ucm9vbUlkO1xuXG4gICAgbGV0IGF2YXRhciA9IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9hdmF0YXJQbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9pY29uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbiAgICBpZiAoc3BhY2UpIHtcbiAgICAgICAgYXZhdGFyID0gPFJvb21BdmF0YXIgc2l6ZT17c2l6ZX0gcm9vbT17c3BhY2V9IHR5cGU9XCJzcXVhcmVcIiAvPjtcbiAgICB9XG5cbiAgICBsZXQgbm90aWZCYWRnZTtcbiAgICBpZiAoc3BhY2VLZXkgJiYgbm90aWZpY2F0aW9uU3RhdGUpIHtcbiAgICAgICAgbGV0IGFyaWFMYWJlbCA9IF90KFwiYTExeV9qdW1wX2ZpcnN0X3VucmVhZF9yb29tXCIpO1xuICAgICAgICBpZiAoc3BhY2U/LmdldE15TWVtYmVyc2hpcCgpID09PSBLbm93bk1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICBhcmlhTGFiZWwgPSBfdChcImExMXl8anVtcF9maXJzdF9pbnZpdGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqdW1wVG9Ob3RpZmljYXRpb24gPSAoZXY6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2Uuc2V0QWN0aXZlUm9vbUluU3BhY2Uoc3BhY2VLZXkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG5vdGlmQmFkZ2UgPSAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlUGFuZWxfYmFkZ2VDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8Tm90aWZpY2F0aW9uQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17anVtcFRvTm90aWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb249e25vdGlmaWNhdGlvblN0YXRlfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXthcmlhTGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PXt0YWJJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgc2hvd1Vuc2VudFRvb2x0aXA9e3RydWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCBjb250ZXh0TWVudTogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG1lbnVEaXNwbGF5ZWQgJiYgaGFuZGxlLmN1cnJlbnQgJiYgQ29udGV4dE1lbnVDb21wb25lbnQpIHtcbiAgICAgICAgY29udGV4dE1lbnUgPSAoXG4gICAgICAgICAgICA8Q29udGV4dE1lbnVDb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4udG9SaWdodE9mKGhhbmRsZS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCAwKX1cbiAgICAgICAgICAgICAgICBzcGFjZT17c3BhY2V9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3U3BhY2VIb21lID0gKCk6IHZvaWQgPT5cbiAgICAgICAgLy8gc3BhY2UgaXMgc2V0IGhlcmUgYmVjYXVzZSBvZiB0aGUgYXNzaWdubWVudCBjb25kaXRpb24gb2Ygb25DbGlja1xuICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7IGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLCByb29tX2lkOiBzcGFjZSEucm9vbUlkIH0pO1xuICAgIGNvbnN0IGFjdGl2YXRlU3BhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzcGFjZUtleSkgU3BhY2VTdG9yZS5pbnN0YW5jZS5zZXRBY3RpdmVTcGFjZShzcGFjZUtleSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkNsaWNrID0gcHJvcHMub25DbGljayA/PyAoc2VsZWN0ZWQgJiYgc3BhY2UgPyB2aWV3U3BhY2VIb21lIDogYWN0aXZhdGVTcGFjZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfU3BhY2VCdXR0b25cIiwgY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAgICAgbXhfU3BhY2VCdXR0b25fYWN0aXZlOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICBteF9TcGFjZUJ1dHRvbl9oYXNNZW51T3BlbjogbWVudURpc3BsYXllZCxcbiAgICAgICAgICAgICAgICBteF9TcGFjZUJ1dHRvbl9uYXJyb3c6IGlzTmFycm93LFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgIHRpdGxlPXshaXNOYXJyb3cgfHwgbWVudURpc3BsYXllZCA/IHVuZGVmaW5lZCA6IGxhYmVsfVxuICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgIG9uQ29udGV4dE1lbnU9e29wZW5NZW51fVxuICAgICAgICAgICAgcmVmPXtoYW5kbGV9XG4gICAgICAgICAgICB0YWJJbmRleD17dGFiSW5kZXh9XG4gICAgICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX3NlbGVjdGlvbldyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX2F2YXRhcldyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge2F2YXRhcn1cbiAgICAgICAgICAgICAgICAgICAge25vdGlmQmFkZ2V9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyFpc05hcnJvdyAmJiA8c3BhbiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9uYW1lXCI+e2xhYmVsfTwvc3Bhbj59XG5cbiAgICAgICAgICAgICAgICB7Q29udGV4dE1lbnVDb21wb25lbnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8Q29udGV4dE1lbnVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9tZW51QnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29wZW5NZW51fVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2NvbnRleHRNZW51VG9vbHRpcH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e21lbnVEaXNwbGF5ZWR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHtjb250ZXh0TWVudX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJSXRlbVByb3BzIGV4dGVuZHMgSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MTElFbGVtZW50PiB7XG4gICAgc3BhY2U6IFJvb207XG4gICAgYWN0aXZlU3BhY2VzOiBTcGFjZUtleVtdO1xuICAgIGlzTmVzdGVkPzogYm9vbGVhbjtcbiAgICBpc1BhbmVsQ29sbGFwc2VkPzogYm9vbGVhbjtcbiAgICBvbkV4cGFuZD86IEZ1bmN0aW9uO1xuICAgIHBhcmVudHM/OiBTZXQ8c3RyaW5nPjtcbiAgICBpbm5lclJlZj86IExlZ2FjeVJlZjxIVE1MTElFbGVtZW50PjtcbiAgICBkcmFnSGFuZGxlUHJvcHM/OiBEcmFnZ2FibGVQcm92aWRlZERyYWdIYW5kbGVQcm9wcyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBJSXRlbVN0YXRlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29sbGFwc2VkOiBib29sZWFuO1xuICAgIGNoaWxkU3BhY2VzOiBSb29tW107XG59XG5cbmV4cG9ydCBjbGFzcyBTcGFjZUl0ZW0gZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElJdGVtUHJvcHMsIElJdGVtU3RhdGU+IHtcbiAgICBwcml2YXRlIGJ1dHRvblJlZiA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSUl0ZW1Qcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgY29uc3QgY29sbGFwc2VkID0gU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZS5pbnN0YW5jZS5nZXRTcGFjZUNvbGxhcHNlZFN0YXRlKFxuICAgICAgICAgICAgcHJvcHMuc3BhY2Uucm9vbUlkLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wYXJlbnRzLFxuICAgICAgICAgICAgIXByb3BzLmlzTmVzdGVkLCAvLyBkZWZhdWx0IHRvIGNvbGxhcHNlZCBmb3Igcm9vdCBpdGVtc1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLnByb3BzLnNwYWNlLm5hbWUsXG4gICAgICAgICAgICBjb2xsYXBzZWQsXG4gICAgICAgICAgICBjaGlsZFNwYWNlczogdGhpcy5jaGlsZFNwYWNlcyxcbiAgICAgICAgfTtcblxuICAgICAgICBTcGFjZVN0b3JlLmluc3RhbmNlLm9uKHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkLCB0aGlzLm9uU3BhY2VVcGRhdGUpO1xuICAgICAgICB0aGlzLnByb3BzLnNwYWNlLm9uKFJvb21FdmVudC5OYW1lLCB0aGlzLm9uUm9vbU5hbWVDaGFuZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgU3BhY2VTdG9yZS5pbnN0YW5jZS5vZmYodGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsIHRoaXMub25TcGFjZVVwZGF0ZSk7XG4gICAgICAgIHRoaXMucHJvcHMuc3BhY2Uub2ZmKFJvb21FdmVudC5OYW1lLCB0aGlzLm9uUm9vbU5hbWVDaGFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TcGFjZVVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjaGlsZFNwYWNlczogdGhpcy5jaGlsZFNwYWNlcyxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Sb29tTmFtZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLnByb3BzLnNwYWNlLm5hbWUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldCBjaGlsZFNwYWNlcygpOiBSb29tW10ge1xuICAgICAgICByZXR1cm4gU3BhY2VTdG9yZS5pbnN0YW5jZVxuICAgICAgICAgICAgLmdldENoaWxkU3BhY2VzKHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkKVxuICAgICAgICAgICAgLmZpbHRlcigocykgPT4gIXRoaXMucHJvcHMucGFyZW50cz8uaGFzKHMucm9vbUlkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNDb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmNvbGxhcHNlZCB8fCAhIXRoaXMucHJvcHMuaXNQYW5lbENvbGxhcHNlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNvbGxhcHNlID0gKGV2dDogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25FeHBhbmQgJiYgdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkV4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbGxhcHNlZFN0YXRlID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG5cbiAgICAgICAgU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZS5pbnN0YW5jZS5zZXRTcGFjZUNvbGxhcHNlZFN0YXRlKFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsXG4gICAgICAgICAgICB0aGlzLnByb3BzLnBhcmVudHMsXG4gICAgICAgICAgICBuZXdDb2xsYXBzZWRTdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNvbGxhcHNlZDogbmV3Q29sbGFwc2VkU3RhdGUgfSk7XG4gICAgICAgIC8vIGRvbid0IGJ1YmJsZSB1cCBzbyBlbmNhcHN1bGF0aW5nIGJ1dHRvbiBmb3Igc3BhY2VcbiAgICAgICAgLy8gZG9lc24ndCBnZXQgdHJpZ2dlcmVkXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbktleURvd24gPSAoZXY6IFJlYWN0LktleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRSb29tTGlzdEFjdGlvbihldik7XG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gdGhpcy5zdGF0ZS5jaGlsZFNwYWNlcz8ubGVuZ3RoO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkNvbGxhcHNlUm9vbUxpc3RTZWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbiAmJiAhdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbGxhcHNlKGV2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5idXR0b25SZWY/LmN1cnJlbnQ/LnBhcmVudEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEJ1dHRvbiA9IHBhcmVudEl0ZW0/LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEJ1dHRvbj8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgS2V5QmluZGluZ0FjdGlvbi5FeHBhbmRSb29tTGlzdFNlY3Rpb246XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbGxhcHNlKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTGV2ZWwgPSB0aGlzLmJ1dHRvblJlZj8uY3VycmVudD8ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTcGFjZUl0ZW1DaGlsZCA9IGNoaWxkTGV2ZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTExJRWxlbWVudD4oXCIubXhfU3BhY2VJdGVtXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFjZUl0ZW1DaGlsZD8ucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIubXhfU3BhY2VCdXR0b25cIik/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICBhY3RpdmVTcGFjZXMsXG4gICAgICAgICAgICBpc05lc3RlZCxcbiAgICAgICAgICAgIGlzUGFuZWxDb2xsYXBzZWQsXG4gICAgICAgICAgICBvbkV4cGFuZCxcbiAgICAgICAgICAgIHBhcmVudHMsXG4gICAgICAgICAgICBpbm5lclJlZixcbiAgICAgICAgICAgIGRyYWdIYW5kbGVQcm9wcyxcbiAgICAgICAgICAgIC4uLm90aGVyUHJvcHNcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZDtcblxuICAgICAgICBjb25zdCBpdGVtQ2xhc3NlcyA9IGNsYXNzTmFtZXModGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgIG14X1NwYWNlSXRlbTogdHJ1ZSxcbiAgICAgICAgICAgIG14X1NwYWNlSXRlbV9uYXJyb3c6IGlzUGFuZWxDb2xsYXBzZWQsXG4gICAgICAgICAgICBjb2xsYXBzZWQ6IGNvbGxhcHNlZCxcbiAgICAgICAgICAgIGhhc1N1YlNwYWNlczogdGhpcy5zdGF0ZS5jaGlsZFNwYWNlcz8ubGVuZ3RoLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpc0ludml0ZSA9IHNwYWNlLmdldE15TWVtYmVyc2hpcCgpID09PSBLbm93bk1lbWJlcnNoaXAuSW52aXRlO1xuXG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblN0YXRlID0gaXNJbnZpdGVcbiAgICAgICAgICAgID8gU3RhdGljTm90aWZpY2F0aW9uU3RhdGUuZm9yU3ltYm9sKFwiIVwiLCBOb3RpZmljYXRpb25MZXZlbC5IaWdobGlnaHQpXG4gICAgICAgICAgICA6IFNwYWNlU3RvcmUuaW5zdGFuY2UuZ2V0Tm90aWZpY2F0aW9uU3RhdGUoc3BhY2Uucm9vbUlkKTtcblxuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMuc3RhdGUuY2hpbGRTcGFjZXM/Lmxlbmd0aDtcblxuICAgICAgICBsZXQgY2hpbGRJdGVtcztcbiAgICAgICAgaWYgKGhhc0NoaWxkcmVuICYmICFjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNoaWxkSXRlbXMgPSAoXG4gICAgICAgICAgICAgICAgPFNwYWNlVHJlZUxldmVsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlcz17dGhpcy5zdGF0ZS5jaGlsZFNwYWNlc31cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3BhY2VzPXthY3RpdmVTcGFjZXN9XG4gICAgICAgICAgICAgICAgICAgIGlzTmVzdGVkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzPXtuZXcgU2V0KHBhcmVudHMpLmFkZChzcGFjZS5yb29tSWQpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlQ29sbGFwc2VCdXR0b24gPSBoYXNDaGlsZHJlbiA/IChcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU3BhY2VCdXR0b25fdG9nZ2xlQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlQ29sbGFwc2V9XG4gICAgICAgICAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvbGxhcHNlZCA/IF90KFwiYWN0aW9ufGV4cGFuZFwiKSA6IF90KFwiYWN0aW9ufGNvbGxhcHNlXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGw7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB7IHRhYkluZGV4LCAuLi5yZXN0RHJhZ0hhbmRsZVByb3BzIH0gPSBkcmFnSGFuZGxlUHJvcHMgfHwge307XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gYWN0aXZlU3BhY2VzLmluY2x1ZGVzKHNwYWNlLnJvb21JZCk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17aXRlbUNsYXNzZXN9XG4gICAgICAgICAgICAgICAgcmVmPXtpbm5lclJlZn1cbiAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXtoYXNDaGlsZHJlbiA/ICFjb2xsYXBzZWQgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8U3BhY2VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlc3REcmFnSGFuZGxlUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlPXtzcGFjZX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc0ludml0ZSA/IFwibXhfU3BhY2VCdXR0b25faW52aXRlXCIgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e3RoaXMuc3RhdGUubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVUb29sdGlwPXtfdChcInNwYWNlfGNvbnRleHRfbWVudXxvcHRpb25zXCIpfVxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZT17bm90aWZpY2F0aW9uU3RhdGV9XG4gICAgICAgICAgICAgICAgICAgIGlzTmFycm93PXtpc1BhbmVsQ29sbGFwc2VkfVxuICAgICAgICAgICAgICAgICAgICBzaXplPXtpc05lc3RlZCA/IFwiMjRweFwiIDogXCIzMnB4XCJ9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleURvd259XG4gICAgICAgICAgICAgICAgICAgIENvbnRleHRNZW51Q29tcG9uZW50PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc3BhY2UuZ2V0TXlNZW1iZXJzaGlwKCkgPT09IEtub3duTWVtYmVyc2hpcC5Kb2luID8gU3BhY2VDb250ZXh0TWVudSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dG9nZ2xlQ29sbGFwc2VCdXR0b259XG4gICAgICAgICAgICAgICAgPC9TcGFjZUJ1dHRvbj5cblxuICAgICAgICAgICAgICAgIHtjaGlsZEl0ZW1zfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVHJlZUxldmVsUHJvcHMge1xuICAgIHNwYWNlczogUm9vbVtdO1xuICAgIGFjdGl2ZVNwYWNlczogU3BhY2VLZXlbXTtcbiAgICBpc05lc3RlZD86IGJvb2xlYW47XG4gICAgcGFyZW50czogU2V0PHN0cmluZz47XG59XG5cbmNvbnN0IFNwYWNlVHJlZUxldmVsOiBSZWFjdC5GQzxJVHJlZUxldmVsUHJvcHM+ID0gKHsgc3BhY2VzLCBhY3RpdmVTcGFjZXMsIGlzTmVzdGVkLCBwYXJlbnRzIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXhfU3BhY2VUcmVlTGV2ZWxcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgIHtzcGFjZXMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPFNwYWNlSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtzLnJvb21JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNwYWNlcz17YWN0aXZlU3BhY2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2U9e3N9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc05lc3RlZD17aXNOZXN0ZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzPXtwYXJlbnRzfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgPC91bD5cbiAgICApO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQVNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUdBLElBQUFLLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFPLDBCQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxrQkFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsZ0JBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFdBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLHlCQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxZQUFBLEdBQUFiLE9BQUE7QUFDQSxJQUFBYyxpQkFBQSxHQUFBWixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWUsd0JBQUEsR0FBQWYsT0FBQTtBQUNBLElBQUFnQixrQkFBQSxHQUFBaEIsT0FBQTtBQUNBLElBQUFpQixtQkFBQSxHQUFBakIsT0FBQTtBQUVBLElBQUFrQixpQkFBQSxHQUFBaEIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFtQixlQUFBLEdBQUFuQixPQUFB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