parseClassQueries.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.load = void 0;
  6. var _graphql = require("graphql");
  7. var _graphqlRelay = require("graphql-relay");
  8. var _graphqlListFields = _interopRequireDefault(require("graphql-list-fields"));
  9. var _deepcopy = _interopRequireDefault(require("deepcopy"));
  10. var _pluralize = _interopRequireDefault(require("pluralize"));
  11. var defaultGraphQLTypes = _interopRequireWildcard(require("./defaultGraphQLTypes"));
  12. var objectsQueries = _interopRequireWildcard(require("../helpers/objectsQueries"));
  13. var _ParseGraphQLController = require("../../Controllers/ParseGraphQLController");
  14. var _className = require("../transformers/className");
  15. var _parseGraphQLUtils = require("../parseGraphQLUtils");
  16. 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); }
  17. 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; }
  18. function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
  19. const getParseClassQueryConfig = function (parseClassConfig) {
  20. return parseClassConfig && parseClassConfig.query || {};
  21. };
  22. const getQuery = async (parseClass, _source, args, context, queryInfo, parseClasses) => {
  23. let {
  24. id
  25. } = args;
  26. const {
  27. options
  28. } = args;
  29. const {
  30. readPreference,
  31. includeReadPreference
  32. } = options || {};
  33. const {
  34. config,
  35. auth,
  36. info
  37. } = context;
  38. const selectedFields = (0, _graphqlListFields.default)(queryInfo);
  39. const globalIdObject = (0, _graphqlRelay.fromGlobalId)(id);
  40. if (globalIdObject.type === parseClass.className) {
  41. id = globalIdObject.id;
  42. }
  43. const {
  44. keys,
  45. include
  46. } = (0, _parseGraphQLUtils.extractKeysAndInclude)(selectedFields);
  47. return await objectsQueries.getObject(parseClass.className, id, keys, include, readPreference, includeReadPreference, config, auth, info, parseClasses);
  48. };
  49. const load = function (parseGraphQLSchema, parseClass, parseClassConfig) {
  50. const className = parseClass.className;
  51. const graphQLClassName = (0, _className.transformClassNameToGraphQL)(className);
  52. const {
  53. get: isGetEnabled = true,
  54. find: isFindEnabled = true,
  55. getAlias = '',
  56. findAlias = ''
  57. } = getParseClassQueryConfig(parseClassConfig);
  58. const {
  59. classGraphQLOutputType,
  60. classGraphQLFindArgs,
  61. classGraphQLFindResultType
  62. } = parseGraphQLSchema.parseClassTypes[className];
  63. if (isGetEnabled) {
  64. const lowerCaseClassName = graphQLClassName.charAt(0).toLowerCase() + graphQLClassName.slice(1);
  65. const getGraphQLQueryName = getAlias || lowerCaseClassName;
  66. parseGraphQLSchema.addGraphQLQuery(getGraphQLQueryName, {
  67. description: `The ${getGraphQLQueryName} query can be used to get an object of the ${graphQLClassName} class by its id.`,
  68. args: {
  69. id: defaultGraphQLTypes.GLOBAL_OR_OBJECT_ID_ATT,
  70. options: defaultGraphQLTypes.READ_OPTIONS_ATT
  71. },
  72. type: new _graphql.GraphQLNonNull(classGraphQLOutputType || defaultGraphQLTypes.OBJECT),
  73. async resolve(_source, args, context, queryInfo) {
  74. try {
  75. return await getQuery(parseClass, _source, (0, _deepcopy.default)(args), context, queryInfo, parseGraphQLSchema.parseClasses);
  76. } catch (e) {
  77. parseGraphQLSchema.handleError(e);
  78. }
  79. }
  80. });
  81. }
  82. if (isFindEnabled) {
  83. const lowerCaseClassName = graphQLClassName.charAt(0).toLowerCase() + graphQLClassName.slice(1);
  84. const findGraphQLQueryName = findAlias || (0, _pluralize.default)(lowerCaseClassName);
  85. parseGraphQLSchema.addGraphQLQuery(findGraphQLQueryName, {
  86. description: `The ${findGraphQLQueryName} query can be used to find objects of the ${graphQLClassName} class.`,
  87. args: classGraphQLFindArgs,
  88. type: new _graphql.GraphQLNonNull(classGraphQLFindResultType || defaultGraphQLTypes.OBJECT),
  89. async resolve(_source, args, context, queryInfo) {
  90. try {
  91. // Deep copy args to avoid internal re assign issue
  92. const {
  93. where,
  94. order,
  95. skip,
  96. first,
  97. after,
  98. last,
  99. before,
  100. options
  101. } = (0, _deepcopy.default)(args);
  102. const {
  103. readPreference,
  104. includeReadPreference,
  105. subqueryReadPreference
  106. } = options || {};
  107. const {
  108. config,
  109. auth,
  110. info
  111. } = context;
  112. const selectedFields = (0, _graphqlListFields.default)(queryInfo);
  113. const {
  114. keys,
  115. include
  116. } = (0, _parseGraphQLUtils.extractKeysAndInclude)(selectedFields.filter(field => field.startsWith('edges.node.')).map(field => field.replace('edges.node.', '')).filter(field => field.indexOf('edges.node') < 0));
  117. const parseOrder = order && order.join(',');
  118. return await objectsQueries.findObjects(className, where, parseOrder, skip, first, after, last, before, keys, include, false, readPreference, includeReadPreference, subqueryReadPreference, config, auth, info, selectedFields, parseGraphQLSchema.parseClasses);
  119. } catch (e) {
  120. parseGraphQLSchema.handleError(e);
  121. }
  122. }
  123. });
  124. }
  125. };
  126. exports.load = load;
  127. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbCIsInJlcXVpcmUiLCJfZ3JhcGhxbFJlbGF5IiwiX2dyYXBocWxMaXN0RmllbGRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9kZWVwY29weSIsIl9wbHVyYWxpemUiLCJkZWZhdWx0R3JhcGhRTFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJvYmplY3RzUXVlcmllcyIsIl9QYXJzZUdyYXBoUUxDb250cm9sbGVyIiwiX2NsYXNzTmFtZSIsIl9wYXJzZUdyYXBoUUxVdGlscyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdldFBhcnNlQ2xhc3NRdWVyeUNvbmZpZyIsInBhcnNlQ2xhc3NDb25maWciLCJxdWVyeSIsImdldFF1ZXJ5IiwicGFyc2VDbGFzcyIsIl9zb3VyY2UiLCJhcmdzIiwiY29udGV4dCIsInF1ZXJ5SW5mbyIsInBhcnNlQ2xhc3NlcyIsImlkIiwib3B0aW9ucyIsInJlYWRQcmVmZXJlbmNlIiwiaW5jbHVkZVJlYWRQcmVmZXJlbmNlIiwiY29uZmlnIiwiYXV0aCIsImluZm8iLCJzZWxlY3RlZEZpZWxkcyIsImdldEZpZWxkTmFtZXMiLCJnbG9iYWxJZE9iamVjdCIsImZyb21HbG9iYWxJZCIsInR5cGUiLCJjbGFzc05hbWUiLCJrZXlzIiwiaW5jbHVkZSIsImV4dHJhY3RLZXlzQW5kSW5jbHVkZSIsImdldE9iamVjdCIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJncmFwaFFMQ2xhc3NOYW1lIiwidHJhbnNmb3JtQ2xhc3NOYW1lVG9HcmFwaFFMIiwiaXNHZXRFbmFibGVkIiwiZmluZCIsImlzRmluZEVuYWJsZWQiLCJnZXRBbGlhcyIsImZpbmRBbGlhcyIsImNsYXNzR3JhcGhRTE91dHB1dFR5cGUiLCJjbGFzc0dyYXBoUUxGaW5kQXJncyIsImNsYXNzR3JhcGhRTEZpbmRSZXN1bHRUeXBlIiwicGFyc2VDbGFzc1R5cGVzIiwibG93ZXJDYXNlQ2xhc3NOYW1lIiwiY2hhckF0IiwidG9Mb3dlckNhc2UiLCJzbGljZSIsImdldEdyYXBoUUxRdWVyeU5hbWUiLCJhZGRHcmFwaFFMUXVlcnkiLCJkZXNjcmlwdGlvbiIsIkdMT0JBTF9PUl9PQkpFQ1RfSURfQVRUIiwiUkVBRF9PUFRJT05TX0FUVCIsIkdyYXBoUUxOb25OdWxsIiwiT0JKRUNUIiwicmVzb2x2ZSIsImRlZXBjb3B5IiwiaGFuZGxlRXJyb3IiLCJmaW5kR3JhcGhRTFF1ZXJ5TmFtZSIsInBsdXJhbGl6ZSIsIndoZXJlIiwib3JkZXIiLCJza2lwIiwiZmlyc3QiLCJhZnRlciIsImxhc3QiLCJiZWZvcmUiLCJzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIiwiZmlsdGVyIiwiZmllbGQiLCJzdGFydHNXaXRoIiwibWFwIiwicmVwbGFjZSIsImluZGV4T2YiLCJwYXJzZU9yZGVyIiwiam9pbiIsImZpbmRPYmplY3RzIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvcGFyc2VDbGFzc1F1ZXJpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR3JhcGhRTE5vbk51bGwgfSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7IGZyb21HbG9iYWxJZCB9IGZyb20gJ2dyYXBocWwtcmVsYXknO1xuaW1wb3J0IGdldEZpZWxkTmFtZXMgZnJvbSAnZ3JhcGhxbC1saXN0LWZpZWxkcyc7XG5pbXBvcnQgZGVlcGNvcHkgZnJvbSAnZGVlcGNvcHknO1xuaW1wb3J0IHBsdXJhbGl6ZSBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0ICogYXMgZGVmYXVsdEdyYXBoUUxUeXBlcyBmcm9tICcuL2RlZmF1bHRHcmFwaFFMVHlwZXMnO1xuaW1wb3J0ICogYXMgb2JqZWN0c1F1ZXJpZXMgZnJvbSAnLi4vaGVscGVycy9vYmplY3RzUXVlcmllcyc7XG5pbXBvcnQgeyBQYXJzZUdyYXBoUUxDbGFzc0NvbmZpZyB9IGZyb20gJy4uLy4uL0NvbnRyb2xsZXJzL1BhcnNlR3JhcGhRTENvbnRyb2xsZXInO1xuaW1wb3J0IHsgdHJhbnNmb3JtQ2xhc3NOYW1lVG9HcmFwaFFMIH0gZnJvbSAnLi4vdHJhbnNmb3JtZXJzL2NsYXNzTmFtZSc7XG5pbXBvcnQgeyBleHRyYWN0S2V5c0FuZEluY2x1ZGUgfSBmcm9tICcuLi9wYXJzZUdyYXBoUUxVdGlscyc7XG5cbmNvbnN0IGdldFBhcnNlQ2xhc3NRdWVyeUNvbmZpZyA9IGZ1bmN0aW9uIChwYXJzZUNsYXNzQ29uZmlnOiA/UGFyc2VHcmFwaFFMQ2xhc3NDb25maWcpIHtcbiAgcmV0dXJuIChwYXJzZUNsYXNzQ29uZmlnICYmIHBhcnNlQ2xhc3NDb25maWcucXVlcnkpIHx8IHt9O1xufTtcblxuY29uc3QgZ2V0UXVlcnkgPSBhc3luYyAocGFyc2VDbGFzcywgX3NvdXJjZSwgYXJncywgY29udGV4dCwgcXVlcnlJbmZvLCBwYXJzZUNsYXNzZXMpID0+IHtcbiAgbGV0IHsgaWQgfSA9IGFyZ3M7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gYXJncztcbiAgY29uc3QgeyByZWFkUHJlZmVyZW5jZSwgaW5jbHVkZVJlYWRQcmVmZXJlbmNlIH0gPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCB7IGNvbmZpZywgYXV0aCwgaW5mbyB9ID0gY29udGV4dDtcbiAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSBnZXRGaWVsZE5hbWVzKHF1ZXJ5SW5mbyk7XG5cbiAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQoaWQpO1xuXG4gIGlmIChnbG9iYWxJZE9iamVjdC50eXBlID09PSBwYXJzZUNsYXNzLmNsYXNzTmFtZSkge1xuICAgIGlkID0gZ2xvYmFsSWRPYmplY3QuaWQ7XG4gIH1cblxuICBjb25zdCB7IGtleXMsIGluY2x1ZGUgfSA9IGV4dHJhY3RLZXlzQW5kSW5jbHVkZShzZWxlY3RlZEZpZWxkcyk7XG5cbiAgcmV0dXJuIGF3YWl0IG9iamVjdHNRdWVyaWVzLmdldE9iamVjdChcbiAgICBwYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICBpZCxcbiAgICBrZXlzLFxuICAgIGluY2x1ZGUsXG4gICAgcmVhZFByZWZlcmVuY2UsXG4gICAgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLFxuICAgIGNvbmZpZyxcbiAgICBhdXRoLFxuICAgIGluZm8sXG4gICAgcGFyc2VDbGFzc2VzXG4gICk7XG59O1xuXG5jb25zdCBsb2FkID0gZnVuY3Rpb24gKHBhcnNlR3JhcGhRTFNjaGVtYSwgcGFyc2VDbGFzcywgcGFyc2VDbGFzc0NvbmZpZzogP1BhcnNlR3JhcGhRTENsYXNzQ29uZmlnKSB7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnNlQ2xhc3MuY2xhc3NOYW1lO1xuICBjb25zdCBncmFwaFFMQ2xhc3NOYW1lID0gdHJhbnNmb3JtQ2xhc3NOYW1lVG9HcmFwaFFMKGNsYXNzTmFtZSk7XG4gIGNvbnN0IHtcbiAgICBnZXQ6IGlzR2V0RW5hYmxlZCA9IHRydWUsXG4gICAgZmluZDogaXNGaW5kRW5hYmxlZCA9IHRydWUsXG4gICAgZ2V0QWxpYXM6IGdldEFsaWFzID0gJycsXG4gICAgZmluZEFsaWFzOiBmaW5kQWxpYXMgPSAnJyxcbiAgfSA9IGdldFBhcnNlQ2xhc3NRdWVyeUNvbmZpZyhwYXJzZUNsYXNzQ29uZmlnKTtcblxuICBjb25zdCB7XG4gICAgY2xhc3NHcmFwaFFMT3V0cHV0VHlwZSxcbiAgICBjbGFzc0dyYXBoUUxGaW5kQXJncyxcbiAgICBjbGFzc0dyYXBoUUxGaW5kUmVzdWx0VHlwZSxcbiAgfSA9IHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzVHlwZXNbY2xhc3NOYW1lXTtcblxuICBpZiAoaXNHZXRFbmFibGVkKSB7XG4gICAgY29uc3QgbG93ZXJDYXNlQ2xhc3NOYW1lID0gZ3JhcGhRTENsYXNzTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGdyYXBoUUxDbGFzc05hbWUuc2xpY2UoMSk7XG5cbiAgICBjb25zdCBnZXRHcmFwaFFMUXVlcnlOYW1lID0gZ2V0QWxpYXMgfHwgbG93ZXJDYXNlQ2xhc3NOYW1lO1xuXG4gICAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxRdWVyeShnZXRHcmFwaFFMUXVlcnlOYW1lLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFRoZSAke2dldEdyYXBoUUxRdWVyeU5hbWV9IHF1ZXJ5IGNhbiBiZSB1c2VkIHRvIGdldCBhbiBvYmplY3Qgb2YgdGhlICR7Z3JhcGhRTENsYXNzTmFtZX0gY2xhc3MgYnkgaXRzIGlkLmAsXG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiBkZWZhdWx0R3JhcGhRTFR5cGVzLkdMT0JBTF9PUl9PQkpFQ1RfSURfQVRULFxuICAgICAgICBvcHRpb25zOiBkZWZhdWx0R3JhcGhRTFR5cGVzLlJFQURfT1BUSU9OU19BVFQsXG4gICAgICB9LFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKGNsYXNzR3JhcGhRTE91dHB1dFR5cGUgfHwgZGVmYXVsdEdyYXBoUUxUeXBlcy5PQkpFQ1QpLFxuICAgICAgYXN5bmMgcmVzb2x2ZShfc291cmNlLCBhcmdzLCBjb250ZXh0LCBxdWVyeUluZm8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0UXVlcnkoXG4gICAgICAgICAgICBwYXJzZUNsYXNzLFxuICAgICAgICAgICAgX3NvdXJjZSxcbiAgICAgICAgICAgIGRlZXBjb3B5KGFyZ3MpLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHF1ZXJ5SW5mbyxcbiAgICAgICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzZXNcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzRmluZEVuYWJsZWQpIHtcbiAgICBjb25zdCBsb3dlckNhc2VDbGFzc05hbWUgPSBncmFwaFFMQ2xhc3NOYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgZ3JhcGhRTENsYXNzTmFtZS5zbGljZSgxKTtcblxuICAgIGNvbnN0IGZpbmRHcmFwaFFMUXVlcnlOYW1lID0gZmluZEFsaWFzIHx8IHBsdXJhbGl6ZShsb3dlckNhc2VDbGFzc05hbWUpO1xuXG4gICAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxRdWVyeShmaW5kR3JhcGhRTFF1ZXJ5TmFtZSwge1xuICAgICAgZGVzY3JpcHRpb246IGBUaGUgJHtmaW5kR3JhcGhRTFF1ZXJ5TmFtZX0gcXVlcnkgY2FuIGJlIHVzZWQgdG8gZmluZCBvYmplY3RzIG9mIHRoZSAke2dyYXBoUUxDbGFzc05hbWV9IGNsYXNzLmAsXG4gICAgICBhcmdzOiBjbGFzc0dyYXBoUUxGaW5kQXJncyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChjbGFzc0dyYXBoUUxGaW5kUmVzdWx0VHlwZSB8fCBkZWZhdWx0R3JhcGhRTFR5cGVzLk9CSkVDVCksXG4gICAgICBhc3luYyByZXNvbHZlKF9zb3VyY2UsIGFyZ3MsIGNvbnRleHQsIHF1ZXJ5SW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIERlZXAgY29weSBhcmdzIHRvIGF2b2lkIGludGVybmFsIHJlIGFzc2lnbiBpc3N1ZVxuICAgICAgICAgIGNvbnN0IHsgd2hlcmUsIG9yZGVyLCBza2lwLCBmaXJzdCwgYWZ0ZXIsIGxhc3QsIGJlZm9yZSwgb3B0aW9ucyB9ID0gZGVlcGNvcHkoYXJncyk7XG4gICAgICAgICAgY29uc3QgeyByZWFkUHJlZmVyZW5jZSwgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLCBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0gPSBjb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRmllbGRzID0gZ2V0RmllbGROYW1lcyhxdWVyeUluZm8pO1xuXG4gICAgICAgICAgY29uc3QgeyBrZXlzLCBpbmNsdWRlIH0gPSBleHRyYWN0S2V5c0FuZEluY2x1ZGUoXG4gICAgICAgICAgICBzZWxlY3RlZEZpZWxkc1xuICAgICAgICAgICAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLnN0YXJ0c1dpdGgoJ2VkZ2VzLm5vZGUuJykpXG4gICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4gZmllbGQucmVwbGFjZSgnZWRnZXMubm9kZS4nLCAnJykpXG4gICAgICAgICAgICAgIC5maWx0ZXIoZmllbGQgPT4gZmllbGQuaW5kZXhPZignZWRnZXMubm9kZScpIDwgMClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHBhcnNlT3JkZXIgPSBvcmRlciAmJiBvcmRlci5qb2luKCcsJyk7XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgb2JqZWN0c1F1ZXJpZXMuZmluZE9iamVjdHMoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICAgIHBhcnNlT3JkZXIsXG4gICAgICAgICAgICBza2lwLFxuICAgICAgICAgICAgZmlyc3QsXG4gICAgICAgICAgICBhZnRlcixcbiAgICAgICAgICAgIGxhc3QsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgaW5jbHVkZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICBpbmNsdWRlUmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBzZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzZXNcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnQgeyBsb2FkIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGtCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxVQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxtQkFBQSxHQUFBQyx1QkFBQSxDQUFBUCxPQUFBO0FBQ0EsSUFBQVEsY0FBQSxHQUFBRCx1QkFBQSxDQUFBUCxPQUFBO0FBQ0EsSUFBQVMsdUJBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLGtCQUFBLEdBQUFYLE9BQUE7QUFBNkQsU0FBQVkseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQU4sd0JBQUFNLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3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