UNPKG

matrix-react-sdk

Version:
152 lines (147 loc) 24.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useInputEventProcessor = useInputEventProcessor; var _react = require("react"); var _useSettings = require("../../../../../hooks/useSettings"); var _KeyBindingsManager = require("../../../../../KeyBindingsManager"); var _KeyboardShortcuts = require("../../../../../accessibility/KeyboardShortcuts"); var _EventUtils = require("../../../../../utils/EventUtils"); var _dispatcher = _interopRequireDefault(require("../../../../../dispatcher/dispatcher")); var _actions = require("../../../../../dispatcher/actions"); var _RoomContext = require("../../../../../contexts/RoomContext"); var _ComposerContext = require("../ComposerContext"); var _MatrixClientContext = require("../../../../../contexts/MatrixClientContext"); var _selection = require("../utils/selection"); var _event = require("../utils/event"); var _editing = require("../utils/editing"); var _utils = require("./utils"); /* 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. */ function useInputEventProcessor(onSend, autocompleteRef, initialContent, eventRelation) { const roomContext = (0, _RoomContext.useRoomContext)(); const composerContext = (0, _ComposerContext.useComposerContext)(); const mxClient = (0, _MatrixClientContext.useMatrixClientContext)(); const isCtrlEnterToSend = (0, _useSettings.useSettingValue)("MessageComposerInput.ctrlEnterToSend"); return (0, _react.useCallback)((event, composer, editor) => { const send = () => { event.stopPropagation?.(); event.preventDefault?.(); // do not send the message if we have the autocomplete open, regardless of settings if (autocompleteRef?.current && !autocompleteRef.current.state.hide) { return; } onSend(); }; if ((0, _utils.isEventToHandleAsClipboardEvent)(event)) { const data = event instanceof ClipboardEvent ? event.clipboardData : event.dataTransfer; const handled = (0, _utils.handleClipboardEvent)(event, data, roomContext, mxClient, eventRelation); return handled ? null : event; } const isKeyboardEvent = event instanceof KeyboardEvent; if (isKeyboardEvent) { return handleKeyboardEvent(event, send, initialContent, composer, editor, roomContext, composerContext, mxClient, autocompleteRef); } else { return handleInputEvent(event, send, isCtrlEnterToSend); } }, [isCtrlEnterToSend, onSend, initialContent, roomContext, composerContext, mxClient, autocompleteRef, eventRelation]); } function handleKeyboardEvent(event, send, initialContent, composer, editor, roomContext, composerContext, mxClient, autocompleteRef) { const { editorStateTransfer } = composerContext; const isEditing = Boolean(editorStateTransfer); const isEditorModified = isEditing ? initialContent !== composer.content() : composer.content().length !== 0; const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getMessageComposerAction(event); // we need autocomplete to take priority when it is open for using enter to select const isHandledByAutocomplete = (0, _utils.handleEventWithAutocomplete)(autocompleteRef, event); if (isHandledByAutocomplete) { return event; } // taking the client from context gives us an client | undefined type, narrow it down if (mxClient === undefined) { return null; } switch (action) { case _KeyboardShortcuts.KeyBindingAction.SendMessage: send(); return null; case _KeyboardShortcuts.KeyBindingAction.EditPrevMessage: { // Or if the caret is not at the beginning of the editor // Or the editor is modified if (!(0, _selection.isCaretAtStart)(editor) || isEditorModified) { break; } const isDispatched = dispatchEditEvent(event, false, editorStateTransfer, composerContext, roomContext, mxClient); if (isDispatched) { return null; } break; } case _KeyboardShortcuts.KeyBindingAction.EditNextMessage: { // If not in edition // Or if the caret is not at the end of the editor // Or the editor is modified if (!editorStateTransfer || !(0, _selection.isCaretAtEnd)(editor) || isEditorModified) { break; } const isDispatched = dispatchEditEvent(event, true, editorStateTransfer, composerContext, roomContext, mxClient); if (!isDispatched) { (0, _editing.endEditing)(roomContext); event.preventDefault(); event.stopPropagation(); } return null; } } return event; } function dispatchEditEvent(event, isForward, editorStateTransfer, composerContext, roomContext, mxClient) { const foundEvents = editorStateTransfer ? (0, _event.getEventsFromEditorStateTransfer)(editorStateTransfer, roomContext, mxClient) : (0, _event.getEventsFromRoom)(composerContext, roomContext); if (!foundEvents) { return false; } const newEvent = (0, _EventUtils.findEditableEvent)({ events: foundEvents, isForward, fromEventId: editorStateTransfer?.getEvent().getId(), matrixClient: mxClient }); if (newEvent) { _dispatcher.default.dispatch({ action: _actions.Action.EditEvent, event: newEvent, timelineRenderingType: roomContext.timelineRenderingType }); event.stopPropagation(); event.preventDefault(); return true; } return false; } function handleInputEvent(event, send, isCtrlEnterToSend) { switch (event.inputType) { case "insertParagraph": if (!isCtrlEnterToSend) { send(); return null; } break; case "sendMessage": if (isCtrlEnterToSend) { send(); return null; } break; } return event; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3VzZVNldHRpbmdzIiwiX0tleUJpbmRpbmdzTWFuYWdlciIsIl9LZXlib2FyZFNob3J0Y3V0cyIsIl9FdmVudFV0aWxzIiwiX2Rpc3BhdGNoZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2FjdGlvbnMiLCJfUm9vbUNvbnRleHQiLCJfQ29tcG9zZXJDb250ZXh0IiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfc2VsZWN0aW9uIiwiX2V2ZW50IiwiX2VkaXRpbmciLCJfdXRpbHMiLCJ1c2VJbnB1dEV2ZW50UHJvY2Vzc29yIiwib25TZW5kIiwiYXV0b2NvbXBsZXRlUmVmIiwiaW5pdGlhbENvbnRlbnQiLCJldmVudFJlbGF0aW9uIiwicm9vbUNvbnRleHQiLCJ1c2VSb29tQ29udGV4dCIsImNvbXBvc2VyQ29udGV4dCIsInVzZUNvbXBvc2VyQ29udGV4dCIsIm14Q2xpZW50IiwidXNlTWF0cml4Q2xpZW50Q29udGV4dCIsImlzQ3RybEVudGVyVG9TZW5kIiwidXNlU2V0dGluZ1ZhbHVlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsImNvbXBvc2VyIiwiZWRpdG9yIiwic2VuZCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiY3VycmVudCIsInN0YXRlIiwiaGlkZSIsImlzRXZlbnRUb0hhbmRsZUFzQ2xpcGJvYXJkRXZlbnQiLCJkYXRhIiwiQ2xpcGJvYXJkRXZlbnQiLCJjbGlwYm9hcmREYXRhIiwiZGF0YVRyYW5zZmVyIiwiaGFuZGxlZCIsImhhbmRsZUNsaXBib2FyZEV2ZW50IiwiaXNLZXlib2FyZEV2ZW50IiwiS2V5Ym9hcmRFdmVudCIsImhhbmRsZUtleWJvYXJkRXZlbnQiLCJoYW5kbGVJbnB1dEV2ZW50IiwiZWRpdG9yU3RhdGVUcmFuc2ZlciIsImlzRWRpdGluZyIsIkJvb2xlYW4iLCJpc0VkaXRvck1vZGlmaWVkIiwiY29udGVudCIsImxlbmd0aCIsImFjdGlvbiIsImdldEtleUJpbmRpbmdzTWFuYWdlciIsImdldE1lc3NhZ2VDb21wb3NlckFjdGlvbiIsImlzSGFuZGxlZEJ5QXV0b2NvbXBsZXRlIiwiaGFuZGxlRXZlbnRXaXRoQXV0b2NvbXBsZXRlIiwidW5kZWZpbmVkIiwiS2V5QmluZGluZ0FjdGlvbiIsIlNlbmRNZXNzYWdlIiwiRWRpdFByZXZNZXNzYWdlIiwiaXNDYXJldEF0U3RhcnQiLCJpc0Rpc3BhdGNoZWQiLCJkaXNwYXRjaEVkaXRFdmVudCIsIkVkaXROZXh0TWVzc2FnZSIsImlzQ2FyZXRBdEVuZCIsImVuZEVkaXRpbmciLCJpc0ZvcndhcmQiLCJmb3VuZEV2ZW50cyIsImdldEV2ZW50c0Zyb21FZGl0b3JTdGF0ZVRyYW5zZmVyIiwiZ2V0RXZlbnRzRnJvbVJvb20iLCJuZXdFdmVudCIsImZpbmRFZGl0YWJsZUV2ZW50IiwiZXZlbnRzIiwiZnJvbUV2ZW50SWQiLCJnZXRFdmVudCIsImdldElkIiwibWF0cml4Q2xpZW50IiwiZGlzIiwiZGlzcGF0Y2giLCJBY3Rpb24iLCJFZGl0RXZlbnQiLCJ0aW1lbGluZVJlbmRlcmluZ1R5cGUiLCJpbnB1dFR5cGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9yb29tcy93eXNpd3lnX2NvbXBvc2VyL2hvb2tzL3VzZUlucHV0RXZlbnRQcm9jZXNzb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgV3lzaXd5ZywgV3lzaXd5Z0V2ZW50IH0gZnJvbSBcIkB2ZWN0b3ItaW0vbWF0cml4LXd5c2l3eWdcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBJRXZlbnRSZWxhdGlvbiwgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyB1c2VTZXR0aW5nVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vaG9va3MvdXNlU2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEtleUJpbmRpbmdzTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9LZXlCaW5kaW5nc01hbmFnZXJcIjtcbmltcG9ydCB7IEtleUJpbmRpbmdBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9LZXlib2FyZFNob3J0Y3V0c1wiO1xuaW1wb3J0IHsgZmluZEVkaXRhYmxlRXZlbnQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdXRpbHMvRXZlbnRVdGlsc1wiO1xuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgeyB1c2VSb29tQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IHsgSVJvb21TdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zdHJ1Y3R1cmVzL1Jvb21WaWV3XCI7XG5pbXBvcnQgeyBDb21wb3NlckNvbnRleHRTdGF0ZSwgdXNlQ29tcG9zZXJDb250ZXh0IH0gZnJvbSBcIi4uL0NvbXBvc2VyQ29udGV4dFwiO1xuaW1wb3J0IEVkaXRvclN0YXRlVHJhbnNmZXIgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3V0aWxzL0VkaXRvclN0YXRlVHJhbnNmZXJcIjtcbmltcG9ydCB7IHVzZU1hdHJpeENsaWVudENvbnRleHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgaXNDYXJldEF0RW5kLCBpc0NhcmV0QXRTdGFydCB9IGZyb20gXCIuLi91dGlscy9zZWxlY3Rpb25cIjtcbmltcG9ydCB7IGdldEV2ZW50c0Zyb21FZGl0b3JTdGF0ZVRyYW5zZmVyLCBnZXRFdmVudHNGcm9tUm9vbSB9IGZyb20gXCIuLi91dGlscy9ldmVudFwiO1xuaW1wb3J0IHsgZW5kRWRpdGluZyB9IGZyb20gXCIuLi91dGlscy9lZGl0aW5nXCI7XG5pbXBvcnQgQXV0b2NvbXBsZXRlIGZyb20gXCIuLi8uLi9BdXRvY29tcGxldGVcIjtcbmltcG9ydCB7IGhhbmRsZUNsaXBib2FyZEV2ZW50LCBoYW5kbGVFdmVudFdpdGhBdXRvY29tcGxldGUsIGlzRXZlbnRUb0hhbmRsZUFzQ2xpcGJvYXJkRXZlbnQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlSW5wdXRFdmVudFByb2Nlc3NvcihcbiAgICBvblNlbmQ6ICgpID0+IHZvaWQsXG4gICAgYXV0b2NvbXBsZXRlUmVmOiBSZWFjdC5SZWZPYmplY3Q8QXV0b2NvbXBsZXRlPixcbiAgICBpbml0aWFsQ29udGVudD86IHN0cmluZyxcbiAgICBldmVudFJlbGF0aW9uPzogSUV2ZW50UmVsYXRpb24sXG4pOiAoZXZlbnQ6IFd5c2l3eWdFdmVudCwgY29tcG9zZXI6IFd5c2l3eWcsIGVkaXRvcjogSFRNTEVsZW1lbnQpID0+IFd5c2l3eWdFdmVudCB8IG51bGwge1xuICAgIGNvbnN0IHJvb21Db250ZXh0ID0gdXNlUm9vbUNvbnRleHQoKTtcbiAgICBjb25zdCBjb21wb3NlckNvbnRleHQgPSB1c2VDb21wb3NlckNvbnRleHQoKTtcbiAgICBjb25zdCBteENsaWVudCA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcbiAgICBjb25zdCBpc0N0cmxFbnRlclRvU2VuZCA9IHVzZVNldHRpbmdWYWx1ZTxib29sZWFuPihcIk1lc3NhZ2VDb21wb3NlcklucHV0LmN0cmxFbnRlclRvU2VuZFwiKTtcblxuICAgIHJldHVybiB1c2VDYWxsYmFjayhcbiAgICAgICAgKGV2ZW50OiBXeXNpd3lnRXZlbnQsIGNvbXBvc2VyOiBXeXNpd3lnLCBlZGl0b3I6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZW5kID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpO1xuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzZW5kIHRoZSBtZXNzYWdlIGlmIHdlIGhhdmUgdGhlIGF1dG9jb21wbGV0ZSBvcGVuLCByZWdhcmRsZXNzIG9mIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZVJlZj8uY3VycmVudCAmJiAhYXV0b2NvbXBsZXRlUmVmLmN1cnJlbnQuc3RhdGUuaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uU2VuZCgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGlzRXZlbnRUb0hhbmRsZUFzQ2xpcGJvYXJkRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGV2ZW50IGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVDbGlwYm9hcmRFdmVudChldmVudCwgZGF0YSwgcm9vbUNvbnRleHQsIG14Q2xpZW50LCBldmVudFJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlZCA/IG51bGwgOiBldmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNLZXlib2FyZEV2ZW50ID0gZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50O1xuICAgICAgICAgICAgaWYgKGlzS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVLZXlib2FyZEV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgc2VuZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2VyLFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJvb21Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBjb21wb3NlckNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIG14Q2xpZW50LFxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVSZWYsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUlucHV0RXZlbnQoZXZlbnQsIHNlbmQsIGlzQ3RybEVudGVyVG9TZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW1xuICAgICAgICAgICAgaXNDdHJsRW50ZXJUb1NlbmQsXG4gICAgICAgICAgICBvblNlbmQsXG4gICAgICAgICAgICBpbml0aWFsQ29udGVudCxcbiAgICAgICAgICAgIHJvb21Db250ZXh0LFxuICAgICAgICAgICAgY29tcG9zZXJDb250ZXh0LFxuICAgICAgICAgICAgbXhDbGllbnQsXG4gICAgICAgICAgICBhdXRvY29tcGxldGVSZWYsXG4gICAgICAgICAgICBldmVudFJlbGF0aW9uLFxuICAgICAgICBdLFxuICAgICk7XG59XG5cbnR5cGUgU2VuZCA9ICgpID0+IHZvaWQ7XG5cbmZ1bmN0aW9uIGhhbmRsZUtleWJvYXJkRXZlbnQoXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgc2VuZDogU2VuZCxcbiAgICBpbml0aWFsQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbXBvc2VyOiBXeXNpd3lnLFxuICAgIGVkaXRvcjogSFRNTEVsZW1lbnQsXG4gICAgcm9vbUNvbnRleHQ6IElSb29tU3RhdGUsXG4gICAgY29tcG9zZXJDb250ZXh0OiBDb21wb3NlckNvbnRleHRTdGF0ZSxcbiAgICBteENsaWVudDogTWF0cml4Q2xpZW50IHwgdW5kZWZpbmVkLFxuICAgIGF1dG9jb21wbGV0ZVJlZjogUmVhY3QuUmVmT2JqZWN0PEF1dG9jb21wbGV0ZT4sXG4pOiBLZXlib2FyZEV2ZW50IHwgbnVsbCB7XG4gICAgY29uc3QgeyBlZGl0b3JTdGF0ZVRyYW5zZmVyIH0gPSBjb21wb3NlckNvbnRleHQ7XG4gICAgY29uc3QgaXNFZGl0aW5nID0gQm9vbGVhbihlZGl0b3JTdGF0ZVRyYW5zZmVyKTtcbiAgICBjb25zdCBpc0VkaXRvck1vZGlmaWVkID0gaXNFZGl0aW5nID8gaW5pdGlhbENvbnRlbnQgIT09IGNvbXBvc2VyLmNvbnRlbnQoKSA6IGNvbXBvc2VyLmNvbnRlbnQoKS5sZW5ndGggIT09IDA7XG4gICAgY29uc3QgYWN0aW9uID0gZ2V0S2V5QmluZGluZ3NNYW5hZ2VyKCkuZ2V0TWVzc2FnZUNvbXBvc2VyQWN0aW9uKGV2ZW50KTtcblxuICAgIC8vIHdlIG5lZWQgYXV0b2NvbXBsZXRlIHRvIHRha2UgcHJpb3JpdHkgd2hlbiBpdCBpcyBvcGVuIGZvciB1c2luZyBlbnRlciB0byBzZWxlY3RcbiAgICBjb25zdCBpc0hhbmRsZWRCeUF1dG9jb21wbGV0ZSA9IGhhbmRsZUV2ZW50V2l0aEF1dG9jb21wbGV0ZShhdXRvY29tcGxldGVSZWYsIGV2ZW50KTtcbiAgICBpZiAoaXNIYW5kbGVkQnlBdXRvY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cblxuICAgIC8vIHRha2luZyB0aGUgY2xpZW50IGZyb20gY29udGV4dCBnaXZlcyB1cyBhbiBjbGllbnQgfCB1bmRlZmluZWQgdHlwZSwgbmFycm93IGl0IGRvd25cbiAgICBpZiAobXhDbGllbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlIEtleUJpbmRpbmdBY3Rpb24uU2VuZE1lc3NhZ2U6XG4gICAgICAgICAgICBzZW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkVkaXRQcmV2TWVzc2FnZToge1xuICAgICAgICAgICAgLy8gT3IgaWYgdGhlIGNhcmV0IGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZGl0b3JcbiAgICAgICAgICAgIC8vIE9yIHRoZSBlZGl0b3IgaXMgbW9kaWZpZWRcbiAgICAgICAgICAgIGlmICghaXNDYXJldEF0U3RhcnQoZWRpdG9yKSB8fCBpc0VkaXRvck1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzRGlzcGF0Y2hlZCA9IGRpc3BhdGNoRWRpdEV2ZW50KFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGVkaXRvclN0YXRlVHJhbnNmZXIsXG4gICAgICAgICAgICAgICAgY29tcG9zZXJDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJvb21Db250ZXh0LFxuICAgICAgICAgICAgICAgIG14Q2xpZW50LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGlzRGlzcGF0Y2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUJpbmRpbmdBY3Rpb24uRWRpdE5leHRNZXNzYWdlOiB7XG4gICAgICAgICAgICAvLyBJZiBub3QgaW4gZWRpdGlvblxuICAgICAgICAgICAgLy8gT3IgaWYgdGhlIGNhcmV0IGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBlZGl0b3JcbiAgICAgICAgICAgIC8vIE9yIHRoZSBlZGl0b3IgaXMgbW9kaWZpZWRcbiAgICAgICAgICAgIGlmICghZWRpdG9yU3RhdGVUcmFuc2ZlciB8fCAhaXNDYXJldEF0RW5kKGVkaXRvcikgfHwgaXNFZGl0b3JNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc0Rpc3BhdGNoZWQgPSBkaXNwYXRjaEVkaXRFdmVudChcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGVkaXRvclN0YXRlVHJhbnNmZXIsXG4gICAgICAgICAgICAgICAgY29tcG9zZXJDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJvb21Db250ZXh0LFxuICAgICAgICAgICAgICAgIG14Q2xpZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghaXNEaXNwYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgZW5kRWRpdGluZyhyb29tQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRWRpdEV2ZW50KFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGlzRm9yd2FyZDogYm9vbGVhbixcbiAgICBlZGl0b3JTdGF0ZVRyYW5zZmVyOiBFZGl0b3JTdGF0ZVRyYW5zZmVyIHwgdW5kZWZpbmVkLFxuICAgIGNvbXBvc2VyQ29udGV4dDogQ29tcG9zZXJDb250ZXh0U3RhdGUsXG4gICAgcm9vbUNvbnRleHQ6IElSb29tU3RhdGUsXG4gICAgbXhDbGllbnQ6IE1hdHJpeENsaWVudCxcbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kRXZlbnRzID0gZWRpdG9yU3RhdGVUcmFuc2ZlclxuICAgICAgICA/IGdldEV2ZW50c0Zyb21FZGl0b3JTdGF0ZVRyYW5zZmVyKGVkaXRvclN0YXRlVHJhbnNmZXIsIHJvb21Db250ZXh0LCBteENsaWVudClcbiAgICAgICAgOiBnZXRFdmVudHNGcm9tUm9vbShjb21wb3NlckNvbnRleHQsIHJvb21Db250ZXh0KTtcbiAgICBpZiAoIWZvdW5kRXZlbnRzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdFdmVudCA9IGZpbmRFZGl0YWJsZUV2ZW50KHtcbiAgICAgICAgZXZlbnRzOiBmb3VuZEV2ZW50cyxcbiAgICAgICAgaXNGb3J3YXJkLFxuICAgICAgICBmcm9tRXZlbnRJZDogZWRpdG9yU3RhdGVUcmFuc2Zlcj8uZ2V0RXZlbnQoKS5nZXRJZCgpLFxuICAgICAgICBtYXRyaXhDbGllbnQ6IG14Q2xpZW50LFxuICAgIH0pO1xuICAgIGlmIChuZXdFdmVudCkge1xuICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uRWRpdEV2ZW50LFxuICAgICAgICAgICAgZXZlbnQ6IG5ld0V2ZW50LFxuICAgICAgICAgICAgdGltZWxpbmVSZW5kZXJpbmdUeXBlOiByb29tQ29udGV4dC50aW1lbGluZVJlbmRlcmluZ1R5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudHlwZSBJbnB1dEV2ZW50ID0gRXhjbHVkZTxXeXNpd3lnRXZlbnQsIEtleWJvYXJkRXZlbnQgfCBDbGlwYm9hcmRFdmVudD47XG5cbmZ1bmN0aW9uIGhhbmRsZUlucHV0RXZlbnQoZXZlbnQ6IElucHV0RXZlbnQsIHNlbmQ6IFNlbmQsIGlzQ3RybEVudGVyVG9TZW5kOiBib29sZWFuKTogSW5wdXRFdmVudCB8IG51bGwge1xuICAgIHN3aXRjaCAoZXZlbnQuaW5wdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJpbnNlcnRQYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGlmICghaXNDdHJsRW50ZXJUb1NlbmQpIHtcbiAgICAgICAgICAgICAgICBzZW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlbmRNZXNzYWdlXCI6XG4gICAgICAgICAgICBpZiAoaXNDdHJsRW50ZXJUb1NlbmQpIHtcbiAgICAgICAgICAgICAgICBzZW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxtQkFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsa0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFlBQUEsR0FBQVIsT0FBQTtBQUVBLElBQUFTLGdCQUFBLEdBQUFULE9BQUE7QUFFQSxJQUFBVSxvQkFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsVUFBQSxHQUFBWCxPQUFBO0FBQ0Es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UUFFQSxPQUFPLElBQUk7TUFDZjtFQUNKO0VBRUEsT0FBT0osS0FBSztBQUNoQjtBQUVBLFNBQVNxQyxpQkFBaUJBLENBQ3RCckMsS0FBb0IsRUFDcEJ5QyxTQUFrQixFQUNsQnJCLG1CQUFvRCxFQUNwRDNCLGVBQXFDLEVBQ3JDRixXQUF1QixFQUN2QkksUUFBc0IsRUFDZjtFQUNQLE1BQU0rQyxXQUFXLEdBQUd0QixtQkFBbUIsR0FDakMsSUFBQXVCLHVDQUFnQyxFQUFDdkIsbUJBQW1CLEVBQUU3QixXQUFXLEVBQUVJLFFBQVEsQ0FBQyxHQUM1RSxJQUFBaUQsd0JBQWlCLEVBQUNuRCxlQUFlLEVBQUVGLFdBQVcsQ0FBQztFQUNyRCxJQUFJLENBQUNtRCxXQUFXLEVBQUU7SUFDZCxPQUFPLEtBQUs7RUFDaEI7RUFFQSxNQUFNRyxRQUFRLEdBQUcsSUFBQUMsNkJBQWlCLEVBQUM7SUFDL0JDLE1BQU0sRUFBRUwsV0FBVztJQUNuQkQsU0FBUztJQUNUTyxXQUFXLEVBQUU1QixtQkFBbUIsRUFBRTZCLFFBQVEsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDO0lBQ3BEQyxZQUFZLEVBQUV4RDtFQUNsQixDQUFDLENBQUM7RUFDRixJQUFJa0QsUUFBUSxFQUFFO0lBQ1ZPLG1CQUFHLENBQUNDLFFBQVEsQ0FBQztNQUNUM0IsTUFBTSxFQUFFNEIsZUFBTSxDQUFDQyxTQUFTO01BQ3hCdkQsS0FBSyxFQUFFNkMsUUFBUTtNQUNmVyxxQkFBcUIsRUFBRWpFLFdBQVcsQ0FBQ2lFO0lBQ3ZDLENBQUMsQ0FBQztJQUNGeEQsS0FBSyxDQUFDSSxlQUFlLENBQUMsQ0FBQztJQUN2QkosS0FBSyxDQUFDSyxjQUFjLENBQUMsQ0FBQztJQUN0QixPQUFPLElBQUk7RUFDZjtFQUNBLE9BQU8sS0FBSztBQUNoQjtBQUlBLFNBQVNjLGdCQUFnQkEsQ0FBQ25CLEtBQWlCLEVBQUVHLElBQVUsRUFBRU4saUJBQTBCLEVBQXFCO0VBQ3BHLFFBQVFHLEtBQUssQ0FBQ3lELFNBQVM7SUFDbkIsS0FBSyxpQkFBaUI7TUFDbEIsSUFBSSxDQUFDNUQsaUJBQWlCLEVBQUU7UUFDcEJNLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxJQUFJO01BQ2Y7TUFDQTtJQUNKLEtBQUssYUFBYTtNQUNkLElBQUlOLGlCQUFpQixFQUFFO1FBQ25CTSxJQUFJLENBQUMsQ0FBQztRQUNOLE9BQU8sSUFBSTtNQUNmO01BQ0E7RUFDUjtFQUVBLE9BQU9ILEtBQUs7QUFDaEIiLCJpZ25vcmVMaXN0IjpbXX0=