schemaMutations.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.load = void 0;
  6. var _node = _interopRequireDefault(require("parse/node"));
  7. var _graphql = require("graphql");
  8. var _deepcopy = _interopRequireDefault(require("deepcopy"));
  9. var _graphqlRelay = require("graphql-relay");
  10. var schemaTypes = _interopRequireWildcard(require("./schemaTypes"));
  11. var _schemaFields = require("../transformers/schemaFields");
  12. var _parseGraphQLUtils = require("../parseGraphQLUtils");
  13. var _schemaQueries = require("./schemaQueries");
  14. 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); }
  15. 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; }
  16. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  17. const load = parseGraphQLSchema => {
  18. const createClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
  19. name: 'CreateClass',
  20. description: 'The createClass mutation can be used to create the schema for a new object class.',
  21. inputFields: {
  22. name: schemaTypes.CLASS_NAME_ATT,
  23. schemaFields: {
  24. description: "These are the schema's fields of the object class.",
  25. type: schemaTypes.SCHEMA_FIELDS_INPUT
  26. }
  27. },
  28. outputFields: {
  29. class: {
  30. description: 'This is the created class.',
  31. type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
  32. }
  33. },
  34. mutateAndGetPayload: async (args, context) => {
  35. try {
  36. const {
  37. name,
  38. schemaFields
  39. } = (0, _deepcopy.default)(args);
  40. const {
  41. config,
  42. auth
  43. } = context;
  44. (0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth);
  45. if (auth.isReadOnly) {
  46. throw new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to create a schema.");
  47. }
  48. const schema = await config.database.loadSchema({
  49. clearCache: true
  50. });
  51. const parseClass = await schema.addClassIfNotExists(name, (0, _schemaFields.transformToParse)(schemaFields));
  52. return {
  53. class: {
  54. name: parseClass.className,
  55. schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
  56. }
  57. };
  58. } catch (e) {
  59. parseGraphQLSchema.handleError(e);
  60. }
  61. }
  62. });
  63. parseGraphQLSchema.addGraphQLType(createClassMutation.args.input.type.ofType, true, true);
  64. parseGraphQLSchema.addGraphQLType(createClassMutation.type, true, true);
  65. parseGraphQLSchema.addGraphQLMutation('createClass', createClassMutation, true, true);
  66. const updateClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
  67. name: 'UpdateClass',
  68. description: 'The updateClass mutation can be used to update the schema for an existing object class.',
  69. inputFields: {
  70. name: schemaTypes.CLASS_NAME_ATT,
  71. schemaFields: {
  72. description: "These are the schema's fields of the object class.",
  73. type: schemaTypes.SCHEMA_FIELDS_INPUT
  74. }
  75. },
  76. outputFields: {
  77. class: {
  78. description: 'This is the updated class.',
  79. type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
  80. }
  81. },
  82. mutateAndGetPayload: async (args, context) => {
  83. try {
  84. const {
  85. name,
  86. schemaFields
  87. } = (0, _deepcopy.default)(args);
  88. const {
  89. config,
  90. auth
  91. } = context;
  92. (0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth);
  93. if (auth.isReadOnly) {
  94. throw new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update a schema.");
  95. }
  96. const schema = await config.database.loadSchema({
  97. clearCache: true
  98. });
  99. const existingParseClass = await (0, _schemaQueries.getClass)(name, schema);
  100. const parseClass = await schema.updateClass(name, (0, _schemaFields.transformToParse)(schemaFields, existingParseClass.fields), undefined, undefined, config.database);
  101. return {
  102. class: {
  103. name: parseClass.className,
  104. schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
  105. }
  106. };
  107. } catch (e) {
  108. parseGraphQLSchema.handleError(e);
  109. }
  110. }
  111. });
  112. parseGraphQLSchema.addGraphQLType(updateClassMutation.args.input.type.ofType, true, true);
  113. parseGraphQLSchema.addGraphQLType(updateClassMutation.type, true, true);
  114. parseGraphQLSchema.addGraphQLMutation('updateClass', updateClassMutation, true, true);
  115. const deleteClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
  116. name: 'DeleteClass',
  117. description: 'The deleteClass mutation can be used to delete an existing object class.',
  118. inputFields: {
  119. name: schemaTypes.CLASS_NAME_ATT
  120. },
  121. outputFields: {
  122. class: {
  123. description: 'This is the deleted class.',
  124. type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
  125. }
  126. },
  127. mutateAndGetPayload: async (args, context) => {
  128. try {
  129. const {
  130. name
  131. } = (0, _deepcopy.default)(args);
  132. const {
  133. config,
  134. auth
  135. } = context;
  136. (0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth);
  137. if (auth.isReadOnly) {
  138. throw new _node.default.Error(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to delete a schema.");
  139. }
  140. const schema = await config.database.loadSchema({
  141. clearCache: true
  142. });
  143. const existingParseClass = await (0, _schemaQueries.getClass)(name, schema);
  144. await config.database.deleteSchema(name);
  145. return {
  146. class: {
  147. name: existingParseClass.className,
  148. schemaFields: (0, _schemaFields.transformToGraphQL)(existingParseClass.fields)
  149. }
  150. };
  151. } catch (e) {
  152. parseGraphQLSchema.handleError(e);
  153. }
  154. }
  155. });
  156. parseGraphQLSchema.addGraphQLType(deleteClassMutation.args.input.type.ofType, true, true);
  157. parseGraphQLSchema.addGraphQLType(deleteClassMutation.type, true, true);
  158. parseGraphQLSchema.addGraphQLMutation('deleteClass', deleteClassMutation, true, true);
  159. };
  160. exports.load = load;
  161. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWwiLCJfZGVlcGNvcHkiLCJfZ3JhcGhxbFJlbGF5Iiwic2NoZW1hVHlwZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9zY2hlbWFGaWVsZHMiLCJfcGFyc2VHcmFwaFFMVXRpbHMiLCJfc2NoZW1hUXVlcmllcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJjcmVhdGVDbGFzc011dGF0aW9uIiwibXV0YXRpb25XaXRoQ2xpZW50TXV0YXRpb25JZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImlucHV0RmllbGRzIiwiQ0xBU1NfTkFNRV9BVFQiLCJzY2hlbWFGaWVsZHMiLCJ0eXBlIiwiU0NIRU1BX0ZJRUxEU19JTlBVVCIsIm91dHB1dEZpZWxkcyIsImNsYXNzIiwiR3JhcGhRTE5vbk51bGwiLCJDTEFTUyIsIm11dGF0ZUFuZEdldFBheWxvYWQiLCJhcmdzIiwiY29udGV4dCIsImRlZXBjb3B5IiwiY29uZmlnIiwiYXV0aCIsImVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MiLCJpc1JlYWRPbmx5IiwiUGFyc2UiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJzY2hlbWEiLCJkYXRhYmFzZSIsImxvYWRTY2hlbWEiLCJjbGVhckNhY2hlIiwicGFyc2VDbGFzcyIsImFkZENsYXNzSWZOb3RFeGlzdHMiLCJ0cmFuc2Zvcm1Ub1BhcnNlIiwiY2xhc3NOYW1lIiwidHJhbnNmb3JtVG9HcmFwaFFMIiwiZmllbGRzIiwiaGFuZGxlRXJyb3IiLCJhZGRHcmFwaFFMVHlwZSIsImlucHV0Iiwib2ZUeXBlIiwiYWRkR3JhcGhRTE11dGF0aW9uIiwidXBkYXRlQ2xhc3NNdXRhdGlvbiIsImV4aXN0aW5nUGFyc2VDbGFzcyIsImdldENsYXNzIiwidXBkYXRlQ2xhc3MiLCJ1bmRlZmluZWQiLCJkZWxldGVDbGFzc011dGF0aW9uIiwiZGVsZXRlU2NoZW1hIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hTXV0YXRpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCB7IEdyYXBoUUxOb25OdWxsIH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQgZGVlcGNvcHkgZnJvbSAnZGVlcGNvcHknO1xuaW1wb3J0IHsgbXV0YXRpb25XaXRoQ2xpZW50TXV0YXRpb25JZCB9IGZyb20gJ2dyYXBocWwtcmVsYXknO1xuaW1wb3J0ICogYXMgc2NoZW1hVHlwZXMgZnJvbSAnLi9zY2hlbWFUeXBlcyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1Ub1BhcnNlLCB0cmFuc2Zvcm1Ub0dyYXBoUUwgfSBmcm9tICcuLi90cmFuc2Zvcm1lcnMvc2NoZW1hRmllbGRzJztcbmltcG9ydCB7IGVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MgfSBmcm9tICcuLi9wYXJzZUdyYXBoUUxVdGlscyc7XG5pbXBvcnQgeyBnZXRDbGFzcyB9IGZyb20gJy4vc2NoZW1hUXVlcmllcyc7XG5cbmNvbnN0IGxvYWQgPSBwYXJzZUdyYXBoUUxTY2hlbWEgPT4ge1xuICBjb25zdCBjcmVhdGVDbGFzc011dGF0aW9uID0gbXV0YXRpb25XaXRoQ2xpZW50TXV0YXRpb25JZCh7XG4gICAgbmFtZTogJ0NyZWF0ZUNsYXNzJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgY3JlYXRlQ2xhc3MgbXV0YXRpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBzY2hlbWEgZm9yIGEgbmV3IG9iamVjdCBjbGFzcy4nLFxuICAgIGlucHV0RmllbGRzOiB7XG4gICAgICBuYW1lOiBzY2hlbWFUeXBlcy5DTEFTU19OQU1FX0FUVCxcbiAgICAgIHNjaGVtYUZpZWxkczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGVzZSBhcmUgdGhlIHNjaGVtYSdzIGZpZWxkcyBvZiB0aGUgb2JqZWN0IGNsYXNzLlwiLFxuICAgICAgICB0eXBlOiBzY2hlbWFUeXBlcy5TQ0hFTUFfRklFTERTX0lOUFVULFxuICAgICAgfSxcbiAgICB9LFxuICAgIG91dHB1dEZpZWxkczoge1xuICAgICAgY2xhc3M6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBjcmVhdGVkIGNsYXNzLicsXG4gICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChzY2hlbWFUeXBlcy5DTEFTUyksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbXV0YXRlQW5kR2V0UGF5bG9hZDogYXN5bmMgKGFyZ3MsIGNvbnRleHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgc2NoZW1hRmllbGRzIH0gPSBkZWVwY29weShhcmdzKTtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIGF1dGggfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgZW5mb3JjZU1hc3RlcktleUFjY2VzcyhhdXRoKTtcblxuICAgICAgICBpZiAoYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIGNyZWF0ZSBhIHNjaGVtYS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBjb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSh7IGNsZWFyQ2FjaGU6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlQ2xhc3MgPSBhd2FpdCBzY2hlbWEuYWRkQ2xhc3NJZk5vdEV4aXN0cyhuYW1lLCB0cmFuc2Zvcm1Ub1BhcnNlKHNjaGVtYUZpZWxkcykpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBuYW1lOiBwYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkczogdHJhbnNmb3JtVG9HcmFwaFFMKHBhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKGNyZWF0ZUNsYXNzTXV0YXRpb24uYXJncy5pbnB1dC50eXBlLm9mVHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShjcmVhdGVDbGFzc011dGF0aW9uLnR5cGUsIHRydWUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTE11dGF0aW9uKCdjcmVhdGVDbGFzcycsIGNyZWF0ZUNsYXNzTXV0YXRpb24sIHRydWUsIHRydWUpO1xuXG4gIGNvbnN0IHVwZGF0ZUNsYXNzTXV0YXRpb24gPSBtdXRhdGlvbldpdGhDbGllbnRNdXRhdGlvbklkKHtcbiAgICBuYW1lOiAnVXBkYXRlQ2xhc3MnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB1cGRhdGVDbGFzcyBtdXRhdGlvbiBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIHNjaGVtYSBmb3IgYW4gZXhpc3Rpbmcgb2JqZWN0IGNsYXNzLicsXG4gICAgaW5wdXRGaWVsZHM6IHtcbiAgICAgIG5hbWU6IHNjaGVtYVR5cGVzLkNMQVNTX05BTUVfQVRULFxuICAgICAgc2NoZW1hRmllbGRzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZXNlIGFyZSB0aGUgc2NoZW1hJ3MgZmllbGRzIG9mIHRoZSBvYmplY3QgY2xhc3MuXCIsXG4gICAgICAgIHR5cGU6IHNjaGVtYVR5cGVzLlNDSEVNQV9GSUVMRFNfSU5QVVQsXG4gICAgICB9LFxuICAgIH0sXG4gICAgb3V0cHV0RmllbGRzOiB7XG4gICAgICBjbGFzczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIHVwZGF0ZWQgY2xhc3MuJyxcbiAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKHNjaGVtYVR5cGVzLkNMQVNTKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBtdXRhdGVBbmRHZXRQYXlsb2FkOiBhc3luYyAoYXJncywgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBzY2hlbWFGaWVsZHMgfSA9IGRlZXBjb3B5KGFyZ3MpO1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgYXV0aCB9ID0gY29udGV4dDtcblxuICAgICAgICBlbmZvcmNlTWFzdGVyS2V5QWNjZXNzKGF1dGgpO1xuXG4gICAgICAgIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgXCJyZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gdXBkYXRlIGEgc2NoZW1hLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKHsgY2xlYXJDYWNoZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJzZUNsYXNzID0gYXdhaXQgZ2V0Q2xhc3MobmFtZSwgc2NoZW1hKTtcbiAgICAgICAgY29uc3QgcGFyc2VDbGFzcyA9IGF3YWl0IHNjaGVtYS51cGRhdGVDbGFzcyhcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHRyYW5zZm9ybVRvUGFyc2Uoc2NoZW1hRmllbGRzLCBleGlzdGluZ1BhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbmZpZy5kYXRhYmFzZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBuYW1lOiBwYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkczogdHJhbnNmb3JtVG9HcmFwaFFMKHBhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKHVwZGF0ZUNsYXNzTXV0YXRpb24uYXJncy5pbnB1dC50eXBlLm9mVHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZSh1cGRhdGVDbGFzc011dGF0aW9uLnR5cGUsIHRydWUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTE11dGF0aW9uKCd1cGRhdGVDbGFzcycsIHVwZGF0ZUNsYXNzTXV0YXRpb24sIHRydWUsIHRydWUpO1xuXG4gIGNvbnN0IGRlbGV0ZUNsYXNzTXV0YXRpb24gPSBtdXRhdGlvbldpdGhDbGllbnRNdXRhdGlvbklkKHtcbiAgICBuYW1lOiAnRGVsZXRlQ2xhc3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbGV0ZUNsYXNzIG11dGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBvYmplY3QgY2xhc3MuJyxcbiAgICBpbnB1dEZpZWxkczoge1xuICAgICAgbmFtZTogc2NoZW1hVHlwZXMuQ0xBU1NfTkFNRV9BVFQsXG4gICAgfSxcbiAgICBvdXRwdXRGaWVsZHM6IHtcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZGVsZXRlZCBjbGFzcy4nLFxuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoc2NoZW1hVHlwZXMuQ0xBU1MpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG11dGF0ZUFuZEdldFBheWxvYWQ6IGFzeW5jIChhcmdzLCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGRlZXBjb3B5KGFyZ3MpO1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgYXV0aCB9ID0gY29udGV4dDtcblxuICAgICAgICBlbmZvcmNlTWFzdGVyS2V5QWNjZXNzKGF1dGgpO1xuXG4gICAgICAgIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgXCJyZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gZGVsZXRlIGEgc2NoZW1hLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKHsgY2xlYXJDYWNoZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJzZUNsYXNzID0gYXdhaXQgZ2V0Q2xhc3MobmFtZSwgc2NoZW1hKTtcbiAgICAgICAgYXdhaXQgY29uZmlnLmRhdGFiYXNlLmRlbGV0ZVNjaGVtYShuYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgbmFtZTogZXhpc3RpbmdQYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkczogdHJhbnNmb3JtVG9HcmFwaFFMKGV4aXN0aW5nUGFyc2VDbGFzcy5maWVsZHMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5oYW5kbGVFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoZGVsZXRlQ2xhc3NNdXRhdGlvbi5hcmdzLmlucHV0LnR5cGUub2ZUeXBlLCB0cnVlLCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKGRlbGV0ZUNsYXNzTXV0YXRpb24udHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMTXV0YXRpb24oJ2RlbGV0ZUNsYXNzJywgZGVsZXRlQ2xhc3NNdXRhdGlvbiwgdHJ1ZSwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgeyBsb2FkIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLGFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxjQUFBLEdBQUFSLE9BQUE7QUFBMkMsU0FBQVMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FB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