matrix-react-sdk
Version:
SDK for matrix.org using React
188 lines (150 loc) • 26.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _SyntaxHighlight = _interopRequireDefault(require("../views/elements/SyntaxHighlight"));
var _languageHandler = require("../../languageHandler");
var sdk = _interopRequireWildcard(require("../../index"));
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _DevtoolsDialog = require("../views/dialogs/DevtoolsDialog");
var _EventUtils = require("../../utils/EventUtils");
var _MatrixClientPeg = require("../../MatrixClientPeg");
var _replaceableComponent = require("../../utils/replaceableComponent");
var _dec, _class, _class2, _temp;
let ViewSource = (_dec = (0, _replaceableComponent.replaceableComponent)("structures.ViewSource"), _dec(_class = (_temp = _class2 = class ViewSource extends _react.default.Component {
constructor(props) {
super(props);
this.state = {
isEditing: false
};
}
onBack() {
// TODO: refresh the "Event ID:" modal header
this.setState({
isEditing: false
});
}
onEdit() {
this.setState({
isEditing: true
});
} // returns the dialog body for viewing the event source
viewSourceContent() {
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isEncrypted = mxEvent.isEncrypted();
const decryptedEventSource = mxEvent._clearEvent; // FIXME: _clearEvent is private
const originalEventSource = mxEvent.event;
if (isEncrypted) {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("details", {
open: true,
className: "mx_ViewSource_details"
}, /*#__PURE__*/_react.default.createElement("summary", null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("Decrypted event source"))), /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
className: "json"
}, JSON.stringify(decryptedEventSource, null, 2))), /*#__PURE__*/_react.default.createElement("details", {
className: "mx_ViewSource_details"
}, /*#__PURE__*/_react.default.createElement("summary", null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("Original event source"))), /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
className: "json"
}, JSON.stringify(originalEventSource, null, 2))));
} else {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("Original event source")), /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
className: "json"
}, JSON.stringify(originalEventSource, null, 2)));
}
} // returns the id of the initial message, not the id of the previous edit
getBaseEventId() {
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isEncrypted = mxEvent.isEncrypted();
const baseMxEvent = this.props.mxEvent;
if (isEncrypted) {
// `relates_to` field is inside the encrypted event
return mxEvent.event.content["m.relates_to"]?.event_id ?? baseMxEvent.getId();
} else {
return mxEvent.getContent()["m.relates_to"]?.event_id ?? baseMxEvent.getId();
}
} // returns the SendCustomEvent component prefilled with the correct details
editSourceContent() {
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isStateEvent = mxEvent.isState();
const roomId = mxEvent.getRoomId();
const originalContent = mxEvent.getContent();
if (isStateEvent) {
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Consumer, null, cli => /*#__PURE__*/_react.default.createElement(_DevtoolsDialog.SendCustomEvent, {
room: cli.getRoom(roomId),
forceStateEvent: true,
onBack: () => this.onBack(),
inputs: {
eventType: mxEvent.getType(),
evContent: JSON.stringify(originalContent, null, "\t"),
stateKey: mxEvent.getStateKey()
}
}));
} else {
// prefill an edit-message event
// keep only the `body` and `msgtype` fields of originalContent
const bodyToStartFrom = originalContent["m.new_content"]?.body ?? originalContent.body; // prefill the last edit body, to start editing from there
const newContent = {
"body": ` * ${bodyToStartFrom}`,
"msgtype": originalContent.msgtype,
"m.new_content": {
body: bodyToStartFrom,
msgtype: originalContent.msgtype
},
"m.relates_to": {
rel_type: "m.replace",
event_id: this.getBaseEventId()
}
};
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Consumer, null, cli => /*#__PURE__*/_react.default.createElement(_DevtoolsDialog.SendCustomEvent, {
room: cli.getRoom(roomId),
forceStateEvent: false,
forceGeneralEvent: true,
onBack: () => this.onBack(),
inputs: {
eventType: mxEvent.getType(),
evContent: JSON.stringify(newContent, null, "\t")
}
}));
}
}
canSendStateEvent(mxEvent) {
const cli = _MatrixClientPeg.MatrixClientPeg.get();
const room = cli.getRoom(mxEvent.getRoomId());
return room.currentState.mayClientSendStateEvent(mxEvent.getType(), cli);
}
render() {
const BaseDialog = sdk.getComponent("views.dialogs.BaseDialog");
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isEditing = this.state.isEditing;
const roomId = mxEvent.getRoomId();
const eventId = mxEvent.getId();
const canEdit = mxEvent.isState() ? this.canSendStateEvent(mxEvent) : (0, _EventUtils.canEditContent)(this.props.mxEvent);
return /*#__PURE__*/_react.default.createElement(BaseDialog, {
className: "mx_ViewSource",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("View Source")
}, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", null, "Room ID: ", roomId), /*#__PURE__*/_react.default.createElement("div", null, "Event ID: ", eventId), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ViewSource_separator"
}), isEditing ? this.editSourceContent() : this.viewSourceContent()), !isEditing && canEdit && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_buttons"
}, /*#__PURE__*/_react.default.createElement("button", {
onClick: () => this.onEdit()
}, (0, _languageHandler._t)("Edit"))));
}
}, (0, _defineProperty2.default)(_class2, "propTypes", {
onFinished: _propTypes.default.func.isRequired,
mxEvent: _propTypes.default.object.isRequired // the MatrixEvent associated with the context menu
}), _temp)) || _class);
exports.default = ViewSource;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvVmlld1NvdXJjZS5qcyJdLCJuYW1lcyI6WyJWaWV3U291cmNlIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwic3RhdGUiLCJpc0VkaXRpbmciLCJvbkJhY2siLCJzZXRTdGF0ZSIsIm9uRWRpdCIsInZpZXdTb3VyY2VDb250ZW50IiwibXhFdmVudCIsInJlcGxhY2luZ0V2ZW50IiwiaXNFbmNyeXB0ZWQiLCJkZWNyeXB0ZWRFdmVudFNvdXJjZSIsIl9jbGVhckV2ZW50Iiwib3JpZ2luYWxFdmVudFNvdXJjZSIsImV2ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEJhc2VFdmVudElkIiwiYmFzZU14RXZlbnQiLCJjb250ZW50IiwiZXZlbnRfaWQiLCJnZXRJZCIsImdldENvbnRlbnQiLCJlZGl0U291cmNlQ29udGVudCIsImlzU3RhdGVFdmVudCIsImlzU3RhdGUiLCJyb29tSWQiLCJnZXRSb29tSWQiLCJvcmlnaW5hbENvbnRlbnQiLCJjbGkiLCJnZXRSb29tIiwiZXZlbnRUeXBlIiwiZ2V0VHlwZSIsImV2Q29udGVudCIsInN0YXRlS2V5IiwiZ2V0U3RhdGVLZXkiLCJib2R5VG9TdGFydEZyb20iLCJib2R5IiwibmV3Q29udGVudCIsIm1zZ3R5cGUiLCJyZWxfdHlwZSIsImNhblNlbmRTdGF0ZUV2ZW50IiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwicm9vbSIsImN1cnJlbnRTdGF0ZSIsIm1heUNsaWVudFNlbmRTdGF0ZUV2ZW50IiwicmVuZGVyIiwiQmFzZURpYWxvZyIsInNkayIsImdldENvbXBvbmVudCIsImV2ZW50SWQiLCJjYW5FZGl0Iiwib25GaW5pc2hlZCIsIlByb3BUeXBlcyIsImZ1bmMiLCJpc1JlcXVpcmVkIiwib2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBa0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztB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QUFWLENBQWlCRCxVQUZYLENBRXVCOztBQUZ2QixDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE1LCAyMDE2IE9wZW5NYXJrZXQgTHRkXG5Db3B5cmlnaHQgMjAxOSBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFN5bnRheEhpZ2hsaWdodCBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvU3ludGF4SGlnaGxpZ2h0XCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCAqIGFzIHNkayBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBTZW5kQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vdmlld3MvZGlhbG9ncy9EZXZ0b29sc0RpYWxvZ1wiO1xuaW1wb3J0IHsgY2FuRWRpdENvbnRlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvRXZlbnRVdGlsc1wiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSAnLi4vLi4vTWF0cml4Q2xpZW50UGVnJztcbmltcG9ydCB7IHJlcGxhY2VhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInN0cnVjdHVyZXMuVmlld1NvdXJjZVwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld1NvdXJjZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgb25GaW5pc2hlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgICAgbXhFdmVudDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLCAvLyB0aGUgTWF0cml4RXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG1lbnVcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc0VkaXRpbmc6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG9uQmFjaygpIHtcbiAgICAgICAgLy8gVE9ETzogcmVmcmVzaCB0aGUgXCJFdmVudCBJRDpcIiBtb2RhbCBoZWFkZXJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzRWRpdGluZzogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgb25FZGl0KCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNFZGl0aW5nOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdGhlIGRpYWxvZyBib2R5IGZvciB2aWV3aW5nIHRoZSBldmVudCBzb3VyY2VcbiAgICB2aWV3U291cmNlQ29udGVudCgpIHtcbiAgICAgICAgY29uc3QgbXhFdmVudCA9IHRoaXMucHJvcHMubXhFdmVudC5yZXBsYWNpbmdFdmVudCgpIHx8IHRoaXMucHJvcHMubXhFdmVudDsgLy8gc2hvdyB0aGUgcmVwbGFjaW5nIGV2ZW50LCBub3QgdGhlIG9yaWdpbmFsLCBpZiBpdCBpcyBhbiBlZGl0XG4gICAgICAgIGNvbnN0IGlzRW5jcnlwdGVkID0gbXhFdmVudC5pc0VuY3J5cHRlZCgpO1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWRFdmVudFNvdXJjZSA9IG14RXZlbnQuX2NsZWFyRXZlbnQ7IC8vIEZJWE1FOiBfY2xlYXJFdmVudCBpcyBwcml2YXRlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRTb3VyY2UgPSBteEV2ZW50LmV2ZW50O1xuXG4gICAgICAgIGlmIChpc0VuY3J5cHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscyBvcGVuIGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2VfZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkaW5nXCI+e190KFwiRGVjcnlwdGVkIGV2ZW50IHNvdXJjZVwiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3ludGF4SGlnaGxpZ2h0IGNsYXNzTmFtZT1cImpzb25cIj57SlNPTi5zdHJpbmdpZnkoZGVjcnlwdGVkRXZlbnRTb3VyY2UsIG51bGwsIDIpfTwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2VfZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkaW5nXCI+e190KFwiT3JpZ2luYWwgZXZlbnQgc291cmNlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTeW50YXhIaWdobGlnaHQgY2xhc3NOYW1lPVwianNvblwiPntKU09OLnN0cmluZ2lmeShvcmlnaW5hbEV2ZW50U291cmNlLCBudWxsLCAyKX08L1N5bnRheEhpZ2hsaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9WaWV3U291cmNlX2hlYWRpbmdcIj57X3QoXCJPcmlnaW5hbCBldmVudCBzb3VyY2VcIil9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxTeW50YXhIaWdobGlnaHQgY2xhc3NOYW1lPVwianNvblwiPntKU09OLnN0cmluZ2lmeShvcmlnaW5hbEV2ZW50U291cmNlLCBudWxsLCAyKX08L1N5bnRheEhpZ2hsaWdodD5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgaW5pdGlhbCBtZXNzYWdlLCBub3QgdGhlIGlkIG9mIHRoZSBwcmV2aW91cyBlZGl0XG4gICAgZ2V0QmFzZUV2ZW50SWQoKSB7XG4gICAgICAgIGNvbnN0IG14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQucmVwbGFjaW5nRXZlbnQoKSB8fCB0aGlzLnByb3BzLm14RXZlbnQ7IC8vIHNob3cgdGhlIHJlcGxhY2luZyBldmVudCwgbm90IHRoZSBvcmlnaW5hbCwgaWYgaXQgaXMgYW4gZWRpdFxuICAgICAgICBjb25zdCBpc0VuY3J5cHRlZCA9IG14RXZlbnQuaXNFbmNyeXB0ZWQoKTtcbiAgICAgICAgY29uc3QgYmFzZU14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG5cbiAgICAgICAgaWYgKGlzRW5jcnlwdGVkKSB7XG4gICAgICAgICAgICAvLyBgcmVsYXRlc190b2AgZmllbGQgaXMgaW5zaWRlIHRoZSBlbmNyeXB0ZWQgZXZlbnRcbiAgICAgICAgICAgIHJldHVybiBteEV2ZW50LmV2ZW50LmNvbnRlbnRbXCJtLnJlbGF0ZXNfdG9cIl0/LmV2ZW50X2lkID8/IGJhc2VNeEV2ZW50LmdldElkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbXhFdmVudC5nZXRDb250ZW50KClbXCJtLnJlbGF0ZXNfdG9cIl0/LmV2ZW50X2lkID8/IGJhc2VNeEV2ZW50LmdldElkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRoZSBTZW5kQ3VzdG9tRXZlbnQgY29tcG9uZW50IHByZWZpbGxlZCB3aXRoIHRoZSBjb3JyZWN0IGRldGFpbHNcbiAgICBlZGl0U291cmNlQ29udGVudCgpIHtcbiAgICAgICAgY29uc3QgbXhFdmVudCA9IHRoaXMucHJvcHMubXhFdmVudC5yZXBsYWNpbmdFdmVudCgpIHx8IHRoaXMucHJvcHMubXhFdmVudDsgLy8gc2hvdyB0aGUgcmVwbGFjaW5nIGV2ZW50LCBub3QgdGhlIG9yaWdpbmFsLCBpZiBpdCBpcyBhbiBlZGl0XG5cbiAgICAgICAgY29uc3QgaXNTdGF0ZUV2ZW50ID0gbXhFdmVudC5pc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IHJvb21JZCA9IG14RXZlbnQuZ2V0Um9vbUlkKCk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IG14RXZlbnQuZ2V0Q29udGVudCgpO1xuXG4gICAgICAgIGlmIChpc1N0YXRlRXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPE1hdHJpeENsaWVudENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgICAgICAgIHsoY2xpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VuZEN1c3RvbUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbT17Y2xpLmdldFJvb20ocm9vbUlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVN0YXRlRXZlbnQ9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CYWNrPXsoKSA9PiB0aGlzLm9uQmFjaygpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IG14RXZlbnQuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldkNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsQ29udGVudCwgbnVsbCwgXCJcXHRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlS2V5OiBteEV2ZW50LmdldFN0YXRlS2V5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9NYXRyaXhDbGllbnRDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHByZWZpbGwgYW4gZWRpdC1tZXNzYWdlIGV2ZW50XG4gICAgICAgICAgICAvLyBrZWVwIG9ubHkgdGhlIGBib2R5YCBhbmQgYG1zZ3R5cGVgIGZpZWxkcyBvZiBvcmlnaW5hbENvbnRlbnRcbiAgICAgICAgICAgIGNvbnN0IGJvZHlUb1N0YXJ0RnJvbSA9IG9yaWdpbmFsQ29udGVudFtcIm0ubmV3X2NvbnRlbnRcIl0/LmJvZHkgPz8gb3JpZ2luYWxDb250ZW50LmJvZHk7IC8vIHByZWZpbGwgdGhlIGxhc3QgZWRpdCBib2R5LCB0byBzdGFydCBlZGl0aW5nIGZyb20gdGhlcmVcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgXCJib2R5XCI6IGAgKiAke2JvZHlUb1N0YXJ0RnJvbX1gLFxuICAgICAgICAgICAgICAgIFwibXNndHlwZVwiOiBvcmlnaW5hbENvbnRlbnQubXNndHlwZSxcbiAgICAgICAgICAgICAgICBcIm0ubmV3X2NvbnRlbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICBib2R5OiBib2R5VG9TdGFydEZyb20sXG4gICAgICAgICAgICAgICAgICAgIG1zZ3R5cGU6IG9yaWdpbmFsQ29udGVudC5tc2d0eXBlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtLnJlbGF0ZXNfdG9cIjoge1xuICAgICAgICAgICAgICAgICAgICByZWxfdHlwZTogXCJtLnJlcGxhY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IHRoaXMuZ2V0QmFzZUV2ZW50SWQoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPE1hdHJpeENsaWVudENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgICAgICAgIHsoY2xpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VuZEN1c3RvbUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbT17Y2xpLmdldFJvb20ocm9vbUlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVN0YXRlRXZlbnQ9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlR2VuZXJhbEV2ZW50PXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQmFjaz17KCkgPT4gdGhpcy5vbkJhY2soKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBteEV2ZW50LmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZDb250ZW50OiBKU09OLnN0cmluZ2lmeShuZXdDb250ZW50LCBudWxsLCBcIlxcdFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L01hdHJpeENsaWVudENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuU2VuZFN0YXRlRXZlbnQobXhFdmVudCkge1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHJvb20gPSBjbGkuZ2V0Um9vbShteEV2ZW50LmdldFJvb21JZCgpKTtcbiAgICAgICAgcmV0dXJuIHJvb20uY3VycmVudFN0YXRlLm1heUNsaWVudFNlbmRTdGF0ZUV2ZW50KG14RXZlbnQuZ2V0VHlwZSgpLCBjbGkpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgQmFzZURpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoXCJ2aWV3cy5kaWFsb2dzLkJhc2VEaWFsb2dcIik7XG4gICAgICAgIGNvbnN0IG14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQucmVwbGFjaW5nRXZlbnQoKSB8fCB0aGlzLnByb3BzLm14RXZlbnQ7IC8vIHNob3cgdGhlIHJlcGxhY2luZyBldmVudCwgbm90IHRoZSBvcmlnaW5hbCwgaWYgaXQgaXMgYW4gZWRpdFxuXG4gICAgICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuc3RhdGUuaXNFZGl0aW5nO1xuICAgICAgICBjb25zdCByb29tSWQgPSBteEV2ZW50LmdldFJvb21JZCgpO1xuICAgICAgICBjb25zdCBldmVudElkID0gbXhFdmVudC5nZXRJZCgpO1xuICAgICAgICBjb25zdCBjYW5FZGl0ID0gbXhFdmVudC5pc1N0YXRlKCkgPyB0aGlzLmNhblNlbmRTdGF0ZUV2ZW50KG14RXZlbnQpIDogY2FuRWRpdENvbnRlbnQodGhpcy5wcm9wcy5teEV2ZW50KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nIGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2VcIiBvbkZpbmlzaGVkPXt0aGlzLnByb3BzLm9uRmluaXNoZWR9IHRpdGxlPXtfdChcIlZpZXcgU291cmNlXCIpfT5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlJvb20gSUQ6IHtyb29tSWR9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+RXZlbnQgSUQ6IHtldmVudElkfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2Vfc2VwYXJhdG9yXCIgLz5cbiAgICAgICAgICAgICAgICAgICAge2lzRWRpdGluZyA/IHRoaXMuZWRpdFNvdXJjZUNvbnRlbnQoKSA6IHRoaXMudmlld1NvdXJjZUNvbnRlbnQoKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7IWlzRWRpdGluZyAmJiBjYW5FZGl0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB0aGlzLm9uRWRpdCgpfT57X3QoXCJFZGl0XCIpfTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==