SchemasRouter.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.internalUpdateSchema = exports.internalCreateSchema = exports.SchemasRouter = void 0;
  6. var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
  7. var middleware = _interopRequireWildcard(require("../middlewares"));
  8. 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); }
  9. 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; }
  10. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  11. // schemas.js
  12. var Parse = require('parse/node').Parse,
  13. SchemaController = require('../Controllers/SchemaController');
  14. function classNameMismatchResponse(bodyClass, pathClass) {
  15. throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, `Class name mismatch between ${bodyClass} and ${pathClass}.`);
  16. }
  17. function getAllSchemas(req) {
  18. return req.config.database.loadSchema({
  19. clearCache: true
  20. }).then(schemaController => schemaController.getAllClasses({
  21. clearCache: true
  22. })).then(schemas => ({
  23. response: {
  24. results: schemas
  25. }
  26. }));
  27. }
  28. function getOneSchema(req) {
  29. const className = req.params.className;
  30. return req.config.database.loadSchema({
  31. clearCache: true
  32. }).then(schemaController => schemaController.getOneSchema(className, true)).then(schema => ({
  33. response: schema
  34. })).catch(error => {
  35. if (error === undefined) {
  36. throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, `Class ${className} does not exist.`);
  37. } else {
  38. throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Database adapter error.');
  39. }
  40. });
  41. }
  42. const checkIfDefinedSchemasIsUsed = req => {
  43. var _req$config;
  44. if (((_req$config = req.config) === null || _req$config === void 0 || (_req$config = _req$config.schema) === null || _req$config === void 0 ? void 0 : _req$config.lockSchemas) === true) {
  45. throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'Cannot perform this operation when schemas options is used.');
  46. }
  47. };
  48. const internalCreateSchema = async (className, body, config) => {
  49. const controller = await config.database.loadSchema({
  50. clearCache: true
  51. });
  52. const response = await controller.addClassIfNotExists(className, body.fields, body.classLevelPermissions, body.indexes);
  53. return {
  54. response
  55. };
  56. };
  57. exports.internalCreateSchema = internalCreateSchema;
  58. const internalUpdateSchema = async (className, body, config) => {
  59. const controller = await config.database.loadSchema({
  60. clearCache: true
  61. });
  62. const response = await controller.updateClass(className, body.fields || {}, body.classLevelPermissions, body.indexes, config.database);
  63. return {
  64. response
  65. };
  66. };
  67. exports.internalUpdateSchema = internalUpdateSchema;
  68. async function createSchema(req) {
  69. checkIfDefinedSchemasIsUsed(req);
  70. if (req.auth.isReadOnly) {
  71. throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to create a schema.");
  72. }
  73. if (req.params.className && req.body.className) {
  74. if (req.params.className != req.body.className) {
  75. return classNameMismatchResponse(req.body.className, req.params.className);
  76. }
  77. }
  78. const className = req.params.className || req.body.className;
  79. if (!className) {
  80. throw new Parse.Error(135, `POST ${req.path} needs a class name.`);
  81. }
  82. return await internalCreateSchema(className, req.body, req.config);
  83. }
  84. function modifySchema(req) {
  85. checkIfDefinedSchemasIsUsed(req);
  86. if (req.auth.isReadOnly) {
  87. throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update a schema.");
  88. }
  89. if (req.body.className && req.body.className != req.params.className) {
  90. return classNameMismatchResponse(req.body.className, req.params.className);
  91. }
  92. const className = req.params.className;
  93. return internalUpdateSchema(className, req.body, req.config);
  94. }
  95. const deleteSchema = req => {
  96. if (req.auth.isReadOnly) {
  97. throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to delete a schema.");
  98. }
  99. if (!SchemaController.classNameIsValid(req.params.className)) {
  100. throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, SchemaController.invalidClassNameMessage(req.params.className));
  101. }
  102. return req.config.database.deleteSchema(req.params.className).then(() => ({
  103. response: {}
  104. }));
  105. };
  106. class SchemasRouter extends _PromiseRouter.default {
  107. mountRoutes() {
  108. this.route('GET', '/schemas', middleware.promiseEnforceMasterKeyAccess, getAllSchemas);
  109. this.route('GET', '/schemas/:className', middleware.promiseEnforceMasterKeyAccess, getOneSchema);
  110. this.route('POST', '/schemas', middleware.promiseEnforceMasterKeyAccess, createSchema);
  111. this.route('POST', '/schemas/:className', middleware.promiseEnforceMasterKeyAccess, createSchema);
  112. this.route('PUT', '/schemas/:className', middleware.promiseEnforceMasterKeyAccess, modifySchema);
  113. this.route('DELETE', '/schemas/:className', middleware.promiseEnforceMasterKeyAccess, deleteSchema);
  114. }
  115. }
  116. exports.SchemasRouter = SchemasRouter;
  117. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUHJvbWlzZVJvdXRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwibWlkZGxld2FyZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUGFyc2UiLCJTY2hlbWFDb250cm9sbGVyIiwiY2xhc3NOYW1lTWlzbWF0Y2hSZXNwb25zZSIsImJvZHlDbGFzcyIsInBhdGhDbGFzcyIsIkVycm9yIiwiSU5WQUxJRF9DTEFTU19OQU1FIiwiZ2V0QWxsU2NoZW1hcyIsInJlcSIsImNvbmZpZyIsImRhdGFiYXNlIiwibG9hZFNjaGVtYSIsImNsZWFyQ2FjaGUiLCJ0aGVuIiwic2NoZW1hQ29udHJvbGxlciIsImdldEFsbENsYXNzZXMiLCJzY2hlbWFzIiwicmVzcG9uc2UiLCJyZXN1bHRzIiwiZ2V0T25lU2NoZW1hIiwiY2xhc3NOYW1lIiwicGFyYW1zIiwic2NoZW1hIiwiY2F0Y2giLCJlcnJvciIsInVuZGVmaW5lZCIsIklOVEVSTkFMX1NFUlZFUl9FUlJPUiIsImNoZWNrSWZEZWZpbmVkU2NoZW1hc0lzVXNlZCIsIl9yZXEkY29uZmlnIiwibG9ja1NjaGVtYXMiLCJPUEVSQVRJT05fRk9SQklEREVOIiwiaW50ZXJuYWxDcmVhdGVTY2hlbWEiLCJib2R5IiwiY29udHJvbGxlciIsImFkZENsYXNzSWZOb3RFeGlzdHMiLCJmaWVsZHMiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJpbmRleGVzIiwiZXhwb3J0cyIsImludGVybmFsVXBkYXRlU2NoZW1hIiwidXBkYXRlQ2xhc3MiLCJjcmVhdGVTY2hlbWEiLCJhdXRoIiwiaXNSZWFkT25seSIsInBhdGgiLCJtb2RpZnlTY2hlbWEiLCJkZWxldGVTY2hlbWEiLCJjbGFzc05hbWVJc1ZhbGlkIiwiaW52YWxpZENsYXNzTmFtZU1lc3NhZ2UiLCJTY2hlbWFzUm91dGVyIiwiUHJvbWlzZVJvdXRlciIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL1NjaGVtYXNSb3V0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2NoZW1hcy5qc1xuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2UsXG4gIFNjaGVtYUNvbnRyb2xsZXIgPSByZXF1aXJlKCcuLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG5cbmltcG9ydCBQcm9taXNlUm91dGVyIGZyb20gJy4uL1Byb21pc2VSb3V0ZXInO1xuaW1wb3J0ICogYXMgbWlkZGxld2FyZSBmcm9tICcuLi9taWRkbGV3YXJlcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZU1pc21hdGNoUmVzcG9uc2UoYm9keUNsYXNzLCBwYXRoQ2xhc3MpIHtcbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLklOVkFMSURfQ0xBU1NfTkFNRSxcbiAgICBgQ2xhc3MgbmFtZSBtaXNtYXRjaCBiZXR3ZWVuICR7Ym9keUNsYXNzfSBhbmQgJHtwYXRoQ2xhc3N9LmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsU2NoZW1hcyhyZXEpIHtcbiAgcmV0dXJuIHJlcS5jb25maWcuZGF0YWJhc2VcbiAgICAubG9hZFNjaGVtYSh7IGNsZWFyQ2FjaGU6IHRydWUgfSlcbiAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHNjaGVtYUNvbnRyb2xsZXIuZ2V0QWxsQ2xhc3Nlcyh7IGNsZWFyQ2FjaGU6IHRydWUgfSkpXG4gICAgLnRoZW4oc2NoZW1hcyA9PiAoeyByZXNwb25zZTogeyByZXN1bHRzOiBzY2hlbWFzIH0gfSkpO1xufVxuXG5mdW5jdGlvbiBnZXRPbmVTY2hlbWEocmVxKSB7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IHJlcS5wYXJhbXMuY2xhc3NOYW1lO1xuICByZXR1cm4gcmVxLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5sb2FkU2NoZW1hKHsgY2xlYXJDYWNoZTogdHJ1ZSB9KVxuICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5nZXRPbmVTY2hlbWEoY2xhc3NOYW1lLCB0cnVlKSlcbiAgICAudGhlbihzY2hlbWEgPT4gKHsgcmVzcG9uc2U6IHNjaGVtYSB9KSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfQ0xBU1NfTkFNRSwgYENsYXNzICR7Y2xhc3NOYW1lfSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdEYXRhYmFzZSBhZGFwdGVyIGVycm9yLicpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5jb25zdCBjaGVja0lmRGVmaW5lZFNjaGVtYXNJc1VzZWQgPSByZXEgPT4ge1xuICBpZiAocmVxLmNvbmZpZz8uc2NoZW1hPy5sb2NrU2NoZW1hcyA9PT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gd2hlbiBzY2hlbWFzIG9wdGlvbnMgaXMgdXNlZC4nXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGludGVybmFsQ3JlYXRlU2NoZW1hID0gYXN5bmMgKGNsYXNzTmFtZSwgYm9keSwgY29uZmlnKSA9PiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBhd2FpdCBjb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSh7IGNsZWFyQ2FjaGU6IHRydWUgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udHJvbGxlci5hZGRDbGFzc0lmTm90RXhpc3RzKFxuICAgIGNsYXNzTmFtZSxcbiAgICBib2R5LmZpZWxkcyxcbiAgICBib2R5LmNsYXNzTGV2ZWxQZXJtaXNzaW9ucyxcbiAgICBib2R5LmluZGV4ZXNcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbnRlcm5hbFVwZGF0ZVNjaGVtYSA9IGFzeW5jIChjbGFzc05hbWUsIGJvZHksIGNvbmZpZykgPT4ge1xuICBjb25zdCBjb250cm9sbGVyID0gYXdhaXQgY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoeyBjbGVhckNhY2hlOiB0cnVlIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRyb2xsZXIudXBkYXRlQ2xhc3MoXG4gICAgY2xhc3NOYW1lLFxuICAgIGJvZHkuZmllbGRzIHx8IHt9LFxuICAgIGJvZHkuY2xhc3NMZXZlbFBlcm1pc3Npb25zLFxuICAgIGJvZHkuaW5kZXhlcyxcbiAgICBjb25maWcuZGF0YWJhc2VcbiAgKTtcbiAgcmV0dXJuIHsgcmVzcG9uc2UgfTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYShyZXEpIHtcbiAgY2hlY2tJZkRlZmluZWRTY2hlbWFzSXNVc2VkKHJlcSk7XG4gIGlmIChyZXEuYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIGNyZWF0ZSBhIHNjaGVtYS5cIlxuICAgICk7XG4gIH1cbiAgaWYgKHJlcS5wYXJhbXMuY2xhc3NOYW1lICYmIHJlcS5ib2R5LmNsYXNzTmFtZSkge1xuICAgIGlmIChyZXEucGFyYW1zLmNsYXNzTmFtZSAhPSByZXEuYm9keS5jbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBjbGFzc05hbWVNaXNtYXRjaFJlc3BvbnNlKHJlcS5ib2R5LmNsYXNzTmFtZSwgcmVxLnBhcmFtcy5jbGFzc05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHJlcS5wYXJhbXMuY2xhc3NOYW1lIHx8IHJlcS5ib2R5LmNsYXNzTmFtZTtcbiAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTM1LCBgUE9TVCAke3JlcS5wYXRofSBuZWVkcyBhIGNsYXNzIG5hbWUuYCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgaW50ZXJuYWxDcmVhdGVTY2hlbWEoY2xhc3NOYW1lLCByZXEuYm9keSwgcmVxLmNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIG1vZGlmeVNjaGVtYShyZXEpIHtcbiAgY2hlY2tJZkRlZmluZWRTY2hlbWFzSXNVc2VkKHJlcSk7XG4gIGlmIChyZXEuYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIHVwZGF0ZSBhIHNjaGVtYS5cIlxuICAgICk7XG4gIH1cbiAgaWYgKHJlcS5ib2R5LmNsYXNzTmFtZSAmJiByZXEuYm9keS5jbGFzc05hbWUgIT0gcmVxLnBhcmFtcy5jbGFzc05hbWUpIHtcbiAgICByZXR1cm4gY2xhc3NOYW1lTWlzbWF0Y2hSZXNwb25zZShyZXEuYm9keS5jbGFzc05hbWUsIHJlcS5wYXJhbXMuY2xhc3NOYW1lKTtcbiAgfVxuICBjb25zdCBjbGFzc05hbWUgPSByZXEucGFyYW1zLmNsYXNzTmFtZTtcblxuICByZXR1cm4gaW50ZXJuYWxVcGRhdGVTY2hlbWEoY2xhc3NOYW1lLCByZXEuYm9keSwgcmVxLmNvbmZpZyk7XG59XG5cbmNvbnN0IGRlbGV0ZVNjaGVtYSA9IHJlcSA9PiB7XG4gIGlmIChyZXEuYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIGRlbGV0ZSBhIHNjaGVtYS5cIlxuICAgICk7XG4gIH1cbiAgaWYgKCFTY2hlbWFDb250cm9sbGVyLmNsYXNzTmFtZUlzVmFsaWQocmVxLnBhcmFtcy5jbGFzc05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9DTEFTU19OQU1FLFxuICAgICAgU2NoZW1hQ29udHJvbGxlci5pbnZhbGlkQ2xhc3NOYW1lTWVzc2FnZShyZXEucGFyYW1zLmNsYXNzTmFtZSlcbiAgICApO1xuICB9XG4gIHJldHVybiByZXEuY29uZmlnLmRhdGFiYXNlLmRlbGV0ZVNjaGVtYShyZXEucGFyYW1zLmNsYXNzTmFtZSkudGhlbigoKSA9PiAoeyByZXNwb25zZToge30gfSkpO1xufTtcblxuZXhwb3J0IGNsYXNzIFNjaGVtYXNSb3V0ZXIgZXh0ZW5kcyBQcm9taXNlUm91dGVyIHtcbiAgbW91bnRSb3V0ZXMoKSB7XG4gICAgdGhpcy5yb3V0ZSgnR0VUJywgJy9zY2hlbWFzJywgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgZ2V0QWxsU2NoZW1hcyk7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdHRVQnLFxuICAgICAgJy9zY2hlbWFzLzpjbGFzc05hbWUnLFxuICAgICAgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyxcbiAgICAgIGdldE9uZVNjaGVtYVxuICAgICk7XG4gICAgdGhpcy5yb3V0ZSgnUE9TVCcsICcvc2NoZW1hcycsIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsIGNyZWF0ZVNjaGVtYSk7XG4gICAgdGhpcy5yb3V0ZShcbiAgICAgICdQT1NUJyxcbiAgICAgICcvc2NoZW1hcy86Y2xhc3NOYW1lJyxcbiAgICAgIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICBjcmVhdGVTY2hlbWFcbiAgICApO1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnUFVUJyxcbiAgICAgICcvc2NoZW1hcy86Y2xhc3NOYW1lJyxcbiAgICAgIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICBtb2RpZnlTY2hlbWFcbiAgICApO1xuICAgIHRoaXMucm91dGUoXG4gICAgICAnREVMRVRFJyxcbiAgICAgICcvc2NoZW1hcy86Y2xhc3NOYW1lJyxcbiAgICAgIG1pZGRsZXdhcmUucHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICBkZWxldGVTY2hlbWFcbiAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUtBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUE2QyxTQUFBRyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBRix3QkFBQUUsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxR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