matrix-react-sdk
Version:
SDK for matrix.org using React
124 lines (119 loc) • 18.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _compoundWeb = require("@vector-im/compound-web");
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _useEventEmitter = require("../../../hooks/useEventEmitter");
var _languageHandler = require("../../../languageHandler");
const _excluded = ["name", "idName", "title", "url", "urls", "size", "onClick", "className", "type", "altText"];
/*
Copyright 2024 New Vector Ltd.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2018 New Vector Ltd
Copyright 2015, 2016 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
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; }
const calculateUrls = (url, urls, lowBandwidth = false) => {
// work out the full set of urls to try to load. This is formed like so:
// imageUrls: [ props.url, ...props.urls ]
let _urls = [];
if (!lowBandwidth) {
_urls = urls || [];
if (url) {
// copy urls and put url first
_urls = [url, ..._urls];
}
}
// deduplicate URLs
return Array.from(new Set(_urls));
};
const useImageUrl = ({
url,
urls
}) => {
// Since this is a hot code path and the settings store can be slow, we
// use the cached lowBandwidth value from the room context if it exists
const roomContext = (0, _react.useContext)(_RoomContext.default);
const lowBandwidth = roomContext ? roomContext.lowBandwidth : _SettingsStore.default.getValue("lowBandwidth");
const [imageUrls, setUrls] = (0, _react.useState)(calculateUrls(url, urls, lowBandwidth));
const [urlsIndex, setIndex] = (0, _react.useState)(0);
const onError = (0, _react.useCallback)(() => {
setIndex(i => i + 1); // try the next one
}, []);
(0, _react.useEffect)(() => {
setUrls(calculateUrls(url, urls, lowBandwidth));
setIndex(0);
}, [url, JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const onClientSync = (0, _react.useCallback)((syncState, prevState) => {
// Consider the client reconnected if there is no error with syncing.
// This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP.
const reconnected = syncState !== "ERROR" && prevState !== syncState;
if (reconnected) {
setIndex(0);
}
}, []);
(0, _useEventEmitter.useTypedEventEmitter)(cli, _matrix.ClientEvent.Sync, onClientSync);
const imageUrl = imageUrls[urlsIndex];
return [imageUrl, onError];
};
const BaseAvatar = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
const {
name,
idName,
title,
url,
urls,
size = "40px",
onClick,
className,
type = "round",
altText = (0, _languageHandler._t)("common|avatar")
} = props,
otherProps = (0, _objectWithoutProperties2.default)(props, _excluded);
const [imageUrl, onError] = useImageUrl({
url,
urls
});
const extraProps = {};
if (onClick) {
extraProps["aria-live"] = "off";
extraProps["role"] = "button";
} else if (!imageUrl) {
extraProps["role"] = "presentation";
extraProps["aria-label"] = undefined;
} else {
extraProps["role"] = undefined;
}
return /*#__PURE__*/_react.default.createElement(_compoundWeb.Avatar, (0, _extends2.default)({
ref: ref,
src: imageUrl,
id: idName ?? "",
name: name ?? "",
type: type,
size: size,
className: (0, _classnames.default)("mx_BaseAvatar", className),
"aria-label": altText,
onError: onError,
title: title,
onClick: onClick
}, extraProps, otherProps, {
"data-testid": "avatar-img"
}));
});
var _default = exports.default = BaseAvatar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWF0cml4IiwiX2NvbXBvdW5kV2ViIiwiX1NldHRpbmdzU3RvcmUiLCJfUm9vbUNvbnRleHQiLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl91c2VFdmVudEVtaXR0ZXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX2V4Y2x1ZGVkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiY2FsY3VsYXRlVXJscyIsInVybCIsInVybHMiLCJsb3dCYW5kd2lkdGgiLCJfdXJscyIsIkFycmF5IiwiZnJvbSIsIlNldCIsInVzZUltYWdlVXJsIiwicm9vbUNvbnRleHQiLCJ1c2VDb250ZXh0IiwiUm9vbUNvbnRleHQiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJpbWFnZVVybHMiLCJzZXRVcmxzIiwidXNlU3RhdGUiLCJ1cmxzSW5kZXgiLCJzZXRJbmRleCIsIm9uRXJyb3IiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjbGkiLCJNYXRyaXhDbGllbnRDb250ZXh0Iiwib25DbGllbnRTeW5jIiwic3luY1N0YXRlIiwicHJldlN0YXRlIiwicmVjb25uZWN0ZWQiLCJ1c2VUeXBlZEV2ZW50RW1pdHRlciIsIkNsaWVudEV2ZW50IiwiU3luYyIsImltYWdlVXJsIiwiQmFzZUF2YXRhciIsImZvcndhcmRSZWYiLCJwcm9wcyIsInJlZiIsIm5hbWUiLCJpZE5hbWUiLCJ0aXRsZSIsInNpemUiLCJvbkNsaWNrIiwiY2xhc3NOYW1lIiwidHlwZSIsImFsdFRleHQiLCJfdCIsIm90aGVyUHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiZXh0cmFQcm9wcyIsInVuZGVmaW5lZCIsImNyZWF0ZUVsZW1lbnQiLCJBdmF0YXIiLCJfZXh0ZW5kczIiLCJzcmMiLCJpZCIsImNsYXNzTmFtZXMiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9hdmF0YXJzL0Jhc2VBdmF0YXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxOSBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cbkNvcHlyaWdodCAyMDE4IE5ldyBWZWN0b3IgTHRkXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgQXJpYVJvbGUsIGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgQ2xpZW50RXZlbnQsIFN5bmNTdGF0ZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEF2YXRhciB9IGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLXdlYlwiO1xuXG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IFJvb21Db250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZVR5cGVkRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIG5hbWU/OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQXZhdGFyPltcIm5hbWVcIl07IC8vIFRoZSBuYW1lIChmaXJzdCBpbml0aWFsIHVzZWQgYXMgZGVmYXVsdClcbiAgICBpZE5hbWU/OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQXZhdGFyPltcImlkXCJdOyAvLyBJRCBmb3IgZ2VuZXJhdGluZyBoYXNoIGNvbG91cnNcbiAgICB0aXRsZT86IHN0cmluZzsgLy8gb25Ib3ZlciB0aXRsZSB0ZXh0XG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDsgLy8gaGlnaGVzdCBwcmlvcml0eSBvZiB0aGVtIGFsbCwgc2hvcnRjdXQgdG8gc2V0IGluIHVybHNbMF1cbiAgICB1cmxzPzogc3RyaW5nW107IC8vIFtoaWdoZXN0X3ByaW9yaXR5LCAuLi4gLCBsb3dlc3RfcHJpb3JpdHldXG4gICAgdHlwZT86IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBdmF0YXI+W1widHlwZVwiXTtcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgb25DbGljaz86IChldjogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHRhYkluZGV4PzogbnVtYmVyO1xuICAgIGFsdFRleHQ/OiBzdHJpbmc7XG4gICAgcm9sZT86IEFyaWFSb2xlO1xufVxuXG5jb25zdCBjYWxjdWxhdGVVcmxzID0gKHVybD86IHN0cmluZyB8IG51bGwsIHVybHM/OiBzdHJpbmdbXSwgbG93QmFuZHdpZHRoID0gZmFsc2UpOiBzdHJpbmdbXSA9PiB7XG4gICAgLy8gd29yayBvdXQgdGhlIGZ1bGwgc2V0IG9mIHVybHMgdG8gdHJ5IHRvIGxvYWQuIFRoaXMgaXMgZm9ybWVkIGxpa2Ugc286XG4gICAgLy8gaW1hZ2VVcmxzOiBbIHByb3BzLnVybCwgLi4ucHJvcHMudXJscyBdXG5cbiAgICBsZXQgX3VybHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFsb3dCYW5kd2lkdGgpIHtcbiAgICAgICAgX3VybHMgPSB1cmxzIHx8IFtdO1xuXG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgIC8vIGNvcHkgdXJscyBhbmQgcHV0IHVybCBmaXJzdFxuICAgICAgICAgICAgX3VybHMgPSBbdXJsLCAuLi5fdXJsc107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWR1cGxpY2F0ZSBVUkxzXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChfdXJscykpO1xufTtcblxuY29uc3QgdXNlSW1hZ2VVcmwgPSAoeyB1cmwsIHVybHMgfTogeyB1cmw/OiBzdHJpbmcgfCBudWxsOyB1cmxzPzogc3RyaW5nW10gfSk6IFtzdHJpbmcsICgpID0+IHZvaWRdID0+IHtcbiAgICAvLyBTaW5jZSB0aGlzIGlzIGEgaG90IGNvZGUgcGF0aCBhbmQgdGhlIHNldHRpbmdzIHN0b3JlIGNhbiBiZSBzbG93LCB3ZVxuICAgIC8vIHVzZSB0aGUgY2FjaGVkIGxvd0JhbmR3aWR0aCB2YWx1ZSBmcm9tIHRoZSByb29tIGNvbnRleHQgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgcm9vbUNvbnRleHQgPSB1c2VDb250ZXh0KFJvb21Db250ZXh0KTtcbiAgICBjb25zdCBsb3dCYW5kd2lkdGggPSByb29tQ29udGV4dCA/IHJvb21Db250ZXh0Lmxvd0JhbmR3aWR0aCA6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJsb3dCYW5kd2lkdGhcIik7XG5cbiAgICBjb25zdCBbaW1hZ2VVcmxzLCBzZXRVcmxzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihjYWxjdWxhdGVVcmxzKHVybCwgdXJscywgbG93QmFuZHdpZHRoKSk7XG4gICAgY29uc3QgW3VybHNJbmRleCwgc2V0SW5kZXhdID0gdXNlU3RhdGU8bnVtYmVyPigwKTtcblxuICAgIGNvbnN0IG9uRXJyb3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHNldEluZGV4KChpKSA9PiBpICsgMSk7IC8vIHRyeSB0aGUgbmV4dCBvbmVcbiAgICB9LCBbXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRVcmxzKGNhbGN1bGF0ZVVybHModXJsLCB1cmxzLCBsb3dCYW5kd2lkdGgpKTtcbiAgICAgICAgc2V0SW5kZXgoMCk7XG4gICAgfSwgW3VybCwgSlNPTi5zdHJpbmdpZnkodXJscyldKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcblxuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3Qgb25DbGllbnRTeW5jID0gdXNlQ2FsbGJhY2soKHN5bmNTdGF0ZTogU3luY1N0YXRlLCBwcmV2U3RhdGU6IFN5bmNTdGF0ZSB8IG51bGwpID0+IHtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNsaWVudCByZWNvbm5lY3RlZCBpZiB0aGVyZSBpcyBubyBlcnJvciB3aXRoIHN5bmNpbmcuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIHN0YXRlIGNvdWxkIGJlIFJFQ09OTkVDVElORywgU1lOQ0lORywgUFJFUEFSRUQgb3IgQ0FUQ0hVUC5cbiAgICAgICAgY29uc3QgcmVjb25uZWN0ZWQgPSBzeW5jU3RhdGUgIT09IFwiRVJST1JcIiAmJiBwcmV2U3RhdGUgIT09IHN5bmNTdGF0ZTtcbiAgICAgICAgaWYgKHJlY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBzZXRJbmRleCgwKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB1c2VUeXBlZEV2ZW50RW1pdHRlcihjbGksIENsaWVudEV2ZW50LlN5bmMsIG9uQ2xpZW50U3luYyk7XG5cbiAgICBjb25zdCBpbWFnZVVybCA9IGltYWdlVXJsc1t1cmxzSW5kZXhdO1xuICAgIHJldHVybiBbaW1hZ2VVcmwsIG9uRXJyb3JdO1xufTtcblxuY29uc3QgQmFzZUF2YXRhciA9IGZvcndhcmRSZWY8SFRNTEVsZW1lbnQsIElQcm9wcz4oKHByb3BzLCByZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkTmFtZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHVybCxcbiAgICAgICAgdXJscyxcbiAgICAgICAgc2l6ZSA9IFwiNDBweFwiLFxuICAgICAgICBvbkNsaWNrLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHR5cGUgPSBcInJvdW5kXCIsXG4gICAgICAgIGFsdFRleHQgPSBfdChcImNvbW1vbnxhdmF0YXJcIiksXG4gICAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBbaW1hZ2VVcmwsIG9uRXJyb3JdID0gdXNlSW1hZ2VVcmwoeyB1cmwsIHVybHMgfSk7XG5cbiAgICBjb25zdCBleHRyYVByb3BzOiBQYXJ0aWFsPFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBdmF0YXI+PiA9IHt9O1xuXG4gICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgZXh0cmFQcm9wc1tcImFyaWEtbGl2ZVwiXSA9IFwib2ZmXCI7XG4gICAgICAgIGV4dHJhUHJvcHNbXCJyb2xlXCJdID0gXCJidXR0b25cIjtcbiAgICB9IGVsc2UgaWYgKCFpbWFnZVVybCkge1xuICAgICAgICBleHRyYVByb3BzW1wicm9sZVwiXSA9IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgIGV4dHJhUHJvcHNbXCJhcmlhLWxhYmVsXCJdID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dHJhUHJvcHNbXCJyb2xlXCJdID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxBdmF0YXJcbiAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgc3JjPXtpbWFnZVVybH1cbiAgICAgICAgICAgIGlkPXtpZE5hbWUgPz8gXCJcIn1cbiAgICAgICAgICAgIG5hbWU9e25hbWUgPz8gXCJcIn1cbiAgICAgICAgICAgIHR5cGU9e3R5cGV9XG4gICAgICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfQmFzZUF2YXRhclwiLCBjbGFzc05hbWUpfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD17YWx0VGV4dH1cbiAgICAgICAgICAgIG9uRXJyb3I9e29uRXJyb3J9XG4gICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgICAgey4uLmV4dHJhUHJvcHN9XG4gICAgICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXZhdGFyLWltZ1wiXG4gICAgICAgIC8+XG4gICAgKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBCYXNlQXZhdGFyO1xuZXhwb3J0IHR5cGUgQmFzZUF2YXRhclR5cGUgPSBSZWFjdC5GQzxJUHJvcHM+O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFXQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxP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