UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

84 lines 13.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildJSONAPISerializerFor = void 0; const utils_1 = require("@orbit/utils"); const serializers_1 = require("@orbit/serializers"); const jsonapi_atomic_operation_serializer_1 = require("./jsonapi-atomic-operation-serializer"); const jsonapi_resource_serializer_1 = require("./jsonapi-resource-serializer"); const jsonapi_resource_identity_serializer_1 = require("./jsonapi-resource-identity-serializer"); const jsonapi_serializers_1 = require("./jsonapi-serializers"); const jsonapi_document_serializer_1 = require("./jsonapi-document-serializer"); const jsonapi_resource_field_serializer_1 = require("./jsonapi-resource-field-serializer"); function buildJSONAPISerializerFor(settings) { const { schema, keyMap } = settings; const defaultSerializerClassFor = (0, serializers_1.buildSerializerClassFor)({ unknown: serializers_1.NoopSerializer, object: serializers_1.NoopSerializer, array: serializers_1.NoopSerializer, boolean: serializers_1.BooleanSerializer, string: serializers_1.StringSerializer, date: serializers_1.DateSerializer, datetime: serializers_1.DateTimeSerializer, number: serializers_1.NumberSerializer, [jsonapi_serializers_1.JSONAPISerializers.Resource]: jsonapi_resource_serializer_1.JSONAPIResourceSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceDocument]: jsonapi_document_serializer_1.JSONAPIDocumentSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceIdentity]: jsonapi_resource_identity_serializer_1.JSONAPIResourceIdentitySerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceAtomicOperation]: jsonapi_atomic_operation_serializer_1.JSONAPIAtomicOperationSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceType]: serializers_1.StringSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceTypeParam]: serializers_1.StringSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceTypePath]: serializers_1.StringSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceField]: jsonapi_resource_field_serializer_1.JSONAPIResourceFieldSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceFieldParam]: jsonapi_resource_field_serializer_1.JSONAPIResourceFieldSerializer, [jsonapi_serializers_1.JSONAPISerializers.ResourceFieldPath]: jsonapi_resource_field_serializer_1.JSONAPIResourceFieldSerializer }); let serializerClassFor; if (settings.serializerClassFor) { serializerClassFor = (type = 'unknown') => { return (settings.serializerClassFor(type) || defaultSerializerClassFor(type)); }; } else { serializerClassFor = defaultSerializerClassFor; } let serializerSettingsFor; let defaultSerializerSettingsFor = (0, serializers_1.buildSerializerSettingsFor)({ sharedSettings: { keyMap, schema }, settingsByType: { [jsonapi_serializers_1.JSONAPISerializers.ResourceTypePath]: { serializationOptions: { inflectors: ['pluralize', 'dasherize'] } }, [jsonapi_serializers_1.JSONAPISerializers.ResourceFieldPath]: { serializationOptions: { inflectors: ['dasherize'] } } } }); let customSerializerSettingsFor = settings.serializerSettingsFor; if (customSerializerSettingsFor) { serializerSettingsFor = (type = 'unknown') => { let defaultSerializerSettings = defaultSerializerSettingsFor(type) || {}; let customSerializerSettings = customSerializerSettingsFor(type) || {}; return (0, utils_1.deepMerge)(defaultSerializerSettings, customSerializerSettings); }; } else { serializerSettingsFor = defaultSerializerSettingsFor; } let customSerializerFor = settings.serializerFor; let backupSerializerFor = (0, serializers_1.buildSerializerFor)({ serializerClassFor, serializerSettingsFor }); if (customSerializerFor) { return (type = 'unknown') => customSerializerFor(type) || backupSerializerFor(type); } else { return (type = 'unknown') => backupSerializerFor(type); } } exports.buildJSONAPISerializerFor = buildJSONAPISerializerFor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1zZXJpYWxpemVyLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VyaWFsaXplcnMvanNvbmFwaS1zZXJpYWxpemVyLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0NBQXlDO0FBQ3pDLG9EQWM0QjtBQUM1QiwrRkFBeUY7QUFDekYsK0VBQTBFO0FBQzFFLGlHQUEyRjtBQUUzRiwrREFBMkQ7QUFDM0QsK0VBQTBFO0FBQzFFLDJGQUFxRjtBQUVyRixTQUFnQix5QkFBeUIsQ0FBQyxRQU16QztJQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBRXBDLE1BQU0seUJBQXlCLEdBQUcsSUFBQSxxQ0FBdUIsRUFBQztRQUN4RCxPQUFPLEVBQUUsNEJBQWM7UUFDdkIsTUFBTSxFQUFFLDRCQUFjO1FBQ3RCLEtBQUssRUFBRSw0QkFBYztRQUNyQixPQUFPLEVBQUUsK0JBQW9DO1FBQzdDLE1BQU0sRUFBRSw4QkFBbUM7UUFDM0MsSUFBSSxFQUFFLDRCQUFpQztRQUN2QyxRQUFRLEVBQUUsZ0NBQXFDO1FBQy9DLE1BQU0sRUFBRSw4QkFBbUM7UUFDM0MsQ0FBQyx3Q0FBa0IsQ0FBQyxRQUFrQixDQUFDLEVBQUUsdURBQTRDO1FBQ3JGLENBQUMsd0NBQWtCLENBQUMsZ0JBQTBCLENBQUMsRUFBRSx1REFBNEM7UUFDN0YsQ0FBQyx3Q0FBa0IsQ0FBQyxnQkFBMEIsQ0FBQyxFQUFFLHdFQUFvRDtRQUNyRyxDQUFDLHdDQUFrQixDQUFDLHVCQUFpQyxDQUFDLEVBQUUsc0VBQW1EO1FBQzNHLENBQUMsd0NBQWtCLENBQUMsWUFBc0IsQ0FBQyxFQUFFLDhCQUFtQztRQUNoRixDQUFDLHdDQUFrQixDQUFDLGlCQUEyQixDQUFDLEVBQUUsOEJBQW1DO1FBQ3JGLENBQUMsd0NBQWtCLENBQUMsZ0JBQTBCLENBQUMsRUFBRSw4QkFBbUM7UUFDcEYsQ0FBQyx3Q0FBa0IsQ0FBQyxhQUF1QixDQUFDLEVBQUUsa0VBQWlEO1FBQy9GLENBQUMsd0NBQWtCLENBQUMsa0JBQTRCLENBQUMsRUFBRSxrRUFBaUQ7UUFDcEcsQ0FBQyx3Q0FBa0IsQ0FBQyxpQkFBMkIsQ0FBQyxFQUFFLGtFQUFpRDtLQUNwRyxDQUFDLENBQUM7SUFDSCxJQUFJLGtCQUF3QyxDQUFDO0lBQzdDLElBQUksUUFBUSxDQUFDLGtCQUFrQixFQUFFO1FBQy9CLGtCQUFrQixHQUFHLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sQ0FDSixRQUFRLENBQUMsa0JBQTJDLENBQUMsSUFBSSxDQUFDO2dCQUMzRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FDaEMsQ0FBQztRQUNKLENBQUMsQ0FBQztLQUNIO1NBQU07UUFDTCxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztLQUNoRDtJQUVELElBQUkscUJBQThDLENBQUM7SUFDbkQsSUFBSSw0QkFBNEIsR0FBRyxJQUFBLHdDQUEwQixFQUFDO1FBQzVELGNBQWMsRUFBRTtZQUNkLE1BQU07WUFDTixNQUFNO1NBQ1A7UUFDRCxjQUFjLEVBQUU7WUFDZCxDQUFDLHdDQUFrQixDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3JDLG9CQUFvQixFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFO2FBQ2pFO1lBQ0QsQ0FBQyx3Q0FBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUN0QyxvQkFBb0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2FBQ3BEO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFDSCxJQUFJLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztJQUNqRSxJQUFJLDJCQUEyQixFQUFFO1FBQy9CLHFCQUFxQixHQUFHLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRSxFQUFFO1lBQzNDLElBQUkseUJBQXlCLEdBQUcsNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pFLElBQUksd0JBQXdCLEdBQ3pCLDJCQUF1RCxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RSxPQUFPLElBQUEsaUJBQVMsRUFBQyx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQztLQUNIO1NBQU07UUFDTCxxQkFBcUIsR0FBRyw0QkFBNEIsQ0FBQztLQUN0RDtJQUVELElBQUksbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUNqRCxJQUFJLG1CQUFtQixHQUFHLElBQUEsZ0NBQWtCLEVBQUM7UUFDM0Msa0JBQWtCO1FBQ2xCLHFCQUFxQjtLQUN0QixDQUFDLENBQUM7SUFDSCxJQUFJLG1CQUFtQixFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FDekIsbUJBQXVDLENBQUMsSUFBSSxDQUFDO1lBQzlDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdCO1NBQU07UUFDTCxPQUFPLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDeEQ7QUFDSCxDQUFDO0FBaEZELDhEQWdGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQge1xuICBOb29wU2VyaWFsaXplcixcbiAgQm9vbGVhblNlcmlhbGl6ZXIsXG4gIFN0cmluZ1NlcmlhbGl6ZXIsXG4gIERhdGVTZXJpYWxpemVyLFxuICBEYXRlVGltZVNlcmlhbGl6ZXIsXG4gIE51bWJlclNlcmlhbGl6ZXIsXG4gIGJ1aWxkU2VyaWFsaXplckZvcixcbiAgYnVpbGRTZXJpYWxpemVyQ2xhc3NGb3IsXG4gIGJ1aWxkU2VyaWFsaXplclNldHRpbmdzRm9yLFxuICBTZXJpYWxpemVyRm9yRm4sXG4gIFNlcmlhbGl6ZXJDbGFzc0ZvckZuLFxuICBTZXJpYWxpemVyU2V0dGluZ3NGb3JGbixcbiAgU2VyaWFsaXplckNsYXNzXG59IGZyb20gJ0BvcmJpdC9zZXJpYWxpemVycyc7XG5pbXBvcnQgeyBKU09OQVBJQXRvbWljT3BlcmF0aW9uU2VyaWFsaXplciB9IGZyb20gJy4vanNvbmFwaS1hdG9taWMtb3BlcmF0aW9uLXNlcmlhbGl6ZXInO1xuaW1wb3J0IHsgSlNPTkFQSVJlc291cmNlU2VyaWFsaXplciB9IGZyb20gJy4vanNvbmFwaS1yZXNvdXJjZS1zZXJpYWxpemVyJztcbmltcG9ydCB7IEpTT05BUElSZXNvdXJjZUlkZW50aXR5U2VyaWFsaXplciB9IGZyb20gJy4vanNvbmFwaS1yZXNvdXJjZS1pZGVudGl0eS1zZXJpYWxpemVyJztcbmltcG9ydCB7IFJlY29yZFNjaGVtYSwgUmVjb3JkS2V5TWFwIH0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgSlNPTkFQSVNlcmlhbGl6ZXJzIH0gZnJvbSAnLi9qc29uYXBpLXNlcmlhbGl6ZXJzJztcbmltcG9ydCB7IEpTT05BUElEb2N1bWVudFNlcmlhbGl6ZXIgfSBmcm9tICcuL2pzb25hcGktZG9jdW1lbnQtc2VyaWFsaXplcic7XG5pbXBvcnQgeyBKU09OQVBJUmVzb3VyY2VGaWVsZFNlcmlhbGl6ZXIgfSBmcm9tICcuL2pzb25hcGktcmVzb3VyY2UtZmllbGQtc2VyaWFsaXplcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEpTT05BUElTZXJpYWxpemVyRm9yKHNldHRpbmdzOiB7XG4gIHNjaGVtYTogUmVjb3JkU2NoZW1hO1xuICBrZXlNYXA/OiBSZWNvcmRLZXlNYXA7XG4gIHNlcmlhbGl6ZXJGb3I/OiBTZXJpYWxpemVyRm9yRm47XG4gIHNlcmlhbGl6ZXJDbGFzc0Zvcj86IFNlcmlhbGl6ZXJDbGFzc0ZvckZuO1xuICBzZXJpYWxpemVyU2V0dGluZ3NGb3I/OiBTZXJpYWxpemVyU2V0dGluZ3NGb3JGbjtcbn0pOiBTZXJpYWxpemVyRm9yRm4ge1xuICBjb25zdCB7IHNjaGVtYSwga2V5TWFwIH0gPSBzZXR0aW5ncztcblxuICBjb25zdCBkZWZhdWx0U2VyaWFsaXplckNsYXNzRm9yID0gYnVpbGRTZXJpYWxpemVyQ2xhc3NGb3Ioe1xuICAgIHVua25vd246IE5vb3BTZXJpYWxpemVyLFxuICAgIG9iamVjdDogTm9vcFNlcmlhbGl6ZXIsXG4gICAgYXJyYXk6IE5vb3BTZXJpYWxpemVyLFxuICAgIGJvb2xlYW46IEJvb2xlYW5TZXJpYWxpemVyIGFzIFNlcmlhbGl6ZXJDbGFzcyxcbiAgICBzdHJpbmc6IFN0cmluZ1NlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIGRhdGU6IERhdGVTZXJpYWxpemVyIGFzIFNlcmlhbGl6ZXJDbGFzcyxcbiAgICBkYXRldGltZTogRGF0ZVRpbWVTZXJpYWxpemVyIGFzIFNlcmlhbGl6ZXJDbGFzcyxcbiAgICBudW1iZXI6IE51bWJlclNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2UgYXMgc3RyaW5nXTogSlNPTkFQSVJlc291cmNlU2VyaWFsaXplciBhcyBTZXJpYWxpemVyQ2xhc3MsXG4gICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZURvY3VtZW50IGFzIHN0cmluZ106IEpTT05BUElEb2N1bWVudFNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VJZGVudGl0eSBhcyBzdHJpbmddOiBKU09OQVBJUmVzb3VyY2VJZGVudGl0eVNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VBdG9taWNPcGVyYXRpb24gYXMgc3RyaW5nXTogSlNPTkFQSUF0b21pY09wZXJhdGlvblNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VUeXBlIGFzIHN0cmluZ106IFN0cmluZ1NlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VUeXBlUGFyYW0gYXMgc3RyaW5nXTogU3RyaW5nU2VyaWFsaXplciBhcyBTZXJpYWxpemVyQ2xhc3MsXG4gICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZVR5cGVQYXRoIGFzIHN0cmluZ106IFN0cmluZ1NlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VGaWVsZCBhcyBzdHJpbmddOiBKU09OQVBJUmVzb3VyY2VGaWVsZFNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzLFxuICAgIFtKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VGaWVsZFBhcmFtIGFzIHN0cmluZ106IEpTT05BUElSZXNvdXJjZUZpZWxkU2VyaWFsaXplciBhcyBTZXJpYWxpemVyQ2xhc3MsXG4gICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZUZpZWxkUGF0aCBhcyBzdHJpbmddOiBKU09OQVBJUmVzb3VyY2VGaWVsZFNlcmlhbGl6ZXIgYXMgU2VyaWFsaXplckNsYXNzXG4gIH0pO1xuICBsZXQgc2VyaWFsaXplckNsYXNzRm9yOiBTZXJpYWxpemVyQ2xhc3NGb3JGbjtcbiAgaWYgKHNldHRpbmdzLnNlcmlhbGl6ZXJDbGFzc0Zvcikge1xuICAgIHNlcmlhbGl6ZXJDbGFzc0ZvciA9ICh0eXBlID0gJ3Vua25vd24nKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoc2V0dGluZ3Muc2VyaWFsaXplckNsYXNzRm9yIGFzIFNlcmlhbGl6ZXJDbGFzc0ZvckZuKSh0eXBlKSB8fFxuICAgICAgICBkZWZhdWx0U2VyaWFsaXplckNsYXNzRm9yKHR5cGUpXG4gICAgICApO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplckNsYXNzRm9yID0gZGVmYXVsdFNlcmlhbGl6ZXJDbGFzc0ZvcjtcbiAgfVxuXG4gIGxldCBzZXJpYWxpemVyU2V0dGluZ3NGb3I6IFNlcmlhbGl6ZXJTZXR0aW5nc0ZvckZuO1xuICBsZXQgZGVmYXVsdFNlcmlhbGl6ZXJTZXR0aW5nc0ZvciA9IGJ1aWxkU2VyaWFsaXplclNldHRpbmdzRm9yKHtcbiAgICBzaGFyZWRTZXR0aW5nczoge1xuICAgICAga2V5TWFwLFxuICAgICAgc2NoZW1hXG4gICAgfSxcbiAgICBzZXR0aW5nc0J5VHlwZToge1xuICAgICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZVR5cGVQYXRoXToge1xuICAgICAgICBzZXJpYWxpemF0aW9uT3B0aW9uczogeyBpbmZsZWN0b3JzOiBbJ3BsdXJhbGl6ZScsICdkYXNoZXJpemUnXSB9XG4gICAgICB9LFxuICAgICAgW0pTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZUZpZWxkUGF0aF06IHtcbiAgICAgICAgc2VyaWFsaXphdGlvbk9wdGlvbnM6IHsgaW5mbGVjdG9yczogWydkYXNoZXJpemUnXSB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgbGV0IGN1c3RvbVNlcmlhbGl6ZXJTZXR0aW5nc0ZvciA9IHNldHRpbmdzLnNlcmlhbGl6ZXJTZXR0aW5nc0ZvcjtcbiAgaWYgKGN1c3RvbVNlcmlhbGl6ZXJTZXR0aW5nc0Zvcikge1xuICAgIHNlcmlhbGl6ZXJTZXR0aW5nc0ZvciA9ICh0eXBlID0gJ3Vua25vd24nKSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFNlcmlhbGl6ZXJTZXR0aW5ncyA9IGRlZmF1bHRTZXJpYWxpemVyU2V0dGluZ3NGb3IodHlwZSkgfHwge307XG4gICAgICBsZXQgY3VzdG9tU2VyaWFsaXplclNldHRpbmdzID1cbiAgICAgICAgKGN1c3RvbVNlcmlhbGl6ZXJTZXR0aW5nc0ZvciBhcyBTZXJpYWxpemVyU2V0dGluZ3NGb3JGbikodHlwZSkgfHwge307XG4gICAgICByZXR1cm4gZGVlcE1lcmdlKGRlZmF1bHRTZXJpYWxpemVyU2V0dGluZ3MsIGN1c3RvbVNlcmlhbGl6ZXJTZXR0aW5ncyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVyU2V0dGluZ3NGb3IgPSBkZWZhdWx0U2VyaWFsaXplclNldHRpbmdzRm9yO1xuICB9XG5cbiAgbGV0IGN1c3RvbVNlcmlhbGl6ZXJGb3IgPSBzZXR0aW5ncy5zZXJpYWxpemVyRm9yO1xuICBsZXQgYmFja3VwU2VyaWFsaXplckZvciA9IGJ1aWxkU2VyaWFsaXplckZvcih7XG4gICAgc2VyaWFsaXplckNsYXNzRm9yLFxuICAgIHNlcmlhbGl6ZXJTZXR0aW5nc0ZvclxuICB9KTtcbiAgaWYgKGN1c3RvbVNlcmlhbGl6ZXJGb3IpIHtcbiAgICByZXR1cm4gKHR5cGUgPSAndW5rbm93bicpID0+XG4gICAgICAoY3VzdG9tU2VyaWFsaXplckZvciBhcyBTZXJpYWxpemVyRm9yRm4pKHR5cGUpIHx8XG4gICAgICBiYWNrdXBTZXJpYWxpemVyRm9yKHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAodHlwZSA9ICd1bmtub3duJykgPT4gYmFja3VwU2VyaWFsaXplckZvcih0eXBlKTtcbiAgfVxufVxuIl19