matrix-react-sdk
Version:
SDK for matrix.org using React
161 lines (150 loc) • 30.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IncomingCallToast = IncomingCallToast;
exports.getIncomingCallToastKey = void 0;
var _react = _interopRequireWildcard(require("react"));
var _compoundWeb = require("@vector-im/compound-web");
var _videoCallSolid = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/video-call-solid"));
var _languageHandler = require("../languageHandler");
var _RoomAvatar = _interopRequireDefault(require("../components/views/avatars/RoomAvatar"));
var _MatrixClientPeg = require("../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
var _actions = require("../dispatcher/actions");
var _ToastStore = _interopRequireDefault(require("../stores/ToastStore"));
var _LiveContentSummary = require("../components/views/rooms/LiveContentSummary");
var _useCall = require("../hooks/useCall");
var _AccessibleButton = _interopRequireDefault(require("../components/views/elements/AccessibleButton"));
var _useDispatcher = require("../hooks/useDispatcher");
var _Call = require("../models/Call");
var _LegacyCallHandler = _interopRequireWildcard(require("../LegacyCallHandler"));
var _useEventEmitter = require("../hooks/useEventEmitter");
var _CallStore = require("../stores/CallStore");
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 2022 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.
*/
const getIncomingCallToastKey = (callId, roomId) => `call_${callId}_${roomId}`;
exports.getIncomingCallToastKey = getIncomingCallToastKey;
const MAX_RING_TIME_MS = 10 * 1000;
function JoinCallButtonWithCall({
onClick,
call,
disabledTooltip
}) {
let disTooltip = disabledTooltip;
const disabledBecauseFullTooltip = (0, _useCall.useJoinCallButtonDisabledTooltip)(call);
disTooltip = disabledTooltip ?? disabledBecauseFullTooltip ?? undefined;
return /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, {
description: disTooltip ?? (0, _languageHandler._t)("voip|video_call")
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, {
className: "mx_IncomingCallToast_joinButton",
onClick: onClick,
disabled: disTooltip != undefined,
kind: "primary",
Icon: _videoCallSolid.default,
size: "sm"
}, (0, _languageHandler._t)("action|join")));
}
function IncomingCallToast({
notifyEvent
}) {
const roomId = notifyEvent.getRoomId();
const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(roomId) ?? undefined;
const call = (0, _useCall.useCall)(roomId);
const [connectedCalls, setConnectedCalls] = (0, _react.useState)(Array.from(_CallStore.CallStore.instance.connectedCalls));
(0, _useEventEmitter.useEventEmitter)(_CallStore.CallStore.instance, _CallStore.CallStoreEvent.ConnectedCalls, () => {
setConnectedCalls(Array.from(_CallStore.CallStore.instance.connectedCalls));
});
const otherCallIsOngoing = connectedCalls.find(call => call.roomId !== roomId);
// Start ringing if not already.
(0, _react.useEffect)(() => {
const isRingToast = notifyEvent.getContent()["notify_type"] == "ring";
if (isRingToast && !_LegacyCallHandler.default.instance.isPlaying(_LegacyCallHandler.AudioID.Ring)) {
_LegacyCallHandler.default.instance.play(_LegacyCallHandler.AudioID.Ring);
}
}, [notifyEvent]);
// Stop ringing on dismiss.
const dismissToast = (0, _react.useCallback)(() => {
_ToastStore.default.sharedInstance().dismissToast(getIncomingCallToastKey(notifyEvent.getContent().call_id ?? "", roomId));
_LegacyCallHandler.default.instance.pause(_LegacyCallHandler.AudioID.Ring);
}, [notifyEvent, roomId]);
// Dismiss if session got ended remotely.
const onCall = (0, _react.useCallback)((call, callRoomId) => {
const roomId = notifyEvent.getRoomId();
if (!roomId && roomId !== callRoomId) return;
if (call === null || call.participants.size === 0) {
dismissToast();
}
}, [dismissToast, notifyEvent]);
// Dismiss if antother device from this user joins.
const onParticipantChange = (0, _react.useCallback)((participants, prevParticipants) => {
if (Array.from(participants.keys()).some(p => p.userId == room?.client.getUserId())) {
dismissToast();
}
}, [dismissToast, room?.client]);
// Dismiss on timeout.
(0, _react.useEffect)(() => {
const timeout = setTimeout(dismissToast, MAX_RING_TIME_MS);
return () => clearTimeout(timeout);
});
// Dismiss on viewing call.
(0, _useDispatcher.useDispatcher)(_dispatcher.default, (0, _react.useCallback)(payload => {
if (payload.action === _actions.Action.ViewRoom && payload.room_id === roomId && payload.view_call) {
dismissToast();
}
}, [roomId, dismissToast]));
// Dismiss on clicking join.
const onJoinClick = (0, _react.useCallback)(e => {
e.stopPropagation();
// The toast will be automatically dismissed by the dispatcher callback above
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: room?.roomId,
view_call: true,
skipLobby: "shiftKey" in e ? e.shiftKey : false,
metricsTrigger: undefined
});
}, [room]);
// Dismiss on closing toast.
const onCloseClick = (0, _react.useCallback)(e => {
e.stopPropagation();
dismissToast();
}, [dismissToast]);
(0, _useEventEmitter.useEventEmitter)(_CallStore.CallStore.instance, _CallStore.CallStoreEvent.Call, onCall);
(0, _useEventEmitter.useEventEmitter)(call ?? undefined, _Call.CallEvent.Participants, onParticipantChange);
return /*#__PURE__*/_react.default.createElement(_compoundWeb.TooltipProvider, null, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: room ?? undefined,
size: "24px"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_IncomingCallToast_content"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_IncomingCallToast_info"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_IncomingCallToast_room"
}, room ? room.name : (0, _languageHandler._t)("voip|call_toast_unknown_room")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_IncomingCallToast_message"
}, (0, _languageHandler._t)("voip|video_call_started")), call ? /*#__PURE__*/_react.default.createElement(_LiveContentSummary.LiveContentSummaryWithCall, {
call: call
}) : /*#__PURE__*/_react.default.createElement(_LiveContentSummary.LiveContentSummary, {
type: _LiveContentSummary.LiveContentType.Video,
text: (0, _languageHandler._t)("common|video"),
active: false,
participantCount: 0
})), /*#__PURE__*/_react.default.createElement(JoinCallButtonWithCall, {
onClick: onJoinClick,
call: call,
disabledTooltip: otherCallIsOngoing ? "Ongoing call" : undefined
})), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_IncomingCallToast_closeButton",
onClick: onCloseClick,
title: (0, _languageHandler._t)("action|close")
})));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY29tcG91bmRXZWIiLCJfdmlkZW9DYWxsU29saWQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Sb29tQXZhdGFyIiwiX01hdHJpeENsaWVudFBlZyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfVG9hc3RTdG9yZSIsIl9MaXZlQ29udGVudFN1bW1hcnkiLCJfdXNlQ2FsbCIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX3VzZURpc3BhdGNoZXIiLCJfQ2FsbCIsIl9MZWdhY3lDYWxsSGFuZGxlciIsIl91c2VFdmVudEVtaXR0ZXIiLCJfQ2FsbFN0b3JlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiZ2V0SW5jb21pbmdDYWxsVG9hc3RLZXkiLCJjYWxsSWQiLCJyb29tSWQiLCJleHBvcnRzIiwiTUFYX1JJTkdfVElNRV9NUyIsIkpvaW5DYWxsQnV0dG9uV2l0aENhbGwiLCJvbkNsaWNrIiwiZGlzYWJsZWRUb29sdGlwIiwiZGlzVG9vbHRpcCIsImRpc2FibGVkQmVjYXVzZUZ1bGxUb29sdGlwIiwidXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAiLCJ1bmRlZmluZWQiLCJjcmVhdGVFbGVtZW50IiwiVG9vbHRpcCIsImRlc2NyaXB0aW9uIiwiX3QiLCJCdXR0b24iLCJjbGFzc05hbWUiLCJkaXNhYmxlZCIsImtpbmQiLCJJY29uIiwiVmlkZW9DYWxsSWNvbiIsInNpemUiLCJJbmNvbWluZ0NhbGxUb2FzdCIsIm5vdGlmeUV2ZW50IiwiZ2V0Um9vbUlkIiwicm9vbSIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRSb29tIiwidXNlQ2FsbCIsImNvbm5lY3RlZENhbGxzIiwic2V0Q29ubmVjdGVkQ2FsbHMiLCJ1c2VTdGF0ZSIsIkFycmF5IiwiZnJvbSIsIkNhbGxTdG9yZSIsImluc3RhbmNlIiwidXNlRXZlbnRFbWl0dGVyIiwiQ2FsbFN0b3JlRXZlbnQiLCJDb25uZWN0ZWRDYWxscyIsIm90aGVyQ2FsbElzT25nb2luZyIsImZpbmQiLCJ1c2VFZmZlY3QiLCJpc1JpbmdUb2FzdCIsImdldENvbnRlbnQiLCJMZWdhY3lDYWxsSGFuZGxlciIsImlzUGxheWluZyIsIkF1ZGlvSUQiLCJSaW5nIiwicGxheSIsImRpc21pc3NUb2FzdCIsInVzZUNhbGxiYWNrIiwiVG9hc3RTdG9yZSIsInNoYXJlZEluc3RhbmNlIiwiY2FsbF9pZCIsInBhdXNlIiwib25DYWxsIiwiY2FsbFJvb21JZCIsInBhcnRpY2lwYW50cyIsIm9uUGFydGljaXBhbnRDaGFuZ2UiLCJwcmV2UGFydGljaXBhbnRzIiwia2V5cyIsInNvbWUiLCJwIiwidXNlcklkIiwiY2xpZW50IiwiZ2V0VXNlcklkIiwidGltZW91dCIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJ1c2VEaXNwYXRjaGVyIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJwYXlsb2FkIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1Jvb20iLCJyb29tX2lkIiwidmlld19jYWxsIiwib25Kb2luQ2xpY2siLCJzdG9wUHJvcGFnYXRpb24iLCJkaXNwYXRjaCIsInNraXBMb2JieSIsInNoaWZ0S2V5IiwibWV0cmljc1RyaWdnZXIiLCJvbkNsb3NlQ2xpY2siLCJDYWxsIiwiQ2FsbEV2ZW50IiwiUGFydGljaXBhbnRzIiwiVG9vbHRpcFByb3ZpZGVyIiwiRnJhZ21lbnQiLCJuYW1lIiwiTGl2ZUNvbnRlbnRTdW1tYXJ5V2l0aENhbGwiLCJMaXZlQ29udGVudFN1bW1hcnkiLCJ0eXBlIiwiTGl2ZUNvbnRlbnRUeXBlIiwiVmlkZW8iLCJ0ZXh0IiwiYWN0aXZlIiwicGFydGljaXBhbnRDb3VudCIsInRpdGxlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvYXN0cy9JbmNvbWluZ0NhbGxUb2FzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgUm9vbU1lbWJlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEJ1dHRvbiwgVG9vbHRpcCwgVG9vbHRpcFByb3ZpZGVyIH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtd2ViXCI7XG5pbXBvcnQgVmlkZW9DYWxsSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvdmlkZW8tY2FsbC1zb2xpZFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL2F2YXRhcnMvUm9vbUF2YXRhclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IFRvYXN0U3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9Ub2FzdFN0b3JlXCI7XG5pbXBvcnQge1xuICAgIExpdmVDb250ZW50U3VtbWFyeSxcbiAgICBMaXZlQ29udGVudFN1bW1hcnlXaXRoQ2FsbCxcbiAgICBMaXZlQ29udGVudFR5cGUsXG59IGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL0xpdmVDb250ZW50U3VtbWFyeVwiO1xuaW1wb3J0IHsgdXNlQ2FsbCwgdXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAgfSBmcm9tIFwiLi4vaG9va3MvdXNlQ2FsbFwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2hvb2tzL3VzZURpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgQ2FsbCwgQ2FsbEV2ZW50IH0gZnJvbSBcIi4uL21vZGVscy9DYWxsXCI7XG5pbXBvcnQgTGVnYWN5Q2FsbEhhbmRsZXIsIHsgQXVkaW9JRCB9IGZyb20gXCIuLi9MZWdhY3lDYWxsSGFuZGxlclwiO1xuaW1wb3J0IHsgdXNlRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQ2FsbFN0b3JlLCBDYWxsU3RvcmVFdmVudCB9IGZyb20gXCIuLi9zdG9yZXMvQ2FsbFN0b3JlXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRJbmNvbWluZ0NhbGxUb2FzdEtleSA9IChjYWxsSWQ6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGNhbGxfJHtjYWxsSWR9XyR7cm9vbUlkfWA7XG5jb25zdCBNQVhfUklOR19USU1FX01TID0gMTAgKiAxMDAwO1xuXG5pbnRlcmZhY2UgSm9pbkNhbGxCdXR0b25XaXRoQ2FsbFByb3BzIHtcbiAgICBvbkNsaWNrOiAoZTogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgY2FsbDogQ2FsbCB8IG51bGw7XG4gICAgZGlzYWJsZWRUb29sdGlwOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIEpvaW5DYWxsQnV0dG9uV2l0aENhbGwoeyBvbkNsaWNrLCBjYWxsLCBkaXNhYmxlZFRvb2x0aXAgfTogSm9pbkNhbGxCdXR0b25XaXRoQ2FsbFByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGxldCBkaXNUb29sdGlwID0gZGlzYWJsZWRUb29sdGlwO1xuICAgIGNvbnN0IGRpc2FibGVkQmVjYXVzZUZ1bGxUb29sdGlwID0gdXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAoY2FsbCk7XG4gICAgZGlzVG9vbHRpcCA9IGRpc2FibGVkVG9vbHRpcCA/PyBkaXNhYmxlZEJlY2F1c2VGdWxsVG9vbHRpcCA/PyB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8VG9vbHRpcCBkZXNjcmlwdGlvbj17ZGlzVG9vbHRpcCA/PyBfdChcInZvaXB8dmlkZW9fY2FsbFwiKX0+XG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfSW5jb21pbmdDYWxsVG9hc3Rfam9pbkJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzVG9vbHRpcCAhPSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIEljb249e1ZpZGVvQ2FsbEljb259XG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258am9pblwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgKTtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgICBub3RpZnlFdmVudDogTWF0cml4RXZlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmNvbWluZ0NhbGxUb2FzdCh7IG5vdGlmeUV2ZW50IH06IFByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHJvb21JZCA9IG5vdGlmeUV2ZW50LmdldFJvb21JZCgpITtcbiAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKHJvb21JZCkgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbGwgPSB1c2VDYWxsKHJvb21JZCk7XG4gICAgY29uc3QgW2Nvbm5lY3RlZENhbGxzLCBzZXRDb25uZWN0ZWRDYWxsc10gPSB1c2VTdGF0ZTxDYWxsW10+KEFycmF5LmZyb20oQ2FsbFN0b3JlLmluc3RhbmNlLmNvbm5lY3RlZENhbGxzKSk7XG4gICAgdXNlRXZlbnRFbWl0dGVyKENhbGxTdG9yZS5pbnN0YW5jZSwgQ2FsbFN0b3JlRXZlbnQuQ29ubmVjdGVkQ2FsbHMsICgpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGVkQ2FsbHMoQXJyYXkuZnJvbShDYWxsU3RvcmUuaW5zdGFuY2UuY29ubmVjdGVkQ2FsbHMpKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdGhlckNhbGxJc09uZ29pbmcgPSBjb25uZWN0ZWRDYWxscy5maW5kKChjYWxsKSA9PiBjYWxsLnJvb21JZCAhPT0gcm9vbUlkKTtcbiAgICAvLyBTdGFydCByaW5naW5nIGlmIG5vdCBhbHJlYWR5LlxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzUmluZ1RvYXN0ID0gKG5vdGlmeUV2ZW50LmdldENvbnRlbnQoKSBhcyB1bmtub3duIGFzIHsgbm90aWZ5X3R5cGU6IHN0cmluZyB9KVtcIm5vdGlmeV90eXBlXCJdID09IFwicmluZ1wiO1xuICAgICAgICBpZiAoaXNSaW5nVG9hc3QgJiYgIUxlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLmlzUGxheWluZyhBdWRpb0lELlJpbmcpKSB7XG4gICAgICAgICAgICBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5wbGF5KEF1ZGlvSUQuUmluZyk7XG4gICAgICAgIH1cbiAgICB9LCBbbm90aWZ5RXZlbnRdKTtcblxuICAgIC8vIFN0b3AgcmluZ2luZyBvbiBkaXNtaXNzLlxuICAgIGNvbnN0IGRpc21pc3NUb2FzdCA9IHVzZUNhbGxiYWNrKCgpOiB2b2lkID0+IHtcbiAgICAgICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmRpc21pc3NUb2FzdChcbiAgICAgICAgICAgIGdldEluY29taW5nQ2FsbFRvYXN0S2V5KG5vdGlmeUV2ZW50LmdldENvbnRlbnQoKS5jYWxsX2lkID8/IFwiXCIsIHJvb21JZCksXG4gICAgICAgICk7XG4gICAgICAgIExlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLnBhdXNlKEF1ZGlvSUQuUmluZyk7XG4gICAgfSwgW25vdGlmeUV2ZW50LCByb29tSWRdKTtcblxuICAgIC8vIERpc21pc3MgaWYgc2Vzc2lvbiBnb3QgZW5kZWQgcmVtb3RlbHkuXG4gICAgY29uc3Qgb25DYWxsID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChjYWxsOiBDYWxsLCBjYWxsUm9vbUlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvb21JZCA9IG5vdGlmeUV2ZW50LmdldFJvb21JZCgpO1xuICAgICAgICAgICAgaWYgKCFyb29tSWQgJiYgcm9vbUlkICE9PSBjYWxsUm9vbUlkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoY2FsbCA9PT0gbnVsbCB8fCBjYWxsLnBhcnRpY2lwYW50cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlzbWlzc1RvYXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNtaXNzVG9hc3QsIG5vdGlmeUV2ZW50XSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBpZiBhbnRvdGhlciBkZXZpY2UgZnJvbSB0aGlzIHVzZXIgam9pbnMuXG4gICAgY29uc3Qgb25QYXJ0aWNpcGFudENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAocGFydGljaXBhbnRzOiBNYXA8Um9vbU1lbWJlciwgU2V0PHN0cmluZz4+LCBwcmV2UGFydGljaXBhbnRzOiBNYXA8Um9vbU1lbWJlciwgU2V0PHN0cmluZz4+KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuZnJvbShwYXJ0aWNpcGFudHMua2V5cygpKS5zb21lKChwKSA9PiBwLnVzZXJJZCA9PSByb29tPy5jbGllbnQuZ2V0VXNlcklkKCkpKSB7XG4gICAgICAgICAgICAgICAgZGlzbWlzc1RvYXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNtaXNzVG9hc3QsIHJvb20/LmNsaWVudF0sXG4gICAgKTtcblxuICAgIC8vIERpc21pc3Mgb24gdGltZW91dC5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChkaXNtaXNzVG9hc3QsIE1BWF9SSU5HX1RJTUVfTVMpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gRGlzbWlzcyBvbiB2aWV3aW5nIGNhbGwuXG4gICAgdXNlRGlzcGF0Y2hlcihcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIsXG4gICAgICAgIHVzZUNhbGxiYWNrKFxuICAgICAgICAgICAgKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT09IEFjdGlvbi5WaWV3Um9vbSAmJiBwYXlsb2FkLnJvb21faWQgPT09IHJvb21JZCAmJiBwYXlsb2FkLnZpZXdfY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNtaXNzVG9hc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW3Jvb21JZCwgZGlzbWlzc1RvYXN0XSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBvbiBjbGlja2luZyBqb2luLlxuICAgIGNvbnN0IG9uSm9pbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIChlOiBCdXR0b25FdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gVGhlIHRvYXN0IHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNtaXNzZWQgYnkgdGhlIGRpc3BhdGNoZXIgY2FsbGJhY2sgYWJvdmVcbiAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgICAgIHJvb21faWQ6IHJvb20/LnJvb21JZCxcbiAgICAgICAgICAgICAgICB2aWV3X2NhbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgc2tpcExvYmJ5OiBcInNoaWZ0S2V5XCIgaW4gZSA/IGUuc2hpZnRLZXkgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtyb29tXSxcbiAgICApO1xuXG4gICAgLy8gRGlzbWlzcyBvbiBjbG9zaW5nIHRvYXN0LlxuICAgIGNvbnN0IG9uQ2xvc2VDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoZTogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGRpc21pc3NUb2FzdCgpO1xuICAgICAgICB9LFxuICAgICAgICBbZGlzbWlzc1RvYXN0XSxcbiAgICApO1xuXG4gICAgdXNlRXZlbnRFbWl0dGVyKENhbGxTdG9yZS5pbnN0YW5jZSwgQ2FsbFN0b3JlRXZlbnQuQ2FsbCwgb25DYWxsKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoY2FsbCA/PyB1bmRlZmluZWQsIENhbGxFdmVudC5QYXJ0aWNpcGFudHMsIG9uUGFydGljaXBhbnRDaGFuZ2UpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFRvb2x0aXBQcm92aWRlcj5cbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPFJvb21BdmF0YXIgcm9vbT17cm9vbSA/PyB1bmRlZmluZWR9IHNpemU9XCIyNHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9JbmNvbWluZ0NhbGxUb2FzdF9pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9JbmNvbWluZ0NhbGxUb2FzdF9yb29tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jvb20gPyByb29tLm5hbWUgOiBfdChcInZvaXB8Y2FsbF90b2FzdF91bmtub3duX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X21lc3NhZ2VcIj57X3QoXCJ2b2lwfHZpZGVvX2NhbGxfc3RhcnRlZFwiKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYWxsID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaXZlQ29udGVudFN1bW1hcnlXaXRoQ2FsbCBjYWxsPXtjYWxsfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGl2ZUNvbnRlbnRTdW1tYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9e0xpdmVDb250ZW50VHlwZS5WaWRlb31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD17X3QoXCJjb21tb258dmlkZW9cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZT17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50Q291bnQ9ezB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8Sm9pbkNhbGxCdXR0b25XaXRoQ2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25Kb2luQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsPXtjYWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRUb29sdGlwPXtvdGhlckNhbGxJc09uZ29pbmcgPyBcIk9uZ29pbmcgY2FsbFwiIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0luY29taW5nQ2FsbFRvYXN0X2Nsb3NlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25DbG9zZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJhY3Rpb258Y2xvc2VcIil9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICA8L1Rvb2x0aXBQcm92aWRlcj5cbiAgICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBSixzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQVEsUUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsV0FBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsbUJBQUEsR0FBQVYsT0FBQTtBQUtBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGlCQUFBLEdBQUFULHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBYSxjQUFBLEdBQUFiLE9BQUE7QUFFQSxJQUFBYyxLQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxrQkFBQSxHQUFBaEIsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFnQixnQkFBQSxHQUFBaEIsT0FBQTtBQUNBLElBQUFpQixVQUFBLEdBQUFqQixPQUFBO0FBQWdFLFNBQUFrQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBcEIsd0JBQUFvQixDQUFBLEVBQUFFLENBQUEsU0FB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