UNPKG

matrix-react-sdk

Version:
443 lines (375 loc) 52 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SpaceItem = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _SpaceStore = _interopRequireDefault(require("../../../stores/SpaceStore")); var _SpaceTreeLevelLayoutStore = _interopRequireDefault(require("../../../stores/SpaceTreeLevelLayoutStore")); var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge")); var _RovingAccessibleButton = require("../../../accessibility/roving/RovingAccessibleButton"); var _RovingAccessibleTooltipButton = require("../../../accessibility/roving/RovingAccessibleTooltipButton"); var _IconizedContextMenu = _interopRequireWildcard(require("../context_menus/IconizedContextMenu")); var _languageHandler = require("../../../languageHandler"); var _ContextMenuTooltipButton = require("../../../accessibility/context_menu/ContextMenuTooltipButton"); var _ContextMenu = require("../../structures/ContextMenu"); var _space = require("../../../utils/space"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); var _RoomViewStore = _interopRequireDefault(require("../../../stores/RoomViewStore")); var _RightPanelStorePhases = require("../../../stores/RightPanelStorePhases"); var _event = require("matrix-js-sdk/src/@types/event"); var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState"); var _NotificationColor = require("../../../stores/notifications/NotificationColor"); /* Copyright 2021 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. */ class SpaceItem extends _react.default.PureComponent /*:: <IItemProps, IItemState>*/ { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onContextMenu", (ev /*: React.MouseEvent*/ ) => { if (this.props.space.getMyMembership() !== "join") return; ev.preventDefault(); ev.stopPropagation(); this.setState({ contextMenuPosition: { right: ev.clientX, top: ev.clientY, height: 0 } }); }); (0, _defineProperty2.default)(this, "onClick", (ev /*: React.MouseEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); _SpaceStore.default.instance.setActiveSpace(this.props.space); }); (0, _defineProperty2.default)(this, "onMenuOpenClick", (ev /*: React.MouseEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); const target = ev.target; this.setState({ contextMenuPosition: target.getBoundingClientRect() }); }); (0, _defineProperty2.default)(this, "onMenuClose", () => { this.setState({ contextMenuPosition: null }); }); (0, _defineProperty2.default)(this, "onInviteClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); (0, _space.showSpaceInvite)(this.props.space); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onSettingsClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); (0, _space.showSpaceSettings)(this.context, this.props.space); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onLeaveClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); _dispatcher.default.dispatch({ action: "leave_room", room_id: this.props.space.roomId }); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onNewRoomClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); (0, _space.showCreateNewRoom)(this.context, this.props.space); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onAddExistingRoomClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); (0, _space.showAddExistingRooms)(this.context, this.props.space); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onMembersClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); if (!_RoomViewStore.default.getRoomId()) { _dispatcher.default.dispatch({ action: "view_room", room_id: this.props.space.roomId }, true); } _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.SpaceMemberList, refireParams: { space: this.props.space } }); this.setState({ contextMenuPosition: null }); // also close the menu }); (0, _defineProperty2.default)(this, "onExploreRoomsClick", (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); _dispatcher.default.dispatch({ action: "view_room", room_id: this.props.space.roomId }); this.setState({ contextMenuPosition: null }); // also close the menu }); const collapsed = _SpaceTreeLevelLayoutStore.default.instance.getSpaceCollapsedState(props.space.roomId, this.props.parents, !props.isNested // default to collapsed for root items ); this.state = { collapsed: collapsed, contextMenuPosition: null }; } toggleCollapse(evt) { if (this.props.onExpand && this.state.collapsed) { this.props.onExpand(); } const newCollapsedState = !this.state.collapsed; _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(); } renderContextMenu() /*: React.ReactElement*/ { if (this.props.space.getMyMembership() !== "join") return null; let contextMenu = null; if (this.state.contextMenuPosition) { const userId = this.context.getUserId(); let inviteOption; if (this.props.space.getJoinRule() === "public" || this.props.space.canInvite(userId)) { inviteOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { className: "mx_SpacePanel_contextMenu_inviteButton", iconClassName: "mx_SpacePanel_iconInvite", label: (0, _languageHandler._t)("Invite people"), onClick: this.onInviteClick }); } let settingsOption; let leaveSection; if ((0, _space.shouldShowSpaceSettings)(this.context, this.props.space)) { settingsOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconSettings", label: (0, _languageHandler._t)("Settings"), onClick: this.onSettingsClick }); } else { leaveSection = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { red: true, first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconLeave", label: (0, _languageHandler._t)("Leave space"), onClick: this.onLeaveClick })); } const canAddRooms = this.props.space.currentState.maySendStateEvent(_event.EventType.SpaceChild, userId); let newRoomSection; if (this.props.space.currentState.maySendStateEvent(_event.EventType.SpaceChild, userId)) { newRoomSection = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconPlus", label: (0, _languageHandler._t)("Create new room"), onClick: this.onNewRoomClick }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconHash", label: (0, _languageHandler._t)("Add existing room"), onClick: this.onAddExistingRoomClick })); } contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.toRightOf)(this.state.contextMenuPosition, 0), { onFinished: this.onMenuClose, className: "mx_SpacePanel_contextMenu", compact: true }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpacePanel_contextMenu_header" }, this.props.space.name), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, inviteOption, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconMembers", label: (0, _languageHandler._t)("Members"), onClick: this.onMembersClick }), settingsOption, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_SpacePanel_iconExplore", label: canAddRooms ? (0, _languageHandler._t)("Manage & explore rooms") : (0, _languageHandler._t)("Explore rooms"), onClick: this.onExploreRoomsClick })), newRoomSection, leaveSection); } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenuTooltipButton.ContextMenuTooltipButton, { className: "mx_SpaceButton_menuButton", onClick: this.onMenuOpenClick, title: (0, _languageHandler._t)("Space options"), isExpanded: !!this.state.contextMenuPosition }), contextMenu); } render() { const { space, activeSpaces, isNested } = this.props; const forceCollapsed = this.props.isPanelCollapsed; const isNarrow = this.props.isPanelCollapsed; const collapsed = this.state.collapsed || forceCollapsed; const childSpaces = _SpaceStore.default.instance.getChildSpaces(space.roomId).filter(s => !this.props.parents?.has(s.roomId)); const isActive = activeSpaces.includes(space); const itemClasses = (0, _classnames.default)({ "mx_SpaceItem": true, "mx_SpaceItem_narrow": isNarrow, "collapsed": collapsed, "hasSubSpaces": childSpaces && childSpaces.length }); const isInvite = space.getMyMembership() === "invite"; const classes = (0, _classnames.default)("mx_SpaceButton", { mx_SpaceButton_active: isActive, mx_SpaceButton_hasMenuOpen: !!this.state.contextMenuPosition, mx_SpaceButton_narrow: isNarrow, mx_SpaceButton_invite: isInvite }); const notificationState = isInvite ? _StaticNotificationState.StaticNotificationState.forSymbol("!", _NotificationColor.NotificationColor.Red) : _SpaceStore.default.instance.getNotificationState(space.roomId); let childItems; if (childSpaces && !collapsed) { childItems = /*#__PURE__*/_react.default.createElement(SpaceTreeLevel, { spaces: childSpaces, activeSpaces: activeSpaces, isNested: true, parents: new Set(this.props.parents).add(this.props.space.roomId) }); } let notifBadge; if (notificationState) { notifBadge = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpacePanel_badgeContainer" }, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, { forceCount: false, notification: notificationState })); } const avatarSize = isNested ? 24 : 32; const toggleCollapseButton = childSpaces && childSpaces.length ? /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_SpaceButton_toggleCollapse", onClick: evt => this.toggleCollapse(evt) }) : null; let button; if (isNarrow) { button = /*#__PURE__*/_react.default.createElement(_RovingAccessibleTooltipButton.RovingAccessibleTooltipButton, { className: classes, title: space.name, onClick: this.onClick, onContextMenu: this.onContextMenu, forceHide: !!this.state.contextMenuPosition, role: "treeitem" }, toggleCollapseButton, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_selectionWrapper" }, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { width: avatarSize, height: avatarSize, room: space }), notifBadge, this.renderContextMenu())); } else { button = /*#__PURE__*/_react.default.createElement(_RovingAccessibleButton.RovingAccessibleButton, { className: classes, onClick: this.onClick, onContextMenu: this.onContextMenu, role: "treeitem" }, toggleCollapseButton, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_selectionWrapper" }, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { width: avatarSize, height: avatarSize, room: space }), /*#__PURE__*/_react.default.createElement("span", { className: "mx_SpaceButton_name" }, space.name), notifBadge, this.renderContextMenu())); } return /*#__PURE__*/_react.default.createElement("li", { className: itemClasses }, button, childItems); } } exports.SpaceItem = SpaceItem; (0, _defineProperty2.default)(SpaceItem, "contextType", _MatrixClientContext.default); const SpaceTreeLevel /*: React.FC<ITreeLevelProps>*/ = ({ spaces, activeSpaces, isNested, parents }) => { return /*#__PURE__*/_react.default.createElement("ul", { className: "mx_SpaceTreeLevel" }, spaces.map(s => { return /*#__PURE__*/_react.default.createElement(SpaceItem, { key: s.roomId, activeSpaces: activeSpaces, space: s, isNested: isNested, parents: parents }); })); }; var _default = SpaceTreeLevel; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NwYWNlcy9TcGFjZVRyZWVMZXZlbC50c3giXSwibmFtZXMiOlsiU3BhY2VJdGVtIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImV2Iiwic3BhY2UiLCJnZXRNeU1lbWJlcnNoaXAiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInNldFN0YXRlIiwiY29udGV4dE1lbnVQb3NpdGlvbiIsInJpZ2h0IiwiY2xpZW50WCIsInRvcCIsImNsaWVudFkiLCJoZWlnaHQiLCJTcGFjZVN0b3JlIiwiaW5zdGFuY2UiLCJzZXRBY3RpdmVTcGFjZSIsInRhcmdldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImNvbnRleHQiLCJkZWZhdWx0RGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiYWN0aW9uIiwicm9vbV9pZCIsInJvb21JZCIsIlJvb21WaWV3U3RvcmUiLCJnZXRSb29tSWQiLCJBY3Rpb24iLCJTZXRSaWdodFBhbmVsUGhhc2UiLCJwaGFzZSIsIlJpZ2h0UGFuZWxQaGFzZXMiLCJTcGFjZU1lbWJlckxpc3QiLCJyZWZpcmVQYXJhbXMiLCJjb2xsYXBzZWQiLCJTcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIiwiZ2V0U3BhY2VDb2xsYXBzZWRTdGF0ZSIsInBhcmVudHMiLCJpc05lc3RlZCIsInN0YXRlIiwidG9nZ2xlQ29sbGFwc2UiLCJldnQiLCJvbkV4cGFuZCIsIm5ld0NvbGxhcHNlZFN0YXRlIiwic2V0U3BhY2VDb2xsYXBzZWRTdGF0ZSIsInJlbmRlckNvbnRleHRNZW51IiwiY29udGV4dE1lbnUiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJpbnZpdGVPcHRpb24iLCJnZXRKb2luUnVsZSIsImNhbkludml0ZSIsIm9uSW52aXRlQ2xpY2siLCJzZXR0aW5nc09wdGlvbiIsImxlYXZlU2VjdGlvbiIsIm9uU2V0dGluZ3NDbGljayIsIm9uTGVhdmVDbGljayIsImNhbkFkZFJvb21zIiwiY3VycmVudFN0YXRlIiwibWF5U2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJTcGFjZUNoaWxkIiwibmV3Um9vbVNlY3Rpb24iLCJvbk5ld1Jvb21DbGljayIsIm9uQWRkRXhpc3RpbmdSb29tQ2xpY2siLCJvbk1lbnVDbG9zZSIsIm5hbWUiLCJvbk1lbWJlcnNDbGljayIsIm9uRXhwbG9yZVJvb21zQ2xpY2siLCJvbk1lbnVPcGVuQ2xpY2siLCJyZW5kZXIiLCJhY3RpdmVTcGFjZXMiLCJmb3JjZUNvbGxhcHNlZCIsImlzUGFuZWxDb2xsYXBzZWQiLCJpc05hcnJvdyIsImNoaWxkU3BhY2VzIiwiZ2V0Q2hpbGRTcGFjZXMiLCJmaWx0ZXIiLCJzIiwiaGFzIiwiaXNBY3RpdmUiLCJpbmNsdWRlcyIsIml0ZW1DbGFzc2VzIiwibGVuZ3RoIiwiaXNJbnZpdGUiLCJjbGFzc2VzIiwibXhfU3BhY2VCdXR0b25fYWN0aXZlIiwibXhfU3BhY2VCdXR0b25faGFzTWVudU9wZW4iLCJteF9TcGFjZUJ1dHRvbl9uYXJyb3ciLCJteF9TcGFjZUJ1dHRvbl9pbnZpdGUiLCJub3RpZmljYXRpb25TdGF0ZSIsIlN0YXRpY05vdGlmaWNhdGlvblN0YXRlIiwiZm9yU3ltYm9sIiwiTm90aWZpY2F0aW9uQ29sb3IiLCJSZWQiLCJnZXROb3RpZmljYXRpb25TdGF0ZSIsImNoaWxkSXRlbXMiLCJTZXQiLCJhZGQiLCJub3RpZkJhZGdlIiwiYXZhdGFyU2l6ZSIsInRvZ2dsZUNvbGxhcHNlQnV0dG9uIiwiYnV0dG9uIiwib25DbGljayIsIm9uQ29udGV4dE1lbnUiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwiU3BhY2VUcmVlTGV2ZWwiLCJzcGFjZXMiLCJtYXAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7QUFDQTs7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SSxJQUFBLFNBQVMsRUFBQztBQUFkLEtBQ0ZzRSxNQUFNLENBQUNDLEdBQVAsQ0FBVzlCLENBQUMsSUFBSTtBQUNiLHdCQUFRLDZCQUFDLFNBQUQ7QUFDSixNQUFBLEdBQUcsRUFBRUEsQ0FBQyxDQUFDckQsTUFESDtBQUVKLE1BQUEsWUFBWSxFQUFFOEMsWUFGVjtBQUdKLE1BQUEsS0FBSyxFQUFFTyxDQUhIO0FBSUosTUFBQSxRQUFRLEVBQUV4QyxRQUpOO0FBS0osTUFBQSxPQUFPLEVBQUVEO0FBTEwsTUFBUjtBQU9ILEdBUkEsQ0FERSxDQUFQO0FBV0gsQ0FqQkQ7O2VBbUJlcUUsYyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQge1Jvb219IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuXG5pbXBvcnQgUm9vbUF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9Sb29tQXZhdGFyXCI7XG5pbXBvcnQgU3BhY2VTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1NwYWNlU3RvcmVcIjtcbmltcG9ydCBTcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZVwiO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkJhZGdlIGZyb20gXCIuLi9yb29tcy9Ob3RpZmljYXRpb25CYWRnZVwiO1xuaW1wb3J0IHtSb3ZpbmdBY2Nlc3NpYmxlQnV0dG9ufSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9yb3ZpbmcvUm92aW5nQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHtSb3ZpbmdBY2Nlc3NpYmxlVG9vbHRpcEJ1dHRvbn0gZnJvbSBcIi4uLy4uLy4uL2FjY2Vzc2liaWxpdHkvcm92aW5nL1JvdmluZ0FjY2Vzc2libGVUb29sdGlwQnV0dG9uXCI7XG5pbXBvcnQgSWNvbml6ZWRDb250ZXh0TWVudSwge1xuICAgIEljb25pemVkQ29udGV4dE1lbnVPcHRpb24sXG4gICAgSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QsXG59IGZyb20gXCIuLi9jb250ZXh0X21lbnVzL0ljb25pemVkQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7X3R9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7Q29udGV4dE1lbnVUb29sdGlwQnV0dG9ufSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9jb250ZXh0X21lbnUvQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uXCI7XG5pbXBvcnQge3RvUmlnaHRPZn0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7XG4gICAgc2hvdWxkU2hvd1NwYWNlU2V0dGluZ3MsXG4gICAgc2hvd0FkZEV4aXN0aW5nUm9vbXMsXG4gICAgc2hvd0NyZWF0ZU5ld1Jvb20sXG4gICAgc2hvd1NwYWNlSW52aXRlLFxuICAgIHNob3dTcGFjZVNldHRpbmdzLFxufSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvc3BhY2VcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiwge0J1dHRvbkV2ZW50fSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgUm9vbVZpZXdTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1Jvb21WaWV3U3RvcmVcIjtcbmltcG9ydCB7U2V0UmlnaHRQYW5lbFBoYXNlUGF5bG9hZH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvU2V0UmlnaHRQYW5lbFBoYXNlUGF5bG9hZFwiO1xuaW1wb3J0IHtSaWdodFBhbmVsUGhhc2VzfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1JpZ2h0UGFuZWxTdG9yZVBoYXNlc1wiO1xuaW1wb3J0IHtFdmVudFR5cGV9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9AdHlwZXMvZXZlbnRcIjtcbmltcG9ydCB7U3RhdGljTm90aWZpY2F0aW9uU3RhdGV9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9TdGF0aWNOb3RpZmljYXRpb25TdGF0ZVwiO1xuaW1wb3J0IHtOb3RpZmljYXRpb25Db2xvcn0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkNvbG9yXCI7XG5cbmludGVyZmFjZSBJSXRlbVByb3BzIHtcbiAgICBzcGFjZT86IFJvb207XG4gICAgYWN0aXZlU3BhY2VzOiBSb29tW107XG4gICAgaXNOZXN0ZWQ/OiBib29sZWFuO1xuICAgIGlzUGFuZWxDb2xsYXBzZWQ/OiBib29sZWFuO1xuICAgIG9uRXhwYW5kPzogRnVuY3Rpb247XG4gICAgcGFyZW50cz86IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgSUl0ZW1TdGF0ZSB7XG4gICAgY29sbGFwc2VkOiBib29sZWFuO1xuICAgIGNvbnRleHRNZW51UG9zaXRpb246IFBpY2s8RE9NUmVjdCwgXCJyaWdodFwiIHwgXCJ0b3BcIiB8IFwiaGVpZ2h0XCI+O1xufVxuXG5leHBvcnQgY2xhc3MgU3BhY2VJdGVtIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJSXRlbVByb3BzLCBJSXRlbVN0YXRlPiB7XG4gICAgc3RhdGljIGNvbnRleHRUeXBlID0gTWF0cml4Q2xpZW50Q29udGV4dDtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBjb25zdCBjb2xsYXBzZWQgPSBTcGFjZVRyZWVMZXZlbExheW91dFN0b3JlLmluc3RhbmNlLmdldFNwYWNlQ29sbGFwc2VkU3RhdGUoXG4gICAgICAgICAgICBwcm9wcy5zcGFjZS5yb29tSWQsXG4gICAgICAgICAgICB0aGlzLnByb3BzLnBhcmVudHMsXG4gICAgICAgICAgICAhcHJvcHMuaXNOZXN0ZWQsIC8vIGRlZmF1bHQgdG8gY29sbGFwc2VkIGZvciByb290IGl0ZW1zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGNvbGxhcHNlZDogY29sbGFwc2VkLFxuICAgICAgICAgICAgY29udGV4dE1lbnVQb3NpdGlvbjogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNvbGxhcHNlKGV2dCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkV4cGFuZCAmJiB0aGlzLnN0YXRlLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkV4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbGxhcHNlZFN0YXRlID0gIXRoaXMuc3RhdGUuY29sbGFwc2VkO1xuXG4gICAgICAgIFNwYWNlVHJlZUxldmVsTGF5b3V0U3RvcmUuaW5zdGFuY2Uuc2V0U3BhY2VDb2xsYXBzZWRTdGF0ZShcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wYXJlbnRzLFxuICAgICAgICAgICAgbmV3Q29sbGFwc2VkU3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogbmV3Q29sbGFwc2VkU3RhdGV9KTtcbiAgICAgICAgLy8gZG9uJ3QgYnViYmxlIHVwIHNvIGVuY2Fwc3VsYXRpbmcgYnV0dG9uIGZvciBzcGFjZVxuICAgICAgICAvLyBkb2Vzbid0IGdldCB0cmlnZ2VyZWRcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Db250ZXh0TWVudSA9IChldjogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zcGFjZS5nZXRNeU1lbWJlcnNoaXAoKSAhPT0gXCJqb2luXCIpIHJldHVybjtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY29udGV4dE1lbnVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHJpZ2h0OiBldi5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHRvcDogZXYuY2xpZW50WSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2sgPSAoZXY6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2Uuc2V0QWN0aXZlU3BhY2UodGhpcy5wcm9wcy5zcGFjZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25NZW51T3BlbkNsaWNrID0gKGV2OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldi50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NvbnRleHRNZW51UG9zaXRpb246IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTWVudUNsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjb250ZXh0TWVudVBvc2l0aW9uOiBudWxsfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25JbnZpdGVDbGljayA9IChldjogQnV0dG9uRXZlbnQpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgc2hvd1NwYWNlSW52aXRlKHRoaXMucHJvcHMuc3BhY2UpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjb250ZXh0TWVudVBvc2l0aW9uOiBudWxsfSk7IC8vIGFsc28gY2xvc2UgdGhlIG1lbnVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblNldHRpbmdzQ2xpY2sgPSAoZXY6IEJ1dHRvbkV2ZW50KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHNob3dTcGFjZVNldHRpbmdzKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wcy5zcGFjZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NvbnRleHRNZW51UG9zaXRpb246IG51bGx9KTsgLy8gYWxzbyBjbG9zZSB0aGUgbWVudVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTGVhdmVDbGljayA9IChldjogQnV0dG9uRXZlbnQpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBcImxlYXZlX3Jvb21cIixcbiAgICAgICAgICAgIHJvb21faWQ6IHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y29udGV4dE1lbnVQb3NpdGlvbjogbnVsbH0pOyAvLyBhbHNvIGNsb3NlIHRoZSBtZW51XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25OZXdSb29tQ2xpY2sgPSAoZXY6IEJ1dHRvbkV2ZW50KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHNob3dDcmVhdGVOZXdSb29tKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wcy5zcGFjZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NvbnRleHRNZW51UG9zaXRpb246IG51bGx9KTsgLy8gYWxzbyBjbG9zZSB0aGUgbWVudVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQWRkRXhpc3RpbmdSb29tQ2xpY2sgPSAoZXY6IEJ1dHRvbkV2ZW50KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHNob3dBZGRFeGlzdGluZ1Jvb21zKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wcy5zcGFjZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NvbnRleHRNZW51UG9zaXRpb246IG51bGx9KTsgLy8gYWxzbyBjbG9zZSB0aGUgbWVudVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTWVtYmVyc0NsaWNrID0gKGV2OiBCdXR0b25FdmVudCkgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoIVJvb21WaWV3U3RvcmUuZ2V0Um9vbUlkKCkpIHtcbiAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwidmlld19yb29tXCIsXG4gICAgICAgICAgICAgICAgcm9vbV9pZDogdGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsXG4gICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFNldFJpZ2h0UGFuZWxQaGFzZVBheWxvYWQ+KHtcbiAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlNldFJpZ2h0UGFuZWxQaGFzZSxcbiAgICAgICAgICAgIHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLlNwYWNlTWVtYmVyTGlzdCxcbiAgICAgICAgICAgIHJlZmlyZVBhcmFtczogeyBzcGFjZTogdGhpcy5wcm9wcy5zcGFjZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y29udGV4dE1lbnVQb3NpdGlvbjogbnVsbH0pOyAvLyBhbHNvIGNsb3NlIHRoZSBtZW51XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25FeHBsb3JlUm9vbXNDbGljayA9IChldjogQnV0dG9uRXZlbnQpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBcInZpZXdfcm9vbVwiLFxuICAgICAgICAgICAgcm9vbV9pZDogdGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjb250ZXh0TWVudVBvc2l0aW9uOiBudWxsfSk7IC8vIGFsc28gY2xvc2UgdGhlIG1lbnVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJDb250ZXh0TWVudSgpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zcGFjZS5nZXRNeU1lbWJlcnNoaXAoKSAhPT0gXCJqb2luXCIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZXh0TWVudSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNvbnRleHRNZW51UG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuY29udGV4dC5nZXRVc2VySWQoKTtcblxuICAgICAgICAgICAgbGV0IGludml0ZU9wdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNwYWNlLmdldEpvaW5SdWxlKCkgPT09IFwicHVibGljXCIgfHwgdGhpcy5wcm9wcy5zcGFjZS5jYW5JbnZpdGUodXNlcklkKSkge1xuICAgICAgICAgICAgICAgIGludml0ZU9wdGlvbiA9IChcbiAgICAgICAgICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1NwYWNlUGFuZWxfY29udGV4dE1lbnVfaW52aXRlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9TcGFjZVBhbmVsX2ljb25JbnZpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiSW52aXRlIHBlb3BsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25JbnZpdGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2V0dGluZ3NPcHRpb247XG4gICAgICAgICAgICBsZXQgbGVhdmVTZWN0aW9uO1xuICAgICAgICAgICAgaWYgKHNob3VsZFNob3dTcGFjZVNldHRpbmdzKHRoaXMuY29udGV4dCwgdGhpcy5wcm9wcy5zcGFjZSkpIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5nc09wdGlvbiA9IChcbiAgICAgICAgICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9TcGFjZVBhbmVsX2ljb25TZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJTZXR0aW5nc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25TZXR0aW5nc0NsaWNrfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlYXZlU2VjdGlvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCByZWQgZmlyc3Q+XG4gICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfU3BhY2VQYW5lbF9pY29uTGVhdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiTGVhdmUgc3BhY2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uTGVhdmVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L0ljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2FuQWRkUm9vbXMgPSB0aGlzLnByb3BzLnNwYWNlLmN1cnJlbnRTdGF0ZS5tYXlTZW5kU3RhdGVFdmVudChFdmVudFR5cGUuU3BhY2VDaGlsZCwgdXNlcklkKTtcblxuICAgICAgICAgICAgbGV0IG5ld1Jvb21TZWN0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc3BhY2UuY3VycmVudFN0YXRlLm1heVNlbmRTdGF0ZUV2ZW50KEV2ZW50VHlwZS5TcGFjZUNoaWxkLCB1c2VySWQpKSB7XG4gICAgICAgICAgICAgICAgbmV3Um9vbVNlY3Rpb24gPSA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QgZmlyc3Q+XG4gICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfU3BhY2VQYW5lbF9pY29uUGx1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJDcmVhdGUgbmV3IHJvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uTmV3Um9vbUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1NwYWNlUGFuZWxfaWNvbkhhc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiQWRkIGV4aXN0aW5nIHJvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uQWRkRXhpc3RpbmdSb29tQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdD47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRleHRNZW51ID0gPEljb25pemVkQ29udGV4dE1lbnVcbiAgICAgICAgICAgICAgICB7Li4udG9SaWdodE9mKHRoaXMuc3RhdGUuY29udGV4dE1lbnVQb3NpdGlvbiwgMCl9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5vbk1lbnVDbG9zZX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZVBhbmVsX2NvbnRleHRNZW51XCJcbiAgICAgICAgICAgICAgICBjb21wYWN0XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZVBhbmVsX2NvbnRleHRNZW51X2hlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICB7IHRoaXMucHJvcHMuc3BhY2UubmFtZSB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0IGZpcnN0PlxuICAgICAgICAgICAgICAgICAgICB7IGludml0ZU9wdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfU3BhY2VQYW5lbF9pY29uTWVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJNZW1iZXJzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vbk1lbWJlcnNDbGlja31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgeyBzZXR0aW5nc09wdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfU3BhY2VQYW5lbF9pY29uRXhwbG9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17Y2FuQWRkUm9vbXMgPyBfdChcIk1hbmFnZSAmIGV4cGxvcmUgcm9vbXNcIikgOiBfdChcIkV4cGxvcmUgcm9vbXNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uRXhwbG9yZVJvb21zQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdD5cbiAgICAgICAgICAgICAgICB7IG5ld1Jvb21TZWN0aW9uIH1cbiAgICAgICAgICAgICAgICB7IGxlYXZlU2VjdGlvbiB9XG4gICAgICAgICAgICA8L0ljb25pemVkQ29udGV4dE1lbnU+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICA8Q29udGV4dE1lbnVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX21lbnVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uTWVudU9wZW5DbGlja31cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwiU3BhY2Ugb3B0aW9uc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgaXNFeHBhbmRlZD17ISF0aGlzLnN0YXRlLmNvbnRleHRNZW51UG9zaXRpb259XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IGNvbnRleHRNZW51IH1cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7c3BhY2UsIGFjdGl2ZVNwYWNlcywgaXNOZXN0ZWR9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBjb25zdCBmb3JjZUNvbGxhcHNlZCA9IHRoaXMucHJvcHMuaXNQYW5lbENvbGxhcHNlZDtcbiAgICAgICAgY29uc3QgaXNOYXJyb3cgPSB0aGlzLnByb3BzLmlzUGFuZWxDb2xsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuc3RhdGUuY29sbGFwc2VkIHx8IGZvcmNlQ29sbGFwc2VkO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkU3BhY2VzID0gU3BhY2VTdG9yZS5pbnN0YW5jZS5nZXRDaGlsZFNwYWNlcyhzcGFjZS5yb29tSWQpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gIXRoaXMucHJvcHMucGFyZW50cz8uaGFzKHMucm9vbUlkKSk7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlU3BhY2VzLmluY2x1ZGVzKHNwYWNlKTtcbiAgICAgICAgY29uc3QgaXRlbUNsYXNzZXMgPSBjbGFzc05hbWVzKHtcbiAgICAgICAgICAgIFwibXhfU3BhY2VJdGVtXCI6IHRydWUsXG4gICAgICAgICAgICBcIm14X1NwYWNlSXRlbV9uYXJyb3dcIjogaXNOYXJyb3csXG4gICAgICAgICAgICBcImNvbGxhcHNlZFwiOiBjb2xsYXBzZWQsXG4gICAgICAgICAgICBcImhhc1N1YlNwYWNlc1wiOiBjaGlsZFNwYWNlcyAmJiBjaGlsZFNwYWNlcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlzSW52aXRlID0gc3BhY2UuZ2V0TXlNZW1iZXJzaGlwKCkgPT09IFwiaW52aXRlXCI7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfU3BhY2VCdXR0b25cIiwge1xuICAgICAgICAgICAgbXhfU3BhY2VCdXR0b25fYWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgICAgIG14X1NwYWNlQnV0dG9uX2hhc01lbnVPcGVuOiAhIXRoaXMuc3RhdGUuY29udGV4dE1lbnVQb3NpdGlvbixcbiAgICAgICAgICAgIG14X1NwYWNlQnV0dG9uX25hcnJvdzogaXNOYXJyb3csXG4gICAgICAgICAgICBteF9TcGFjZUJ1dHRvbl9pbnZpdGU6IGlzSW52aXRlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uU3RhdGUgPSBpc0ludml0ZVxuICAgICAgICAgICAgPyBTdGF0aWNOb3RpZmljYXRpb25TdGF0ZS5mb3JTeW1ib2woXCIhXCIsIE5vdGlmaWNhdGlvbkNvbG9yLlJlZClcbiAgICAgICAgICAgIDogU3BhY2VTdG9yZS5pbnN0YW5jZS5nZXROb3RpZmljYXRpb25TdGF0ZShzcGFjZS5yb29tSWQpO1xuXG4gICAgICAgIGxldCBjaGlsZEl0ZW1zO1xuICAgICAgICBpZiAoY2hpbGRTcGFjZXMgJiYgIWNvbGxhcHNlZCkge1xuICAgICAgICAgICAgY2hpbGRJdGVtcyA9IDxTcGFjZVRyZWVMZXZlbFxuICAgICAgICAgICAgICAgIHNwYWNlcz17Y2hpbGRTcGFjZXN9XG4gICAgICAgICAgICAgICAgYWN0aXZlU3BhY2VzPXthY3RpdmVTcGFjZXN9XG4gICAgICAgICAgICAgICAgaXNOZXN0ZWQ9e3RydWV9XG4gICAgICAgICAgICAgICAgcGFyZW50cz17bmV3IFNldCh0aGlzLnByb3BzLnBhcmVudHMpLmFkZCh0aGlzLnByb3BzLnNwYWNlLnJvb21JZCl9XG4gICAgICAgICAgICAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub3RpZkJhZGdlO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uU3RhdGUpIHtcbiAgICAgICAgICAgIG5vdGlmQmFkZ2UgPSA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlUGFuZWxfYmFkZ2VDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8Tm90aWZpY2F0aW9uQmFkZ2UgZm9yY2VDb3VudD17ZmFsc2V9IG5vdGlmaWNhdGlvbj17bm90aWZpY2F0aW9uU3RhdGV9IC8+XG4gICAgICAgICAgICA8L2Rpdj47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdmF0YXJTaXplID0gaXNOZXN0ZWQgPyAyNCA6IDMyO1xuXG4gICAgICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlQnV0dG9uID0gY2hpbGRTcGFjZXMgJiYgY2hpbGRTcGFjZXMubGVuZ3RoID9cbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU3BhY2VCdXR0b25fdG9nZ2xlQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2V2dCA9PiB0aGlzLnRvZ2dsZUNvbGxhcHNlKGV2dCl9XG4gICAgICAgICAgICAvPiA6IG51bGw7XG5cbiAgICAgICAgbGV0IGJ1dHRvbjtcbiAgICAgICAgaWYgKGlzTmFycm93KSB7XG4gICAgICAgICAgICBidXR0b24gPSAoXG4gICAgICAgICAgICAgICAgPFJvdmluZ0FjY2Vzc2libGVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc31cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e3NwYWNlLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5vbkNvbnRleHRNZW51fVxuICAgICAgICAgICAgICAgICAgICBmb3JjZUhpZGU9eyEhdGhpcy5zdGF0ZS5jb250ZXh0TWVudVBvc2l0aW9ufVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeyB0b2dnbGVDb2xsYXBzZUJ1dHRvbiB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU3BhY2VCdXR0b25fc2VsZWN0aW9uV3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJvb21BdmF0YXIgd2lkdGg9e2F2YXRhclNpemV9IGhlaWdodD17YXZhdGFyU2l6ZX0gcm9vbT17c3BhY2V9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7IG5vdGlmQmFkZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aGlzLnJlbmRlckNvbnRleHRNZW51KCkgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1JvdmluZ0FjY2Vzc2libGVUb29sdGlwQnV0dG9uPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1dHRvbiA9IChcbiAgICAgICAgICAgICAgICA8Um92aW5nQWNj