UNPKG

matrix-react-sdk

Version:
124 lines (119 loc) 21.9 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 _htmlEntities = require("html-entities"); var _HtmlUtils = require("../../../HtmlUtils"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _Modal = _interopRequireDefault(require("../../../Modal")); var ImageUtils = _interopRequireWildcard(require("../../../ImageUtils")); var _Media = require("../../../customisations/Media"); var _ImageView = _interopRequireDefault(require("../elements/ImageView")); var _LinkWithTooltip = _interopRequireDefault(require("../elements/LinkWithTooltip")); var _PlatformPeg = _interopRequireDefault(require("../../../PlatformPeg")); 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 2016-2021 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. */ class LinkPreviewWidget extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "image", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onImageClick", ev => { const p = this.props.preview; if (ev.button != 0 || ev.metaKey) return; ev.preventDefault(); let src = p["og:image"]; if (src?.startsWith("mxc://")) { src = (0, _Media.mediaFromMxc)(src).srcHttp; } if (!src) return; const params = { src: src, width: p["og:image:width"], height: p["og:image:height"], name: p["og:title"] || p["og:description"] || this.props.link, fileSize: p["matrix:image:size"], link: this.props.link }; if (this.image.current) { const clientRect = this.image.current.getBoundingClientRect(); params.thumbnailInfo = { width: clientRect.width, height: clientRect.height, positionX: clientRect.x, positionY: clientRect.y }; } _Modal.default.createDialog(_ImageView.default, params, "mx_Dialog_lightbox", undefined, true); }); } render() { const p = this.props.preview; // FIXME: do we want to factor out all image displaying between this and MImageBody - especially for lightboxing? let image = p["og:image"] ?? null; if (!_SettingsStore.default.getValue("showImages")) { image = null; // Don't render a button to show the image, just hide it outright } const imageMaxWidth = 100; const imageMaxHeight = 100; if (image && image.startsWith("mxc://")) { // We deliberately don't want a square here, so use the source HTTP thumbnail function image = (0, _Media.mediaFromMxc)(image).getThumbnailOfSourceHttp(imageMaxWidth, imageMaxHeight, "scale"); } const thumbHeight = ImageUtils.thumbHeight(p["og:image:width"], p["og:image:height"], imageMaxWidth, imageMaxHeight) ?? imageMaxHeight; let img; if (image) { img = /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget_image", style: { height: thumbHeight } }, /*#__PURE__*/_react.default.createElement("img", { ref: this.image, style: { maxWidth: imageMaxWidth, maxHeight: imageMaxHeight }, src: image, onClick: this.onImageClick, alt: "" })); } // The description includes &-encoded HTML entities, we decode those as React treats the thing as an // opaque string. This does not allow any HTML to be injected into the DOM. const description = (0, _htmlEntities.decode)(p["og:description"] || ""); const title = p["og:title"]?.trim() ?? ""; const anchor = /*#__PURE__*/_react.default.createElement("a", { href: this.props.link, target: "_blank", rel: "noreferrer noopener" }, title); const needsTooltip = _PlatformPeg.default.get()?.needsUrlTooltips() && this.props.link !== title; return /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget_wrapImageCaption" }, img, /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget_caption" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget_title" }, needsTooltip ? /*#__PURE__*/_react.default.createElement(_LinkWithTooltip.default, { tooltip: new URL(this.props.link, window.location.href).toString() }, anchor) : anchor, p["og:site_name"] && /*#__PURE__*/_react.default.createElement("span", { className: "mx_LinkPreviewWidget_siteName" }, " - " + p["og:site_name"])), /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewWidget_description" }, /*#__PURE__*/_react.default.createElement(_HtmlUtils.Linkify, null, description)))), this.props.children); } } exports.default = LinkPreviewWidget; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfaHRtbEVudGl0aWVzIiwiX0h0bWxVdGlscyIsIl9TZXR0aW5nc1N0b3JlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9Nb2RhbCIsIkltYWdlVXRpbHMiLCJfTWVkaWEiLCJfSW1hZ2VWaWV3IiwiX0xpbmtXaXRoVG9vbHRpcCIsIl9QbGF0Zm9ybVBlZyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkxpbmtQcmV2aWV3V2lkZ2V0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwiZXYiLCJwIiwicHJvcHMiLCJwcmV2aWV3IiwiYnV0dG9uIiwibWV0YUtleSIsInByZXZlbnREZWZhdWx0Iiwic3JjIiwic3RhcnRzV2l0aCIsIm1lZGlhRnJvbU14YyIsInNyY0h0dHAiLCJwYXJhbXMiLCJ3aWR0aCIsImhlaWdodCIsIm5hbWUiLCJsaW5rIiwiZmlsZVNpemUiLCJpbWFnZSIsImN1cnJlbnQiLCJjbGllbnRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidGh1bWJuYWlsSW5mbyIsInBvc2l0aW9uWCIsIngiLCJwb3NpdGlvblkiLCJ5IiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJJbWFnZVZpZXciLCJ1bmRlZmluZWQiLCJyZW5kZXIiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJpbWFnZU1heFdpZHRoIiwiaW1hZ2VNYXhIZWlnaHQiLCJnZXRUaHVtYm5haWxPZlNvdXJjZUh0dHAiLCJ0aHVtYkhlaWdodCIsImltZyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzdHlsZSIsInJlZiIsIm1heFdpZHRoIiwibWF4SGVpZ2h0Iiwib25DbGljayIsIm9uSW1hZ2VDbGljayIsImFsdCIsImRlc2NyaXB0aW9uIiwiZGVjb2RlIiwidGl0bGUiLCJ0cmltIiwiYW5jaG9yIiwiaHJlZiIsInRhcmdldCIsInJlbCIsIm5lZWRzVG9vbHRpcCIsIlBsYXRmb3JtUGVnIiwibmVlZHNVcmxUb29sdGlwcyIsInRvb2x0aXAiLCJVUkwiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInRvU3RyaW5nIiwiTGlua2lmeSIsImNoaWxkcmVuIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL0xpbmtQcmV2aWV3V2lkZ2V0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNi0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRQcm9wcywgY3JlYXRlUmVmLCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCJodG1sLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgSVByZXZpZXdVcmxSZXNwb25zZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHsgTGlua2lmeSB9IGZyb20gXCIuLi8uLi8uLi9IdG1sVXRpbHNcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgKiBhcyBJbWFnZVV0aWxzIGZyb20gXCIuLi8uLi8uLi9JbWFnZVV0aWxzXCI7XG5pbXBvcnQgeyBtZWRpYUZyb21NeGMgfSBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvTWVkaWFcIjtcbmltcG9ydCBJbWFnZVZpZXcgZnJvbSBcIi4uL2VsZW1lbnRzL0ltYWdlVmlld1wiO1xuaW1wb3J0IExpbmtXaXRoVG9vbHRpcCBmcm9tIFwiLi4vZWxlbWVudHMvTGlua1dpdGhUb29sdGlwXCI7XG5pbXBvcnQgUGxhdGZvcm1QZWcgZnJvbSBcIi4uLy4uLy4uL1BsYXRmb3JtUGVnXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGxpbms6IHN0cmluZztcbiAgICBwcmV2aWV3OiBJUHJldmlld1VybFJlc3BvbnNlO1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50OyAvLyB0aGUgRXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmV2aWV3XG4gICAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmtQcmV2aWV3V2lkZ2V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcz4ge1xuICAgIHByaXZhdGUgaW1hZ2UgPSBjcmVhdGVSZWY8SFRNTEltYWdlRWxlbWVudD4oKTtcblxuICAgIHByaXZhdGUgb25JbWFnZUNsaWNrID0gKGV2OiBSZWFjdC5Nb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb3BzLnByZXZpZXc7XG4gICAgICAgIGlmIChldi5idXR0b24gIT0gMCB8fCBldi5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbGV0IHNyYzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBbXCJvZzppbWFnZVwiXTtcbiAgICAgICAgaWYgKHNyYz8uc3RhcnRzV2l0aChcIm14YzovL1wiKSkge1xuICAgICAgICAgICAgc3JjID0gbWVkaWFGcm9tTXhjKHNyYykuc3JjSHR0cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3JjKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyYW1zOiBPbWl0PENvbXBvbmVudFByb3BzPHR5cGVvZiBJbWFnZVZpZXc+LCBcIm9uRmluaXNoZWRcIj4gPSB7XG4gICAgICAgICAgICBzcmM6IHNyYyxcbiAgICAgICAgICAgIHdpZHRoOiBwW1wib2c6aW1hZ2U6d2lkdGhcIl0sXG4gICAgICAgICAgICBoZWlnaHQ6IHBbXCJvZzppbWFnZTpoZWlnaHRcIl0sXG4gICAgICAgICAgICBuYW1lOiBwW1wib2c6dGl0bGVcIl0gfHwgcFtcIm9nOmRlc2NyaXB0aW9uXCJdIHx8IHRoaXMucHJvcHMubGluayxcbiAgICAgICAgICAgIGZpbGVTaXplOiBwW1wibWF0cml4OmltYWdlOnNpemVcIl0sXG4gICAgICAgICAgICBsaW5rOiB0aGlzLnByb3BzLmxpbmssXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UuY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50UmVjdCA9IHRoaXMuaW1hZ2UuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgcGFyYW1zLnRodW1ibmFpbEluZm8gPSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblg6IGNsaWVudFJlY3QueCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblk6IGNsaWVudFJlY3QueSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coSW1hZ2VWaWV3LCBwYXJhbXMsIFwibXhfRGlhbG9nX2xpZ2h0Ym94XCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucHJvcHMucHJldmlldztcblxuICAgICAgICAvLyBGSVhNRTogZG8gd2Ugd2FudCB0byBmYWN0b3Igb3V0IGFsbCBpbWFnZSBkaXNwbGF5aW5nIGJldHdlZW4gdGhpcyBhbmQgTUltYWdlQm9keSAtIGVzcGVjaWFsbHkgZm9yIGxpZ2h0Ym94aW5nP1xuICAgICAgICBsZXQgaW1hZ2U6IHN0cmluZyB8IG51bGwgPSBwW1wib2c6aW1hZ2VcIl0gPz8gbnVsbDtcbiAgICAgICAgaWYgKCFTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwic2hvd0ltYWdlc1wiKSkge1xuICAgICAgICAgICAgaW1hZ2UgPSBudWxsOyAvLyBEb24ndCByZW5kZXIgYSBidXR0b24gdG8gc2hvdyB0aGUgaW1hZ2UsIGp1c3QgaGlkZSBpdCBvdXRyaWdodFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlTWF4V2lkdGggPSAxMDA7XG4gICAgICAgIGNvbnN0IGltYWdlTWF4SGVpZ2h0ID0gMTAwO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgaW1hZ2Uuc3RhcnRzV2l0aChcIm14YzovL1wiKSkge1xuICAgICAgICAgICAgLy8gV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHdhbnQgYSBzcXVhcmUgaGVyZSwgc28gdXNlIHRoZSBzb3VyY2UgSFRUUCB0aHVtYm5haWwgZnVuY3Rpb25cbiAgICAgICAgICAgIGltYWdlID0gbWVkaWFGcm9tTXhjKGltYWdlKS5nZXRUaHVtYm5haWxPZlNvdXJjZUh0dHAoaW1hZ2VNYXhXaWR0aCwgaW1hZ2VNYXhIZWlnaHQsIFwic2NhbGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHVtYkhlaWdodCA9XG4gICAgICAgICAgICBJbWFnZVV0aWxzLnRodW1iSGVpZ2h0KHBbXCJvZzppbWFnZTp3aWR0aFwiXSwgcFtcIm9nOmltYWdlOmhlaWdodFwiXSwgaW1hZ2VNYXhXaWR0aCwgaW1hZ2VNYXhIZWlnaHQpID8/XG4gICAgICAgICAgICBpbWFnZU1heEhlaWdodDtcblxuICAgICAgICBsZXQgaW1nOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICBpbWcgPSAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld1dpZGdldF9pbWFnZVwiIHN0eWxlPXt7IGhlaWdodDogdGh1bWJIZWlnaHQgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5pbWFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IG1heFdpZHRoOiBpbWFnZU1heFdpZHRoLCBtYXhIZWlnaHQ6IGltYWdlTWF4SGVpZ2h0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2ltYWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vbkltYWdlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBkZXNjcmlwdGlvbiBpbmNsdWRlcyAmLWVuY29kZWQgSFRNTCBlbnRpdGllcywgd2UgZGVjb2RlIHRob3NlIGFzIFJlYWN0IHRyZWF0cyB0aGUgdGhpbmcgYXMgYW5cbiAgICAgICAgLy8gb3BhcXVlIHN0cmluZy4gVGhpcyBkb2VzIG5vdCBhbGxvdyBhbnkgSFRNTCB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBET00uXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVjb2RlKHBbXCJvZzpkZXNjcmlwdGlvblwiXSB8fCBcIlwiKTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IHBbXCJvZzp0aXRsZVwiXT8udHJpbSgpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IChcbiAgICAgICAgICAgIDxhIGhyZWY9e3RoaXMucHJvcHMubGlua30gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiPlxuICAgICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmVlZHNUb29sdGlwID0gUGxhdGZvcm1QZWcuZ2V0KCk/Lm5lZWRzVXJsVG9vbHRpcHMoKSAmJiB0aGlzLnByb3BzLmxpbmsgIT09IHRpdGxlO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0xpbmtQcmV2aWV3V2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld1dpZGdldF93cmFwSW1hZ2VDYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIHtpbWd9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTGlua1ByZXZpZXdXaWRnZXRfY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld1dpZGdldF90aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuZWVkc1Rvb2x0aXAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rV2l0aFRvb2x0aXAgdG9vbHRpcD17bmV3IFVSTCh0aGlzLnByb3BzLmxpbmssIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS50b1N0cmluZygpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbmNob3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGlua1dpdGhUb29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BbXCJvZzpzaXRlX25hbWVcIl0gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld1dpZGdldF9zaXRlTmFtZVwiPntcIiAtIFwiICsgcFtcIm9nOnNpdGVfbmFtZVwiXX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld1dpZGdldF9kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5raWZ5PntkZXNjcmlwdGlvbn08L0xpbmtpZnk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsY0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBUCx1QkFB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