matrix-react-sdk
Version:
SDK for matrix.org using React
208 lines (196 loc) • 33.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PinnedEventTile = PinnedEventTile;
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _compoundWeb = require("@vector-im/compound-web");
var _visibilityOn = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/visibility-on"));
var _unpin = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/unpin"));
var _forward = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/forward"));
var _overflowHorizontal = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/overflow-horizontal"));
var _delete = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/delete"));
var _threads = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/threads"));
var _classnames = _interopRequireDefault(require("classnames"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _MessageEvent = _interopRequireDefault(require("../messages/MessageEvent"));
var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar"));
var _languageHandler = require("../../../languageHandler");
var _FormattingUtils = require("../../../utils/FormattingUtils");
var _MatrixClientContext = require("../../../contexts/MatrixClientContext");
var _useRoomState = require("../../../hooks/useRoomState");
var _EventUtils = require("../../../utils/EventUtils");
var _events = require("../../../events");
var _ConfirmRedactDialog = require("../dialogs/ConfirmRedactDialog");
var _PinningUtils = _interopRequireDefault(require("../../../utils/PinningUtils.ts"));
var _PosthogTrackers = _interopRequireDefault(require("../../../PosthogTrackers.ts"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2021 The Matrix.org Foundation C.I.C.
Copyright 2017 Travis Ralston
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const AVATAR_SIZE = "32px";
/**
* Properties for {@link PinnedEventTile}.
*/
/**
* A pinned event tile.
*/
function PinnedEventTile({
event,
room,
permalinkCreator
}) {
const sender = event.getSender();
if (!sender) {
throw new Error("Pinned event unexpectedly has no sender");
}
const isInThread = Boolean(event.threadRootId);
const displayThreadInfo = !event.isThreadRoot && isInThread;
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PinnedEventTile",
role: "listitem"
}, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, {
className: "mx_PinnedEventTile_senderAvatar",
member: event.sender,
size: AVATAR_SIZE,
fallbackUserId: sender
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PinnedEventTile_wrapper"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PinnedEventTile_top"
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, {
label: event.sender?.name || sender
}, /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("mx_PinnedEventTile_sender", (0, _FormattingUtils.getUserNameColorClass)(sender))
}, event.sender?.name || sender)), /*#__PURE__*/_react.default.createElement(PinMenu, {
event: event,
room: room,
permalinkCreator: permalinkCreator
})), /*#__PURE__*/_react.default.createElement(_MessageEvent.default, {
mxEvent: event,
maxImageHeight: 150,
onHeightChanged: () => {} // we need to give this, apparently
,
permalinkCreator: permalinkCreator,
replacingEventId: event.replacingEventId()
}), displayThreadInfo && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PinnedEventTile_thread"
}, /*#__PURE__*/_react.default.createElement(_threads.default, null), (0, _languageHandler._t)("right_panel|pinned_messages|reply_thread", {}, {
link: sub => /*#__PURE__*/_react.default.createElement("button", {
type: "button",
onClick: () => {
if (!event.threadRootId) return;
const rootEvent = room.findEventById(event.threadRootId);
if (!rootEvent) return;
_dispatcher.default.dispatch({
action: _actions.Action.ShowThread,
rootEvent: rootEvent,
push: true
});
}
}, sub)
}))));
}
/**
* Properties for {@link PinMenu}.
*/
/**
* A popover menu with actions on the pinned event
*/
function PinMenu({
event,
room,
permalinkCreator
}) {
const [open, setOpen] = (0, _react.useState)(false);
const matrixClient = (0, _MatrixClientContext.useMatrixClientContext)();
/**
* View the event in the timeline.
*/
const onViewInTimeline = (0, _react.useCallback)(() => {
_PosthogTrackers.default.trackInteraction("PinnedMessageListViewTimeline");
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
event_id: event.getId(),
highlighted: true,
room_id: event.getRoomId(),
metricsTrigger: undefined // room doesn't change
});
}, [event]);
/**
* Whether the client can unpin the event.
* If the room state change, we want to check again the permission
*/
const canUnpin = (0, _useRoomState.useRoomState)(room, () => _PinningUtils.default.canUnpin(matrixClient, event));
/**
* Unpin the event.
* @param event
*/
const onUnpin = (0, _react.useCallback)(async () => {
await _PinningUtils.default.pinOrUnpinEvent(matrixClient, event);
_PosthogTrackers.default.trackPinUnpinMessage("Unpin", "MessagePinningList");
}, [event, matrixClient]);
const contentActionable = (0, _EventUtils.isContentActionable)(event);
// Get the forwardable event for the given event
const forwardableEvent = contentActionable && (0, _events.getForwardableEvent)(event, matrixClient);
/**
* Open the forward dialog.
*/
const onForward = (0, _react.useCallback)(() => {
if (forwardableEvent) {
_dispatcher.default.dispatch({
action: _actions.Action.OpenForwardDialog,
event: forwardableEvent,
permalinkCreator: permalinkCreator
});
}
}, [forwardableEvent, permalinkCreator]);
/**
* Whether the client can redact the event.
*/
const canRedact = room.getLiveTimeline().getState(_matrix.EventTimeline.FORWARDS)?.maySendRedactionForEvent(event, matrixClient.getSafeUserId()) && event.getType() !== _matrix.EventType.RoomServerAcl && event.getType() !== _matrix.EventType.RoomEncryption;
/**
* Redact the event.
*/
const onRedact = (0, _react.useCallback)(() => (0, _ConfirmRedactDialog.createRedactEventDialog)({
mxEvent: event
}), [event]);
return /*#__PURE__*/_react.default.createElement(_compoundWeb.Menu, {
open: open,
onOpenChange: setOpen,
showTitle: false,
title: (0, _languageHandler._t)("right_panel|pinned_messages|menu"),
side: "right",
align: "start",
trigger: /*#__PURE__*/_react.default.createElement(_compoundWeb.IconButton, {
size: "24px",
"aria-label": (0, _languageHandler._t)("right_panel|pinned_messages|menu")
}, /*#__PURE__*/_react.default.createElement(_overflowHorizontal.default, null))
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, {
Icon: _visibilityOn.default,
label: (0, _languageHandler._t)("right_panel|pinned_messages|view"),
onSelect: onViewInTimeline
}), canUnpin && /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, {
Icon: _unpin.default,
label: (0, _languageHandler._t)("action|unpin"),
onSelect: onUnpin
}), forwardableEvent && /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, {
Icon: _forward.default,
label: (0, _languageHandler._t)("action|forward"),
onSelect: onForward
}), canRedact && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, {
kind: "critical",
Icon: _delete.default,
label: (0, _languageHandler._t)("action|delete"),
onSelect: onRedact
})));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2NvbXBvdW5kV2ViIiwiX3Zpc2liaWxpdHlPbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdW5waW4iLCJfZm9yd2FyZCIsIl9vdmVyZmxvd0hvcml6b250YWwiLCJfZGVsZXRlIiwiX3RocmVhZHMiLCJfY2xhc3NuYW1lcyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfTWVzc2FnZUV2ZW50IiwiX01lbWJlckF2YXRhciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRm9ybWF0dGluZ1V0aWxzIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfdXNlUm9vbVN0YXRlIiwiX0V2ZW50VXRpbHMiLCJfZXZlbnRzIiwiX0NvbmZpcm1SZWRhY3REaWFsb2ciLCJfUGlubmluZ1V0aWxzIiwiX1Bvc3Rob2dUcmFja2VycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkFWQVRBUl9TSVpFIiwiUGlubmVkRXZlbnRUaWxlIiwiZXZlbnQiLCJyb29tIiwicGVybWFsaW5rQ3JlYXRvciIsInNlbmRlciIsImdldFNlbmRlciIsIkVycm9yIiwiaXNJblRocmVhZCIsIkJvb2xlYW4iLCJ0aHJlYWRSb290SWQiLCJkaXNwbGF5VGhyZWFkSW5mbyIsImlzVGhyZWFkUm9vdCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJyb2xlIiwibWVtYmVyIiwic2l6ZSIsImZhbGxiYWNrVXNlcklkIiwiVG9vbHRpcCIsImxhYmVsIiwibmFtZSIsImNsYXNzTmFtZXMiLCJnZXRVc2VyTmFtZUNvbG9yQ2xhc3MiLCJQaW5NZW51IiwibXhFdmVudCIsIm1heEltYWdlSGVpZ2h0Iiwib25IZWlnaHRDaGFuZ2VkIiwicmVwbGFjaW5nRXZlbnRJZCIsIl90IiwibGluayIsInN1YiIsInR5cGUiLCJvbkNsaWNrIiwicm9vdEV2ZW50IiwiZmluZEV2ZW50QnlJZCIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiU2hvd1RocmVhZCIsInB1c2giLCJvcGVuIiwic2V0T3BlbiIsInVzZVN0YXRlIiwibWF0cml4Q2xpZW50IiwidXNlTWF0cml4Q2xpZW50Q29udGV4dCIsIm9uVmlld0luVGltZWxpbmUiLCJ1c2VDYWxsYmFjayIsIlBvc3Rob2dUcmFja2VycyIsInRyYWNrSW50ZXJhY3Rpb24iLCJWaWV3Um9vbSIsImV2ZW50X2lkIiwiZ2V0SWQiLCJoaWdobGlnaHRlZCIsInJvb21faWQiLCJnZXRSb29tSWQiLCJtZXRyaWNzVHJpZ2dlciIsInVuZGVmaW5lZCIsImNhblVucGluIiwidXNlUm9vbVN0YXRlIiwiUGlubmluZ1V0aWxzIiwib25VbnBpbiIsInBpbk9yVW5waW5FdmVudCIsInRyYWNrUGluVW5waW5NZXNzYWdlIiwiY29udGVudEFjdGlvbmFibGUiLCJpc0NvbnRlbnRBY3Rpb25hYmxlIiwiZm9yd2FyZGFibGVFdmVudCIsImdldEZvcndhcmRhYmxlRXZlbnQiLCJvbkZvcndhcmQiLCJPcGVuRm9yd2FyZERpYWxvZyIsImNhblJlZGFjdCIsImdldExpdmVUaW1lbGluZSIsImdldFN0YXRlIiwiRXZlbnRUaW1lbGluZSIsIkZPUldBUkRTIiwibWF5U2VuZFJlZGFjdGlvbkZvckV2ZW50IiwiZ2V0U2FmZVVzZXJJZCIsImdldFR5cGUiLCJFdmVudFR5cGUiLCJSb29tU2VydmVyQWNsIiwiUm9vbUVuY3J5cHRpb24iLCJvblJlZGFjdCIsImNyZWF0ZVJlZGFjdEV2ZW50RGlhbG9nIiwiTWVudSIsIm9uT3BlbkNoYW5nZSIsInNob3dUaXRsZSIsInRpdGxlIiwic2lkZSIsImFsaWduIiwidHJpZ2dlciIsIkljb25CdXR0b24iLCJNZW51SXRlbSIsIkljb24iLCJWaWV3SWNvbiIsIm9uU2VsZWN0IiwiVW5waW5JY29uIiwiRm9yd2FyZEljb24iLCJGcmFnbWVudCIsIlNlcGFyYXRvciIsImtpbmQiLCJEZWxldGVJY29uIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvcm9vbXMvUGlubmVkRXZlbnRUaWxlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTcgVHJhdmlzIFJhbHN0b25cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IEpTWCwgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBFdmVudFRpbWVsaW5lLCBFdmVudFR5cGUsIE1hdHJpeEV2ZW50LCBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiwgTWVudSwgTWVudUl0ZW0sIFNlcGFyYXRvciwgVG9vbHRpcCB9IGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLXdlYlwiO1xuaW1wb3J0IFZpZXdJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy92aXNpYmlsaXR5LW9uXCI7XG5pbXBvcnQgVW5waW5JY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy91bnBpblwiO1xuaW1wb3J0IEZvcndhcmRJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9mb3J3YXJkXCI7XG5pbXBvcnQgVHJpZ2dlckljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL292ZXJmbG93LWhvcml6b250YWxcIjtcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9kZWxldGVcIjtcbmltcG9ydCBUaHJlYWRJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy90aHJlYWRzXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuXG5pbXBvcnQgZGlzIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCBNZXNzYWdlRXZlbnQgZnJvbSBcIi4uL21lc3NhZ2VzL01lc3NhZ2VFdmVudFwiO1xuaW1wb3J0IE1lbWJlckF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9NZW1iZXJBdmF0YXJcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgZ2V0VXNlck5hbWVDb2xvckNsYXNzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0Zvcm1hdHRpbmdVdGlsc1wiO1xuaW1wb3J0IHsgVmlld1Jvb21QYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvVmlld1Jvb21QYXlsb2FkXCI7XG5pbXBvcnQgeyBSb29tUGVybWFsaW5rQ3JlYXRvciB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wZXJtYWxpbmtzL1Blcm1hbGlua3NcIjtcbmltcG9ydCB7IHVzZU1hdHJpeENsaWVudENvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlUm9vbVN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZVJvb21TdGF0ZVwiO1xuaW1wb3J0IHsgaXNDb250ZW50QWN0aW9uYWJsZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9FdmVudFV0aWxzXCI7XG5pbXBvcnQgeyBnZXRGb3J3YXJkYWJsZUV2ZW50IH0gZnJvbSBcIi4uLy4uLy4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgT3BlbkZvcndhcmREaWFsb2dQYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvT3BlbkZvcndhcmREaWFsb2dQYXlsb2FkXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWRhY3RFdmVudERpYWxvZyB9IGZyb20gXCIuLi9kaWFsb2dzL0NvbmZpcm1SZWRhY3REaWFsb2dcIjtcbmltcG9ydCB7IFNob3dUaHJlYWRQYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvU2hvd1RocmVhZFBheWxvYWRcIjtcbmltcG9ydCBQaW5uaW5nVXRpbHMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1Bpbm5pbmdVdGlscy50c1wiO1xuaW1wb3J0IFBvc3Rob2dUcmFja2VycyBmcm9tIFwiLi4vLi4vLi4vUG9zdGhvZ1RyYWNrZXJzLnRzXCI7XG5cbmNvbnN0IEFWQVRBUl9TSVpFID0gXCIzMnB4XCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3Ige0BsaW5rIFBpbm5lZEV2ZW50VGlsZX0uXG4gKi9cbmludGVyZmFjZSBQaW5uZWRFdmVudFRpbGVQcm9wcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHRvIGRpc3BsYXkuXG4gICAgICovXG4gICAgZXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJtYWxpbmsgY3JlYXRvciB0byB1c2UuXG4gICAgICovXG4gICAgcGVybWFsaW5rQ3JlYXRvcjogUm9vbVBlcm1hbGlua0NyZWF0b3I7XG4gICAgLyoqXG4gICAgICogVGhlIHJvb20gdGhlIGV2ZW50IGlzIGluLlxuICAgICAqL1xuICAgIHJvb206IFJvb207XG59XG5cbi8qKlxuICogQSBwaW5uZWQgZXZlbnQgdGlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFBpbm5lZEV2ZW50VGlsZSh7IGV2ZW50LCByb29tLCBwZXJtYWxpbmtDcmVhdG9yIH06IFBpbm5lZEV2ZW50VGlsZVByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHNlbmRlciA9IGV2ZW50LmdldFNlbmRlcigpO1xuICAgIGlmICghc2VuZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBpbm5lZCBldmVudCB1bmV4cGVjdGVkbHkgaGFzIG5vIHNlbmRlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0luVGhyZWFkID0gQm9vbGVhbihldmVudC50aHJlYWRSb290SWQpO1xuICAgIGNvbnN0IGRpc3BsYXlUaHJlYWRJbmZvID0gIWV2ZW50LmlzVGhyZWFkUm9vdCAmJiBpc0luVGhyZWFkO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9QaW5uZWRFdmVudFRpbGVcIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPE1lbWJlckF2YXRhclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9QaW5uZWRFdmVudFRpbGVfc2VuZGVyQXZhdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyPXtldmVudC5zZW5kZXJ9XG4gICAgICAgICAgICAgICAgICAgIHNpemU9e0FWQVRBUl9TSVpFfVxuICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1VzZXJJZD17c2VuZGVyfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfUGlubmVkRXZlbnRUaWxlX3dyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Bpbm5lZEV2ZW50VGlsZV90b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAgbGFiZWw9e2V2ZW50LnNlbmRlcj8ubmFtZSB8fCBzZW5kZXJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfUGlubmVkRXZlbnRUaWxlX3NlbmRlclwiLCBnZXRVc2VyTmFtZUNvbG9yQ2xhc3Moc2VuZGVyKSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtldmVudC5zZW5kZXI/Lm5hbWUgfHwgc2VuZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxQaW5NZW51IGV2ZW50PXtldmVudH0gcm9vbT17cm9vbX0gcGVybWFsaW5rQ3JlYXRvcj17cGVybWFsaW5rQ3JlYXRvcn0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8TWVzc2FnZUV2ZW50XG4gICAgICAgICAgICAgICAgICAgIG14RXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgICBtYXhJbWFnZUhlaWdodD17MTUwfVxuICAgICAgICAgICAgICAgICAgICBvbkhlaWdodENoYW5nZWQ9eygpID0+IHt9fSAvLyB3ZSBuZWVkIHRvIGdpdmUgdGhpcywgYXBwYXJlbnRseVxuICAgICAgICAgICAgICAgICAgICBwZXJtYWxpbmtDcmVhdG9yPXtwZXJtYWxpbmtDcmVhdG9yfVxuICAgICAgICAgICAgICAgICAgICByZXBsYWNpbmdFdmVudElkPXtldmVudC5yZXBsYWNpbmdFdmVudElkKCl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7ZGlzcGxheVRocmVhZEluZm8gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Bpbm5lZEV2ZW50VGlsZV90aHJlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUaHJlYWRJY29uIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyaWdodF9wYW5lbHxwaW5uZWRfbWVzc2FnZXN8cmVwbHlfdGhyZWFkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rOiAoc3ViKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnRocmVhZFJvb3RJZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RFdmVudCA9IHJvb20uZmluZEV2ZW50QnlJZChldmVudC50aHJlYWRSb290SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvb3RFdmVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaDxTaG93VGhyZWFkUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uU2hvd1RocmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFdmVudDogcm9vdEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB7QGxpbmsgUGluTWVudX0uXG4gKi9cbmludGVyZmFjZSBQaW5NZW51UHJvcHMgZXh0ZW5kcyBQaW5uZWRFdmVudFRpbGVQcm9wcyB7fVxuXG4vKipcbiAqIEEgcG9wb3ZlciBtZW51IHdpdGggYWN0aW9ucyBvbiB0aGUgcGlubmVkIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIFBpbk1lbnUoeyBldmVudCwgcm9vbSwgcGVybWFsaW5rQ3JlYXRvciB9OiBQaW5NZW51UHJvcHMpOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IG1hdHJpeENsaWVudCA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcblxuICAgIC8qKlxuICAgICAqIFZpZXcgdGhlIGV2ZW50IGluIHRoZSB0aW1lbGluZS5cbiAgICAgKi9cbiAgICBjb25zdCBvblZpZXdJblRpbWVsaW5lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBQb3N0aG9nVHJhY2tlcnMudHJhY2tJbnRlcmFjdGlvbihcIlBpbm5lZE1lc3NhZ2VMaXN0Vmlld1RpbWVsaW5lXCIpO1xuXG4gICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3Um9vbVBheWxvYWQ+KHtcbiAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50LmdldElkKCksXG4gICAgICAgICAgICBoaWdobGlnaHRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHJvb21faWQ6IGV2ZW50LmdldFJvb21JZCgpLFxuICAgICAgICAgICAgbWV0cmljc1RyaWdnZXI6IHVuZGVmaW5lZCwgLy8gcm9vbSBkb2Vzbid0IGNoYW5nZVxuICAgICAgICB9KTtcbiAgICB9LCBbZXZlbnRdKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNsaWVudCBjYW4gdW5waW4gdGhlIGV2ZW50LlxuICAgICAqIElmIHRoZSByb29tIHN0YXRlIGNoYW5nZSwgd2Ugd2FudCB0byBjaGVjayBhZ2FpbiB0aGUgcGVybWlzc2lvblxuICAgICAqL1xuICAgIGNvbnN0IGNhblVucGluID0gdXNlUm9vbVN0YXRlKHJvb20sICgpID0+IFBpbm5pbmdVdGlscy5jYW5VbnBpbihtYXRyaXhDbGllbnQsIGV2ZW50KSk7XG5cbiAgICAvKipcbiAgICAgKiBVbnBpbiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgY29uc3Qgb25VbnBpbiA9IHVzZUNhbGxiYWNrKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgUGlubmluZ1V0aWxzLnBpbk9yVW5waW5FdmVudChtYXRyaXhDbGllbnQsIGV2ZW50KTtcbiAgICAgICAgUG9zdGhvZ1RyYWNrZXJzLnRyYWNrUGluVW5waW5NZXNzYWdlKFwiVW5waW5cIiwgXCJNZXNzYWdlUGlubmluZ0xpc3RcIik7XG4gICAgfSwgW2V2ZW50LCBtYXRyaXhDbGllbnRdKTtcblxuICAgIGNvbnN0IGNvbnRlbnRBY3Rpb25hYmxlID0gaXNDb250ZW50QWN0aW9uYWJsZShldmVudCk7XG4gICAgLy8gR2V0IHRoZSBmb3J3YXJkYWJsZSBldmVudCBmb3IgdGhlIGdpdmVuIGV2ZW50XG4gICAgY29uc3QgZm9yd2FyZGFibGVFdmVudCA9IGNvbnRlbnRBY3Rpb25hYmxlICYmIGdldEZvcndhcmRhYmxlRXZlbnQoZXZlbnQsIG1hdHJpeENsaWVudCk7XG4gICAgLyoqXG4gICAgICogT3BlbiB0aGUgZm9yd2FyZCBkaWFsb2cuXG4gICAgICovXG4gICAgY29uc3Qgb25Gb3J3YXJkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBpZiAoZm9yd2FyZGFibGVFdmVudCkge1xuICAgICAgICAgICAgZGlzLmRpc3BhdGNoPE9wZW5Gb3J3YXJkRGlhbG9nUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLk9wZW5Gb3J3YXJkRGlhbG9nLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBmb3J3YXJkYWJsZUV2ZW50LFxuICAgICAgICAgICAgICAgIHBlcm1hbGlua0NyZWF0b3I6IHBlcm1hbGlua0NyZWF0b3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtmb3J3YXJkYWJsZUV2ZW50LCBwZXJtYWxpbmtDcmVhdG9yXSk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjbGllbnQgY2FuIHJlZGFjdCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgY29uc3QgY2FuUmVkYWN0ID1cbiAgICAgICAgcm9vbVxuICAgICAgICAgICAgLmdldExpdmVUaW1lbGluZSgpXG4gICAgICAgICAgICAuZ2V0U3RhdGUoRXZlbnRUaW1lbGluZS5GT1JXQVJEUylcbiAgICAgICAgICAgID8ubWF5U2VuZFJlZGFjdGlvbkZvckV2ZW50KGV2ZW50LCBtYXRyaXhDbGllbnQuZ2V0U2FmZVVzZXJJZCgpKSAmJlxuICAgICAgICBldmVudC5nZXRUeXBlKCkgIT09IEV2ZW50VHlwZS5Sb29tU2VydmVyQWNsICYmXG4gICAgICAgIGV2ZW50LmdldFR5cGUoKSAhPT0gRXZlbnRUeXBlLlJvb21FbmNyeXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogUmVkYWN0IHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBjb25zdCBvblJlZGFjdCA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoKTogdm9pZCA9PlxuICAgICAgICAgICAgY3JlYXRlUmVkYWN0RXZlbnREaWFsb2coe1xuICAgICAgICAgICAgICAgIG14RXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgfSksXG4gICAgICAgIFtldmVudF0sXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxNZW51XG4gICAgICAgICAgICBvcGVuPXtvcGVufVxuICAgICAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRPcGVufVxuICAgICAgICAgICAgc2hvd1RpdGxlPXtmYWxzZX1cbiAgICAgICAgICAgIHRpdGxlPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc3xtZW51XCIpfVxuICAgICAgICAgICAgc2lkZT1cInJpZ2h0XCJcbiAgICAgICAgICAgIGFsaWduPVwic3RhcnRcIlxuICAgICAgICAgICAgdHJpZ2dlcj17XG4gICAgICAgICAgICAgICAgPEljb25CdXR0b24gc2l6ZT1cIjI0cHhcIiBhcmlhLWxhYmVsPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc3xtZW51XCIpfT5cbiAgICAgICAgICAgICAgICAgICAgPFRyaWdnZXJJY29uIC8+XG4gICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAgICA8TWVudUl0ZW0gSWNvbj17Vmlld0ljb259IGxhYmVsPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc3x2aWV3XCIpfSBvblNlbGVjdD17b25WaWV3SW5UaW1lbGluZX0gLz5cbiAgICAgICAgICAgIHtjYW5VbnBpbiAmJiA8TWVudUl0ZW0gSWNvbj17VW5waW5JY29ufSBsYWJlbD17X3QoXCJhY3Rpb258dW5waW5cIil9IG9uU2VsZWN0PXtvblVucGlufSAvPn1cbiAgICAgICAgICAgIHtmb3J3YXJkYWJsZUV2ZW50ICYmIDxNZW51SXRlbSBJY29uPXtGb3J3YXJkSWNvbn0gbGFiZWw9e190KFwiYWN0aW9ufGZvcndhcmRcIil9IG9uU2VsZWN0PXtvbkZvcndhcmR9IC8+fVxuICAgICAgICAgICAge2NhblJlZGFjdCAmJiAoXG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0ga2luZD1cImNyaXRpY2FsXCIgSWNvbj17RGVsZXRlSWNvbn0gbGFiZWw9e190KFwiYWN0aW9ufGRlbGV0ZVwiKX0gb25TZWxlY3Q9e29uUmVkYWN0fSAvPlxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9NZW51PlxuICAgICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFGLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTyxtQkFBQSxHQUFBSCxzQkFBQSxDQUFBSixPQUFBO0FBQ0Es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