"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformQueryInputToParse = exports.transformQueryConstraintInputToParse = void 0; var _graphqlRelay = require("graphql-relay"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const parseQueryMap = { OR: '$or', AND: '$and', NOR: '$nor' }; const parseConstraintMap = { equalTo: '$eq', notEqualTo: '$ne', lessThan: '$lt', lessThanOrEqualTo: '$lte', greaterThan: '$gt', greaterThanOrEqualTo: '$gte', in: '$in', notIn: '$nin', exists: '$exists', inQueryKey: '$select', notInQueryKey: '$dontSelect', inQuery: '$inQuery', notInQuery: '$notInQuery', containedBy: '$containedBy', contains: '$all', matchesRegex: '$regex', options: '$options', text: '$text', search: '$search', term: '$term', language: '$language', caseSensitive: '$caseSensitive', diacriticSensitive: '$diacriticSensitive', nearSphere: '$nearSphere', maxDistance: '$maxDistance', maxDistanceInRadians: '$maxDistanceInRadians', maxDistanceInMiles: '$maxDistanceInMiles', maxDistanceInKilometers: '$maxDistanceInKilometers', within: '$within', box: '$box', geoWithin: '$geoWithin', polygon: '$polygon', centerSphere: '$centerSphere', geoIntersects: '$geoIntersects', point: '$point' }; const transformQueryConstraintInputToParse = (constraints, parentFieldName, className, parentConstraints, parseClasses) => { const fields = parseClasses[className].fields; if (parentFieldName === 'id' && className) { Object.keys(constraints).forEach(constraintName => { const constraintValue = constraints[constraintName]; if (typeof constraintValue === 'string') { const globalIdObject = (0, _graphqlRelay.fromGlobalId)(constraintValue); if (globalIdObject.type === className) { constraints[constraintName] = globalIdObject.id; } } else if (Array.isArray(constraintValue)) { constraints[constraintName] = constraintValue.map(value => { const globalIdObject = (0, _graphqlRelay.fromGlobalId)(value); if (globalIdObject.type === className) { return globalIdObject.id; } return value; }); } }); parentConstraints.objectId = constraints; delete parentConstraints.id; } Object.keys(constraints).forEach(fieldName => { let fieldValue = constraints[fieldName]; if (parseConstraintMap[fieldName]) { constraints[parseConstraintMap[fieldName]] = constraints[fieldName]; delete constraints[fieldName]; } /** * If we have a key-value pair, we need to change the way the constraint is structured. * * Example: * From: * { * "someField": { * "lessThan": { * "key":"foo.bar", * "value": 100 * }, * "greaterThan": { * "key":"foo.bar", * "value": 10 * } * } * } * * To: * { * "someField.foo.bar": { * "$lt": 100, * "$gt": 10 * } * } */ if (fieldValue.key && fieldValue.value !== undefined && parentConstraints && parentFieldName) { delete parentConstraints[parentFieldName]; parentConstraints[`${parentFieldName}.${fieldValue.key}`] = _objectSpread(_objectSpread({}, parentConstraints[`${parentFieldName}.${fieldValue.key}`]), {}, { [parseConstraintMap[fieldName]]: fieldValue.value }); } else if (fields[parentFieldName] && (fields[parentFieldName].type === 'Pointer' || fields[parentFieldName].type === 'Relation')) { const { targetClass } = fields[parentFieldName]; if (fieldName === 'exists') { if (fields[parentFieldName].type === 'Relation') { const whereTarget = fieldValue ? 'where' : 'notWhere'; if (constraints[whereTarget]) { if (constraints[whereTarget].objectId) { constraints[whereTarget].objectId = _objectSpread(_objectSpread({}, constraints[whereTarget].objectId), {}, { $exists: fieldValue }); } else { constraints[whereTarget].objectId = { $exists: fieldValue }; } } else { const parseWhereTarget = fieldValue ? '$inQuery' : '$notInQuery'; parentConstraints[parentFieldName][parseWhereTarget] = { where: { objectId: { $exists: true } }, className: targetClass }; } delete constraints.$exists; } else { parentConstraints[parentFieldName].$exists = fieldValue; } return; } switch (fieldName) { case 'have': parentConstraints[parentFieldName].$inQuery = { where: fieldValue, className: targetClass }; transformQueryInputToParse(parentConstraints[parentFieldName].$inQuery.where, targetClass, parseClasses); break; case 'haveNot': parentConstraints[parentFieldName].$notInQuery = { where: fieldValue, className: targetClass }; transformQueryInputToParse(parentConstraints[parentFieldName].$notInQuery.where, targetClass, parseClasses); break; } delete constraints[fieldName]; return; } switch (fieldName) { case 'point': if (typeof fieldValue === 'object' && !fieldValue.__type) { fieldValue.__type = 'GeoPoint'; } break; case 'nearSphere': if (typeof fieldValue === 'object' && !fieldValue.__type) { fieldValue.__type = 'GeoPoint'; } break; case 'box': if (typeof fieldValue === 'object' && fieldValue.bottomLeft && fieldValue.upperRight) { fieldValue = [_objectSpread({ __type: 'GeoPoint' }, fieldValue.bottomLeft), _objectSpread({ __type: 'GeoPoint' }, fieldValue.upperRight)]; constraints[parseConstraintMap[fieldName]] = fieldValue; } break; case 'polygon': if (fieldValue instanceof Array) { fieldValue.forEach(geoPoint => { if (typeof geoPoint === 'object' && !geoPoint.__type) { geoPoint.__type = 'GeoPoint'; } }); } break; case 'centerSphere': if (typeof fieldValue === 'object' && fieldValue.center && fieldValue.distance) { fieldValue = [_objectSpread({ __type: 'GeoPoint' }, fieldValue.center), fieldValue.distance]; constraints[parseConstraintMap[fieldName]] = fieldValue; } break; } if (typeof fieldValue === 'object') { if (fieldName === 'where') { transformQueryInputToParse(fieldValue, className, parseClasses); } else { transformQueryConstraintInputToParse(fieldValue, fieldName, className, constraints, parseClasses); } } }); }; exports.transformQueryConstraintInputToParse = transformQueryConstraintInputToParse; const transformQueryInputToParse = (constraints, className, parseClasses) => { if (!constraints || typeof constraints !== 'object') { return; } Object.keys(constraints).forEach(fieldName => { const fieldValue = constraints[fieldName]; if (parseQueryMap[fieldName]) { delete constraints[fieldName]; fieldName = parseQueryMap[fieldName]; constraints[fieldName] = fieldValue; fieldValue.forEach(fieldValueItem => { transformQueryInputToParse(fieldValueItem, className, parseClasses); }); return; } else { transformQueryConstraintInputToParse(fieldValue, fieldName, className, constraints, parseClasses); } }); }; exports.transformQueryInputToParse = transformQueryInputToParse; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbFJlbGF5IiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwicGFyc2VRdWVyeU1hcCIsIk9SIiwiQU5EIiwiTk9SIiwicGFyc2VDb25zdHJhaW50TWFwIiwiZXF1YWxUbyIsIm5vdEVxdWFsVG8iLCJsZXNzVGhhbiIsImxlc3NUaGFuT3JFcXVhbFRvIiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsImluIiwibm90SW4iLCJleGlzdHMiLCJpblF1ZXJ5S2V5Iiwibm90SW5RdWVyeUtleSIsImluUXVlcnkiLCJub3RJblF1ZXJ5IiwiY29udGFpbmVkQnkiLCJjb250YWlucyIsIm1hdGNoZXNSZWdleCIsIm9wdGlvbnMiLCJ0ZXh0Iiwic2VhcmNoIiwidGVybSIsImxhbmd1YWdlIiwiY2FzZVNlbnNpdGl2ZSIsImRpYWNyaXRpY1NlbnNpdGl2ZSIsIm5lYXJTcGhlcmUiLCJtYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlSW5SYWRpYW5zIiwibWF4RGlzdGFuY2VJbk1pbGVzIiwibWF4RGlzdGFuY2VJbktpbG9tZXRlcnMiLCJ3aXRoaW4iLCJib3giLCJnZW9XaXRoaW4iLCJwb2x5Z29uIiwiY2VudGVyU3BoZXJlIiwiZ2VvSW50ZXJzZWN0cyIsInBvaW50IiwidHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlIiwiY29uc3RyYWludHMiLCJwYXJlbnRGaWVsZE5hbWUiLCJjbGFzc05hbWUiLCJwYXJlbnRDb25zdHJhaW50cyIsInBhcnNlQ2xhc3NlcyIsImZpZWxkcyIsImNvbnN0cmFpbnROYW1lIiwiY29uc3RyYWludFZhbHVlIiwiZ2xvYmFsSWRPYmplY3QiLCJmcm9tR2xvYmFsSWQiLCJ0eXBlIiwiaWQiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJvYmplY3RJZCIsImZpZWxkTmFtZSIsImZpZWxkVmFsdWUiLCJrZXkiLCJ1bmRlZmluZWQiLCJ0YXJnZXRDbGFzcyIsIndoZXJlVGFyZ2V0IiwiJGV4aXN0cyIsInBhcnNlV2hlcmVUYXJnZXQiLCJ3aGVyZSIsIiRpblF1ZXJ5IiwidHJhbnNmb3JtUXVlcnlJbnB1dFRvUGFyc2UiLCIkbm90SW5RdWVyeSIsIl9fdHlwZSIsImJvdHRvbUxlZnQiLCJ1cHBlclJpZ2h0IiwiZ2VvUG9pbnQiLCJjZW50ZXIiLCJkaXN0YW5jZSIsImV4cG9ydHMiLCJmaWVsZFZhbHVlSXRlbSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML3RyYW5zZm9ybWVycy9xdWVyeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tR2xvYmFsSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcblxuY29uc3QgcGFyc2VRdWVyeU1hcCA9IHtcbiAgT1I6ICckb3InLFxuICBBTkQ6ICckYW5kJyxcbiAgTk9SOiAnJG5vcicsXG59O1xuXG5jb25zdCBwYXJzZUNvbnN0cmFpbnRNYXAgPSB7XG4gIGVxdWFsVG86ICckZXEnLFxuICBub3RFcXVhbFRvOiAnJG5lJyxcbiAgbGVzc1RoYW46ICckbHQnLFxuICBsZXNzVGhhbk9yRXF1YWxUbzogJyRsdGUnLFxuICBncmVhdGVyVGhhbjogJyRndCcsXG4gIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiAnJGd0ZScsXG4gIGluOiAnJGluJyxcbiAgbm90SW46ICckbmluJyxcbiAgZXhpc3RzOiAnJGV4aXN0cycsXG4gIGluUXVlcnlLZXk6ICckc2VsZWN0JyxcbiAgbm90SW5RdWVyeUtleTogJyRkb250U2VsZWN0JyxcbiAgaW5RdWVyeTogJyRpblF1ZXJ5JyxcbiAgbm90SW5RdWVyeTogJyRub3RJblF1ZXJ5JyxcbiAgY29udGFpbmVkQnk6ICckY29udGFpbmVkQnknLFxuICBjb250YWluczogJyRhbGwnLFxuICBtYXRjaGVzUmVnZXg6ICckcmVnZXgnLFxuICBvcHRpb25zOiAnJG9wdGlvbnMnLFxuICB0ZXh0OiAnJHRleHQnLFxuICBzZWFyY2g6ICckc2VhcmNoJyxcbiAgdGVybTogJyR0ZXJtJyxcbiAgbGFuZ3VhZ2U6ICckbGFuZ3VhZ2UnLFxuICBjYXNlU2Vuc2l0aXZlOiAnJGNhc2VTZW5zaXRpdmUnLFxuICBkaWFjcml0aWNTZW5zaXRpdmU6ICckZGlhY3JpdGljU2Vuc2l0aXZlJyxcbiAgbmVhclNwaGVyZTogJyRuZWFyU3BoZXJlJyxcbiAgbWF4RGlzdGFuY2U6ICckbWF4RGlzdGFuY2UnLFxuICBtYXhEaXN0YW5jZUluUmFkaWFuczogJyRtYXhEaXN0YW5jZUluUmFkaWFucycsXG4gIG1heERpc3RhbmNlSW5NaWxlczogJyRtYXhEaXN0YW5jZUluTWlsZXMnLFxuICBtYXhEaXN0YW5jZUluS2lsb21ldGVyczogJyRtYXhEaXN0YW5jZUluS2lsb21ldGVycycsXG4gIHdpdGhpbjogJyR3aXRoaW4nLFxuICBib3g6ICckYm94JyxcbiAgZ2VvV2l0aGluOiAnJGdlb1dpdGhpbicsXG4gIHBvbHlnb246ICckcG9seWdvbicsXG4gIGNlbnRlclNwaGVyZTogJyRjZW50ZXJTcGhlcmUnLFxuICBnZW9JbnRlcnNlY3RzOiAnJGdlb0ludGVyc2VjdHMnLFxuICBwb2ludDogJyRwb2ludCcsXG59O1xuXG5jb25zdCB0cmFuc2Zvcm1RdWVyeUNvbnN0cmFpbnRJbnB1dFRvUGFyc2UgPSAoXG4gIGNvbnN0cmFpbnRzLFxuICBwYXJlbnRGaWVsZE5hbWUsXG4gIGNsYXNzTmFtZSxcbiAgcGFyZW50Q29uc3RyYWludHMsXG4gIHBhcnNlQ2xhc3Nlc1xuKSA9PiB7XG4gIGNvbnN0IGZpZWxkcyA9IHBhcnNlQ2xhc3Nlc1tjbGFzc05hbWVdLmZpZWxkcztcbiAgaWYgKHBhcmVudEZpZWxkTmFtZSA9PT0gJ2lkJyAmJiBjbGFzc05hbWUpIHtcbiAgICBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZm9yRWFjaChjb25zdHJhaW50TmFtZSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJhaW50VmFsdWUgPSBjb25zdHJhaW50c1tjb25zdHJhaW50TmFtZV07XG4gICAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQoY29uc3RyYWludFZhbHVlKTtcblxuICAgICAgICBpZiAoZ2xvYmFsSWRPYmplY3QudHlwZSA9PT0gY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY29uc3RyYWludHNbY29uc3RyYWludE5hbWVdID0gZ2xvYmFsSWRPYmplY3QuaWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25zdHJhaW50VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0cmFpbnRzW2NvbnN0cmFpbnROYW1lXSA9IGNvbnN0cmFpbnRWYWx1ZS5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbElkT2JqZWN0ID0gZnJvbUdsb2JhbElkKHZhbHVlKTtcblxuICAgICAgICAgIGlmIChnbG9iYWxJZE9iamVjdC50eXBlID09PSBjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxJZE9iamVjdC5pZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHBhcmVudENvbnN0cmFpbnRzLm9iamVjdElkID0gY29uc3RyYWludHM7XG4gICAgZGVsZXRlIHBhcmVudENvbnN0cmFpbnRzLmlkO1xuICB9XG4gIE9iamVjdC5rZXlzKGNvbnN0cmFpbnRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgbGV0IGZpZWxkVmFsdWUgPSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuICAgIGlmIChwYXJzZUNvbnN0cmFpbnRNYXBbZmllbGROYW1lXSkge1xuICAgICAgY29uc3RyYWludHNbcGFyc2VDb25zdHJhaW50TWFwW2ZpZWxkTmFtZV1dID0gY29uc3RyYWludHNbZmllbGROYW1lXTtcbiAgICAgIGRlbGV0ZSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB3ZSBoYXZlIGEga2V5LXZhbHVlIHBhaXIsIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIGNvbnN0cmFpbnQgaXMgc3RydWN0dXJlZC5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogICBGcm9tOlxuICAgICAqICAge1xuICAgICAqICAgICBcInNvbWVGaWVsZFwiOiB7XG4gICAgICogICAgICAgXCJsZXNzVGhhblwiOiB7XG4gICAgICogICAgICAgICBcImtleVwiOlwiZm9vLmJhclwiLFxuICAgICAqICAgICAgICAgXCJ2YWx1ZVwiOiAxMDBcbiAgICAgKiAgICAgICB9LFxuICAgICAqICAgICAgIFwiZ3JlYXRlclRoYW5cIjoge1xuICAgICAqICAgICAgICAgXCJrZXlcIjpcImZvby5iYXJcIixcbiAgICAgKiAgICAgICAgIFwidmFsdWVcIjogMTBcbiAgICAgKiAgICAgICB9XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgVG86XG4gICAgICogICB7XG4gICAgICogICAgIFwic29tZUZpZWxkLmZvby5iYXJcIjoge1xuICAgICAqICAgICAgIFwiJGx0XCI6IDEwMCxcbiAgICAgKiAgICAgICBcIiRndFwiOiAxMFxuICAgICAqICAgICAgfVxuICAgICAqICAgfVxuICAgICAqL1xuICAgIGlmIChmaWVsZFZhbHVlLmtleSAmJiBmaWVsZFZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Q29uc3RyYWludHMgJiYgcGFyZW50RmllbGROYW1lKSB7XG4gICAgICBkZWxldGUgcGFyZW50Q29uc3RyYWludHNbcGFyZW50RmllbGROYW1lXTtcbiAgICAgIHBhcmVudENvbnN0cmFpbnRzW2Ake3BhcmVudEZpZWxkTmFtZX0uJHtmaWVsZFZhbHVlLmtleX1gXSA9IHtcbiAgICAgICAgLi4ucGFyZW50Q29uc3RyYWludHNbYCR7cGFyZW50RmllbGROYW1lfS4ke2ZpZWxkVmFsdWUua2V5fWBdLFxuICAgICAgICBbcGFyc2VDb25zdHJhaW50TWFwW2ZpZWxkTmFtZV1dOiBmaWVsZFZhbHVlLnZhbHVlLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZmllbGRzW3BhcmVudEZpZWxkTmFtZV0gJiZcbiAgICAgIChmaWVsZHNbcGFyZW50RmllbGROYW1lXS50eXBlID09PSAnUG9pbnRlcicgfHwgZmllbGRzW3BhcmVudEZpZWxkTmFtZV0udHlwZSA9PT0gJ1JlbGF0aW9uJylcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0Q2xhc3MgfSA9IGZpZWxkc1twYXJlbnRGaWVsZE5hbWVdO1xuICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gJ2V4aXN0cycpIHtcbiAgICAgICAgaWYgKGZpZWxkc1twYXJlbnRGaWVsZE5hbWVdLnR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgICBjb25zdCB3aGVyZVRhcmdldCA9IGZpZWxkVmFsdWUgPyAnd2hlcmUnIDogJ25vdFdoZXJlJztcbiAgICAgICAgICBpZiAoY29uc3RyYWludHNbd2hlcmVUYXJnZXRdKSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbd2hlcmVUYXJnZXRdLm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzW3doZXJlVGFyZ2V0XS5vYmplY3RJZCA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25zdHJhaW50c1t3aGVyZVRhcmdldF0ub2JqZWN0SWQsXG4gICAgICAgICAgICAgICAgJGV4aXN0czogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzW3doZXJlVGFyZ2V0XS5vYmplY3RJZCA9IHtcbiAgICAgICAgICAgICAgICAkZXhpc3RzOiBmaWVsZFZhbHVlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZVdoZXJlVGFyZ2V0ID0gZmllbGRWYWx1ZSA/ICckaW5RdWVyeScgOiAnJG5vdEluUXVlcnknO1xuICAgICAgICAgICAgcGFyZW50Q29uc3RyYWludHNbcGFyZW50RmllbGROYW1lXVtwYXJzZVdoZXJlVGFyZ2V0XSA9IHtcbiAgICAgICAgICAgICAgd2hlcmU6IHsgb2JqZWN0SWQ6IHsgJGV4aXN0czogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgY29uc3RyYWludHMuJGV4aXN0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnRDb25zdHJhaW50c1twYXJlbnRGaWVsZE5hbWVdLiRleGlzdHMgPSBmaWVsZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZmllbGROYW1lKSB7XG4gICAgICAgIGNhc2UgJ2hhdmUnOlxuICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJGluUXVlcnkgPSB7XG4gICAgICAgICAgICB3aGVyZTogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZShcbiAgICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJGluUXVlcnkud2hlcmUsXG4gICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hhdmVOb3QnOlxuICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJG5vdEluUXVlcnkgPSB7XG4gICAgICAgICAgICB3aGVyZTogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZShcbiAgICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJG5vdEluUXVlcnkud2hlcmUsXG4gICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWxldGUgY29uc3RyYWludHNbZmllbGROYW1lXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChmaWVsZE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BvaW50JzpcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiAhZmllbGRWYWx1ZS5fX3R5cGUpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlLl9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICduZWFyU3BoZXJlJzpcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiAhZmllbGRWYWx1ZS5fX3R5cGUpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlLl9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3gnOlxuICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuYm90dG9tTGVmdCAmJiBmaWVsZFZhbHVlLnVwcGVyUmlnaHQpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICAgICAgICAgIC4uLmZpZWxkVmFsdWUuYm90dG9tTGVmdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgICAgICAgICAgICAgLi4uZmllbGRWYWx1ZS51cHBlclJpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGNvbnN0cmFpbnRzW3BhcnNlQ29uc3RyYWludE1hcFtmaWVsZE5hbWVdXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaChnZW9Qb2ludCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGdlb1BvaW50ID09PSAnb2JqZWN0JyAmJiAhZ2VvUG9pbnQuX190eXBlKSB7XG4gICAgICAgICAgICAgIGdlb1BvaW50Ll9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXJTcGhlcmUnOlxuICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuY2VudGVyICYmIGZpZWxkVmFsdWUuZGlzdGFuY2UpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICAgICAgICAgIC4uLmZpZWxkVmFsdWUuY2VudGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpZWxkVmFsdWUuZGlzdGFuY2UsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBjb25zdHJhaW50c1twYXJzZUNvbnN0cmFpbnRNYXBbZmllbGROYW1lXV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoZmllbGROYW1lID09PSAnd2hlcmUnKSB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlKGZpZWxkVmFsdWUsIGNsYXNzTmFtZSwgcGFyc2VDbGFzc2VzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5Q29uc3RyYWludElucHV0VG9QYXJzZShcbiAgICAgICAgICBmaWVsZFZhbHVlLFxuICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgICAgcGFyc2VDbGFzc2VzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlID0gKGNvbnN0cmFpbnRzLCBjbGFzc05hbWUsIHBhcnNlQ2xhc3NlcykgPT4ge1xuICBpZiAoIWNvbnN0cmFpbnRzIHx8IHR5cGVvZiBjb25zdHJhaW50cyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuXG4gICAgaWYgKHBhcnNlUXVlcnlNYXBbZmllbGROYW1lXSkge1xuICAgICAgZGVsZXRlIGNvbnN0cmFpbnRzW2ZpZWxkTmFtZV07XG4gICAgICBmaWVsZE5hbWUgPSBwYXJzZVF1ZXJ5TWFwW2ZpZWxkTmFtZV07XG4gICAgICBjb25zdHJhaW50c1tmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaChmaWVsZFZhbHVlSXRlbSA9PiB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlKGZpZWxkVmFsdWVJdGVtLCBjbGFzc05hbWUsIHBhcnNlQ2xhc3Nlcyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlKFxuICAgICAgICBmaWVsZFZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IHsgdHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlLCB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFBNkMsU0FBQUMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFB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