UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

277 lines (276 loc) • 37 kB
/* eslint-disable no-use-before-define */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { default: function() { return _default; }, getCollectionIDType: function() { return getCollectionIDType; } }); const _graphql = require("graphql"); const _graphqltypejson = require("graphql-type-json"); const _types = require("../../fields/config/types"); const _formatLabels = require("../../utilities/formatLabels"); const _groupOrTabHasRequiredSubfield = require("../../utilities/groupOrTabHasRequiredSubfield"); const _combineParentName = /*#__PURE__*/ _interop_require_default(require("../utilities/combineParentName")); const _formatName = /*#__PURE__*/ _interop_require_default(require("../utilities/formatName")); const _withNullableType = /*#__PURE__*/ _interop_require_default(require("./withNullableType")); const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const idFieldTypes = { number: _graphql.GraphQLInt, text: _graphql.GraphQLString }; const getCollectionIDType = (payload, collection)=>{ const idField = (0, _flattenTopLevelFields.default)(collection.fields).find((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id'); if (!idField) { return idFieldTypes[payload.db.defaultIDType]; } return idFieldTypes[idField.type]; }; function buildMutationInputType(payload, name, fields, parentName, forceNullable = false) { const fieldToSchemaMap = { array: (inputObjectTypeConfig, field)=>{ const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true)); let type = buildMutationInputType(payload, fullName, field.fields, fullName); if (!type) return inputObjectTypeConfig; type = new _graphql.GraphQLList((0, _withNullableType.default)(field, type, forceNullable)); return { ...inputObjectTypeConfig, [field.name]: { type } }; }, blocks: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: _graphqltypejson.GraphQLJSON } }), checkbox: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: _graphql.GraphQLBoolean } }), code: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }), collapsible: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{ const addSubField = fieldToSchemaMap[subField.type]; if (addSubField) return addSubField(acc, subField); return acc; }, inputObjectTypeConfig), date: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }), email: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }), group: (inputObjectTypeConfig, field)=>{ const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field); const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true)); let type = buildMutationInputType(payload, fullName, field.fields, fullName); if (!type) return inputObjectTypeConfig; if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type); return { ...inputObjectTypeConfig, [field.name]: { type } }; }, json: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable) } }), number: (inputObjectTypeConfig, field)=>{ const type = field.name === 'id' ? _graphql.GraphQLInt : _graphql.GraphQLFloat; return { ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(type) : type, forceNullable) } }; }, point: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, new _graphql.GraphQLList(_graphql.GraphQLFloat), forceNullable) } }), radio: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }), relationship: (inputObjectTypeConfig, field)=>{ const { relationTo } = field; let type; if (Array.isArray(relationTo)) { const fullName = `${(0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true))}RelationshipInput`; type = new _graphql.GraphQLInputObjectType({ name: fullName, fields: { relationTo: { type: new _graphql.GraphQLEnumType({ name: `${fullName}RelationTo`, values: relationTo.reduce((values, option)=>({ ...values, [(0, _formatName.default)(option)]: { value: option } }), {}) }) }, value: { type: _graphqltypejson.GraphQLJSON } } }); } else { type = getCollectionIDType(payload, payload.collections[relationTo].config); } return { ...inputObjectTypeConfig, [field.name]: { type: field.hasMany ? new _graphql.GraphQLList(type) : type } }; }, richText: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable) } }), row: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{ const addSubField = fieldToSchemaMap[subField.type]; if (addSubField) return addSubField(acc, subField); return acc; }, inputObjectTypeConfig), select: (inputObjectTypeConfig, field)=>{ const formattedName = `${(0, _combineParentName.default)(parentName, field.name)}_MutationInput`; let type = new _graphql.GraphQLEnumType({ name: formattedName, values: field.options.reduce((values, option)=>{ if ((0, _types.optionIsObject)(option)) { return { ...values, [(0, _formatName.default)(option.value)]: { value: option.value } }; } return { ...values, [(0, _formatName.default)(option)]: { value: option } }; }, {}) }); type = field.hasMany ? new _graphql.GraphQLList(type) : type; type = (0, _withNullableType.default)(field, type, forceNullable); return { ...inputObjectTypeConfig, [field.name]: { type } }; }, tabs: (inputObjectTypeConfig, field)=>{ return field.tabs.reduce((acc, tab)=>{ if ((0, _types.tabHasName)(tab)) { const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(tab.name, true)); const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field); let type = buildMutationInputType(payload, fullName, tab.fields, fullName); if (!type) return acc; if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type); return { ...acc, [tab.name]: { type } }; } return { ...acc, ...tab.fields.reduce((subFieldSchema, subField)=>{ const addSubField = fieldToSchemaMap[subField.type]; if (addSubField) return addSubField(subFieldSchema, subField); return subFieldSchema; }, acc) }; }, inputObjectTypeConfig); }, text: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(_graphql.GraphQLString) : _graphql.GraphQLString, forceNullable) } }), textarea: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }), upload: (inputObjectTypeConfig, field)=>({ ...inputObjectTypeConfig, [field.name]: { type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable) } }) }; const fieldName = (0, _formatName.default)(name); const fieldSchemas = fields.reduce((inputObjectTypeConfig, field)=>{ const fieldSchema = fieldToSchemaMap[field.type]; if (typeof fieldSchema !== 'function') { return inputObjectTypeConfig; } const schema = fieldSchema(inputObjectTypeConfig, field); if (Object.keys(schema).length === 0) { return inputObjectTypeConfig; } return { ...inputObjectTypeConfig, ...fieldSchema(inputObjectTypeConfig, field) }; }, {}); if (Object.keys(fieldSchemas).length === 0) { return null; } return new _graphql.GraphQLInputObjectType({ name: `mutation${fieldName}Input`, fields: fieldSchemas }); } const _default = buildMutationInputType; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ncmFwaHFsL3NjaGVtYS9idWlsZE11dGF0aW9uSW5wdXRUeXBlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoUUxJbnB1dEZpZWxkQ29uZmlnLCBHcmFwaFFMU2NhbGFyVHlwZSwgR3JhcGhRTFR5cGUgfSBmcm9tICdncmFwaHFsJ1xuXG5pbXBvcnQge1xuICBHcmFwaFFMQm9vbGVhbixcbiAgR3JhcGhRTEVudW1UeXBlLFxuICBHcmFwaFFMRmxvYXQsXG4gIEdyYXBoUUxJbnB1dE9iamVjdFR5cGUsXG4gIEdyYXBoUUxJbnQsXG4gIEdyYXBoUUxMaXN0LFxuICBHcmFwaFFMTm9uTnVsbCxcbiAgR3JhcGhRTFN0cmluZyxcbn0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB7IEdyYXBoUUxKU09OIH0gZnJvbSAnZ3JhcGhxbC10eXBlLWpzb24nXG5cbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2tGaWVsZCxcbiAgQ2hlY2tib3hGaWVsZCxcbiAgQ29kZUZpZWxkLFxuICBDb2xsYXBzaWJsZUZpZWxkLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBHcm91cEZpZWxkLFxuICBKU09ORmllbGQsXG4gIE51bWJlckZpZWxkLFxuICBQb2ludEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmljaFRleHRGaWVsZCxcbiAgUm93RmllbGQsXG4gIFNlbGVjdEZpZWxkLFxuICBUYWJzRmllbGQsXG4gIFRleHRGaWVsZCxcbiAgVGV4dGFyZWFGaWVsZCxcbiAgVXBsb2FkRmllbGQsXG59IGZyb20gJy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi8uLi9wYXlsb2FkJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCBvcHRpb25Jc09iamVjdCwgdGFiSGFzTmFtZSB9IGZyb20gJy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgeyB0b1dvcmRzIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2Zvcm1hdExhYmVscydcbmltcG9ydCB7IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2dyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkJ1xuaW1wb3J0IGNvbWJpbmVQYXJlbnROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9jb21iaW5lUGFyZW50TmFtZSdcbmltcG9ydCBmb3JtYXROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9mb3JtYXROYW1lJ1xuaW1wb3J0IHdpdGhOdWxsYWJsZVR5cGUgZnJvbSAnLi93aXRoTnVsbGFibGVUeXBlJ1xuaW1wb3J0IGZsYXR0ZW5GaWVsZHMgZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2ZsYXR0ZW5Ub3BMZXZlbEZpZWxkcydcblxuY29uc3QgaWRGaWVsZFR5cGVzID0ge1xuICBudW1iZXI6IEdyYXBoUUxJbnQsXG4gIHRleHQ6IEdyYXBoUUxTdHJpbmcsXG59XG5cbmV4cG9ydCBjb25zdCBnZXRDb2xsZWN0aW9uSURUeXBlID0gKFxuICBwYXlsb2FkOiBQYXlsb2FkLFxuICBjb2xsZWN0aW9uOiBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnLFxuKTogR3JhcGhRTFNjYWxhclR5cGUgPT4ge1xuICBjb25zdCBpZEZpZWxkID0gZmxhdHRlbkZpZWxkcyhjb2xsZWN0aW9uLmZpZWxkcykuZmluZChcbiAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcsXG4gIClcblxuICBpZiAoIWlkRmllbGQpIHtcbiAgICByZXR1cm4gaWRGaWVsZFR5cGVzW3BheWxvYWQuZGIuZGVmYXVsdElEVHlwZV1cbiAgfVxuXG4gIHJldHVybiBpZEZpZWxkVHlwZXNbaWRGaWVsZC50eXBlXVxufVxuXG5leHBvcnQgdHlwZSBJbnB1dE9iamVjdFR5cGVDb25maWcgPSB7XG4gIFtwYXRoOiBzdHJpbmddOiBHcmFwaFFMSW5wdXRGaWVsZENvbmZpZ1xufVxuXG5mdW5jdGlvbiBidWlsZE11dGF0aW9uSW5wdXRUeXBlKFxuICBwYXlsb2FkOiBQYXlsb2FkLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZpZWxkczogRmllbGRbXSxcbiAgcGFyZW50TmFtZTogc3RyaW5nLFxuICBmb3JjZU51bGxhYmxlID0gZmFsc2UsXG4pOiBHcmFwaFFMSW5wdXRPYmplY3RUeXBlIHwgbnVsbCB7XG4gIGNvbnN0IGZpZWxkVG9TY2hlbWFNYXAgPSB7XG4gICAgYXJyYXk6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEFycmF5RmllbGQpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gY29tYmluZVBhcmVudE5hbWUocGFyZW50TmFtZSwgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSlcbiAgICAgIGxldCB0eXBlOiBHcmFwaFFMTGlzdDxHcmFwaFFMVHlwZT4gfCBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGZ1bGxOYW1lLFxuICAgICAgICBmaWVsZC5maWVsZHMsXG4gICAgICAgIGZ1bGxOYW1lLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcblxuICAgICAgdHlwZSA9IG5ldyBHcmFwaFFMTGlzdCh3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCB0eXBlLCBmb3JjZU51bGxhYmxlKSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIGJsb2NrczogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQmxvY2tGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiBHcmFwaFFMSlNPTiB9LFxuICAgIH0pLFxuICAgIGNoZWNrYm94OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBDaGVja2JveEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgfSksXG4gICAgY29kZTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQ29kZUZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgY29sbGFwc2libGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IENvbGxhcHNpYmxlRmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZHMucmVkdWNlKChhY2MsIHN1YkZpZWxkOiBDb2xsYXBzaWJsZUZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZFN1YkZpZWxkID0gZmllbGRUb1NjaGVtYU1hcFtzdWJGaWVsZC50eXBlXVxuICAgICAgICBpZiAoYWRkU3ViRmllbGQpIHJldHVybiBhZGRTdWJGaWVsZChhY2MsIHN1YkZpZWxkKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCBpbnB1dE9iamVjdFR5cGVDb25maWcpLFxuICAgIGRhdGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IERhdGVGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIGVtYWlsOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBFbWFpbEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgZ3JvdXA6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEdyb3VwRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkID0gZ3JvdXBPclRhYkhhc1JlcXVpcmVkU3ViZmllbGQoZmllbGQpXG4gICAgICBjb25zdCBmdWxsTmFtZSA9IGNvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIHRvV29yZHMoZmllbGQubmFtZSwgdHJ1ZSkpXG4gICAgICBsZXQgdHlwZTogR3JhcGhRTFR5cGUgPSBidWlsZE11dGF0aW9uSW5wdXRUeXBlKHBheWxvYWQsIGZ1bGxOYW1lLCBmaWVsZC5maWVsZHMsIGZ1bGxOYW1lKVxuXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcblxuICAgICAgaWYgKHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkKSB0eXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKHR5cGUpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICBqc29uOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBKU09ORmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTEpTT04sIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgbnVtYmVyOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBOdW1iZXJGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGZpZWxkLm5hbWUgPT09ICdpZCcgPyBHcmFwaFFMSW50IDogR3JhcGhRTEZsb2F0XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICAgIFtmaWVsZC5uYW1lXToge1xuICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIGZpZWxkLmhhc01hbnkgPT09IHRydWUgPyBuZXcgR3JhcGhRTExpc3QodHlwZSkgOiB0eXBlLFxuICAgICAgICAgICAgZm9yY2VOdWxsYWJsZSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0sXG4gICAgcG9pbnQ6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFBvaW50RmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgbmV3IEdyYXBoUUxMaXN0KEdyYXBoUUxGbG9hdCksIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgcmFkaW86IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFJhZGlvRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICByZWxhdGlvbnNoaXA6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFJlbGF0aW9uc2hpcEZpZWxkKSA9PiB7XG4gICAgICBjb25zdCB7IHJlbGF0aW9uVG8gfSA9IGZpZWxkXG4gICAgICB0eXBlIFBheWxvYWRHcmFwaFFMUmVsYXRpb25zaGlwVHlwZSA9XG4gICAgICAgIHwgR3JhcGhRTElucHV0T2JqZWN0VHlwZVxuICAgICAgICB8IEdyYXBoUUxMaXN0PEdyYXBoUUxTY2FsYXJUeXBlPlxuICAgICAgICB8IEdyYXBoUUxTY2FsYXJUeXBlXG4gICAgICBsZXQgdHlwZTogUGF5bG9hZEdyYXBoUUxSZWxhdGlvbnNoaXBUeXBlXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gYCR7Y29tYmluZVBhcmVudE5hbWUoXG4gICAgICAgICAgcGFyZW50TmFtZSxcbiAgICAgICAgICB0b1dvcmRzKGZpZWxkLm5hbWUsIHRydWUpLFxuICAgICAgICApfVJlbGF0aW9uc2hpcElucHV0YFxuICAgICAgICB0eXBlID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZ1bGxOYW1lLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgcmVsYXRpb25Ubzoge1xuICAgICAgICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTEVudW1UeXBlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtmdWxsTmFtZX1SZWxhdGlvblRvYCxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHJlbGF0aW9uVG8ucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKHZhbHVlcywgb3B0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXROYW1lKG9wdGlvbildOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogR3JhcGhRTEpTT04gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IGdldENvbGxlY3Rpb25JRFR5cGUocGF5bG9hZCwgcGF5bG9hZC5jb2xsZWN0aW9uc1tyZWxhdGlvblRvXS5jb25maWcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IGZpZWxkLmhhc01hbnkgPyBuZXcgR3JhcGhRTExpc3QodHlwZSkgOiB0eXBlIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICByaWNoVGV4dDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUmljaFRleHRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMSlNPTiwgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICByb3c6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFJvd0ZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRzLnJlZHVjZSgoYWNjLCBzdWJGaWVsZDogRmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgYWRkU3ViRmllbGQgPSBmaWVsZFRvU2NoZW1hTWFwW3N1YkZpZWxkLnR5cGVdXG4gICAgICAgIGlmIChhZGRTdWJGaWVsZCkgcmV0dXJuIGFkZFN1YkZpZWxkKGFjYywgc3ViRmllbGQpXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIGlucHV0T2JqZWN0VHlwZUNvbmZpZyksXG4gICAgc2VsZWN0OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBTZWxlY3RGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGAke2NvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIGZpZWxkLm5hbWUpfV9NdXRhdGlvbklucHV0YFxuICAgICAgbGV0IHR5cGU6IEdyYXBoUUxUeXBlID0gbmV3IEdyYXBoUUxFbnVtVHlwZSh7XG4gICAgICAgIG5hbWU6IGZvcm1hdHRlZE5hbWUsXG4gICAgICAgIHZhbHVlczogZmllbGQub3B0aW9ucy5yZWR1Y2UoKHZhbHVlcywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbklzT2JqZWN0KG9wdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgICAgW2Zvcm1hdE5hbWUob3B0aW9uLnZhbHVlKV06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24pXToge1xuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIHR5cGUgPSBmaWVsZC5oYXNNYW55ID8gbmV3IEdyYXBoUUxMaXN0KHR5cGUpIDogdHlwZVxuICAgICAgdHlwZSA9IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIHR5cGUsIGZvcmNlTnVsbGFibGUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYnM6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRhYnNGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLnRhYnMucmVkdWNlKChhY2MsIHRhYikgPT4ge1xuICAgICAgICBpZiAodGFiSGFzTmFtZSh0YWIpKSB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBjb21iaW5lUGFyZW50TmFtZShwYXJlbnROYW1lLCB0b1dvcmRzKHRhYi5uYW1lLCB0cnVlKSlcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCA9IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkKGZpZWxkKVxuICAgICAgICAgIGxldCB0eXBlOiBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUocGF5bG9hZCwgZnVsbE5hbWUsIHRhYi5maWVsZHMsIGZ1bGxOYW1lKVxuXG4gICAgICAgICAgaWYgKCF0eXBlKSByZXR1cm4gYWNjXG5cbiAgICAgICAgICBpZiAocmVxdWlyZXNBdExlYXN0T25lRmllbGQpIHR5cGUgPSBuZXcgR3JhcGhRTE5vbk51bGwodHlwZSlcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgW3RhYi5uYW1lXTogeyB0eXBlIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgLi4udGFiLmZpZWxkcy5yZWR1Y2UoKHN1YkZpZWxkU2NoZW1hLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRkU3ViRmllbGQgPSBmaWVsZFRvU2NoZW1hTWFwW3N1YkZpZWxkLnR5cGVdXG4gICAgICAgICAgICBpZiAoYWRkU3ViRmllbGQpIHJldHVybiBhZGRTdWJGaWVsZChzdWJGaWVsZFNjaGVtYSwgc3ViRmllbGQpXG4gICAgICAgICAgICByZXR1cm4gc3ViRmllbGRTY2hlbWFcbiAgICAgICAgICB9LCBhY2MpLFxuICAgICAgICB9XG4gICAgICB9LCBpbnB1dE9iamVjdFR5cGVDb25maWcpXG4gICAgfSxcbiAgICB0ZXh0OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBUZXh0RmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHtcbiAgICAgICAgdHlwZTogd2l0aE51bGxhYmxlVHlwZShcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBmaWVsZC5oYXNNYW55ID09PSB0cnVlID8gbmV3IEdyYXBoUUxMaXN0KEdyYXBoUUxTdHJpbmcpIDogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICBmb3JjZU51bGxhYmxlLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9KSxcbiAgICB0ZXh0YXJlYTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogVGV4dGFyZWFGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIHVwbG9hZDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogVXBsb2FkRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgfVxuXG4gIGNvbnN0IGZpZWxkTmFtZSA9IGZvcm1hdE5hbWUobmFtZSlcblxuICBjb25zdCBmaWVsZFNjaGVtYXMgPSBmaWVsZHMucmVkdWNlKChpbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkKSA9PiB7XG4gICAgY29uc3QgZmllbGRTY2hlbWEgPSBmaWVsZFRvU2NoZW1hTWFwW2ZpZWxkLnR5cGVdXG5cbiAgICBpZiAodHlwZW9mIGZpZWxkU2NoZW1hICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaW5wdXRPYmplY3RUeXBlQ29uZmlnXG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gZmllbGRTY2hlbWEoaW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZClcbiAgICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgLi4uZmllbGRTY2hlbWEoaW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZCksXG4gICAgfVxuICB9LCB7fSlcblxuICBpZiAoT2JqZWN0LmtleXMoZmllbGRTY2hlbWFzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgICBuYW1lOiBgbXV0YXRpb24ke2ZpZWxkTmFtZX1JbnB1dGAsXG4gICAgZmllbGRzOiBmaWVsZFNjaGVtYXMsXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGVcbiJdLCJuYW1lcyI6WyJnZXRDb2xsZWN0aW9uSURUeXBlIiwiaWRGaWVsZFR5cGVzIiwibnVtYmVyIiwiR3JhcGhRTEludCIsInRleHQiLCJHcmFwaFFMU3RyaW5nIiwicGF5bG9hZCIsImNvbGxlY3Rpb24iLCJpZEZpZWxkIiwiZmxhdHRlbkZpZWxkcyIsImZpZWxkcyIsImZpbmQiLCJmaWVsZCIsImZpZWxkQWZmZWN0c0RhdGEiLCJuYW1lIiwiZGIiLCJkZWZhdWx0SURUeXBlIiwidHlwZSIsImJ1aWxkTXV0YXRpb25JbnB1dFR5cGUiLCJwYXJlbnROYW1lIiwiZm9yY2VOdWxsYWJsZSIsImZpZWxkVG9TY2hlbWFNYXAiLCJhcnJheSIsImlucHV0T2JqZWN0VHlwZUNvbmZpZyIsImZ1bGxOYW1lIiwiY29tYmluZVBhcmVudE5hbWUiLCJ0b1dvcmRzIiwiR3JhcGhRTExpc3QiLCJ3aXRoTnVsbGFibGVUeXBlIiwiYmxvY2tzIiwiR3JhcGhRTEpTT04iLCJjaGVja2JveCIsIkdyYXBoUUxCb29sZWFuIiwiY29kZSIsImNvbGxhcHNpYmxlIiwicmVkdWNlIiwiYWNjIiwic3ViRmllbGQiLCJhZGRTdWJGaWVsZCIsImRhdGUiLCJlbWFpbCIsImdyb3VwIiwicmVxdWlyZXNBdExlYXN0T25lRmllbGQiLCJncm91cE9yVGFiSGFzUmVxdWlyZWRTdWJmaWVsZCIsIkdyYXBoUUxOb25OdWxsIiwianNvbiIsIkdyYXBoUUxGbG9hdCIsImhhc01hbnkiLCJwb2ludCIsInJhZGlvIiwicmVsYXRpb25zaGlwIiwicmVsYXRpb25UbyIsIkFycmF5IiwiaXNBcnJheSIsIkdyYXBoUUxJbnB1dE9iamVjdFR5cGUiLCJHcmFwaFFMRW51bVR5cGUiLCJ2YWx1ZXMiLCJvcHRpb24iLCJmb3JtYXROYW1lIiwidmFsdWUiLCJjb2xsZWN0aW9ucyIsImNvbmZpZyIsInJpY2hUZXh0Iiwicm93Iiwic2VsZWN0IiwiZm9ybWF0dGVkTmFtZSIsIm9wdGlvbnMiLCJvcHRpb25Jc09iamVjdCIsInRhYnMiLCJ0YWIiLCJ0YWJIYXNOYW1lIiwic3ViRmllbGRTY2hlbWEiLCJ0ZXh0YXJlYSIsInVwbG9hZCIsImZpZWxkTmFtZSIsImZpZWxkU2NoZW1hcyIsImZpZWxkU2NoZW1hIiwic2NoZW1hIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUEsdUNBQXVDOzs7Ozs7Ozs7OztJQWlVdkMsT0FBcUM7ZUFBckM7O0lBM1FhQSxtQkFBbUI7ZUFBbkJBOzs7eUJBMUNOO2lDQUNxQjt1QkE0QmlDOzhCQUNyQzsrQ0FDc0I7MEVBQ2hCO21FQUNQO3lFQUNNOzhFQUNIOzs7Ozs7QUFFMUIsTUFBTUMsZUFBZTtJQUNuQkMsUUFBUUMsbUJBQVU7SUFDbEJDLE1BQU1DLHNCQUFhO0FBQ3JCO0FBRU8sTUFBTUwsc0JBQXNCLENBQ2pDTSxTQUNBQztJQUVBLE1BQU1DLFVBQVVDLElBQUFBLDhCQUFhLEVBQUNGLFdBQVdHLE1BQU0sRUFBRUMsSUFBSSxDQUNuRCxDQUFDQyxRQUFVQyxJQUFBQSx1QkFBZ0IsRUFBQ0QsVUFBVUEsTUFBTUUsSUFBSSxLQUFLO0lBR3ZELElBQUksQ0FBQ04sU0FBUztRQUNaLE9BQU9QLFlBQVksQ0FBQ0ssUUFBUVMsRUFBRSxDQUFDQyxhQUFhLENBQUM7SUFDL0M7SUFFQSxPQUFPZixZQUFZLENBQUNPLFFBQVFTLElBQUksQ0FBQztBQUNuQztBQU1BLFNBQVNDLHVCQUNQWixPQUFnQixFQUNoQlEsSUFBWSxFQUNaSixNQUFlLEVBQ2ZTLFVBQWtCLEVBQ2xCQyxnQkFBZ0Is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