UNPKG

@elemental-concept/grappa

Version:

Decorator-powered REST client for Angular and its HttpClient

110 lines 19.5 kB
import { UID } from '../uid/uid'; import { instances } from '../instances/instances'; import { ClassDescriptor, MethodDescriptor, ObserveOptions } from '../../public'; export class RegistryImpl { constructor() { this.classes = {}; this.registerRequest = (method, endpoint, proto, property, options) => { const classDescriptor = this.getClassDescriptor(proto); const methodDescriptor = new MethodDescriptor(property); methodDescriptor.method = method; methodDescriptor.endpoint = endpoint; methodDescriptor.options = Object.assign({}, RegistryImpl.defaultRequestOptions, options); classDescriptor.methods[property] = methodDescriptor; proto[property] = prepareRequest(classDescriptor, property); }; this.registerClass = (baseUrl, constructor) => { const classDescriptor = this.getClassDescriptor(constructor.prototype); classDescriptor.ctor = constructor; classDescriptor.baseUrl = baseUrl; }; this.getCustomMetadata = (proto, method, customKey) => { const classDescriptor = this.getClassDescriptor(proto); return this.getCustomMetadataImpl(classDescriptor, method, customKey); }; this.registerBeforeFilter = (proto, method, applyTo) => this.getClassDescriptor(proto).filtersBefore.push({ filterFunction: method, applyTo }); this.registerAfterFilter = (proto, method, applyTo) => this.getClassDescriptor(proto).filtersAfter.push({ filterFunction: method, applyTo }); this.getClassDescriptor = (proto) => { const uid = UID(proto); let classDescriptor = this.classes[uid]; if (classDescriptor === undefined) { classDescriptor = new ClassDescriptor(uid, proto); this.classes[uid] = classDescriptor; } return classDescriptor; }; // used for Grappa-Cache this.registerAlternativeHttpClient = (proto, client) => this.getClassDescriptor(proto).restClient = client; // used for Grappa-Cache this.putCustomMetadata = (proto, method, customKey, data) => { const classDescriptor = this.getClassDescriptor(proto); if (!classDescriptor.customMetadata.hasOwnProperty(method)) { classDescriptor.customMetadata[method] = {}; } classDescriptor.customMetadata[method][customKey] = data; }; // used for Grappa-Cache this.getCustomMetadataForDescriptor = (classDescriptor, method, customKey) => this.getCustomMetadataImpl(classDescriptor, method.name, customKey); this.getCustomMetadataImpl = (classDescriptor, methodNAme, customKey) => classDescriptor.customMetadata.hasOwnProperty(methodNAme) && classDescriptor.customMetadata[methodNAme].hasOwnProperty(customKey) ? classDescriptor.customMetadata[methodNAme][customKey] : null; } static { this.defaultRequestOptions = { observe: ObserveOptions.Body }; } get defaultClient() { return instances.restClientInstance; } } function prepareRequest(classDescriptor, property) { // eslint-disable-next-line space-before-function-paren return function (...args) { if (!classDescriptor.methods.hasOwnProperty(property)) { throw new ReferenceError(`REST function "${property}" is not defined for ${classDescriptor.ctor.name}.`); } const method = classDescriptor.methods[property]; const request = { baseUrl: classDescriptor.baseUrl, endpoint: method.endpoint, method: method.method, args, headers: {}, emptyBody: false, classDescriptor, methodDescriptor: method, reportProgress: method.options.reportProgress }; if (method.options.hasOwnProperty('query')) { const idx = typeof method.options.query === 'number' ? method.options.query : args.length - 1; if (idx >= 0 && idx < args.length) { request.params = args[idx]; } } if (method.options.hasOwnProperty('emptyBody')) { request.emptyBody = true; } for (const filter of classDescriptor.filtersBefore) { if (isApplicable(filter, property)) { filter.filterFunction.call(this, request); } } const restClient = classDescriptor.restClient instanceof Object ? classDescriptor.restClient : instances.restClientInstance; let response = restClient.request(request, method.options.observe); for (const filter of classDescriptor.filtersAfter) { if (isApplicable(filter, property)) { response = filter.filterFunction.call(this, response); } } return response; }; } function isApplicable(filter, property) { if (filter.applyTo === null) { return true; } const nameList = typeof filter.applyTo === 'string' ? [filter.applyTo] : filter.applyTo; return nameList.indexOf(property) >= 0; } export const Registry = new RegistryImpl(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWIvc3JjL2xpYi9pbnRlcm5hbC9yZWdpc3RyeS9yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxPQUFPLEVBQ0wsZUFBZSxFQUlmLGdCQUFnQixFQUNoQixjQUFjLEVBS2YsTUFBTSxjQUFjLENBQUM7QUFFdEIsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFHVSxZQUFPLEdBQXlDLEVBQUUsQ0FBQztRQU0zRCxvQkFBZSxHQUFHLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQUUsS0FBVSxFQUFFLFFBQWdCLEVBQUUsT0FBdUIsRUFBUSxFQUFFO1lBQ2xILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFeEQsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNqQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3JDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUYsZUFBZSxDQUFDLE9BQU8sQ0FBRSxRQUFRLENBQUUsR0FBRyxnQkFBZ0IsQ0FBQztZQUV2RCxLQUFLLENBQUUsUUFBUSxDQUFFLEdBQUcsY0FBYyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUM7UUFFRixrQkFBYSxHQUFHLENBQUMsT0FBaUIsRUFBRSxXQUEwQixFQUFRLEVB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QzlELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBRTFGLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVUlEIH0gZnJvbSAnLi4vdWlkL3VpZCc7XHJcblxyXG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuLi9pbnN0YW5jZXMvaW5zdGFuY2VzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2xhc3NEZXNjcmlwdG9yLFxyXG4gIEZpbHRlckRlc2NyaXB0b3IsXHJcbiAgSHR0cFJlc3RDbGllbnQsXHJcbiAgSW5pdGlhbGlzYWJsZSxcclxuICBNZXRob2REZXNjcmlwdG9yLFxyXG4gIE9ic2VydmVPcHRpb25zLFxyXG4gIE9wdGlvbmFsTGlzdCxcclxuICBSZXF1ZXN0T3B0aW9ucyxcclxuICBSZXN0UmVxdWVzdCxcclxuICBVcmxJbnB1dFxyXG59IGZyb20gJy4uLy4uL3B1YmxpYyc7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlJbXBsIHtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkZWZhdWx0UmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0geyBvYnNlcnZlOiBPYnNlcnZlT3B0aW9ucy5Cb2R5IH07XHJcblxyXG4gIHByaXZhdGUgY2xhc3NlczogeyBbIGtleTogc3RyaW5nIF06IENsYXNzRGVzY3JpcHRvciB9ID0ge307XHJcblxyXG4gIGdldCBkZWZhdWx0Q2xpZW50KCkge1xyXG4gICAgcmV0dXJuIGluc3RhbmNlcy5yZXN0Q2xpZW50SW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlclJlcXVlc3QgPSAobWV0aG9kOiBzdHJpbmcsIGVuZHBvaW50OiBzdHJpbmcsIHByb3RvOiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBjbGFzc0Rlc2NyaXB0b3IgPSB0aGlzLmdldENsYXNzRGVzY3JpcHRvcihwcm90byk7XHJcbiAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gbmV3IE1ldGhvZERlc2NyaXB0b3IocHJvcGVydHkpO1xyXG5cclxuICAgIG1ldGhvZERlc2NyaXB0b3IubWV0aG9kID0gbWV0aG9kO1xyXG4gICAgbWV0aG9kRGVzY3JpcHRvci5lbmRwb2ludCA9IGVuZHBvaW50O1xyXG4gICAgbWV0aG9kRGVzY3JpcHRvci5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgUmVnaXN0cnlJbXBsLmRlZmF1bHRSZXF1ZXN0T3B0aW9ucywgb3B0aW9ucyk7XHJcbiAgICBjbGFzc0Rlc2NyaXB0b3IubWV0aG9kc1sgcHJvcGVydHkgXSA9IG1ldGhvZERlc2NyaXB0b3I7XHJcblxyXG4gICAgcHJvdG9bIHByb3BlcnR5IF0gPSBwcmVwYXJlUmVxdWVzdChjbGFzc0Rlc2NyaXB0b3IsIHByb3BlcnR5KTtcclxuICB9O1xyXG5cclxuICByZWdpc3RlckNsYXNzID0gKGJhc2VVcmw6IFVybElucHV0LCBjb25zdHJ1Y3RvcjogSW5pdGlhbGlzYWJsZSk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgY2xhc3NEZXNjcmlwdG9yID0gdGhpcy5nZXRDbGFzc0Rlc2NyaXB0b3IoY29uc3RydWN0b3IucHJvdG90eXBlKTtcclxuXHJcbiAgICBjbGFzc0Rlc2NyaXB0b3IuY3RvciA9IGNvbnN0cnVjdG9yO1xyXG4gICAgY2xhc3NEZXNjcmlwdG9yLmJhc2VVcmwgPSBiYXNlVXJsO1xyXG4gIH07XHJcblxyXG4gIGdldEN1c3RvbU1ldGFkYXRhID0gKHByb3RvOiBhbnksIG1ldGhvZDogc3RyaW5nLCBjdXN0b21LZXk6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgY2xhc3NEZXNjcmlwdG9yID0gdGhpcy5nZXRDbGFzc0Rlc2NyaXB0b3IocHJvdG8pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmdldEN1c3RvbU1ldGFkYXRhSW1wbChjbGFzc0Rlc2NyaXB0b3IsIG1ldGhvZCwgY3VzdG9tS2V5KTtcclxuICB9O1xyXG5cclxuICByZWdpc3RlckJlZm9yZUZpbHRlciA9IChwcm90bzogYW55LCBtZXRob2Q6IEZ1bmN0aW9uLCBhcHBseVRvOiBPcHRpb25hbExpc3Q8c3RyaW5nPikgPT5cclxuICAgIHRoaXMuZ2V0Q2xhc3NEZXNjcmlwdG9yKHByb3RvKS5maWx0ZXJzQmVmb3JlLnB1c2goeyBmaWx0ZXJGdW5jdGlvbjogbWV0aG9kLCBhcHBseVRvIH0pO1xyXG5cclxuICByZWdpc3RlckFmdGVyRmlsdGVyID0gKHByb3RvOiBhbnksIG1ldGhvZDogRnVuY3Rpb24sIGFwcGx5VG86IE9wdGlvbmFsTGlzdDxzdHJpbmc+KSA9PlxyXG4gICAgdGhpcy5nZXRDbGFzc0Rlc2NyaXB0b3IocHJvdG8pLmZpbHRlcnNBZnRlci5wdXNoKHsgZmlsdGVyRnVuY3Rpb246IG1ldGhvZCwgYXBwbHlUbyB9KTtcclxuXHJcbiAgZ2V0Q2xhc3NEZXNjcmlwdG9yID0gKHByb3RvOiBhbnkpOiBDbGFzc0Rlc2NyaXB0b3IgPT4ge1xyXG4gICAgY29uc3QgdWlkID0gVUlEKHByb3RvKTtcclxuXHJcbiAgICBsZXQgY2xhc3NEZXNjcmlwdG9yID0gdGhpcy5jbGFzc2VzWyB1aWQgXTtcclxuXHJcbiAgICBpZiAoY2xhc3NEZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgY2xhc3NEZXNjcmlwdG9yID0gbmV3IENsYXNzRGVzY3JpcHRvcih1aWQsIHByb3RvKTtcclxuICAgICAgdGhpcy5jbGFzc2VzWyB1aWQgXSA9IGNsYXNzRGVzY3JpcHRvcjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NEZXNjcmlwdG9yO1xyXG4gIH07XHJcblxyXG4gIC8vIHVzZWQgZm9yIEdyYXBwYS1DYWNoZVxyXG4gIHJlZ2lzdGVyQWx0ZXJuYXRpdmVIdHRwQ2xpZW50ID0gPFQ+KHByb3RvOiBhbnksIGNsaWVudDogSHR0cFJlc3RDbGllbnQ8VD4pID0+XHJcbiAgICB0aGlzLmdldENsYXNzRGVzY3JpcHRvcihwcm90bykucmVzdENsaWVudCA9IGNsaWVudDtcclxuXHJcbiAgLy8gdXNlZCBmb3IgR3JhcHBhLUNhY2hlXHJcbiAgcHV0Q3VzdG9tTWV0YWRhdGEgPSAocHJvdG86IGFueSwgbWV0aG9kOiBzdHJpbmcsIGN1c3RvbUtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkID0+IHtcclxuICAgIGNvbnN0IGNsYXNzRGVzY3JpcHRvciA9IHRoaXMuZ2V0Q2xhc3NEZXNjcmlwdG9yKHByb3RvKTtcclxuXHJcbiAgICBpZiAoIWNsYXNzRGVzY3JpcHRvci5jdXN0b21NZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XHJcbiAgICAgIGNsYXNzRGVzY3JpcHRvci5jdXN0b21NZXRhZGF0YVsgbWV0aG9kIF0gPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBjbGFzc0Rlc2NyaXB0b3IuY3VzdG9tTWV0YWRhdGFbIG1ldGhvZCBdWyBjdXN0b21LZXkgXSA9IGRhdGE7XHJcbiAgfTtcclxuXHJcbiAgLy8gdXNlZCBmb3IgR3JhcHBhLUNhY2hlXHJcbiAgZ2V0Q3VzdG9tTWV0YWRhdGFGb3JEZXNjcmlwdG9yID0gKGNsYXNzRGVzY3JpcHRvcjogQ2xhc3NEZXNjcmlwdG9yLCBtZXRob2Q6IE1ldGhvZERlc2NyaXB0b3IsIGN1c3RvbUtleTogc3RyaW5nKSA9PlxyXG4gICAgdGhpcy5nZXRDdXN0b21NZXRhZGF0YUltcGwoY2xhc3NEZXNjcmlwdG9yLCBtZXRob2QubmFtZSwgY3VzdG9tS2V5KTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRDdXN0b21NZXRhZGF0YUltcGwgPSAoY2xhc3NEZXNjcmlwdG9yOiBDbGFzc0Rlc2NyaXB0b3IsIG1ldGhvZE5BbWU6IHN0cmluZywgY3VzdG9tS2V5OiBzdHJpbmcpID0+XHJcbiAgICBjbGFzc0Rlc2NyaXB0b3IuY3VzdG9tTWV0YWRhdGEuaGFzT3duUHJvcGVydHkobWV0aG9kTkFtZSlcclxuICAgICYmIGNsYXNzRGVzY3JpcHRvci5jdXN0b21NZXRhZGF0YVsgbWV0aG9kTkFtZSBdLmhhc093blByb3BlcnR5KGN1c3RvbUtleSlcclxuICAgICAgPyBjbGFzc0Rlc2NyaXB0b3IuY3VzdG9tTWV0YWRhdGFbIG1ldGhvZE5BbWUgXVsgY3VzdG9tS2V5IF1cclxuICAgICAgOiBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcmVwYXJlUmVxdWVzdChjbGFzc0Rlc2NyaXB0b3I6IENsYXNzRGVzY3JpcHRvciwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZS1iZWZvcmUtZnVuY3Rpb24tcGFyZW5cclxuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBpZiAoIWNsYXNzRGVzY3JpcHRvci5tZXRob2RzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYFJFU1QgZnVuY3Rpb24gXCIkeyBwcm9wZXJ0eSB9XCIgaXMgbm90IGRlZmluZWQgZm9yICR7IGNsYXNzRGVzY3JpcHRvci5jdG9yLm5hbWUgfS5gKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXRob2QgPSBjbGFzc0Rlc2NyaXB0b3IubWV0aG9kc1sgcHJvcGVydHkgXTtcclxuICAgIGNvbnN0IHJlcXVlc3Q6IFJlc3RSZXF1ZXN0ID0ge1xyXG4gICAgICBiYXNlVXJsOiBjbGFzc0Rlc2NyaXB0b3IuYmFzZVVybCxcclxuICAgICAgZW5kcG9pbnQ6IG1ldGhvZC5lbmRwb2ludCxcclxuICAgICAgbWV0aG9kOiBtZXRob2QubWV0aG9kLFxyXG4gICAgICBhcmdzLFxyXG4gICAgICBoZWFkZXJzOiB7fSxcclxuICAgICAgZW1wdHlCb2R5OiBmYWxzZSxcclxuICAgICAgY2xhc3NEZXNjcmlwdG9yLFxyXG4gICAgICBtZXRob2REZXNjcmlwdG9yOiBtZXRob2QsXHJcbiAgICAgIHJlcG9ydFByb2dyZXNzOiBtZXRob2Qub3B0aW9ucy5yZXBvcnRQcm9ncmVzc1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAobWV0aG9kLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5JykpIHtcclxuICAgICAgY29uc3QgaWR4ID0gdHlwZW9mIG1ldGhvZC5vcHRpb25zLnF1ZXJ5ID09PSAnbnVtYmVyJyA/IG1ldGhvZC5vcHRpb25zLnF1ZXJ5IDogYXJncy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGFyZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgcmVxdWVzdC5wYXJhbXMgPSBhcmdzWyBpZHggXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRob2Qub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnZW1wdHlCb2R5JykpIHtcclxuICAgICAgcmVxdWVzdC5lbXB0eUJvZHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNsYXNzRGVzY3JpcHRvci5maWx0ZXJzQmVmb3JlKSB7XHJcbiAgICAgIGlmIChpc0FwcGxpY2FibGUoZmlsdGVyLCBwcm9wZXJ0eSkpIHtcclxuICAgICAgICBmaWx0ZXIuZmlsdGVyRnVuY3Rpb24uY2FsbCh0aGlzLCByZXF1ZXN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3RDbGllbnQgPSBjbGFzc0Rlc2NyaXB0b3IucmVzdENsaWVudCBpbnN0YW5jZW9mIE9iamVjdFxyXG4gICAgICA/IGNsYXNzRGVzY3JpcHRvci5yZXN0Q2xpZW50XHJcbiAgICAgIDogaW5zdGFuY2VzLnJlc3RDbGllbnRJbnN0YW5jZTtcclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSByZXN0Q2xpZW50LnJlcXVlc3QocmVxdWVzdCwgbWV0aG9kLm9wdGlvbnMub2JzZXJ2ZSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY2xhc3NEZXNjcmlwdG9yLmZpbHRlcnNBZnRlcikge1xyXG4gICAgICBpZiAoaXNBcHBsaWNhYmxlKGZpbHRlciwgcHJvcGVydHkpKSB7XHJcbiAgICAgICAgcmVzcG9uc2UgPSBmaWx0ZXIuZmlsdGVyRnVuY3Rpb24uY2FsbCh0aGlzLCByZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNBcHBsaWNhYmxlKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvciwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gIGlmIChmaWx0ZXIuYXBwbHlUbyA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuYW1lTGlzdCA9IHR5cGVvZiBmaWx0ZXIuYXBwbHlUbyA9PT0gJ3N0cmluZycgPyBbIGZpbHRlci5hcHBseVRvIF0gOiBmaWx0ZXIuYXBwbHlUbztcclxuXHJcbiAgcmV0dXJuIG5hbWVMaXN0LmluZGV4T2YocHJvcGVydHkpID49IDA7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSZWdpc3RyeSA9IG5ldyBSZWdpc3RyeUltcGwoKTtcclxuIl19