UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

209 lines (208 loc) • 20.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _reactrouterdom = require("react-router-dom"); const _reacttoastify = require("react-toastify"); const _useDebounce = /*#__PURE__*/ _interop_require_default(require("../../../hooks/useDebounce")); const _formatDate = require("../../../utilities/formatDate"); const _context = require("../../forms/Form/context"); const _reduceFieldsToValues = /*#__PURE__*/ _interop_require_default(require("../../forms/Form/reduceFieldsToValues")); const _Config = require("../../utilities/Config"); const _DocumentInfo = require("../../utilities/DocumentInfo"); const _Locale = require("../../utilities/Locale"); require("./index.scss"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const baseClass = 'autosave'; const Autosave = ({ id, collection, global, publishedDocUpdatedAt })=>{ const { routes: { admin, api }, serverURL } = (0, _Config.useConfig)(); const { getVersions, versions } = (0, _DocumentInfo.useDocumentInfo)(); const [fields] = (0, _context.useAllFormFields)(); const modified = (0, _context.useFormModified)(); const { code: locale } = (0, _Locale.useLocale)(); const { replace } = (0, _reactrouterdom.useHistory)(); const { i18n, t } = (0, _reacti18next.useTranslation)('version'); let interval = 800; if (collection?.versions.drafts && collection.versions?.drafts?.autosave) interval = collection.versions.drafts.autosave.interval; if (global?.versions.drafts && global.versions?.drafts?.autosave) interval = global.versions.drafts.autosave.interval; const [saving, setSaving] = (0, _react.useState)(false); const [lastSaved, setLastSaved] = (0, _react.useState)(); const debouncedFields = (0, _useDebounce.default)(fields, interval); const fieldRef = (0, _react.useRef)(fields); const modifiedRef = (0, _react.useRef)(modified); const localeRef = (0, _react.useRef)(locale); // Store fields in ref so the autosave func // can always retrieve the most to date copies // after the timeout has executed fieldRef.current = fields; // Store modified in ref so the autosave func // can bail out if modified becomes false while // timing out during autosave modifiedRef.current = modified; const createCollectionDoc = (0, _react.useCallback)(async ()=>{ const res = await fetch(`${serverURL}${api}/${collection.slug}?locale=${locale}&fallback-locale=null&depth=0&draft=true&autosave=true`, { body: JSON.stringify({}), credentials: 'include', headers: { 'Accept-Language': i18n.language, 'Content-Type': 'application/json' }, method: 'POST' }); if (res.status === 201) { const json = await res.json(); replace(`${admin}/collections/${collection.slug}/${json.doc.id}`, { state: { data: json.doc } }); } else { _reacttoastify.toast.error(t('error:autosaving')); } }, [ i18n, serverURL, api, collection, locale, replace, admin, t ]); (0, _react.useEffect)(()=>{ // If no ID, but this is used for a collection doc, // Immediately save it and set lastSaved if (!id && collection) { createCollectionDoc(); } }, [ id, collection, createCollectionDoc ]); // When debounced fields change, autosave (0, _react.useEffect)(()=>{ const autosave = async ()=>{ if (modified) { setSaving(true); let url; let method; if (collection && id) { url = `${serverURL}${api}/${collection.slug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`; method = 'PATCH'; } if (global) { url = `${serverURL}${api}/globals/${global.slug}?draft=true&autosave=true&locale=${localeRef.current}`; method = 'POST'; } if (url) { setTimeout(async ()=>{ if (modifiedRef.current) { const body = { ...(0, _reduceFieldsToValues.default)(fieldRef.current, true), _status: 'draft' }; const res = await fetch(url, { body: JSON.stringify(body), credentials: 'include', headers: { 'Accept-Language': i18n.language, 'Content-Type': 'application/json' }, method }); if (res.status === 200) { setLastSaved(new Date().getTime()); getVersions(); } } setSaving(false); }, 1000); } } }; autosave(); }, [ i18n, debouncedFields, modified, serverURL, api, collection, global, id, getVersions, localeRef, modifiedRef ]); (0, _react.useEffect)(()=>{ if (versions?.docs?.[0]) { setLastSaved(new Date(versions.docs[0].updatedAt).getTime()); } else if (publishedDocUpdatedAt) { setLastSaved(new Date(publishedDocUpdatedAt).getTime()); } }, [ publishedDocUpdatedAt, versions ]); return /*#__PURE__*/ _react.default.createElement("div", { className: baseClass }, saving && t('saving'), !saving && lastSaved && /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, t('lastSavedAgo', { distance: (0, _formatDate.formatTimeToNow)(lastSaved, i18n.language) }))); }; const _default = Autosave; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0F1dG9zYXZlL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlSGlzdG9yeSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3JlYWN0LXRvYXN0aWZ5J1xuXG5pbXBvcnQgdHlwZSB7IFByb3BzIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IHVzZURlYm91bmNlIGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgZm9ybWF0VGltZVRvTm93IH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzL2Zvcm1hdERhdGUnXG5pbXBvcnQgeyB1c2VBbGxGb3JtRmllbGRzLCB1c2VGb3JtTW9kaWZpZWQgfSBmcm9tICcuLi8uLi9mb3Jtcy9Gb3JtL2NvbnRleHQnXG5pbXBvcnQgcmVkdWNlRmllbGRzVG9WYWx1ZXMgZnJvbSAnLi4vLi4vZm9ybXMvRm9ybS9yZWR1Y2VGaWVsZHNUb1ZhbHVlcydcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Db25maWcnXG5pbXBvcnQgeyB1c2VEb2N1bWVudEluZm8gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvRG9jdW1lbnRJbmZvJ1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0xvY2FsZSdcbmltcG9ydCAnLi9pbmRleC5zY3NzJ1xuY29uc3QgYmFzZUNsYXNzID0gJ2F1dG9zYXZlJ1xuXG5jb25zdCBBdXRvc2F2ZTogUmVhY3QuRkM8UHJvcHM+ID0gKHsgaWQsIGNvbGxlY3Rpb24sIGdsb2JhbCwgcHVibGlzaGVkRG9jVXBkYXRlZEF0IH0pID0+IHtcbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhZG1pbiwgYXBpIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gdXNlQ29uZmlnKClcbiAgY29uc3QgeyBnZXRWZXJzaW9ucywgdmVyc2lvbnMgfSA9IHVzZURvY3VtZW50SW5mbygpXG4gIGNvbnN0IFtmaWVsZHNdID0gdXNlQWxsRm9ybUZpZWxkcygpXG4gIGNvbnN0IG1vZGlmaWVkID0gdXNlRm9ybU1vZGlmaWVkKClcbiAgY29uc3QgeyBjb2RlOiBsb2NhbGUgfSA9IHVzZUxvY2FsZSgpXG4gIGNvbnN0IHsgcmVwbGFjZSB9ID0gdXNlSGlzdG9yeSgpXG4gIGNvbnN0IHsgaTE4biwgdCB9ID0gdXNlVHJhbnNsYXRpb24oJ3ZlcnNpb24nKVxuXG4gIGxldCBpbnRlcnZhbCA9IDgwMFxuICBpZiAoY29sbGVjdGlvbj8udmVyc2lvbnMuZHJhZnRzICYmIGNvbGxlY3Rpb24udmVyc2lvbnM/LmRyYWZ0cz8uYXV0b3NhdmUpXG4gICAgaW50ZXJ2YWwgPSBjb2xsZWN0aW9uLnZlcnNpb25zLmRyYWZ0cy5hdXRvc2F2ZS5pbnRlcnZhbFxuICBpZiAoZ2xvYmFsPy52ZXJzaW9ucy5kcmFmdHMgJiYgZ2xvYmFsLnZlcnNpb25zPy5kcmFmdHM/LmF1dG9zYXZlKVxuICAgIGludGVydmFsID0gZ2xvYmFsLnZlcnNpb25zLmRyYWZ0cy5hdXRvc2F2ZS5pbnRlcnZhbFxuXG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RTYXZlZCwgc2V0TGFzdFNhdmVkXSA9IHVzZVN0YXRlPG51bWJlcj4oKVxuICBjb25zdCBkZWJvdW5jZWRGaWVsZHMgPSB1c2VEZWJvdW5jZShmaWVsZHMsIGludGVydmFsKVxuICBjb25zdCBmaWVsZFJlZiA9IHVzZVJlZihmaWVsZHMpXG4gIGNvbnN0IG1vZGlmaWVkUmVmID0gdXNlUmVmKG1vZGlmaWVkKVxuICBjb25zdCBsb2NhbGVSZWYgPSB1c2VSZWYobG9jYWxlKVxuXG4gIC8vIFN0b3JlIGZpZWxkcyBpbiByZWYgc28gdGhlIGF1dG9zYXZlIGZ1bmNcbiAgLy8gY2FuIGFsd2F5cyByZXRyaWV2ZSB0aGUgbW9zdCB0byBkYXRlIGNvcGllc1xuICAvLyBhZnRlciB0aGUgdGltZW91dCBoYXMgZXhlY3V0ZWRcbiAgZmllbGRSZWYuY3VycmVudCA9IGZpZWxkc1xuXG4gIC8vIFN0b3JlIG1vZGlmaWVkIGluIHJlZiBzbyB0aGUgYXV0b3NhdmUgZnVuY1xuICAvLyBjYW4gYmFpbCBvdXQgaWYgbW9kaWZpZWQgYmVjb21lcyBmYWxzZSB3aGlsZVxuICAvLyB0aW1pbmcgb3V0IGR1cmluZyBhdXRvc2F2ZVxuICBtb2RpZmllZFJlZi5jdXJyZW50ID0gbW9kaWZpZWRcblxuICBjb25zdCBjcmVhdGVDb2xsZWN0aW9uRG9jID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7c2VydmVyVVJMfSR7YXBpfS8ke2NvbGxlY3Rpb24uc2x1Z30/bG9jYWxlPSR7bG9jYWxlfSZmYWxsYmFjay1sb2NhbGU9bnVsbCZkZXB0aD0wJmRyYWZ0PXRydWUmYXV0b3NhdmU9dHJ1ZWAsXG4gICAgICB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgcmVwbGFjZShgJHthZG1pbn0vY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uLnNsdWd9LyR7anNvbi5kb2MuaWR9YCwge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRhdGE6IGpzb24uZG9jLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdG9hc3QuZXJyb3IodCgnZXJyb3I6YXV0b3NhdmluZycpKVxuICAgIH1cbiAgfSwgW2kxOG4sIHNlcnZlclVSTCwgYXBpLCBjb2xsZWN0aW9uLCBsb2NhbGUsIHJlcGxhY2UsIGFkbWluLCB0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIG5vIElELCBidXQgdGhpcyBpcyB1c2VkIGZvciBhIGNvbGxlY3Rpb24gZG9jLFxuICAgIC8vIEltbWVkaWF0ZWx5IHNhdmUgaXQgYW5kIHNldCBsYXN0U2F2ZWRcbiAgICBpZiAoIWlkICYmIGNvbGxlY3Rpb24pIHtcbiAgICAgIGNyZWF0ZUNvbGxlY3Rpb25Eb2MoKVxuICAgIH1cbiAgfSwgW2lkLCBjb2xsZWN0aW9uLCBjcmVhdGVDb2xsZWN0aW9uRG9jXSlcblxuICAvLyBXaGVuIGRlYm91bmNlZCBmaWVsZHMgY2hhbmdlLCBhdXRvc2F2ZVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYXV0b3NhdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgc2V0U2F2aW5nKHRydWUpXG5cbiAgICAgICAgbGV0IHVybDogc3RyaW5nXG4gICAgICAgIGxldCBtZXRob2Q6IHN0cmluZ1xuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uICYmIGlkKSB7XG4gICAgICAgICAgdXJsID0gYCR7c2VydmVyVVJMfSR7YXBpfS8ke2NvbGxlY3Rpb24uc2x1Z30vJHtpZH0/ZHJhZnQ9dHJ1ZSZhdXRvc2F2ZT10cnVlJmxvY2FsZT0ke2xvY2FsZVJlZi5jdXJyZW50fWBcbiAgICAgICAgICBtZXRob2QgPSAnUEFUQ0gnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgICAgdXJsID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7Z2xvYmFsLnNsdWd9P2RyYWZ0PXRydWUmYXV0b3NhdmU9dHJ1ZSZsb2NhbGU9JHtsb2NhbGVSZWYuY3VycmVudH1gXG4gICAgICAgICAgbWV0aG9kID0gJ1BPU1QnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobW9kaWZpZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlZHVjZUZpZWxkc1RvVmFsdWVzKGZpZWxkUmVmLmN1cnJlbnQsIHRydWUpLFxuICAgICAgICAgICAgICAgIF9zdGF0dXM6ICdkcmFmdCcsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgc2V0TGFzdFNhdmVkKG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgIGdldFZlcnNpb25zKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGF1dG9zYXZlKClcbiAgfSwgW1xuICAgIGkxOG4sXG4gICAgZGVib3VuY2VkRmllbGRzLFxuICAgIG1vZGlmaWVkLFxuICAgIHNlcnZlclVSTCxcbiAgICBhcGksXG4gICAgY29sbGVjdGlvbixcbiAgICBnbG9iYWwsXG4gICAgaWQsXG4gICAgZ2V0VmVyc2lvbnMsXG4gICAgbG9jYWxlUmVmLFxuICAgIG1vZGlmaWVkUmVmLFxuICBdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZlcnNpb25zPy5kb2NzPy5bMF0pIHtcbiAgICAgIHNldExhc3RTYXZlZChuZXcgRGF0ZSh2ZXJzaW9ucy5kb2NzWzBdLnVwZGF0ZWRBdCkuZ2V0VGltZSgpKVxuICAgIH0gZWxzZSBpZiAocHVibGlzaGVkRG9jVXBkYXRlZEF0KSB7XG4gICAgICBzZXRMYXN0U2F2ZWQobmV3IERhdGUocHVibGlzaGVkRG9jVXBkYXRlZEF0KS5nZXRUaW1lKCkpXG4gICAgfVxuICB9LCBbcHVibGlzaGVkRG9jVXBkYXRlZEF0LCB2ZXJzaW9uc10pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YmFzZUNsYXNzfT5cbiAgICAgIHtzYXZpbmcgJiYgdCgnc2F2aW5nJyl9XG4gICAgICB7IXNhdmluZyAmJiBsYXN0U2F2ZWQgJiYgKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAge3QoJ2xhc3RTYXZlZEFnbycsIHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBmb3JtYXRUaW1lVG9Ob3cobGFzdFNhdmVkLCBpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXV0b3NhdmVcbiJdLCJuYW1lcyI6WyJiYXNlQ2xhc3MiLCJBdXRvc2F2ZSIsImlkIiwiY29sbGVjdGlvbiIsImdsb2JhbCIsInB1Ymxpc2hlZERvY1VwZGF0ZWRBdCIsInJvdXRlcyIsImFkbWluIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwiZ2V0VmVyc2lvbnMiLCJ2ZXJzaW9ucyIsInVzZURvY3VtZW50SW5mbyIsImZpZWxkcyIsInVzZUFsbEZvcm1GaWVsZHMiLCJtb2RpZmllZCIsInVzZUZvcm1Nb2RpZmllZCIsImNvZGUiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJyZXBsYWNlIiwidXNlSGlzdG9yeSIsImkxOG4iLCJ0IiwidXNlVHJhbnNsYXRpb24iLCJpbnRlcnZhbCIsImRyYWZ0cyIsImF1dG9zYXZlIiwic2F2aW5nIiwic2V0U2F2aW5nIiwidXNlU3RhdGUiLCJsYXN0U2F2ZWQiLCJzZXRMYXN0U2F2ZWQiLCJkZWJvdW5jZWRGaWVsZHMiLCJ1c2VEZWJvdW5jZSIsImZpZWxkUmVmIiwidXNlUmVmIiwibW9kaWZpZWRSZWYiLCJsb2NhbGVSZWYiLCJjdXJyZW50IiwiY3JlYXRlQ29sbGVjdGlvbkRvYyIsInVzZUNhbGxiYWNrIiwicmVzIiwiZmV0Y2giLCJzbHVnIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJsYW5ndWFnZSIsIm1ldGhvZCIsInN0YXR1cyIsImpzb24iLCJkb2MiLCJzdGF0ZSIsImRhdGEiLCJ0b2FzdCIsImVycm9yIiwidXNlRWZmZWN0IiwidXJsIiwic2V0VGltZW91dCIsInJlZHVjZUZpZWxkc1RvVmFsdWVzIiwiX3N0YXR1cyIsIkRhdGUiLCJnZXRUaW1lIiwiZG9jcyIsInVwZGF0ZWRBdCIsImRpdiIsImNsYXNzTmFtZSIsIlJlYWN0IiwiRnJhZ21lbnQiLCJkaXN0YW5jZSIsImZvcm1hdFRpbWVUb05vdyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkE2S0E7OztlQUFBOzs7K0RBN0tnRTs4QkFDakM7Z0NBQ0o7K0JBQ0w7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