UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

175 lines (174 loc) • 19.9 kB
/* eslint-disable no-underscore-dangle */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _httpstatus = /*#__PURE__*/ _interop_require_default(require("http-status")); const _executeAccess = /*#__PURE__*/ _interop_require_default(require("../../auth/executeAccess")); const _types = require("../../auth/types"); const _combineQueries = require("../../database/combineQueries"); const _errors = require("../../errors"); const _afterChange = require("../../fields/hooks/afterChange"); const _afterRead = require("../../fields/hooks/afterRead"); const _commitTransaction = require("../../utilities/commitTransaction"); const _initTransaction = require("../../utilities/initTransaction"); const _killTransaction = require("../../utilities/killTransaction"); const _getLatestCollectionVersion = require("../../versions/getLatestCollectionVersion"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function restoreVersion(args) { const { id, collection: { config: collectionConfig }, depth, overrideAccess = false, req, req: { fallbackLocale, locale, payload, t }, showHiddenFields } = args; try { const shouldCommit = await (0, _initTransaction.initTransaction)(req); if (!id) { throw new _errors.APIError('Missing ID of version to restore.', _httpstatus.default.BAD_REQUEST); } // ///////////////////////////////////// // Retrieve original raw version // ///////////////////////////////////// const { docs: versionDocs } = await req.payload.db.findVersions({ collection: collectionConfig.slug, limit: 1, locale, req, where: { id: { equals: id } } }); const [rawVersion] = versionDocs; if (!rawVersion) { throw new _errors.NotFound(t); } const parentDocID = rawVersion.parent; // ///////////////////////////////////// // Access // ///////////////////////////////////// const accessResults = !overrideAccess ? await (0, _executeAccess.default)({ id: parentDocID, req }, collectionConfig.access.update) : true; const hasWherePolicy = (0, _types.hasWhereAccessResult)(accessResults); // ///////////////////////////////////// // Retrieve document // ///////////////////////////////////// const findOneArgs = { collection: collectionConfig.slug, locale, req, where: (0, _combineQueries.combineQueries)({ id: { equals: parentDocID } }, accessResults) }; const doc = await req.payload.db.findOne(findOneArgs); if (!doc && !hasWherePolicy) throw new _errors.NotFound(t); if (!doc && hasWherePolicy) throw new _errors.Forbidden(t); // ///////////////////////////////////// // fetch previousDoc // ///////////////////////////////////// const prevDocWithLocales = await (0, _getLatestCollectionVersion.getLatestCollectionVersion)({ id: parentDocID, config: collectionConfig, payload, query: findOneArgs, req }); // ///////////////////////////////////// // Update // ///////////////////////////////////// let result = await req.payload.db.updateOne({ id: parentDocID, collection: collectionConfig.slug, data: rawVersion.version, req }); // ///////////////////////////////////// // Save `previousDoc` as a version after restoring // ///////////////////////////////////// const prevVersion = { ...prevDocWithLocales }; delete prevVersion.id; await payload.db.createVersion({ autosave: false, collectionSlug: collectionConfig.slug, createdAt: prevVersion.createdAt, parent: parentDocID, req, updatedAt: new Date().toISOString(), versionData: rawVersion.version }); // ///////////////////////////////////// // afterRead - Fields // ///////////////////////////////////// result = await (0, _afterRead.afterRead)({ collection: collectionConfig, context: req.context, depth, doc: result, fallbackLocale, global: null, locale, overrideAccess, req, showHiddenFields }); // ///////////////////////////////////// // afterRead - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: collectionConfig, context: req.context, doc: result, req }) || result; }, Promise.resolve()); // ///////////////////////////////////// // afterChange - Fields // ///////////////////////////////////// result = await (0, _afterChange.afterChange)({ collection: collectionConfig, context: req.context, data: result, doc: result, global: null, operation: 'update', previousDoc: prevDocWithLocales, req }); // ///////////////////////////////////// // afterChange - Collection // ///////////////////////////////////// await collectionConfig.hooks.afterChange.reduce(async (priorHook, hook)=>{ await priorHook; result = await hook({ collection: collectionConfig, context: req.context, doc: result, operation: 'update', previousDoc: prevDocWithLocales, req }) || result; }, Promise.resolve()); if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req); return result; } catch (error) { await (0, _killTransaction.killTransaction)(req); throw error; } } const _default = restoreVersion; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL3Jlc3RvcmVWZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5pbXBvcnQgaHR0cFN0YXR1cyBmcm9tICdodHRwLXN0YXR1cydcblxuaW1wb3J0IHR5cGUgeyBGaW5kT25lQXJncyB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkUmVxdWVzdCB9IGZyb20gJy4uLy4uL2V4cHJlc3MvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb24sIFR5cGVXaXRoSUQgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnXG5cbmltcG9ydCBleGVjdXRlQWNjZXNzIGZyb20gJy4uLy4uL2F1dGgvZXhlY3V0ZUFjY2VzcydcbmltcG9ydCB7IGhhc1doZXJlQWNjZXNzUmVzdWx0IH0gZnJvbSAnLi4vLi4vYXV0aC90eXBlcydcbmltcG9ydCB7IGNvbWJpbmVRdWVyaWVzIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvY29tYmluZVF1ZXJpZXMnXG5pbXBvcnQgeyBBUElFcnJvciwgRm9yYmlkZGVuLCBOb3RGb3VuZCB9IGZyb20gJy4uLy4uL2Vycm9ycydcbmltcG9ydCB7IGFmdGVyQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZmllbGRzL2hvb2tzL2FmdGVyQ2hhbmdlJ1xuaW1wb3J0IHsgYWZ0ZXJSZWFkIH0gZnJvbSAnLi4vLi4vZmllbGRzL2hvb2tzL2FmdGVyUmVhZCdcbmltcG9ydCB7IGNvbW1pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2NvbW1pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgaW5pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2luaXRUcmFuc2FjdGlvbidcbmltcG9ydCB7IGtpbGxUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9raWxsVHJhbnNhY3Rpb24nXG5pbXBvcnQgeyBnZXRMYXRlc3RDb2xsZWN0aW9uVmVyc2lvbiB9IGZyb20gJy4uLy4uL3ZlcnNpb25zL2dldExhdGVzdENvbGxlY3Rpb25WZXJzaW9uJ1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHMgPSB7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25cbiAgY3VycmVudERlcHRoPzogbnVtYmVyXG4gIGRlcHRoPzogbnVtYmVyXG4gIGRpc2FibGVFcnJvcnM/OiBib29sZWFuXG4gIGlkOiBudW1iZXIgfCBzdHJpbmdcbiAgb3ZlcnJpZGVBY2Nlc3M/OiBib29sZWFuXG4gIHJlcTogUGF5bG9hZFJlcXVlc3RcbiAgc2hvd0hpZGRlbkZpZWxkcz86IGJvb2xlYW5cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZVZlcnNpb248VCBleHRlbmRzIFR5cGVXaXRoSUQgPSBhbnk+KGFyZ3M6IEFyZ3VtZW50cyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgY29sbGVjdGlvbjogeyBjb25maWc6IGNvbGxlY3Rpb25Db25maWcgfSxcbiAgICBkZXB0aCxcbiAgICBvdmVycmlkZUFjY2VzcyA9IGZhbHNlLFxuICAgIHJlcSxcbiAgICByZXE6IHsgZmFsbGJhY2tMb2NhbGUsIGxvY2FsZSwgcGF5bG9hZCwgdCB9LFxuICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gIH0gPSBhcmdzXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzaG91bGRDb21taXQgPSBhd2FpdCBpbml0VHJhbnNhY3Rpb24ocmVxKVxuXG4gICAgaWYgKCFpZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKCdNaXNzaW5nIElEIG9mIHZlcnNpb24gdG8gcmVzdG9yZS4nLCBodHRwU3RhdHVzLkJBRF9SRVFVRVNUKVxuICAgIH1cblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBSZXRyaWV2ZSBvcmlnaW5hbCByYXcgdmVyc2lvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGNvbnN0IHsgZG9jczogdmVyc2lvbkRvY3MgfSA9IGF3YWl0IHJlcS5wYXlsb2FkLmRiLmZpbmRWZXJzaW9ucyh7XG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLnNsdWcsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHJlcSxcbiAgICAgIHdoZXJlOiB7IGlkOiB7IGVxdWFsczogaWQgfSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBbcmF3VmVyc2lvbl0gPSB2ZXJzaW9uRG9jc1xuXG4gICAgaWYgKCFyYXdWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmQodClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnREb2NJRCA9IHJhd1ZlcnNpb24ucGFyZW50XG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQWNjZXNzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgY29uc3QgYWNjZXNzUmVzdWx0cyA9ICFvdmVycmlkZUFjY2Vzc1xuICAgICAgPyBhd2FpdCBleGVjdXRlQWNjZXNzKHsgaWQ6IHBhcmVudERvY0lELCByZXEgfSwgY29sbGVjdGlvbkNvbmZpZy5hY2Nlc3MudXBkYXRlKVxuICAgICAgOiB0cnVlXG4gICAgY29uc3QgaGFzV2hlcmVQb2xpY3kgPSBoYXNXaGVyZUFjY2Vzc1Jlc3VsdChhY2Nlc3NSZXN1bHRzKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFJldHJpZXZlIGRvY3VtZW50XG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgY29uc3QgZmluZE9uZUFyZ3M6IEZpbmRPbmVBcmdzID0ge1xuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgbG9jYWxlLFxuICAgICAgcmVxLFxuICAgICAgd2hlcmU6IGNvbWJpbmVRdWVyaWVzKHsgaWQ6IHsgZXF1YWxzOiBwYXJlbnREb2NJRCB9IH0sIGFjY2Vzc1Jlc3VsdHMpLFxuICAgIH1cblxuICAgIGNvbnN0IGRvYyA9IGF3YWl0IHJlcS5wYXlsb2FkLmRiLmZpbmRPbmUoZmluZE9uZUFyZ3MpXG5cbiAgICBpZiAoIWRvYyAmJiAhaGFzV2hlcmVQb2xpY3kpIHRocm93IG5ldyBOb3RGb3VuZCh0KVxuICAgIGlmICghZG9jICYmIGhhc1doZXJlUG9saWN5KSB0aHJvdyBuZXcgRm9yYmlkZGVuKHQpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gZmV0Y2ggcHJldmlvdXNEb2NcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBjb25zdCBwcmV2RG9jV2l0aExvY2FsZXMgPSBhd2FpdCBnZXRMYXRlc3RDb2xsZWN0aW9uVmVyc2lvbih7XG4gICAgICBpZDogcGFyZW50RG9jSUQsXG4gICAgICBjb25maWc6IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcXVlcnk6IGZpbmRPbmVBcmdzLFxuICAgICAgcmVxLFxuICAgIH0pXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gVXBkYXRlXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJlcS5wYXlsb2FkLmRiLnVwZGF0ZU9uZSh7XG4gICAgICBpZDogcGFyZW50RG9jSUQsXG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLnNsdWcsXG4gICAgICBkYXRhOiByYXdWZXJzaW9uLnZlcnNpb24sXG4gICAgICByZXEsXG4gICAgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBTYXZlIGBwcmV2aW91c0RvY2AgYXMgYSB2ZXJzaW9uIGFmdGVyIHJlc3RvcmluZ1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGNvbnN0IHByZXZWZXJzaW9uID0geyAuLi5wcmV2RG9jV2l0aExvY2FsZXMgfVxuXG4gICAgZGVsZXRlIHByZXZWZXJzaW9uLmlkXG5cbiAgICBhd2FpdCBwYXlsb2FkLmRiLmNyZWF0ZVZlcnNpb24oe1xuICAgICAgYXV0b3NhdmU6IGZhbHNlLFxuICAgICAgY29sbGVjdGlvblNsdWc6IGNvbGxlY3Rpb25Db25maWcuc2x1ZyxcbiAgICAgIGNyZWF0ZWRBdDogcHJldlZlcnNpb24uY3JlYXRlZEF0LFxuICAgICAgcGFyZW50OiBwYXJlbnREb2NJRCxcbiAgICAgIHJlcSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdmVyc2lvbkRhdGE6IHJhd1ZlcnNpb24udmVyc2lvbixcbiAgICB9KVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyUmVhZCAtIEZpZWxkc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJlc3VsdCA9IGF3YWl0IGFmdGVyUmVhZCh7XG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICBkZXB0aCxcbiAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICBnbG9iYWw6IG51bGwsXG4gICAgICBsb2NhbGUsXG4gICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgIHJlcSxcbiAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlclJlYWQgLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgY29sbGVjdGlvbkNvbmZpZy5ob29rcy5hZnRlclJlYWQucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICByZXN1bHQgPVxuICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICByZXEsXG4gICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlckNoYW5nZSAtIEZpZWxkc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJlc3VsdCA9IGF3YWl0IGFmdGVyQ2hhbmdlKHtcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgZ2xvYmFsOiBudWxsLFxuICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgIHByZXZpb3VzRG9jOiBwcmV2RG9jV2l0aExvY2FsZXMsXG4gICAgICByZXEsXG4gICAgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlckNoYW5nZSAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmhvb2tzLmFmdGVyQ2hhbmdlLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgcmVzdWx0ID1cbiAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgICBwcmV2aW91c0RvYzogcHJldkRvY1dpdGhMb2NhbGVzLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgfSkpIHx8IHJlc3VsdFxuICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgaWYgKHNob3VsZENvbW1pdCkgYXdhaXQgY29tbWl0VHJhbnNhY3Rpb24ocmVxKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGF3YWl0IGtpbGxUcmFuc2FjdGlvbihyZXEpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCByZXN0b3JlVmVyc2lvblxuIl0sIm5hbWVzIjpbInJlc3RvcmVWZXJzaW9uIiwiYXJncyIsImlkIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImNvbGxlY3Rpb25Db25maWciLCJkZXB0aCIsIm92ZXJyaWRlQWNjZXNzIiwicmVxIiwiZmFsbGJhY2tMb2NhbGUiLCJsb2NhbGUiLCJwYXlsb2FkIiwidCIsInNob3dIaWRkZW5GaWVsZHMiLCJzaG91bGRDb21taXQiLCJpbml0VHJhbnNhY3Rpb24iLCJBUElFcnJvciIsImh0dHBTdGF0dXMiLCJCQURfUkVRVUVTVCIsImRvY3MiLCJ2ZXJzaW9uRG9jcyIsImRiIiwiZmluZFZlcnNpb25zIiwic2x1ZyIsImxpbWl0Iiwid2hlcmUiLCJlcXVhbHMiLCJyYXdWZXJzaW9uIiwiTm90Rm91bmQiLCJwYXJlbnREb2NJRCIsInBhcmVudCIsImFjY2Vzc1Jlc3VsdHMiLCJleGVjdXRlQWNjZXNzIiwiYWNjZXNzIiwidXBkYXRlIiwiaGFzV2hlcmVQb2xpY3kiLCJoYXNXaGVyZUFjY2Vzc1Jlc3VsdCIsImZpbmRPbmVBcmdzIiwiY29tYmluZVF1ZXJpZXMiLCJkb2MiLCJmaW5kT25lIiwiRm9yYmlkZGVuIiwicHJldkRvY1dpdGhMb2NhbGVzIiwiZ2V0TGF0ZXN0Q29sbGVjdGlvblZlcnNpb24iLCJxdWVyeSIsInJlc3VsdCIsInVwZGF0ZU9uZSIsImRhdGEiLCJ2ZXJzaW9uIiwicHJldlZlcnNpb24iLCJjcmVhdGVWZXJzaW9uIiwiYXV0b3NhdmUiLCJjb2xsZWN0aW9uU2x1ZyIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsInZlcnNpb25EYXRhIiwiYWZ0ZXJSZWFkIiwiY29udGV4dCIsImdsb2JhbCIsImhvb2tzIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWZ0ZXJDaGFuZ2UiLCJvcGVyYXRpb24iLCJwcmV2aW91c0RvYyIsImNvbW1pdFRyYW5zYWN0aW9uIiwiZXJyb3IiLCJraWxsVHJhbnNhY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1Qzs7OzsrQkFnTnZDOzs7ZUFBQTs7O21FQS9NdUI7c0VBTUc7dUJBQ1c7Z0NBQ047d0JBQ2U7NkJBQ2xCOzJCQUNGO21DQUNRO2lDQUNGO2lDQUNBOzRDQUNXOzs7Ozs7QUFhM0MsZUFBZUEsZUFBMkNDLElBQWU7SUFDdkUsTUFBTSxFQUNKQyxFQUFFLEVBQ0ZDLFlBQVksRUFBRUMsUUFBUUMsZ0JBQWdCLEVBQUUsRUFDeENDLEtBQUssRUFDTEMsaUJBQWlCLEtBQUssRUFDdEJDLEdBQUcsRUFDSEEsS0FBSyxFQUFFQyxjQUFjLEVBQUVDLE1BQU0sRUFBRUMsT0FB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