matrix-react-sdk
Version:
SDK for matrix.org using React
205 lines (201 loc) • 28.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.stringify = exports.stateKeyField = exports.eventTypeField = exports.TimelineEventEditor = exports.EventViewer = exports.EventEditor = void 0;
var _react = _interopRequireWildcard(require("react"));
var _languageHandler = require("../../../../languageHandler");
var _Field = _interopRequireDefault(require("../../elements/Field"));
var _BaseTool = _interopRequireWildcard(require("./BaseTool"));
var _MatrixClientContext = _interopRequireDefault(require("../../../../contexts/MatrixClientContext"));
var _Validation = _interopRequireDefault(require("../../elements/Validation"));
var _SyntaxHighlight = _interopRequireDefault(require("../../elements/SyntaxHighlight"));
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 2023 The Matrix.org Foundation C.I.C.
Copyright 2022 Michael Telatynski <7t3chguy@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const stringify = object => {
return JSON.stringify(object, null, 2);
};
exports.stringify = stringify;
const eventTypeField = defaultValue => ({
id: "eventType",
label: (0, _languageHandler._td)("devtools|event_type"),
default: defaultValue
});
exports.eventTypeField = eventTypeField;
const stateKeyField = defaultValue => ({
id: "stateKey",
label: (0, _languageHandler._td)("devtools|state_key"),
default: defaultValue
});
exports.stateKeyField = stateKeyField;
const validateEventContent = (0, _Validation.default)({
async deriveData({
value
}) {
try {
JSON.parse(value);
} catch (e) {
return e;
}
return undefined;
},
rules: [{
key: "validJson",
test: ({
value
}, error) => {
if (!value) return true;
return !error;
},
invalid: error => (0, _languageHandler._t)("devtools|invalid_json") + " " + error
}]
});
const EventEditor = ({
fieldDefs,
defaultContent = "{\n\n}",
onSend,
onBack
}) => {
const [fieldData, setFieldData] = (0, _react.useState)(fieldDefs.map(def => def.default ?? ""));
const [content, setContent] = (0, _react.useState)(defaultContent);
const contentField = (0, _react.useRef)(null);
const fields = fieldDefs.map((def, i) => /*#__PURE__*/_react.default.createElement(_Field.default, {
key: def.id,
id: def.id,
label: (0, _languageHandler._t)(def.label),
size: 42,
autoFocus: defaultContent === undefined && i === 0,
type: "text",
autoComplete: "on",
value: fieldData[i],
onChange: ev => setFieldData(data => {
data[i] = ev.target.value;
return [...data];
})
}));
const onAction = async () => {
const valid = contentField.current ? await contentField.current.validate({}) : false;
if (!valid) {
contentField.current?.focus();
contentField.current?.validate({
focused: true
});
return;
}
try {
const json = JSON.parse(content);
await onSend(fieldData, json);
} catch (e) {
return (0, _languageHandler._t)("devtools|failed_to_send") + (e instanceof Error ? ` (${e.message})` : "");
}
return (0, _languageHandler._t)("devtools|event_sent");
};
return /*#__PURE__*/_react.default.createElement(_BaseTool.default, {
actionLabel: (0, _languageHandler._td)("forward|send_label"),
onAction: onAction,
onBack: onBack
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevTools_eventTypeStateKeyGroup"
}, fields), /*#__PURE__*/_react.default.createElement(_Field.default, {
id: "evContent",
label: (0, _languageHandler._t)("devtools|event_content"),
type: "text",
className: "mx_DevTools_textarea",
autoComplete: "off",
value: content,
onChange: ev => setContent(ev.target.value),
element: "textarea",
onValidate: validateEventContent,
ref: contentField,
autoFocus: !!defaultContent
}));
};
exports.EventEditor = EventEditor;
const EventViewer = ({
mxEvent,
onBack,
Editor,
extraButton
}) => {
const [editing, setEditing] = (0, _react.useState)(false);
if (editing) {
const onBack = () => {
setEditing(false);
};
return /*#__PURE__*/_react.default.createElement(Editor, {
mxEvent: mxEvent,
onBack: onBack
});
}
const onAction = async () => {
setEditing(true);
};
return /*#__PURE__*/_react.default.createElement(_BaseTool.default, {
onBack: onBack,
actionLabel: (0, _languageHandler._td)("action|edit"),
onAction: onAction,
extraButton: extraButton
}, /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
language: "json"
}, stringify(mxEvent.event)));
};
// returns the id of the initial message, not the id of the previous edit
exports.EventViewer = EventViewer;
const getBaseEventId = baseEvent => {
// show the replacing event, not the original, if it is an edit
const mxEvent = baseEvent.replacingEvent() ?? baseEvent;
return mxEvent.getWireContent()["m.relates_to"]?.event_id ?? baseEvent.getId();
};
const TimelineEventEditor = ({
mxEvent,
onBack
}) => {
const context = (0, _react.useContext)(_BaseTool.DevtoolsContext);
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const fields = (0, _react.useMemo)(() => [eventTypeField(mxEvent?.getType())], [mxEvent]);
const onSend = ([eventType], content) => {
return cli.sendEvent(context.room.roomId, eventType, content);
};
let defaultContent;
if (mxEvent) {
const originalContent = mxEvent.getContent();
// 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: getBaseEventId(mxEvent)
}
};
defaultContent = stringify(newContent);
} else if (context.threadRootId) {
defaultContent = stringify({
"m.relates_to": {
rel_type: "m.thread",
event_id: context.threadRootId
}
});
}
return /*#__PURE__*/_react.default.createElement(EventEditor, {
fieldDefs: fields,
defaultContent: defaultContent,
onSend: onSend,
onBack: onBack
});
};
exports.TimelineEventEditor = TimelineEventEditor;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0ZpZWxkIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9CYXNlVG9vbCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX1ZhbGlkYXRpb24iLCJfU3ludGF4SGlnaGxpZ2h0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwic3RyaW5naWZ5Iiwib2JqZWN0IiwiSlNPTiIsImV4cG9ydHMiLCJldmVudFR5cGVGaWVsZCIsImRlZmF1bHRWYWx1ZSIsImlkIiwibGFiZWwiLCJfdGQiLCJzdGF0ZUtleUZpZWxkIiwidmFsaWRhdGVFdmVudENvbnRlbnQiLCJ3aXRoVmFsaWRhdGlvbiIsImRlcml2ZURhdGEiLCJ2YWx1ZSIsInBhcnNlIiwidW5kZWZpbmVkIiwicnVsZXMiLCJrZXkiLCJ0ZXN0IiwiZXJyb3IiLCJpbnZhbGlkIiwiX3QiLCJFdmVudEVkaXRvciIsImZpZWxkRGVmcyIsImRlZmF1bHRDb250ZW50Iiwib25TZW5kIiwib25CYWNrIiwiZmllbGREYXRhIiwic2V0RmllbGREYXRhIiwidXNlU3RhdGUiLCJtYXAiLCJkZWYiLCJjb250ZW50Iiwic2V0Q29udGVudCIsImNvbnRlbnRGaWVsZCIsInVzZVJlZiIsImZpZWxkcyIsImNyZWF0ZUVsZW1lbnQiLCJzaXplIiwiYXV0b0ZvY3VzIiwidHlwZSIsImF1dG9Db21wbGV0ZSIsIm9uQ2hhbmdlIiwiZXYiLCJkYXRhIiwidGFyZ2V0Iiwib25BY3Rpb24iLCJ2YWxpZCIsImN1cnJlbnQiLCJ2YWxpZGF0ZSIsImZvY3VzIiwiZm9jdXNlZCIsImpzb24iLCJFcnJvciIsIm1lc3NhZ2UiLCJhY3Rpb25MYWJlbCIsImNsYXNzTmFtZSIsImVsZW1lbnQiLCJvblZhbGlkYXRlIiwicmVmIiwiRXZlbnRWaWV3ZXIiLCJteEV2ZW50IiwiRWRpdG9yIiwiZXh0cmFCdXR0b24iLCJlZGl0aW5nIiwic2V0RWRpdGluZyIsImxhbmd1YWdlIiwiZXZlbnQiLCJnZXRCYXNlRXZlbnRJZCIsImJhc2VFdmVudCIsInJlcGxhY2luZ0V2ZW50IiwiZ2V0V2lyZUNvbnRlbnQiLCJldmVudF9pZCIsImdldElkIiwiVGltZWxpbmVFdmVudEVkaXRvciIsImNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRGV2dG9vbHNDb250ZXh0IiwiY2xpIiwiTWF0cml4Q2xpZW50Q29udGV4dCIsInVzZU1lbW8iLCJnZXRUeXBlIiwiZXZlbnRUeXBlIiwic2VuZEV2ZW50Iiwicm9vbSIsInJvb21JZCIsIm9yaWdpbmFsQ29udGVudCIsImdldENvbnRlbnQiLCJib2R5VG9TdGFydEZyb20iLCJib2R5IiwibmV3Q29udGVudCIsIm1zZ3R5cGUiLCJyZWxfdHlwZSIsInRocmVhZFJvb3RJZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvZGV2dG9vbHMvRXZlbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAyMiBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IElDb250ZW50LCBNYXRyaXhFdmVudCwgVGltZWxpbmVFdmVudHMgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90LCBfdGQsIFRyYW5zbGF0aW9uS2V5IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi9lbGVtZW50cy9GaWVsZFwiO1xuaW1wb3J0IEJhc2VUb29sLCB7IERldnRvb2xzQ29udGV4dCwgSURldnRvb2xzUHJvcHMgfSBmcm9tIFwiLi9CYXNlVG9vbFwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB3aXRoVmFsaWRhdGlvbiBmcm9tIFwiLi4vLi4vZWxlbWVudHMvVmFsaWRhdGlvblwiO1xuaW1wb3J0IFN5bnRheEhpZ2hsaWdodCBmcm9tIFwiLi4vLi4vZWxlbWVudHMvU3ludGF4SGlnaGxpZ2h0XCI7XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdpZnkgPSAob2JqZWN0OiBvYmplY3QpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIG51bGwsIDIpO1xufTtcblxuaW50ZXJmYWNlIElFdmVudEVkaXRvclByb3BzIGV4dGVuZHMgUGljazxJRGV2dG9vbHNQcm9wcywgXCJvbkJhY2tcIj4ge1xuICAgIGZpZWxkRGVmczogSUZpZWxkRGVmW107IC8vIGltbXV0YWJsZVxuICAgIGRlZmF1bHRDb250ZW50Pzogc3RyaW5nO1xuICAgIG9uU2VuZChmaWVsZHM6IHN0cmluZ1tdLCBjb250ZW50OiBJQ29udGVudCk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmludGVyZmFjZSBJRmllbGREZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbGFiZWw6IFRyYW5zbGF0aW9uS2V5O1xuICAgIGRlZmF1bHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBldmVudFR5cGVGaWVsZCA9IChkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBJRmllbGREZWYgPT4gKHtcbiAgICBpZDogXCJldmVudFR5cGVcIixcbiAgICBsYWJlbDogX3RkKFwiZGV2dG9vbHN8ZXZlbnRfdHlwZVwiKSxcbiAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG59KTtcblxuZXhwb3J0IGNvbnN0IHN0YXRlS2V5RmllbGQgPSAoZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogSUZpZWxkRGVmID0+ICh7XG4gICAgaWQ6IFwic3RhdGVLZXlcIixcbiAgICBsYWJlbDogX3RkKFwiZGV2dG9vbHN8c3RhdGVfa2V5XCIpLFxuICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbn0pO1xuXG5jb25zdCB2YWxpZGF0ZUV2ZW50Q29udGVudCA9IHdpdGhWYWxpZGF0aW9uPGFueSwgRXJyb3IgfCB1bmRlZmluZWQ+KHtcbiAgICBhc3luYyBkZXJpdmVEYXRhKHsgdmFsdWUgfSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgSlNPTi5wYXJzZSh2YWx1ZSEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSBhcyBFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiBcInZhbGlkSnNvblwiLFxuICAgICAgICAgICAgdGVzdDogKHsgdmFsdWUgfSwgZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWVycm9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludmFsaWQ6IChlcnJvcikgPT4gX3QoXCJkZXZ0b29sc3xpbnZhbGlkX2pzb25cIikgKyBcIiBcIiArIGVycm9yLFxuICAgICAgICB9LFxuICAgIF0sXG59KTtcblxuZXhwb3J0IGNvbnN0IEV2ZW50RWRpdG9yOiBSZWFjdC5GQzxJRXZlbnRFZGl0b3JQcm9wcz4gPSAoeyBmaWVsZERlZnMsIGRlZmF1bHRDb250ZW50ID0gXCJ7XFxuXFxufVwiLCBvblNlbmQsIG9uQmFjayB9KSA9PiB7XG4gICAgY29uc3QgW2ZpZWxkRGF0YSwgc2V0RmllbGREYXRhXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihmaWVsZERlZnMubWFwKChkZWYpID0+IGRlZi5kZWZhdWx0ID8/IFwiXCIpKTtcbiAgICBjb25zdCBbY29udGVudCwgc2V0Q29udGVudF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGRlZmF1bHRDb250ZW50KTtcbiAgICBjb25zdCBjb250ZW50RmllbGQgPSB1c2VSZWY8RmllbGQ+KG51bGwpO1xuXG4gICAgY29uc3QgZmllbGRzID0gZmllbGREZWZzLm1hcCgoZGVmLCBpKSA9PiAoXG4gICAgICAgIDxGaWVsZFxuICAgICAgICAgICAga2V5PXtkZWYuaWR9XG4gICAgICAgICAgICBpZD17ZGVmLmlkfVxuICAgICAgICAgICAgbGFiZWw9e190KGRlZi5sYWJlbCl9XG4gICAgICAgICAgICBzaXplPXs0Mn1cbiAgICAgICAgICAgIGF1dG9Gb2N1cz17ZGVmYXVsdENvbnRlbnQgPT09IHVuZGVmaW5lZCAmJiBpID09PSAwfVxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwib25cIlxuICAgICAgICAgICAgdmFsdWU9e2ZpZWxkRGF0YVtpXX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXY6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PlxuICAgICAgICAgICAgICAgIHNldEZpZWxkRGF0YSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2ldID0gZXYudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWy4uLmRhdGFdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgKSk7XG5cbiAgICBjb25zdCBvbkFjdGlvbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZCA9IGNvbnRlbnRGaWVsZC5jdXJyZW50ID8gYXdhaXQgY29udGVudEZpZWxkLmN1cnJlbnQudmFsaWRhdGUoe30pIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgY29udGVudEZpZWxkLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgICBjb250ZW50RmllbGQuY3VycmVudD8udmFsaWRhdGUoeyBmb2N1c2VkOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICAgICAgYXdhaXQgb25TZW5kKGZpZWxkRGF0YSwganNvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdChcImRldnRvb2xzfGZhaWxlZF90b19zZW5kXCIpICsgKGUgaW5zdGFuY2VvZiBFcnJvciA/IGAgKCR7ZS5tZXNzYWdlfSlgIDogXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90KFwiZGV2dG9vbHN8ZXZlbnRfc2VudFwiKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPEJhc2VUb29sIGFjdGlvbkxhYmVsPXtfdGQoXCJmb3J3YXJkfHNlbmRfbGFiZWxcIil9IG9uQWN0aW9uPXtvbkFjdGlvbn0gb25CYWNrPXtvbkJhY2t9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZXZUb29sc19ldmVudFR5cGVTdGF0ZUtleUdyb3VwXCI+e2ZpZWxkc308L2Rpdj5cblxuICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgaWQ9XCJldkNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImRldnRvb2xzfGV2ZW50X2NvbnRlbnRcIil9XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0RldlRvb2xzX3RleHRhcmVhXCJcbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtjb250ZW50fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXYpID0+IHNldENvbnRlbnQoZXYudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICBlbGVtZW50PVwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgIG9uVmFsaWRhdGU9e3ZhbGlkYXRlRXZlbnRDb250ZW50fVxuICAgICAgICAgICAgICAgIHJlZj17Y29udGVudEZpZWxkfVxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1cz17ISFkZWZhdWx0Q29udGVudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvQmFzZVRvb2w+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVkaXRvclByb3BzIGV4dGVuZHMgUGljazxJRGV2dG9vbHNQcm9wcywgXCJvbkJhY2tcIj4ge1xuICAgIG14RXZlbnQ/OiBNYXRyaXhFdmVudDtcbn1cblxuaW50ZXJmYWNlIElWaWV3ZXJQcm9wcyBleHRlbmRzIFJlcXVpcmVkPElFZGl0b3JQcm9wcz4ge1xuICAgIEVkaXRvcjogUmVhY3QuRkM8SUVkaXRvclByb3BzPjtcbiAgICBleHRyYUJ1dHRvbj86IFJlYWN0Tm9kZTtcbn1cblxuZXhwb3J0IGNvbnN0IEV2ZW50Vmlld2VyOiBSZWFjdC5GQzxJVmlld2VyUHJvcHM+ID0gKHsgbXhFdmVudCwgb25CYWNrLCBFZGl0b3IsIGV4dHJhQnV0dG9uIH0pID0+IHtcbiAgICBjb25zdCBbZWRpdGluZywgc2V0RWRpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBpZiAoZWRpdGluZykge1xuICAgICAgICBjb25zdCBvbkJhY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzZXRFZGl0aW5nKGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIDxFZGl0b3IgbXhFdmVudD17bXhFdmVudH0gb25CYWNrPXtvbkJhY2t9IC8+O1xuICAgIH1cblxuICAgIGNvbnN0IG9uQWN0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBzZXRFZGl0aW5nKHRydWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9IGFjdGlvbkxhYmVsPXtfdGQoXCJhY3Rpb258ZWRpdFwiKX0gb25BY3Rpb249e29uQWN0aW9ufSBleHRyYUJ1dHRvbj17ZXh0cmFCdXR0b259PlxuICAgICAgICAgICAgPFN5bnRheEhpZ2hsaWdodCBsYW5ndWFnZT1cImpzb25cIj57c3RyaW5naWZ5KG14RXZlbnQuZXZlbnQpfTwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICA8L0Jhc2VUb29sPlxuICAgICk7XG59O1xuXG4vLyByZXR1cm5zIHRoZSBpZCBvZiB0aGUgaW5pdGlhbCBtZXNzYWdlLCBub3QgdGhlIGlkIG9mIHRoZSBwcmV2aW91cyBlZGl0XG5jb25zdCBnZXRCYXNlRXZlbnRJZCA9IChiYXNlRXZlbnQ6IE1hdHJpeEV2ZW50KTogc3RyaW5nID0+IHtcbiAgICAvLyBzaG93IHRoZSByZXBsYWNpbmcgZXZlbnQsIG5vdCB0aGUgb3JpZ2luYWwsIGlmIGl0IGlzIGFuIGVkaXRcbiAgICBjb25zdCBteEV2ZW50ID0gYmFzZUV2ZW50LnJlcGxhY2luZ0V2ZW50KCkgPz8gYmFzZUV2ZW50O1xuICAgIHJldHVybiBteEV2ZW50LmdldFdpcmVDb250ZW50KClbXCJtLnJlbGF0ZXNfdG9cIl0/LmV2ZW50X2lkID8/IGJhc2VFdmVudC5nZXRJZCgpITtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lbGluZUV2ZW50RWRpdG9yOiBSZWFjdC5GQzxJRWRpdG9yUHJvcHM+ID0gKHsgbXhFdmVudCwgb25CYWNrIH0pID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChEZXZ0b29sc0NvbnRleHQpO1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG5cbiAgICBjb25zdCBmaWVsZHMgPSB1c2VNZW1vKCgpID0+IFtldmVudFR5cGVGaWVsZChteEV2ZW50Py5nZXRUeXBlKCkpXSwgW214RXZlbnRdKTtcblxuICAgIGNvbnN0IG9uU2VuZCA9IChbZXZlbnRUeXBlXTogc3RyaW5nW10sIGNvbnRlbnQ6IFRpbWVsaW5lRXZlbnRzW2tleW9mIFRpbWVsaW5lRXZlbnRzXSk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgICAgICByZXR1cm4gY2xpLnNlbmRFdmVudChjb250ZXh0LnJvb20ucm9vbUlkLCBldmVudFR5cGUgYXMga2V5b2YgVGltZWxpbmVFdmVudHMsIGNvbnRlbnQpO1xuICAgIH07XG5cbiAgICBsZXQgZGVmYXVsdENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChteEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IG14RXZlbnQuZ2V0Q29udGVudCgpO1xuICAgICAgICAvLyBwcmVmaWxsIGFuIGVkaXQtbWVzc2FnZSBldmVudCwga2VlcCBvbmx5IHRoZSBgYm9keWAgYW5kIGBtc2d0eXBlYCBmaWVsZHMgb2Ygb3JpZ2luYWxDb250ZW50XG4gICAgICAgIGNvbnN0IGJvZHlUb1N0YXJ0RnJvbSA9IG9yaWdpbmFsQ29udGVudFtcIm0ubmV3X2NvbnRlbnRcIl0/LmJvZHkgPz8gb3JpZ2luYWxDb250ZW50LmJvZHk7IC8vIHByZWZpbGwgdGhlIGxhc3QgZWRpdCBib2R5LCB0byBzdGFydCBlZGl0aW5nIGZyb20gdGhlcmVcbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYm9keVwiOiBgICogJHtib2R5VG9TdGFydEZyb219YCxcbiAgICAgICAgICAgIFwibXNndHlwZVwiOiBvcmlnaW5hbENvbnRlbnQubXNndHlwZSxcbiAgICAgICAgICAgIFwibS5uZXdfY29udGVudFwiOiB7XG4gICAgICAgICAgICAgICAgYm9keTogYm9keVRvU3RhcnRGcm9tLFxuICAgICAgICAgICAgICAgIG1zZ3R5cGU6IG9yaWdpbmFsQ29udGVudC5tc2d0eXBlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibS5yZWxhdGVzX3RvXCI6IHtcbiAgICAgICAgICAgICAgICByZWxfdHlwZTogXCJtLnJlcGxhY2VcIixcbiAgICAgICAgICAgICAgICBldmVudF9pZDogZ2V0QmFzZUV2ZW50SWQobXhFdmVudCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHRDb250ZW50ID0gc3RyaW5naWZ5KG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dC50aHJlYWRSb290SWQpIHtcbiAgICAgICAgZGVmYXVsdENvbnRlbnQgPSBzdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJtLnJlbGF0ZXNfdG9cIjoge1xuICAgICAgICAgICAgICAgIHJlbF90eXBlOiBcIm0udGhyZWFkXCIsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGNvbnRleHQudGhyZWFkUm9vdElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDxFdmVudEVkaXRvciBmaWVsZERlZnM9e2ZpZWxkc30gZGVmYXVsdENvbnRlbnQ9e2RlZmF1bHRDb250ZW50fSBvblNlbmQ9e29uU2VuZH0gb25CYWNrPXtvbkJhY2t9IC8+O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7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