UNPKG

matrix-react-sdk

Version:
178 lines (175 loc) 30 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _classnames = _interopRequireDefault(require("classnames")); var HtmlUtils = _interopRequireWildcard(require("../../../HtmlUtils")); var _MessageDiffUtils = require("../../../utils/MessageDiffUtils"); var _DateUtils = require("../../../DateUtils"); var _pillify = require("../../../utils/pillify"); var _tooltipify = require("../../../utils/tooltipify"); var _languageHandler = require("../../../languageHandler"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _RedactedBody = _interopRequireDefault(require("./RedactedBody")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _ConfirmAndWaitRedactDialog = _interopRequireDefault(require("../dialogs/ConfirmAndWaitRedactDialog")); var _ViewSource = _interopRequireDefault(require("../../structures/ViewSource")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); 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 2019 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 getReplacedContent(event) { const originalContent = event.getOriginalContent(); return originalContent["m.new_content"] || originalContent; } class EditHistoryMessage extends _react.default.PureComponent { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "content", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "pills", []); (0, _defineProperty2.default)(this, "tooltips", []); (0, _defineProperty2.default)(this, "onAssociatedStatusChanged", () => { this.setState({ sendStatus: this.props.mxEvent.getAssociatedStatus() }); }); (0, _defineProperty2.default)(this, "onRedactClick", async () => { const event = this.props.mxEvent; const cli = this.context; _Modal.default.createDialog(_ConfirmAndWaitRedactDialog.default, { event, redact: async () => { await cli.redactEvent(event.getRoomId(), event.getId()); } }, "mx_Dialog_confirmredact"); }); (0, _defineProperty2.default)(this, "onViewSourceClick", () => { _Modal.default.createDialog(_ViewSource.default, { mxEvent: this.props.mxEvent, ignoreEdits: true }, "mx_Dialog_viewsource"); }); const _cli = this.context; const userId = _cli.getSafeUserId(); const _event = this.props.mxEvent; const room = _cli.getRoom(_event.getRoomId()); _event.localRedactionEvent()?.on(_matrix.MatrixEventEvent.Status, this.onAssociatedStatusChanged); const canRedact = room?.currentState.maySendRedactionForEvent(_event, userId) ?? false; this.state = { canRedact, sendStatus: _event.getAssociatedStatus() }; } pillifyLinks() { // not present for redacted events if (this.content.current) { (0, _pillify.pillifyLinks)(this.context, this.content.current.children, this.props.mxEvent, this.pills); } } tooltipifyLinks() { // not present for redacted events if (this.content.current) { (0, _tooltipify.tooltipifyLinks)(this.content.current.children, this.pills, this.tooltips); } } componentDidMount() { this.pillifyLinks(); this.tooltipifyLinks(); } componentWillUnmount() { (0, _pillify.unmountPills)(this.pills); (0, _tooltipify.unmountTooltips)(this.tooltips); const event = this.props.mxEvent; event.localRedactionEvent()?.off(_matrix.MatrixEventEvent.Status, this.onAssociatedStatusChanged); } componentDidUpdate() { this.pillifyLinks(); this.tooltipifyLinks(); } renderActionBar() { // hide the button when already redacted let redactButton; if (!this.props.mxEvent.isRedacted() && !this.props.isBaseEvent && this.state.canRedact) { redactButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onRedactClick }, (0, _languageHandler._t)("action|remove")); } let viewSourceButton; if (_SettingsStore.default.getValue("developerMode")) { viewSourceButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onViewSourceClick }, (0, _languageHandler._t)("action|view_source")); } if (!redactButton && !viewSourceButton) { // Hide the empty MessageActionBar return null; } else { // disabled remove button when not allowed return /*#__PURE__*/_react.default.createElement("div", { className: "mx_MessageActionBar" }, redactButton, viewSourceButton); } } render() { const { mxEvent } = this.props; const content = getReplacedContent(mxEvent); let contentContainer; if (mxEvent.isRedacted()) { contentContainer = /*#__PURE__*/_react.default.createElement(_RedactedBody.default, { mxEvent: this.props.mxEvent }); } else { let contentElements; if (this.props.previousEdit) { contentElements = (0, _MessageDiffUtils.editBodyDiffToHtml)(getReplacedContent(this.props.previousEdit), content); } else { contentElements = HtmlUtils.bodyToSpan(content, null, { stripReplyFallback: true }); } if (mxEvent.getContent().msgtype === _matrix.MsgType.Emote) { const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); contentContainer = /*#__PURE__*/_react.default.createElement("div", { className: "mx_EventTile_content", ref: this.content }, "*\xA0", /*#__PURE__*/_react.default.createElement("span", { className: "mx_MEmoteBody_sender" }, name), "\xA0", contentElements); } else { contentContainer = /*#__PURE__*/_react.default.createElement("div", { className: "mx_EventTile_content", ref: this.content }, contentElements); } } const timestamp = (0, _DateUtils.formatTime)(new Date(mxEvent.getTs()), this.props.isTwelveHour); const isSending = ["sending", "queued", "encrypting"].includes(this.state.sendStatus); const classes = (0, _classnames.default)("mx_EventTile", { // Note: we keep the `sending` state class for tests, not for our styles mx_EventTile_sending: isSending }); return /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_EventTile_line" }, /*#__PURE__*/_react.default.createElement("span", { className: "mx_MessageTimestamp" }, timestamp), contentContainer, this.renderActionBar()))); } } exports.default = EditHistoryMessage; (0, _defineProperty2.default)(EditHistoryMessage, "contextType", _MatrixClientContext.default); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2NsYXNzbmFtZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiSHRtbFV0aWxzIiwiX01lc3NhZ2VEaWZmVXRpbHMiLCJfRGF0ZVV0aWxzIiwiX3BpbGxpZnkiLCJfdG9vbHRpcGlmeSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTW9kYWwiLCJfUmVkYWN0ZWRCb2R5IiwiX0FjY2Vzc2libGVCdXR0b24iLCJfQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2ciLCJfVmlld1NvdXJjZSIsIl9TZXR0aW5nc1N0b3JlIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJnZXRSZXBsYWNlZENvbnRlbnQiLCJldmVudCIsIm9yaWdpbmFsQ29udGVudCIsImdldE9yaWdpbmFsQ29udGVudCIsIkVkaXRIaXN0b3J5TWVzc2FnZSIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjb250ZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInNldFN0YXRlIiwic2VuZFN0YXR1cyIsIm14RXZlbnQiLCJnZXRBc3NvY2lhdGVkU3RhdHVzIiwiY2xpIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJDb25maXJtQW5kV2FpdFJlZGFjdERpYWxvZyIsInJlZGFjdCIsInJlZGFjdEV2ZW50IiwiZ2V0Um9vbUlkIiwiZ2V0SWQiLCJWaWV3U291cmNlIiwiaWdub3JlRWRpdHMiLCJ1c2VySWQiLCJnZXRTYWZlVXNlcklkIiwicm9vbSIsImdldFJvb20iLCJsb2NhbFJlZGFjdGlvbkV2ZW50Iiwib24iLCJNYXRyaXhFdmVudEV2ZW50IiwiU3RhdHVzIiwib25Bc3NvY2lhdGVkU3RhdHVzQ2hhbmdlZCIsImNhblJlZGFjdCIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRSZWRhY3Rpb25Gb3JFdmVudCIsInN0YXRlIiwicGlsbGlmeUxpbmtzIiwiY29udGVudCIsImN1cnJlbnQiLCJjaGlsZHJlbiIsInBpbGxzIiwidG9vbHRpcGlmeUxpbmtzIiwidG9vbHRpcHMiLCJjb21wb25lbnREaWRNb3VudCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudFBpbGxzIiwidW5tb3VudFRvb2x0aXBzIiwib2ZmIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVuZGVyQWN0aW9uQmFyIiwicmVkYWN0QnV0dG9uIiwiaXNSZWRhY3RlZCIsImlzQmFzZUV2ZW50IiwiY3JlYXRlRWxlbWVudCIsIm9uQ2xpY2siLCJvblJlZGFjdENsaWNrIiwiX3QiLCJ2aWV3U291cmNlQnV0dG9uIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwib25WaWV3U291cmNlQ2xpY2siLCJjbGFzc05hbWUiLCJyZW5kZXIiLCJjb250ZW50Q29udGFpbmVyIiwiY29udGVudEVsZW1lbnRzIiwicHJldmlvdXNFZGl0IiwiZWRpdEJvZHlEaWZmVG9IdG1sIiwiYm9keVRvU3BhbiIsInN0cmlwUmVwbHlGYWxsYmFjayIsImdldENvbnRlbnQiLCJtc2d0eXBlIiwiTXNnVHlwZSIsIkVtb3RlIiwibmFtZSIsInNlbmRlciIsImdldFNlbmRlciIsInJlZiIsInRpbWVzdGFtcCIsImZvcm1hdFRpbWUiLCJEYXRlIiwiZ2V0VHMiLCJpc1R3ZWx2ZUhvdXIiLCJpc1NlbmRpbmciLCJpbmNsdWRlcyIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRXZlbnRUaWxlX3NlbmRpbmciLCJleHBvcnRzIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL21lc3NhZ2VzL0VkaXRIaXN0b3J5TWVzc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRXZlbnRTdGF0dXMsIElDb250ZW50LCBNYXRyaXhFdmVudCwgTWF0cml4RXZlbnRFdmVudCwgTXNnVHlwZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCAqIGFzIEh0bWxVdGlscyBmcm9tIFwiLi4vLi4vLi4vSHRtbFV0aWxzXCI7XG5pbXBvcnQgeyBlZGl0Qm9keURpZmZUb0h0bWwgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvTWVzc2FnZURpZmZVdGlsc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSB9IGZyb20gXCIuLi8uLi8uLi9EYXRlVXRpbHNcIjtcbmltcG9ydCB7IHBpbGxpZnlMaW5rcywgdW5tb3VudFBpbGxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3BpbGxpZnlcIjtcbmltcG9ydCB7IHRvb2x0aXBpZnlMaW5rcywgdW5tb3VudFRvb2x0aXBzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Rvb2x0aXBpZnlcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFJlZGFjdGVkQm9keSBmcm9tIFwiLi9SZWRhY3RlZEJvZHlcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2cgZnJvbSBcIi4uL2RpYWxvZ3MvQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2dcIjtcbmltcG9ydCBWaWV3U291cmNlIGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1ZpZXdTb3VyY2VcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuXG5mdW5jdGlvbiBnZXRSZXBsYWNlZENvbnRlbnQoZXZlbnQ6IE1hdHJpeEV2ZW50KTogSUNvbnRlbnQge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV2ZW50LmdldE9yaWdpbmFsQ29udGVudCgpO1xuICAgIHJldHVybiBvcmlnaW5hbENvbnRlbnRbXCJtLm5ld19jb250ZW50XCJdIHx8IG9yaWdpbmFsQ29udGVudDtcbn1cblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgLy8gdGhlIG1lc3NhZ2UgZXZlbnQgYmVpbmcgZWRpdGVkXG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7XG4gICAgcHJldmlvdXNFZGl0PzogTWF0cml4RXZlbnQ7XG4gICAgaXNCYXNlRXZlbnQ/OiBib29sZWFuO1xuICAgIGlzVHdlbHZlSG91cj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGNhblJlZGFjdDogYm9vbGVhbjtcbiAgICBzZW5kU3RhdHVzOiBFdmVudFN0YXR1cyB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRIaXN0b3J5TWVzc2FnZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRleHRUeXBlID0gTWF0cml4Q2xpZW50Q29udGV4dDtcbiAgICBwdWJsaWMgZGVjbGFyZSBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD47XG5cbiAgICBwcml2YXRlIGNvbnRlbnQgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSBwaWxsczogRWxlbWVudFtdID0gW107XG4gICAgcHJpdmF0ZSB0b29sdGlwczogRWxlbWVudFtdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcywgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdCBjbGkgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGNsaS5nZXRTYWZlVXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wcm9wcy5teEV2ZW50O1xuICAgICAgICBjb25zdCByb29tID0gY2xpLmdldFJvb20oZXZlbnQuZ2V0Um9vbUlkKCkpO1xuICAgICAgICBldmVudC5sb2NhbFJlZGFjdGlvbkV2ZW50KCk/Lm9uKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCB0aGlzLm9uQXNzb2NpYXRlZFN0YXR1c0NoYW5nZWQpO1xuICAgICAgICBjb25zdCBjYW5SZWRhY3QgPSByb29tPy5jdXJyZW50U3RhdGUubWF5U2VuZFJlZGFjdGlvbkZvckV2ZW50KGV2ZW50LCB1c2VySWQpID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlID0geyBjYW5SZWRhY3QsIHNlbmRTdGF0dXM6IGV2ZW50LmdldEFzc29jaWF0ZWRTdGF0dXMoKSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Bc3NvY2lhdGVkU3RhdHVzQ2hhbmdlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbmRTdGF0dXM6IHRoaXMucHJvcHMubXhFdmVudC5nZXRBc3NvY2lhdGVkU3RhdHVzKCkgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25SZWRhY3RDbGljayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG4gICAgICAgIGNvbnN0IGNsaSA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICBDb25maXJtQW5kV2FpdFJlZGFjdERpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICByZWRhY3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpLnJlZGFjdEV2ZW50KGV2ZW50LmdldFJvb21JZCgpISwgZXZlbnQuZ2V0SWQoKSEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJteF9EaWFsb2dfY29uZmlybXJlZGFjdFwiLFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmlld1NvdXJjZUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICBWaWV3U291cmNlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG14RXZlbnQ6IHRoaXMucHJvcHMubXhFdmVudCxcbiAgICAgICAgICAgICAgICBpZ25vcmVFZGl0czogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm14X0RpYWxvZ192aWV3c291cmNlXCIsXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGlsbGlmeUxpbmtzKCk6IHZvaWQge1xuICAgICAgICAvLyBub3QgcHJlc2VudCBmb3IgcmVkYWN0ZWQgZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuY3VycmVudCkge1xuICAgICAgICAgICAgcGlsbGlmeUxpbmtzKHRoaXMuY29udGV4dCwgdGhpcy5jb250ZW50LmN1cnJlbnQuY2hpbGRyZW4sIHRoaXMucHJvcHMubXhFdmVudCwgdGhpcy5waWxscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvb2x0aXBpZnlMaW5rcygpOiB2b2lkIHtcbiAgICAgICAgLy8gbm90IHByZXNlbnQgZm9yIHJlZGFjdGVkIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5jb250ZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRvb2x0aXBpZnlMaW5rcyh0aGlzLmNvbnRlbnQuY3VycmVudC5jaGlsZHJlbiwgdGhpcy5waWxscywgdGhpcy50b29sdGlwcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlsbGlmeUxpbmtzKCk7XG4gICAgICAgIHRoaXMudG9vbHRpcGlmeUxpbmtzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB1bm1vdW50UGlsbHModGhpcy5waWxscyk7XG4gICAgICAgIHVubW91bnRUb29sdGlwcyh0aGlzLnRvb2x0aXBzKTtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG4gICAgICAgIGV2ZW50LmxvY2FsUmVkYWN0aW9uRXZlbnQoKT8ub2ZmKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCB0aGlzLm9uQXNzb2NpYXRlZFN0YXR1c0NoYW5nZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlsbGlmeUxpbmtzKCk7XG4gICAgICAgIHRoaXMudG9vbHRpcGlmeUxpbmtzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJBY3Rpb25CYXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgLy8gaGlkZSB0aGUgYnV0dG9uIHdoZW4gYWxyZWFkeSByZWRhY3RlZFxuICAgICAgICBsZXQgcmVkYWN0QnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm14RXZlbnQuaXNSZWRhY3RlZCgpICYmICF0aGlzLnByb3BzLmlzQmFzZUV2ZW50ICYmIHRoaXMuc3RhdGUuY2FuUmVkYWN0KSB7XG4gICAgICAgICAgICByZWRhY3RCdXR0b24gPSA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uUmVkYWN0Q2xpY2t9PntfdChcImFjdGlvbnxyZW1vdmVcIil9PC9BY2Nlc3NpYmxlQnV0dG9uPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aWV3U291cmNlQnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJkZXZlbG9wZXJNb2RlXCIpKSB7XG4gICAgICAgICAgICB2aWV3U291cmNlQnV0dG9uID0gKFxuICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25WaWV3U291cmNlQ2xpY2t9PntfdChcImFjdGlvbnx2aWV3X3NvdXJjZVwiKX08L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZWRhY3RCdXR0b24gJiYgIXZpZXdTb3VyY2VCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGVtcHR5IE1lc3NhZ2VBY3Rpb25CYXJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlzYWJsZWQgcmVtb3ZlIGJ1dHRvbiB3aGVuIG5vdCBhbGxvd2VkXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUFjdGlvbkJhclwiPlxuICAgICAgICAgICAgICAgICAgICB7cmVkYWN0QnV0dG9ufVxuICAgICAgICAgICAgICAgICAgICB7dmlld1NvdXJjZUJ1dHRvbn1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IHsgbXhFdmVudCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgY29udGVudCA9IGdldFJlcGxhY2VkQ29udGVudChteEV2ZW50KTtcbiAgICAgICAgbGV0IGNvbnRlbnRDb250YWluZXI7XG4gICAgICAgIGlmIChteEV2ZW50LmlzUmVkYWN0ZWQoKSkge1xuICAgICAgICAgICAgY29udGVudENvbnRhaW5lciA9IDxSZWRhY3RlZEJvZHkgbXhFdmVudD17dGhpcy5wcm9wcy5teEV2ZW50fSAvPjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50RWxlbWVudHM7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5wcmV2aW91c0VkaXQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudHMgPSBlZGl0Qm9keURpZmZUb0h0bWwoZ2V0UmVwbGFjZWRDb250ZW50KHRoaXMucHJvcHMucHJldmlvdXNFZGl0KSwgY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50cyA9IEh0bWxVdGlscy5ib2R5VG9TcGFuKGNvbnRlbnQsIG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBSZXBseUZhbGxiYWNrOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG14RXZlbnQuZ2V0Q29udGVudCgpLm1zZ3R5cGUgPT09IE1zZ1R5cGUuRW1vdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gbXhFdmVudC5zZW5kZXIgPyBteEV2ZW50LnNlbmRlci5uYW1lIDogbXhFdmVudC5nZXRTZW5kZXIoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVyID0gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0V2ZW50VGlsZV9jb250ZW50XCIgcmVmPXt0aGlzLmNvbnRlbnR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKiZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfTUVtb3RlQm9keV9zZW5kZXJcIj57bmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDt7Y29udGVudEVsZW1lbnRzfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVyID0gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0V2ZW50VGlsZV9jb250ZW50XCIgcmVmPXt0aGlzLmNvbnRlbnR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbnRlbnRFbGVtZW50c31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGZvcm1hdFRpbWUobmV3IERhdGUobXhFdmVudC5nZXRUcygpKSwgdGhpcy5wcm9wcy5pc1R3ZWx2ZUhvdXIpO1xuICAgICAgICBjb25zdCBpc1NlbmRpbmcgPSBbXCJzZW5kaW5nXCIsIFwicXVldWVkXCIsIFwiZW5jcnlwdGluZ1wiXS5pbmNsdWRlcyh0aGlzLnN0YXRlLnNlbmRTdGF0dXMhKTtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9FdmVudFRpbGVcIiwge1xuICAgICAgICAgICAgLy8gTm90ZTogd2Uga2VlcCB0aGUgYHNlbmRpbmdgIHN0YXRlIGNsYXNzIGZvciB0ZXN0cywgbm90IGZvciBvdXIgc3R5bGVzXG4gICAgICAgICAgICBteF9FdmVudFRpbGVfc2VuZGluZzogaXNTZW5kaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRXZlbnRUaWxlX2xpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14X01lc3NhZ2VUaW1lc3RhbXBcIj57dGltZXN0YW1wfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb250ZW50Q29udGFpbmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyQWN0aW9uQmFyKCl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksU0FBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElB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