UNPKG

mzinga

Version:

Node, React and MongoDB Headless CMS and Application Framework

557 lines (556 loc) 61.8 kB
/* eslint-disable no-param-reassign */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return _default; } }); const _graphql = require("graphql"); const _forgotPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/forgotPassword")); const _init = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/init")); const _login = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/login")); const _logout = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/logout")); const _me = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/me")); const _refresh = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/refresh")); const _resetPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/resetPassword")); const _unlock = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/unlock")); const _verifyEmail = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/verifyEmail")); const _types = require("../../fields/config/types"); const _buildMutationInputType = /*#__PURE__*/ _interop_require_wildcard(require("../../graphql/schema/buildMutationInputType")); const _buildObjectType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildObjectType")); const _buildPaginatedListType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildPaginatedListType")); const _buildPoliciesType = require("../../graphql/schema/buildPoliciesType"); const _buildWhereInputType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildWhereInputType")); const _formatName = /*#__PURE__*/ _interop_require_default(require("../../graphql/utilities/formatName")); const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields")); const _formatLabels = require("../../utilities/formatLabels"); const _buildCollectionFields = require("../../versions/buildCollectionFields"); const _count = /*#__PURE__*/ _interop_require_default(require("./resolvers/count")); const _create = /*#__PURE__*/ _interop_require_default(require("./resolvers/create")); const _delete = /*#__PURE__*/ _interop_require_default(require("./resolvers/delete")); const _docAccess = require("./resolvers/docAccess"); const _find = /*#__PURE__*/ _interop_require_default(require("./resolvers/find")); const _findByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findByID")); const _findVersionByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersionByID")); const _findVersions = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersions")); const _restoreVersion = /*#__PURE__*/ _interop_require_default(require("./resolvers/restoreVersion")); const _update = /*#__PURE__*/ _interop_require_default(require("./resolvers/update")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function initCollectionsGraphQL(payload) { Object.keys(payload.collections).forEach((slug)=>{ const collection = payload.collections[slug]; const { config, config: { fields, graphQL = {}, versions } } = collection; if (!graphQL) return; const draftsEnabled = collection.config.versions?.drafts; let singularName; let pluralName; const fromSlug = (0, _formatLabels.formatNames)(collection.config.slug); if (graphQL.singularName) { singularName = (0, _formatLabels.toWords)(graphQL.singularName, true); } else { singularName = fromSlug.singular; } if (graphQL.pluralName) { pluralName = (0, _formatLabels.toWords)(graphQL.pluralName, true); } else { pluralName = fromSlug.plural; } // For collections named 'Media' or similar, // there is a possibility that the singular name // will equal the plural name. Append `all` to the beginning // of potential conflicts if (singularName === pluralName) { pluralName = `all${singularName}`; } collection.graphQL = {}; const hasIDField = (0, _flattenTopLevelFields.default)(fields).findIndex((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id') > -1; const idType = (0, _buildMutationInputType.getCollectionIDType)(payload, config); const baseFields = {}; const whereInputFields = [ ...fields ]; if (!hasIDField) { baseFields.id = { type: idType }; whereInputFields.push({ name: 'id', type: payload.db.defaultIDType }); } const forceNullableObjectType = Boolean(versions?.drafts); collection.graphQL.type = (0, _buildObjectType.default)({ name: singularName, baseFields, fields, forceNullable: forceNullableObjectType, parentName: singularName, payload }); collection.graphQL.paginatedType = (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type); collection.graphQL.whereInputType = (0, _buildWhereInputType.default)({ name: singularName, fields: whereInputFields, parentName: singularName, payload }); if (config.auth && !config.auth.disableLocalStrategy) { fields.push({ name: 'password', type: 'text', label: 'Password', required: true }); } const createMutationInputType = (0, _buildMutationInputType.default)(payload, singularName, fields, singularName); if (createMutationInputType) { collection.graphQL.mutationInputType = new _graphql.GraphQLNonNull(createMutationInputType); } const updateMutationInputType = (0, _buildMutationInputType.default)(payload, `${singularName}Update`, fields.filter((field)=>!((0, _types.fieldAffectsData)(field) && field.name === 'id')), `${singularName}Update`, true); if (updateMutationInputType) { collection.graphQL.updateMutationInputType = new _graphql.GraphQLNonNull(updateMutationInputType); } payload.Query.fields[singularName] = { type: collection.graphQL.type, args: { id: { type: new _graphql.GraphQLNonNull(idType) }, ...draftsEnabled ? { draft: { type: _graphql.GraphQLBoolean } } : {}, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _findByID.default)(collection) }; payload.Query.fields[pluralName] = { type: (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type), args: { ...draftsEnabled ? { draft: { type: _graphql.GraphQLBoolean } } : {}, where: { type: collection.graphQL.whereInputType }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {}, limit: { type: _graphql.GraphQLInt }, page: { type: _graphql.GraphQLInt }, sort: { type: _graphql.GraphQLString } }, resolve: (0, _find.default)(collection) }; payload.Query.fields[`count${pluralName}`] = { type: new _graphql.GraphQLObjectType({ name: `count${pluralName}`, fields: { totalDocs: { type: _graphql.GraphQLInt } } }), args: { ...draftsEnabled ? { draft: { type: _graphql.GraphQLBoolean } } : {}, where: { type: collection.graphQL.whereInputType }, ...payload.config.localization ? { locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _count.default)(collection) }; payload.Query.fields[`docAccess${singularName}`] = { type: (0, _buildPoliciesType.buildPolicyType)({ type: 'collection', entity: config, scope: 'docAccess', typeSuffix: 'DocAccess' }), args: { id: { type: new _graphql.GraphQLNonNull(idType) } }, resolve: (0, _docAccess.docAccessResolver)() }; payload.Mutation.fields[`create${singularName}`] = { type: collection.graphQL.type, args: { ...createMutationInputType ? { data: { type: collection.graphQL.mutationInputType } } : {}, ...draftsEnabled ? { draft: { type: _graphql.GraphQLBoolean } } : {}, ...payload.config.localization ? { locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _create.default)(collection) }; payload.Mutation.fields[`update${singularName}`] = { type: collection.graphQL.type, args: { id: { type: new _graphql.GraphQLNonNull(idType) }, autosave: { type: _graphql.GraphQLBoolean }, ...updateMutationInputType ? { data: { type: collection.graphQL.updateMutationInputType } } : {}, ...draftsEnabled ? { draft: { type: _graphql.GraphQLBoolean } } : {}, ...payload.config.localization ? { locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _update.default)(collection) }; payload.Mutation.fields[`delete${singularName}`] = { type: collection.graphQL.type, args: { id: { type: new _graphql.GraphQLNonNull(idType) } }, resolve: (0, _delete.default)(collection) }; if (config.versions) { const versionIDType = payload.db.defaultIDType === 'text' ? _graphql.GraphQLString : _graphql.GraphQLInt; const versionCollectionFields = [ ...(0, _buildCollectionFields.buildVersionCollectionFields)(config), { name: 'id', type: payload.db.defaultIDType }, { name: 'createdAt', type: 'date', label: 'Created At' }, { name: 'updatedAt', type: 'date', label: 'Updated At' } ]; collection.graphQL.versionType = (0, _buildObjectType.default)({ name: `${singularName}Version`, fields: versionCollectionFields, forceNullable: forceNullableObjectType, parentName: `${singularName}Version`, payload }); payload.Query.fields[`version${(0, _formatName.default)(singularName)}`] = { type: collection.graphQL.versionType, args: { id: { type: versionIDType }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {} }, resolve: (0, _findVersionByID.default)(collection) }; payload.Query.fields[`versions${pluralName}`] = { type: (0, _buildPaginatedListType.default)(`versions${(0, _formatName.default)(pluralName)}`, collection.graphQL.versionType), args: { where: { type: (0, _buildWhereInputType.default)({ name: `versions${singularName}`, fields: versionCollectionFields, parentName: `versions${singularName}`, payload }) }, ...payload.config.localization ? { fallbackLocale: { type: payload.types.fallbackLocaleInputType }, locale: { type: payload.types.localeInputType } } : {}, limit: { type: _graphql.GraphQLInt }, page: { type: _graphql.GraphQLInt }, sort: { type: _graphql.GraphQLString } }, resolve: (0, _findVersions.default)(collection) }; payload.Mutation.fields[`restoreVersion${(0, _formatName.default)(singularName)}`] = { type: collection.graphQL.type, args: { id: { type: versionIDType } }, resolve: (0, _restoreVersion.default)(collection) }; } if (config.auth) { const authFields = config.auth.disableLocalStrategy ? [] : [ { name: 'email', type: 'email', required: true } ]; collection.graphQL.JWT = (0, _buildObjectType.default)({ name: (0, _formatName.default)(`${slug}JWT`), fields: [ ...config.fields.filter((field)=>(0, _types.fieldAffectsData)(field) && field.saveToJWT), ...authFields, { name: 'collection', type: 'text', required: true } ], parentName: (0, _formatName.default)(`${slug}JWT`), payload }); payload.Query.fields[`me${singularName}`] = { type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}Me`), fields: { collection: { type: _graphql.GraphQLString }, exp: { type: _graphql.GraphQLInt }, strategy: { type: _graphql.GraphQLString }, token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }), resolve: (0, _me.default)(collection) }; payload.Query.fields[`initialized${singularName}`] = { type: _graphql.GraphQLBoolean, resolve: (0, _init.default)(collection.config.slug) }; payload.Mutation.fields[`refreshToken${singularName}`] = { type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}Refreshed${singularName}`), fields: { exp: { type: _graphql.GraphQLInt }, refreshedToken: { type: _graphql.GraphQLString }, strategy: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.JWT } } }), resolve: (0, _refresh.default)(collection) }; payload.Mutation.fields[`logout${singularName}`] = { type: _graphql.GraphQLString, resolve: (0, _logout.default)(collection) }; if (!config.auth.disableLocalStrategy) { if (config.auth.maxLoginAttempts > 0) { payload.Mutation.fields[`unlock${singularName}`] = { type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean), args: { email: { type: new _graphql.GraphQLNonNull(_graphql.GraphQLString) } }, resolve: (0, _unlock.default)(collection) }; } payload.Mutation.fields[`login${singularName}`] = { type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}LoginResult`), fields: { exp: { type: _graphql.GraphQLInt }, token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }), args: { email: { type: _graphql.GraphQLString }, password: { type: _graphql.GraphQLString } }, resolve: (0, _login.default)(collection) }; payload.Mutation.fields[`forgotPassword${singularName}`] = { type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean), args: { disableEmail: { type: _graphql.GraphQLBoolean }, email: { type: new _graphql.GraphQLNonNull(_graphql.GraphQLString) }, expiration: { type: _graphql.GraphQLInt } }, resolve: (0, _forgotPassword.default)(collection) }; payload.Mutation.fields[`resetPassword${singularName}`] = { type: new _graphql.GraphQLObjectType({ name: (0, _formatName.default)(`${slug}ResetPassword`), fields: { token: { type: _graphql.GraphQLString }, user: { type: collection.graphQL.type } } }), args: { password: { type: _graphql.GraphQLString }, token: { type: _graphql.GraphQLString } }, resolve: (0, _resetPassword.default)(collection) }; payload.Mutation.fields[`verifyEmail${singularName}`] = { type: _graphql.GraphQLBoolean, args: { token: { type: _graphql.GraphQLString } }, resolve: (0, _verifyEmail.default)(collection) }; } } }); } const _default = initCollectionsGraphQL; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9ncmFwaHFsL2luaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7XG4gIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMSW50LFxuICBHcmFwaFFMTm9uTnVsbCxcbiAgR3JhcGhRTE9iamVjdFR5cGUsXG4gIEdyYXBoUUxTdHJpbmcsXG59IGZyb20gJ2dyYXBocWwnXG5cbmltcG9ydCB0eXBlIHsgRmllbGQgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RUeXBlQ29uZmlnIH0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRPYmplY3RUeXBlJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vLi4vbXppbmdhJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uLCBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgZm9yZ290UGFzc3dvcmQgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9mb3Jnb3RQYXNzd29yZCdcbmltcG9ydCBpbml0IGZyb20gJy4uLy4uL2F1dGgvZ3JhcGhxbC9yZXNvbHZlcnMvaW5pdCdcbmltcG9ydCBsb2dpbiBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL2xvZ2luJ1xuaW1wb3J0IGxvZ291dCBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL2xvZ291dCdcbmltcG9ydCBtZSBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL21lJ1xuaW1wb3J0IHJlZnJlc2ggZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9yZWZyZXNoJ1xuaW1wb3J0IHJlc2V0UGFzc3dvcmQgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9yZXNldFBhc3N3b3JkJ1xuaW1wb3J0IHVubG9jayBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL3VubG9jaydcbmltcG9ydCB2ZXJpZnlFbWFpbCBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL3ZlcmlmeUVtYWlsJ1xuaW1wb3J0IHsgZmllbGRBZmZlY3RzRGF0YSB9IGZyb20gJy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgYnVpbGRNdXRhdGlvbklucHV0VHlwZSwge1xuICBnZXRDb2xsZWN0aW9uSURUeXBlLFxufSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZE11dGF0aW9uSW5wdXRUeXBlJ1xuaW1wb3J0IGJ1aWxkT2JqZWN0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZE9iamVjdFR5cGUnXG5pbXBvcnQgYnVpbGRQYWdpbmF0ZWRMaXN0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZFBhZ2luYXRlZExpc3RUeXBlJ1xuaW1wb3J0IHsgYnVpbGRQb2xpY3lUeXBlIH0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRQb2xpY2llc1R5cGUnXG5pbXBvcnQgYnVpbGRXaGVyZUlucHV0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZFdoZXJlSW5wdXRUeXBlJ1xuaW1wb3J0IGZvcm1hdE5hbWUgZnJvbSAnLi4vLi4vZ3JhcGhxbC91dGlsaXRpZXMvZm9ybWF0TmFtZSdcbmltcG9ydCBmbGF0dGVuRmllbGRzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9mbGF0dGVuVG9wTGV2ZWxGaWVsZHMnXG5pbXBvcnQgeyBmb3JtYXROYW1lcywgdG9Xb3JkcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9mb3JtYXRMYWJlbHMnXG5pbXBvcnQgeyBidWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvYnVpbGRDb2xsZWN0aW9uRmllbGRzJ1xuaW1wb3J0IGNvdW50UmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvY291bnQnXG5pbXBvcnQgY3JlYXRlUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvY3JlYXRlJ1xuaW1wb3J0IGdldERlbGV0ZVJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2RlbGV0ZSdcbmltcG9ydCB7IGRvY0FjY2Vzc1Jlc29sdmVyIH0gZnJvbSAnLi9yZXNvbHZlcnMvZG9jQWNjZXNzJ1xuaW1wb3J0IGZpbmRSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy9maW5kJ1xuaW1wb3J0IGZpbmRCeUlEUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvZmluZEJ5SUQnXG5pbXBvcnQgZmluZFZlcnNpb25CeUlEUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvZmluZFZlcnNpb25CeUlEJ1xuaW1wb3J0IGZpbmRWZXJzaW9uc1Jlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2ZpbmRWZXJzaW9ucydcbmltcG9ydCByZXN0b3JlVmVyc2lvblJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL3Jlc3RvcmVWZXJzaW9uJ1xuaW1wb3J0IHVwZGF0ZVJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL3VwZGF0ZSdcblxuZnVuY3Rpb24gaW5pdENvbGxlY3Rpb25zR3JhcGhRTChwYXlsb2FkOiBQYXlsb2FkKTogdm9pZCB7XG4gIE9iamVjdC5rZXlzKHBheWxvYWQuY29sbGVjdGlvbnMpLmZvckVhY2goKHNsdWcpID0+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tzbHVnXVxuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZzogeyBmaWVsZHMsIGdyYXBoUUwgPSB7fSBhcyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnWydncmFwaFFMJ10sIHZlcnNpb25zIH0sXG4gICAgfSA9IGNvbGxlY3Rpb25cblxuICAgIGlmICghZ3JhcGhRTCkgcmV0dXJuXG5cbiAgICBjb25zdCBkcmFmdHNFbmFibGVkID0gY29sbGVjdGlvbi5jb25maWcudmVyc2lvbnM/LmRyYWZ0c1xuXG4gICAgbGV0IHNpbmd1bGFyTmFtZVxuICAgIGxldCBwbHVyYWxOYW1lXG4gICAgY29uc3QgZnJvbVNsdWcgPSBmb3JtYXROYW1lcyhjb2xsZWN0aW9uLmNvbmZpZy5zbHVnKVxuICAgIGlmIChncmFwaFFMLnNpbmd1bGFyTmFtZSkge1xuICAgICAgc2luZ3VsYXJOYW1lID0gdG9Xb3JkcyhncmFwaFFMLnNpbmd1bGFyTmFtZSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2luZ3VsYXJOYW1lID0gZnJvbVNsdWcuc2luZ3VsYXJcbiAgICB9XG4gICAgaWYgKGdyYXBoUUwucGx1cmFsTmFtZSkge1xuICAgICAgcGx1cmFsTmFtZSA9IHRvV29yZHMoZ3JhcGhRTC5wbHVyYWxOYW1lLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwbHVyYWxOYW1lID0gZnJvbVNsdWcucGx1cmFsXG4gICAgfVxuXG4gICAgLy8gRm9yIGNvbGxlY3Rpb25zIG5hbWVkICdNZWRpYScgb3Igc2ltaWxhcixcbiAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHNpbmd1bGFyIG5hbWVcbiAgICAvLyB3aWxsIGVxdWFsIHRoZSBwbHVyYWwgbmFtZS4gQXBwZW5kIGBhbGxgIHRvIHRoZSBiZWdpbm5pbmdcbiAgICAvLyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzXG4gICAgaWYgKHNpbmd1bGFyTmFtZSA9PT0gcGx1cmFsTmFtZSkge1xuICAgICAgcGx1cmFsTmFtZSA9IGBhbGwke3Npbmd1bGFyTmFtZX1gXG4gICAgfVxuXG4gICAgY29sbGVjdGlvbi5ncmFwaFFMID0ge30gYXMgQ29sbGVjdGlvblsnZ3JhcGhRTCddXG5cbiAgICBjb25zdCBoYXNJREZpZWxkID1cbiAgICAgIGZsYXR0ZW5GaWVsZHMoZmllbGRzKS5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKSA+XG4gICAgICAtMVxuXG4gICAgY29uc3QgaWRUeXBlID0gZ2V0Q29sbGVjdGlvbklEVHlwZShwYXlsb2FkLCBjb25maWcpXG5cbiAgICBjb25zdCBiYXNlRmllbGRzOiBPYmplY3RUeXBlQ29uZmlnID0ge31cblxuICAgIGNvbnN0IHdoZXJlSW5wdXRGaWVsZHMgPSBbLi4uZmllbGRzXVxuXG4gICAgaWYgKCFoYXNJREZpZWxkKSB7XG4gICAgICBiYXNlRmllbGRzLmlkID0geyB0eXBlOiBpZFR5cGUgfVxuICAgICAgd2hlcmVJbnB1dEZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ2lkJyxcbiAgICAgICAgdHlwZTogcGF5bG9hZC5kYi5kZWZhdWx0SURUeXBlIGFzICd0ZXh0JyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgZm9yY2VOdWxsYWJsZU9iamVjdFR5cGUgPSBCb29sZWFuKHZlcnNpb25zPy5kcmFmdHMpXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSA9IGJ1aWxkT2JqZWN0VHlwZSh7XG4gICAgICBuYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBiYXNlRmllbGRzLFxuICAgICAgZmllbGRzLFxuICAgICAgZm9yY2VOdWxsYWJsZTogZm9yY2VOdWxsYWJsZU9iamVjdFR5cGUsXG4gICAgICBwYXJlbnROYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwucGFnaW5hdGVkVHlwZSA9IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUocGx1cmFsTmFtZSwgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUpXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwud2hlcmVJbnB1dFR5cGUgPSBidWlsZFdoZXJlSW5wdXRUeXBlKHtcbiAgICAgIG5hbWU6IHNpbmd1bGFyTmFtZSxcbiAgICAgIGZpZWxkczogd2hlcmVJbnB1dEZpZWxkcyxcbiAgICAgIHBhcmVudE5hbWU6IHNpbmd1bGFyTmFtZSxcbiAgICAgIHBheWxvYWQsXG4gICAgfSlcblxuICAgIGlmIChjb25maWcuYXV0aCAmJiAhY29uZmlnLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3kpIHtcbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICBsYWJlbDogJ1Bhc3N3b3JkJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBzaW5ndWxhck5hbWUsXG4gICAgICBmaWVsZHMsXG4gICAgICBzaW5ndWxhck5hbWUsXG4gICAgKVxuICAgIGlmIChjcmVhdGVNdXRhdGlvbklucHV0VHlwZSkge1xuICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLm11dGF0aW9uSW5wdXRUeXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlKVxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBgJHtzaW5ndWxhck5hbWV9VXBkYXRlYCxcbiAgICAgIGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcpKSxcbiAgICAgIGAke3Npbmd1bGFyTmFtZX1VcGRhdGVgLFxuICAgICAgdHJ1ZSxcbiAgICApXG4gICAgaWYgKHVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlKSB7XG4gICAgICBjb2xsZWN0aW9uLmdyYXBoUUwudXBkYXRlTXV0YXRpb25JbnB1dFR5cGUgPSBuZXcgR3JhcGhRTE5vbk51bGwodXBkYXRlTXV0YXRpb25JbnB1dFR5cGUpXG4gICAgfVxuXG4gICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbc2luZ3VsYXJOYW1lXSA9IHtcbiAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgYXJnczoge1xuICAgICAgICBpZDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoaWRUeXBlKSB9LFxuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZhbGxiYWNrTG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMuZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUgfSxcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZmluZEJ5SURSZXNvbHZlcihjb2xsZWN0aW9uKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1twbHVyYWxOYW1lXSA9IHtcbiAgICAgIHR5cGU6IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUocGx1cmFsTmFtZSwgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUpLFxuICAgICAgYXJnczoge1xuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICB3aGVyZTogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwud2hlcmVJbnB1dFR5cGUgfSxcbiAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmZhbGxiYWNrTG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBsaW1pdDogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgIHBhZ2U6IHsgdHlwZTogR3JhcGhRTEludCB9LFxuICAgICAgICBzb3J0OiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiBmaW5kUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbYGNvdW50JHtwbHVyYWxOYW1lfWBdID0ge1xuICAgICAgdHlwZTogbmV3IEdyYXBoUUxPYmplY3RUeXBlKHtcbiAgICAgICAgbmFtZTogYGNvdW50JHtwbHVyYWxOYW1lfWAsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHRvdGFsRG9jczogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uKGRyYWZ0c0VuYWJsZWRcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZHJhZnQ6IHsgdHlwZTogR3JhcGhRTEJvb2xlYW4gfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgd2hlcmU6IHsgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLndoZXJlSW5wdXRUeXBlIH0sXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogY291bnRSZXNvbHZlcihjb2xsZWN0aW9uKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgZG9jQWNjZXNzJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICB0eXBlOiBidWlsZFBvbGljeVR5cGUoe1xuICAgICAgICB0eXBlOiAnY29sbGVjdGlvbicsXG4gICAgICAgIGVudGl0eTogY29uZmlnLFxuICAgICAgICBzY29wZTogJ2RvY0FjY2VzcycsXG4gICAgICAgIHR5cGVTdWZmaXg6ICdEb2NBY2Nlc3MnLFxuICAgICAgfSksXG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZG9jQWNjZXNzUmVzb2x2ZXIoKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgY3JlYXRlJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uKGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlXG4gICAgICAgICAgPyB7IGRhdGE6IHsgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLm11dGF0aW9uSW5wdXRUeXBlIH0gfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IGNyZWF0ZVJlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgIH1cblxuICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2B1cGRhdGUke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgYXJnczoge1xuICAgICAgICBpZDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoaWRUeXBlKSB9LFxuICAgICAgICBhdXRvc2F2ZTogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAuLi4odXBkYXRlTXV0YXRpb25JbnB1dFR5cGVcbiAgICAgICAgICA/IHsgZGF0YTogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudXBkYXRlTXV0YXRpb25JbnB1dFR5cGUgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihkcmFmdHNFbmFibGVkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRyYWZ0OiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogdXBkYXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYGRlbGV0ZSR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZ2V0RGVsZXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy52ZXJzaW9ucykge1xuICAgICAgY29uc3QgdmVyc2lvbklEVHlwZSA9IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSA9PT0gJ3RleHQnID8gR3JhcGhRTFN0cmluZyA6IEdyYXBoUUxJbnRcbiAgICAgIGNvbnN0IHZlcnNpb25Db2xsZWN0aW9uRmllbGRzOiBGaWVsZFtdID0gW1xuICAgICAgICAuLi5idWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzKGNvbmZpZyksXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSBhcyAndGV4dCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnY3JlYXRlZEF0JyxcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgbGFiZWw6ICdDcmVhdGVkIEF0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICd1cGRhdGVkQXQnLFxuICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgQXQnLFxuICAgICAgICB9LFxuICAgICAgXVxuXG4gICAgICBjb2xsZWN0aW9uLmdyYXBoUUwudmVyc2lvblR5cGUgPSBidWlsZE9iamVjdFR5cGUoe1xuICAgICAgICBuYW1lOiBgJHtzaW5ndWxhck5hbWV9VmVyc2lvbmAsXG4gICAgICAgIGZpZWxkczogdmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMsXG4gICAgICAgIGZvcmNlTnVsbGFibGU6IGZvcmNlTnVsbGFibGVPYmplY3RUeXBlLFxuICAgICAgICBwYXJlbnROYW1lOiBgJHtzaW5ndWxhck5hbWV9VmVyc2lvbmAsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuXG4gICAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgdmVyc2lvbiR7Zm9ybWF0TmFtZShzaW5ndWxhck5hbWUpfWBdID0ge1xuICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudmVyc2lvblR5cGUsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBpZDogeyB0eXBlOiB2ZXJzaW9uSURUeXBlIH0sXG4gICAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5mYWxsYmFja0xvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZTogZmluZFZlcnNpb25CeUlEUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgdmVyc2lvbnMke3BsdXJhbE5hbWV9YF0gPSB7XG4gICAgICAgIHR5cGU6IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUoXG4gICAgICAgICAgYHZlcnNpb25zJHtmb3JtYXROYW1lKHBsdXJhbE5hbWUpfWAsXG4gICAgICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLnZlcnNpb25UeXBlLFxuICAgICAgICApLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIHR5cGU6IGJ1aWxkV2hlcmVJbnB1dFR5cGUoe1xuICAgICAgICAgICAgICBuYW1lOiBgdmVyc2lvbnMke3Npbmd1bGFyTmFtZX1gLFxuICAgICAgICAgICAgICBmaWVsZHM6IHZlcnNpb25Db2xsZWN0aW9uRmllbGRzLFxuICAgICAgICAgICAgICBwYXJlbnROYW1lOiBgdmVyc2lvbnMke3Npbmd1bGFyTmFtZX1gLFxuICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmZhbGxiYWNrTG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIGxpbWl0OiB7IHR5cGU6IEdyYXBoUUxJbnQgfSxcbiAgICAgICAgICBwYWdlOiB7IHR5cGU6IEdyYXBoUUxJbnQgfSxcbiAgICAgICAgICBzb3J0OiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZTogZmluZFZlcnNpb25zUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgcmVzdG9yZVZlcnNpb24ke2Zvcm1hdE5hbWUoc2luZ3VsYXJOYW1lKX1gXSA9IHtcbiAgICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBpZDogeyB0eXBlOiB2ZXJzaW9uSURUeXBlIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IHJlc3RvcmVWZXJzaW9uUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICBjb25zdCBhdXRoRmllbGRzOiBGaWVsZFtdID0gY29uZmlnLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3lcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgdHlwZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgIGNvbGxlY3Rpb24uZ3JhcGhRTC5KV1QgPSBidWlsZE9iamVjdFR5cGUoe1xuICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9SldUYCksXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmNvbmZpZy5maWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGQuc2F2ZVRvSldUKSxcbiAgICAgICAgICAuLi5hdXRoRmllbGRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBhcmVudE5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31KV1RgKSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pXG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2BtZSR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31NZWApLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMU3RyaW5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG9rZW46IHtcbiAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgcmVzb2x2ZTogbWUoY29sbGVjdGlvbiksXG4gICAgICB9XG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2Bpbml0aWFsaXplZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBHcmFwaFFMQm9vbGVhbixcbiAgICAgICAgcmVzb2x2ZTogaW5pdChjb2xsZWN0aW9uLmNvbmZpZy5zbHVnKSxcbiAgICAgIH1cblxuICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHJlZnJlc2hUb2tlbiR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31SZWZyZXNoZWQke3Npbmd1bGFyTmFtZX1gKSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZnJlc2hlZFRva2VuOiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyYXRlZ3k6IHtcbiAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC5KV1QsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICByZXNvbHZlOiByZWZyZXNoKGNvbGxlY3Rpb24pLFxuICAgICAgfVxuXG4gICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgbG9nb3V0JHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgIHJlc29sdmU6IGxvZ291dChjb2xsZWN0aW9uKSxcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25maWcuYXV0aC5kaXNhYmxlTG9jYWxTdHJhdGVneSkge1xuICAgICAgICBpZiAoY29uZmlnLmF1dGgubWF4TG9naW5BdHRlbXB0cyA+IDApIHtcbiAgICAgICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgdW5sb2NrJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZykgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNvbHZlOiB1bmxvY2soY29sbGVjdGlvbiksXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYGxvZ2luJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxPYmplY3RUeXBlKHtcbiAgICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31Mb2dpblJlc3VsdGApLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxJbnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRva2VuOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgICBwYXNzd29yZDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiBsb2dpbihjb2xsZWN0aW9uKSxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2Bmb3Jnb3RQYXNzd29yZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMQm9vbGVhbiksXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgZGlzYWJsZUVtYWlsOiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZykgfSxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHsgdHlwZTogR3JhcGhRTEludCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogZm9yZ290UGFzc3dvcmQoY29sbGVjdGlvbiksXG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgcmVzZXRQYXNzd29yZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gICAgICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9UmVzZXRQYXNzd29yZGApLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHRva2VuOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICAgICAgdXNlcjogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBwYXNzd29yZDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgICB0b2tlbjogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiByZXNldFBhc3N3b3JkKGNvbGxlY3Rpb24pLFxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHZlcmlmeUVtYWlsJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgdHlwZTogR3JhcGhRTEJvb2xlYW4sXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgdG9rZW46IHsgdHlwZTogR3JhcGhRTFN0cmluZyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogdmVyaWZ5RW1haWwoY29sbGVjdGlvbiksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXRDb2xsZWN0aW9uc0dyYXBoUUxcbiJdLCJuYW1lcyI6WyJpbml0Q29sbGVjdGlvbnNHcmFwaFFMIiwicGF5bG9hZCIsIk9iamVjdCIsImtleXMiLCJjb2xsZWN0aW9ucyIsImZvckVhY2giLCJzbHVnIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImZpZWxkcyIsImdyYXBoUUwiLCJ2ZXJzaW9ucyIsImRyYWZ0c0VuYWJsZWQiLCJkcmFmdHMiLCJzaW5ndWxhck5hbWUiLCJwbHVyYWxOYW1lIiwiZnJvbVNsdWciLCJmb3JtYXROYW1lcyIsInRvV29yZHMiLCJzaW5ndWxhciIsInBsdXJhbCIsImhhc0lERmllbGQiLCJmbGF0dGVuRmllbGRzIiwiZmluZEluZGV4IiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsImlkVHlwZSIsImdldENvbGxlY3Rpb25JRFR5cGUiLCJiYXNlRmllbGRzIiwid2hlcmVJbnB1dEZpZWxkcyIsImlkIiwidHlwZSIsInB1c2giLCJkYiIsImRlZmF1bHRJRFR5cGUiLCJmb3JjZU51bGxhYmxlT2JqZWN0VHlwZSIsIkJvb2xlYW4iLCJidWlsZE9iamVjdFR5cGUiLCJmb3JjZU51bGxhYmxlIiwicGFyZW50TmFtZSIsInBhZ2luYXRlZFR5cGUiLCJidWlsZFBhZ2luYXRlZExpc3RUeXBlIiwid2hlcmVJbnB1dFR5cGUiLCJidWlsZFdoZXJlSW5wdXRUeXBlIiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwibGFiZWwiLCJyZXF1aXJlZCIsImNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlIiwiYnVpbGRNdXRhdGlvbklucHV0VHlwZSIsIm11dGF0aW9uSW5wdXRUeXBlIiwiR3JhcGhRTE5vbk51bGwiLCJ1cGRhdGVNdXRhdGlvbklucHV0VHlwZSIsImZpbHRlciIsIlF1ZXJ5IiwiYXJncyIsImRyYWZ0IiwiR3JhcGhRTEJvb2xlYW4iLCJsb2NhbGl6YXRpb24iLCJmYWxsYmFja0xvY2FsZSIsInR5cGVzIiwiZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUiLCJsb2NhbGUiLCJsb2NhbGVJbnB1dFR5cGUiLCJyZXNvbHZlIiwiZmluZEJ5SURSZXNvbHZlciIsIndoZXJlIiwibGltaXQiLCJHcmFwaFFMSW50IiwicGFnZSIsInNvcnQiLCJHcmFwaFFMU3RyaW5nIiwiZmluZFJlc29sdmVyIiwiR3JhcGhRTE9iamVjdFR5cGUiLCJ0b3RhbERvY3MiLCJjb3VudFJlc29sdmVyIiwiYnVpbGRQb2xpY3lUeXBlIiwiZW50aXR5Iiwic2NvcGUiLCJ0eXBlU3VmZml4IiwiZG9jQWNjZXNzUmVzb2x2ZXIiLCJNdXRhdGlvbiIsImRhdGEiLCJjcmVhdGVSZXNvbHZlciIsImF1dG9zYXZlIiwidXBkYXRlUmVzb2x2ZXIiLCJnZXREZWxldGVSZXNvbHZlciIsInZlcnNpb25JRFR5cGUiLCJ2ZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyIsImJ1aWxkVmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMiLCJ2ZXJzaW9uVHlwZSIsImZvcm1hdE5hbWUiLCJmaW5kVmVyc2lvbkJ5SURSZXNvbHZlciIsImZpbmRWZXJzaW9uc1Jlc29sdmVyIiwicmVzdG9yZVZlcnNpb25SZXNvbHZlciIsImF1dGhGaWVsZHMiLCJKV1QiLCJzYXZlVG9KV1QiLCJleHAiLCJzdHJhdGVneSIsInRva2VuIiwidXNlciIsIm1lIiwiaW5pdCIsInJlZnJlc2hlZFRva2VuIiwicmVmcmVzaCIsImxvZ291dCIsIm1heExvZ2luQXR0ZW1wdHMiLCJlbWFpbCIsInVubG9jayIsInBhc3N3b3JkIiwibG9naW4iLCJkaXNhYmxlRW1haWwiLCJleHBpcmF0aW9uIiwiZm9yZ290UGFzc3dvcmQiLCJyZXNldFBhc3N3b3JkIiwidmVyaWZ5RW1haWwiXSwicmFuZ2VNYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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