angular-odata
Version:
Client side OData typescript library for Angular
149 lines • 23.3 kB
JavaScript
import { map } from 'rxjs/operators';
import { PathSegment } from '../../types';
import { ODataPathSegments } from '../path';
import { ODataResource } from '../resource';
export class ODataFunctionResource extends ODataResource {
//#region Factory
static factory(api, { path, outgoingType, incomingType, bindingType, segments, }) {
segments = segments ?? new ODataPathSegments();
const segment = segments.add(PathSegment.function, path);
if (outgoingType !== undefined) {
segment.outgoingType(outgoingType);
}
if (incomingType !== undefined) {
segment.incomingType(incomingType);
}
if (bindingType !== undefined) {
segment.bindingType(bindingType);
}
return new ODataFunctionResource(api, { segments });
}
static fromResource(resource, path) {
const baseType = resource.outgoingType();
const callable = resource.api.findCallable(path, baseType);
const outgoingType = callable?.type();
const bindingType = callable?.binding()?.type;
const incomingType = callable?.returnType();
const func = ODataFunctionResource.factory(resource.api, {
path,
outgoingType,
bindingType,
incomingType,
segments: resource.cloneSegments(),
});
// Switch entitySet to binding type if available
if (bindingType !== undefined && bindingType !== baseType) {
let entitySet = resource.api.findEntitySet(bindingType);
if (entitySet !== undefined) {
func.segment((s) => s.entitySet().path(entitySet.name));
}
}
return func;
}
clone() {
return super.clone();
}
//#endregion
parameters(params, { alias } = {}) {
let parameters = params !== null ? this.encode(params) : null;
if (alias && parameters !== null) {
this.query((q) => {
parameters = Object.entries(parameters).reduce((acc, [name, param]) => {
return Object.assign(acc, { [name]: q.alias(param, name) });
}, {});
});
}
return this.clone().segment((s) => s.function().parameters(parameters));
}
//#region Requests
get(options) {
return super.get(options);
}
call(params, { alias, ...options } = {}) {
return this.parameters(params, { alias }).get(options);
}
/**
* Execute the function with the given parameters and return the result as a property
* @param params Parameters to be sent to the function
* @param alias If true, the parameters will be send using aliases
* @param options Options for the request
* @returns Observable of the result of the function
*/
callProperty(params, { alias, ...options } = {}) {
return this.call(params, {
responseType: 'property',
alias,
...options,
}).pipe(map(({ property }) => property));
}
/**
* Execute the function with the given parameters and return the result as a entity
* @param params Parameters to be sent to the function
* @param alias If true, the parameters will be send using aliases
* @param options Options for the request
* @returns Observable of the result of the function
*/
callEntity(params, { alias, ...options } = {}) {
return this.call(params, {
responseType: 'entity',
alias,
...options,
}).pipe(map(({ entity }) => entity));
}
/**
* Execute the function with the given parameters and return the result as a model
* @param params Parameters to be sent to the function
* @param alias If true, the parameters will be send using aliases
* @param options Options for the request
* @returns Observable of the result of the function
*/
callModel(params, { alias, ModelType, ...options } = {}) {
return this.call(params, {
responseType: 'entity',
alias,
...options,
}).pipe(map(({ entity, annots }) => entity ? this.asModel(entity, { annots, ModelType }) : null));
}
/**
* Execute the function with the given parameters and return the result as a entities
* @param params Parameters to be sent to the function
* @param alias If true, the parameters will be send using aliases
* @param options Options for the request
* @returns Observable of the result of the function
*/
callEntities(params, { alias, ...options } = {}) {
return this.call(params, {
responseType: 'entities',
alias,
...options,
}).pipe(map(({ entities }) => entities));
}
/**
* Execute the function with the given parameters and return the result as a collection
* @param params Parameters to be sent to the function
* @param alias If true, the parameters will be send using aliases
* @param options Options for the request
* @returns Observable of the result of the function
*/
callCollection(params, { alias, CollectionType, ...options } = {}) {
return this.call(params, {
responseType: 'entities',
alias,
...options,
}).pipe(map(({ entities, annots }) => entities
? this.asCollection(entities, { annots, CollectionType })
: null));
}
//#endregion
callArraybuffer(params, { alias, ...options } = {}) {
return this.call(params, {
responseType: 'arraybuffer',
alias,
...options,
});
}
callBlob(params, { alias, ...options } = {}) {
return this.call(params, { responseType: 'blob', alias, ...options });
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2Z1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUzVDLE1BQU0sT0FBTyxxQkFBNEIsU0FBUSxhQUFnQjtJQUMvRCxpQkFBaUI7SUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FDWixHQUFhLEVBQ2IsRUFDRSxJQUFJLEVBQ0osWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsUUFBUSxHQU9UO1FBRUQsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sSUFBSSxxQkFBcUIsQ0FBTyxHQUFHLEVBQUUsRUFBRSxRQUFR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Z0IsRUFDaEIsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLEtBQXlDLEVBQUU7UUFFOUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21vZGVsJztcbmltcG9ydCB7IFBhdGhTZWdtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0aWVzT3B0aW9ucyxcbiAgT0RhdGFFbnRpdHlPcHRpb25zLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlPcHRpb25zLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdGllcywgT0RhdGFFbnRpdHksIE9EYXRhUHJvcGVydHkgfSBmcm9tICcuLi9yZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj4gZXh0ZW5kcyBPRGF0YVJlc291cmNlPFI+IHtcbiAgLy8jcmVnaW9uIEZhY3RvcnlcbiAgc3RhdGljIGZhY3Rvcnk8UCwgUj4oXG4gICAgYXBpOiBPRGF0YUFwaSxcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlLFxuICAgICAgaW5jb21pbmdUeXBlLFxuICAgICAgYmluZGluZ1R5cGUsXG4gICAgICBzZWdtZW50cyxcbiAgICB9OiB7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBvdXRnb2luZ1R5cGU/OiBzdHJpbmc7XG4gICAgICBpbmNvbWluZ1R5cGU/OiBzdHJpbmc7XG4gICAgICBiaW5kaW5nVHlwZT86IHN0cmluZztcbiAgICAgIHNlZ21lbnRzPzogT0RhdGFQYXRoU2VnbWVudHM7XG4gICAgfSxcbiAgKSB7XG4gICAgc2VnbWVudHMgPSBzZWdtZW50cyA/PyBuZXcgT0RhdGFQYXRoU2VnbWVudHMoKTtcblxuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnQuZnVuY3Rpb24sIHBhdGgpO1xuICAgIGlmIChvdXRnb2luZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5vdXRnb2luZ1R5cGUob3V0Z29pbmdUeXBlKTtcbiAgICB9XG4gICAgaWYgKGluY29taW5nVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50LmluY29taW5nVHlwZShpbmNvbWluZ1R5cGUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5iaW5kaW5nVHlwZShiaW5kaW5nVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+KGFwaSwgeyBzZWdtZW50cyB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVzb3VyY2U8UCwgUj4ocmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PiwgcGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVR5cGUgPSByZXNvdXJjZS5vdXRnb2luZ1R5cGUoKTtcbiAgICBjb25zdCBjYWxsYWJsZSA9IHJlc291cmNlLmFwaS5maW5kQ2FsbGFibGU8Uj4ocGF0aCwgYmFzZVR5cGUpO1xuXG4gICAgY29uc3Qgb3V0Z29pbmdUeXBlID0gY2FsbGFibGU/LnR5cGUoKTtcbiAgICBjb25zdCBiaW5kaW5nVHlwZSA9IGNhbGxhYmxlPy5iaW5kaW5nKCk/LnR5cGU7XG4gICAgY29uc3QgaW5jb21pbmdUeXBlID0gY2FsbGFibGU/LnJldHVyblR5cGUoKTtcblxuICAgIGNvbnN0IGZ1bmMgPSBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPihyZXNvdXJjZS5hcGksIHtcbiAgICAgIHBhdGgsXG4gICAgICBvdXRnb2luZ1R5cGUsXG4gICAgICBiaW5kaW5nVHlwZSxcbiAgICAgIGluY29taW5nVHlwZSxcbiAgICAgIHNlZ21lbnRzOiByZXNvdXJjZS5jbG9uZVNlZ21lbnRzKCksXG4gICAgfSk7XG5cbiAgICAvLyBTd2l0Y2ggZW50aXR5U2V0IHRvIGJpbmRpbmcgdHlwZSBpZiBhdmFpbGFibGVcbiAgICBpZiAoYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCAmJiBiaW5kaW5nVHlwZSAhPT0gYmFzZVR5cGUpIHtcbiAgICAgIGxldCBlbnRpdHlTZXQgPSByZXNvdXJjZS5hcGkuZmluZEVudGl0eVNldChiaW5kaW5nVHlwZSk7XG4gICAgICBpZiAoZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZnVuYy5zZWdtZW50KChzKSA9PiBzLmVudGl0eVNldCgpLnBhdGgoZW50aXR5U2V0IS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwYXJhbWV0ZXJzKHBhcmFtczogUCB8IG51bGwsIHsgYWxpYXMgfTogeyBhbGlhcz86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJhbXMgIT09IG51bGwgPyB0aGlzLmVuY29kZShwYXJhbXMpIDogbnVsbDtcbiAgICBpZiAoYWxpYXMgJiYgcGFyYW1ldGVycyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5xdWVyeSgocSkgPT4ge1xuICAgICAgICBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykucmVkdWNlKChhY2MsIFtuYW1lLCBwYXJhbV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiBxLmFsaWFzKHBhcmFtLCBuYW1lKSB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCkuc2VnbWVudCgocykgPT4gcy5mdW5jdGlvbigpLnBhcmFtZXRlcnM8UD4ocGFyYW1ldGVycykpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFJlcXVlc3RzXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQoXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXR5T3B0aW9ucyAmIE9EYXRhRW50aXRpZXNPcHRpb25zICYgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHN1cGVyLmdldChvcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2hvcnRjdXRzXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gYmUgc2VudCB0byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIGFsaWFzIElmIHRydWUsIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc2VuZCB1c2luZyBhbGlhc2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqL1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuIH0gJiBPRGF0YUVudGl0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuIH0gJiBPRGF0YUVudGl0aWVzT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxPRGF0YUVudGl0aWVzPFI+PjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFQcm9wZXJ0eTxSPj47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zPzogeyBhbGlhcz86IGJvb2xlYW47IHJlc3BvbnNlVHlwZT86ICdibG9iJyB9ICYgT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEJsb2I+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuOyByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIH0gJiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuOyByZXNwb25zZVR5cGU/OiAnbm9uZScgfSAmIE9EYXRhT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxudWxsPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHtcbiAgICAgIGFsaWFzLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IHtcbiAgICAgIGFsaWFzPzogYm9vbGVhbjtcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XG4gICAgfSAmIE9EYXRhRW50aXR5T3B0aW9ucyAmXG4gICAgICBPRGF0YUVudGl0aWVzT3B0aW9ucyAmXG4gICAgICBPRGF0YVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMocGFyYW1zLCB7IGFsaWFzIH0pLmdldChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIHByb3BlcnR5XG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyB0byBiZSBzZW50IHRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0gYWxpYXMgSWYgdHJ1ZSwgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBzZW5kIHVzaW5nIGFsaWFzZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgY2FsbFByb3BlcnR5KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgeyBhbGlhcywgLi4ub3B0aW9ucyB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywge1xuICAgICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknLFxuICAgICAgYWxpYXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pLnBpcGUobWFwKCh7IHByb3BlcnR5IH0pID0+IHByb3BlcnR5KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBlbnRpdHlcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBhbGlhcyBJZiB0cnVlLCB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIHNlbmQgdXNpbmcgYWxpYXNlc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uXG4gICAqL1xuICBjYWxsRW50aXR5KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgeyBhbGlhcywgLi4ub3B0aW9ucyB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywge1xuICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXR5JyxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KS5waXBlKG1hcCgoeyBlbnRpdHkgfSkgPT4gZW50aXR5KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBtb2RlbFxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gYmUgc2VudCB0byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIGFsaWFzIElmIHRydWUsIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc2VuZCB1c2luZyBhbGlhc2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIGNhbGxNb2RlbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHtcbiAgICAgIGFsaWFzLFxuICAgICAgTW9kZWxUeXBlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHsgYWxpYXM/OiBib29sZWFuOyBNb2RlbFR5cGU/OiB0eXBlb2YgT0RhdGFNb2RlbCB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdlbnRpdHknLFxuICAgICAgYWxpYXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXR5ID8gdGhpcy5hc01vZGVsKGVudGl0eSwgeyBhbm5vdHMsIE1vZGVsVHlwZSB9KSA6IG51bGwsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBlbnRpdGllc1xuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdG8gYmUgc2VudCB0byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIGFsaWFzIElmIHRydWUsIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc2VuZCB1c2luZyBhbGlhc2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIGNhbGxFbnRpdGllcyhcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHsgYWxpYXMsIC4uLm9wdGlvbnMgfTogeyBhbGlhcz86IGJvb2xlYW4gfSAmIE9EYXRhT3B0aW9ucyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJbXSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywge1xuICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLFxuICAgICAgYWxpYXMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pLnBpcGUobWFwKCh7IGVudGl0aWVzIH0pID0+IGVudGl0aWVzKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyB0byBiZSBzZW50IHRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0gYWxpYXMgSWYgdHJ1ZSwgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBzZW5kIHVzaW5nIGFsaWFzZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgY2FsbENvbGxlY3Rpb24oXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICB7XG4gICAgICBhbGlhcyxcbiAgICAgIENvbGxlY3Rpb25UeXBlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IHtcbiAgICAgIGFsaWFzPzogYm9vbGVhbjtcbiAgICAgIENvbGxlY3Rpb25UeXBlPzogdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+XG4gICAgICAgIGVudGl0aWVzXG4gICAgICAgICAgPyB0aGlzLmFzQ29sbGVjdGlvbihlbnRpdGllcywgeyBhbm5vdHMsIENvbGxlY3Rpb25UeXBlIH0pXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGNhbGxBcnJheWJ1ZmZlcihcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHsgYWxpYXMsIC4uLm9wdGlvbnMgfTogeyBhbGlhcz86IGJvb2xlYW4gfSAmIE9EYXRhT3B0aW9ucyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxCbG9iKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgeyBhbGlhcywgLi4ub3B0aW9ucyB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8QmxvYj4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBhbGlhcywgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuIl19