@granito/ngx-hal-client
Version:
A HAL client to be used in Angular projects
150 lines • 15 kB
JavaScript
import { Observable, filter, map, of, pipe, switchMap, takeUntil } from 'rxjs';
import { isDefined } from './internal';
/**
* Returns an RxJS operator that makes the source {@link Observable}
* complete at the same time as the lifetime {@link Observable}.
*
* @param lifetime the lifetime observable
* @returns a function that transforms the source {@link Observable}
*/
export function completeWith(lifetime) {
const terminator$ = new Observable(subscriber => lifetime.subscribe().add(() => subscriber.next()));
return pipe(takeUntil(terminator$));
}
/**
* Returns an RxJS operator to follow a link on a {@link Resource}. It is
* equivalent to
* ```ts
* map(resource => resource?.follow(rel, params))
* ```
*
* @param rel the relation to follow
* @param params the parameters to expand the link
* @returns a function that transforms the source {@link Observable}
*/
export function follow(rel, params) {
return pipe(map(resource => resource?.follow(rel, params)));
}
/**
* Returns an RxJS operator to create a new resource identified by
* an {@link Accessor} or a {@link Resource}. It is equivalent to
* ```ts
* switchMap(x => of(undefined))
* ```
* if the stream value is `null` or `undefined` and to
* ```ts
* switchMap(x => x.create(obj))
* ```
* otherwise.
*
* @param obj the value for the resource
* @returns a function that transforms the source {@link Observable}
*/
export function create(obj) {
return pipe(switchMap(base => !base ? of(undefined) : base.create(obj)));
}
/**
* Returns an RxJS operator to read a {@link Resource} using an
* {@link Accessor}. It is equivalent to
* ```ts
* switchMap(accessor => of(undefined))
* ```
* if `accessor` is `null` or `undefined` and to
* ```ts
* switchMap(accessor => accessor.read(type))
* ```
* otherwise.
*
* @param type the resource type
* @returns a function that transforms the source {@link Observable}
*/
export function read(type) {
return pipe(switchMap(accessor => !accessor ? of(undefined) :
accessor.read(type)));
}
/**
* Returns an RxJS operator to read a {@link Collection} of resources
* using an {@link Accessor}. It is equivalent to
* ```ts
* switchMap(accessor => of(undefined))
* ```
* if `accessor` is `null` or `undefined` and to
* ```ts
* switchMap(accessor => accessor.readCollection(type))
* ```
* otherwise.
*
* @param type the collection element type
* @returns a function that transforms the source {@link Observable}
*/
export function readCollection(type) {
return pipe(switchMap(accessor => !accessor ? of(undefined) :
accessor.readCollection(type)));
}
/**
* Returns an RxJS operator to refresh a {@link Resource} or
* {@link Collection} of resources. It is equivalent to
* ```ts
* switchMap(resource => of(undefined))
* ```
* if `resource` is `null` or `undefined` and to
* ```ts
* switchMap(resource => resource.read())
* ```
* otherwise.
*
* @returns a function that transforms the source {@link Observable}
*/
export function refresh() {
return pipe(switchMap(resource => !resource ? of(undefined) : resource.read()));
}
/**
* Returns an RxJS operator to edit and update a {@link Resource}.
* It is equivalent to
* ```ts
* switchMap(resource => of(undefined))
* ```
* if `resource` is `null` or `undefined` and applying edit operation to
* the resource and doing
* ```ts
* switchMap(resource => resource.update())
* ```
* otherwise.
*
* @param edit the operation to edit the resource
* @returns a function that transforms the source {@link Observable}
*/
export function update(edit) {
return pipe(switchMap(resource => {
if (!resource)
return of(undefined);
return (edit(resource)).update();
}));
}
/**
* Returns an RxJS operator to delete a resource identified by
* an {@link Accessor} or a {@link Resource}. It is equivalent to
* ```ts
* switchMap(x => of(undefined))
* ```
* if the stream value is `null` or `undefined` and to
* ```ts
* switchMap(x => x.delete())
* ```
* otherwise.
*
* @returns a function that transforms the source {@link Observable}
*/
export function del() {
return pipe(switchMap(base => !base ? of(undefined) : base.delete()));
}
/**
* Returns an RxJS operator to filter out `null` and `undefined` items
* from the source {@link Observable}.
*
* @returns a function that transforms the source {@link Observable}
*/
export function defined() {
return pipe(filter(isDefined));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnhqcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnhqcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUNuRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUEwQyxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFL0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBSSxRQUF5QjtJQUVyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLFVBQVUsQ0FBTyxVQUFVLENBQUMsRUFBRSxDQUNsRCxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVcsRUFBRSxNQUEyQjtJQUUzRCxPQUFPLElBQUksQ0FDUCxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFRO0lBRTNCLE9BQU8sSUFBSSxDQUNQLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDOUQsQ0FBQztBQUNOLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQXFCLElBQWE7SUFFbEQsT0FBTyxJQUFJLENBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDM0IsQ0FBQztBQUNOLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQXFCLElBQWE7SUFFNUQsT0FBTyxJQUFJLENBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDckMsQ0FBQztBQUNOLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLE9BQU87SUFFbkIsT0FBTyxJQUFJLENBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQ3JFLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBcUIsSUFBa0M7SUFFekUsT0FBTyxJQUFJLENBQ1AsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxRQUFRO1lBQ1QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxDQUNMLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxHQUFHO0lBRWYsT0FBTyxJQUFJLENBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQzNELENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTztJQUVuQixPQUFPLElBQUksQ0FDUCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ3BCLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT3BlcmF0b3JGdW5jdGlvbiwgZmlsdGVyLCBtYXAsIG9mLCBwaXBlLCBzd2l0Y2hNYXAsXG4gICAgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2Nlc3NvciwgQ29sbGVjdGlvbiwgUGFyYW1zLCBSZXNvdXJjZSwgaXNEZWZpbmVkIH0gZnJvbSAnLi9pbnRlcm5hbCc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBSeEpTIG9wZXJhdG9yIHRoYXQgbWFrZXMgdGhlIHNvdXJjZSB7QGxpbmsgT2JzZXJ2YWJsZX1cbiAqIGNvbXBsZXRlIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGxpZmV0aW1lIHtAbGluayBPYnNlcnZhYmxlfS5cbiAqXG4gKiBAcGFyYW0gbGlmZXRpbWUgdGhlIGxpZmV0aW1lIG9ic2VydmFibGVcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBzb3VyY2Uge0BsaW5rIE9ic2VydmFibGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV0ZVdpdGg8VD4obGlmZXRpbWU6IE9ic2VydmFibGU8YW55Pik6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxULCBUPiB7XG4gICAgY29uc3QgdGVybWluYXRvciQgPSBuZXcgT2JzZXJ2YWJsZTx2b2lkPihzdWJzY3JpYmVyID0+XG4gICAgICAgIGxpZmV0aW1lLnN1YnNjcmliZSgpLmFkZCgoKSA9PiBzdWJzY3JpYmVyLm5leHQoKSkpO1xuXG4gICAgcmV0dXJuIHBpcGUodGFrZVVudGlsKHRlcm1pbmF0b3IkKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBSeEpTIG9wZXJhdG9yIHRvIGZvbGxvdyBhIGxpbmsgb24gYSB7QGxpbmsgUmVzb3VyY2V9LiBJdCBpc1xuICogZXF1aXZhbGVudCB0b1xuICogYGBgdHNcbiAqIG1hcChyZXNvdXJjZSA9PiByZXNvdXJjZT8uZm9sbG93KHJlbCwgcGFyYW1zKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSByZWwgdGhlIHJlbGF0aW9uIHRvIGZvbGxvd1xuICogQHBhcmFtIHBhcmFtcyB0aGUgcGFyYW1ldGVycyB0byBleHBhbmQgdGhlIGxpbmtcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBzb3VyY2Uge0BsaW5rIE9ic2VydmFibGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3cocmVsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtcyB8IHVuZGVmaW5lZCk6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxSZXNvdXJjZSB8IG51bGwgfCB1bmRlZmluZWQsIEFjY2Vzc29yIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICAgIG1hcChyZXNvdXJjZSA9PiByZXNvdXJjZT8uZm9sbG93KHJlbCwgcGFyYW1zKSlcbiAgICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gUnhKUyBvcGVyYXRvciB0byBjcmVhdGUgYSBuZXcgcmVzb3VyY2UgaWRlbnRpZmllZCBieVxuICogYW4ge0BsaW5rIEFjY2Vzc29yfSBvciBhIHtAbGluayBSZXNvdXJjZX0uIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAoeCA9PiBvZih1bmRlZmluZWQpKVxuICogYGBgXG4gKiBpZiB0aGUgc3RyZWFtIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgdG9cbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAoeCA9PiB4LmNyZWF0ZShvYmopKVxuICogYGBgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgdmFsdWUgZm9yIHRoZSByZXNvdXJjZVxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIHNvdXJjZSB7QGxpbmsgT2JzZXJ2YWJsZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShvYmo6IGFueSk6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxBY2Nlc3NvciB8IFJlc291cmNlIHwgdW5kZWZpbmVkLCBBY2Nlc3NvciB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgICBzd2l0Y2hNYXAoYmFzZSA9PiAhYmFzZSA/IG9mKHVuZGVmaW5lZCkgOiBiYXNlLmNyZWF0ZShvYmopKVxuICAgICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBSeEpTIG9wZXJhdG9yIHRvIHJlYWQgYSB7QGxpbmsgUmVzb3VyY2V9IHVzaW5nIGFuXG4gKiB7QGxpbmsgQWNjZXNzb3J9LiBJdCBpcyBlcXVpdmFsZW50IHRvXG4gKiBgYGB0c1xuICogc3dpdGNoTWFwKGFjY2Vzc29yID0+IG9mKHVuZGVmaW5lZCkpXG4gKiBgYGBcbiAqIGlmIGBhY2Nlc3NvcmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB0b1xuICogYGBgdHNcbiAqIHN3aXRjaE1hcChhY2Nlc3NvciA9PiBhY2Nlc3Nvci5yZWFkKHR5cGUpKVxuICogYGBgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHR5cGUgdGhlIHJlc291cmNlIHR5cGVcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBzb3VyY2Uge0BsaW5rIE9ic2VydmFibGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkPFQgZXh0ZW5kcyBSZXNvdXJjZT4odHlwZTogVHlwZTxUPik6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxBY2Nlc3NvciB8IG51bGwgfCB1bmRlZmluZWQsIFQgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgICAgc3dpdGNoTWFwKGFjY2Vzc29yID0+ICFhY2Nlc3NvciA/IG9mKHVuZGVmaW5lZCkgOlxuICAgICAgICAgICAgYWNjZXNzb3IucmVhZCh0eXBlKSlcbiAgICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gUnhKUyBvcGVyYXRvciB0byByZWFkIGEge0BsaW5rIENvbGxlY3Rpb259IG9mIHJlc291cmNlc1xuICogdXNpbmcgYW4ge0BsaW5rIEFjY2Vzc29yfS4gSXQgaXMgZXF1aXZhbGVudCB0b1xuICogYGBgdHNcbiAqIHN3aXRjaE1hcChhY2Nlc3NvciA9PiBvZih1bmRlZmluZWQpKVxuICogYGBgXG4gKiBpZiBgYWNjZXNzb3JgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgdG9cbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAoYWNjZXNzb3IgPT4gYWNjZXNzb3IucmVhZENvbGxlY3Rpb24odHlwZSkpXG4gKiBgYGBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSB0aGUgY29sbGVjdGlvbiBlbGVtZW50IHR5cGVcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBzb3VyY2Uge0BsaW5rIE9ic2VydmFibGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbjxUIGV4dGVuZHMgUmVzb3VyY2U+KHR5cGU6IFR5cGU8VD4pOlxuICAgIE9wZXJhdG9yRnVuY3Rpb248QWNjZXNzb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBDb2xsZWN0aW9uPFQ+IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChhY2Nlc3NvciA9PiAhYWNjZXNzb3IgPyBvZih1bmRlZmluZWQpIDpcbiAgICAgICAgICAgIGFjY2Vzc29yLnJlYWRDb2xsZWN0aW9uKHR5cGUpKVxuICAgICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBSeEpTIG9wZXJhdG9yIHRvIHJlZnJlc2ggYSB7QGxpbmsgUmVzb3VyY2V9IG9yXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0gb2YgcmVzb3VyY2VzLiBJdCBpcyBlcXVpdmFsZW50IHRvXG4gKiBgYGB0c1xuICogc3dpdGNoTWFwKHJlc291cmNlID0+IG9mKHVuZGVmaW5lZCkpXG4gKiBgYGBcbiAqIGlmIGByZXNvdXJjZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIGFuZCB0b1xuICogYGBgdHNcbiAqIHN3aXRjaE1hcChyZXNvdXJjZSA9PiByZXNvdXJjZS5yZWFkKCkpXG4gKiBgYGBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgc291cmNlIHtAbGluayBPYnNlcnZhYmxlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaDxUIGV4dGVuZHMgUmVzb3VyY2U+KCk6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxUIHwgbnVsbCB8IHVuZGVmaW5lZCwgVCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgICBzd2l0Y2hNYXAocmVzb3VyY2UgPT4gIXJlc291cmNlID8gb2YodW5kZWZpbmVkKSA6IHJlc291cmNlLnJlYWQoKSlcbiAgICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gUnhKUyBvcGVyYXRvciB0byBlZGl0IGFuZCB1cGRhdGUgYSB7QGxpbmsgUmVzb3VyY2V9LlxuICogSXQgaXMgZXF1aXZhbGVudCB0b1xuICogYGBgdHNcbiAqIHN3aXRjaE1hcChyZXNvdXJjZSA9PiBvZih1bmRlZmluZWQpKVxuICogYGBgXG4gKiBpZiBgcmVzb3VyY2VgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgYXBwbHlpbmcgZWRpdCBvcGVyYXRpb24gdG9cbiAqIHRoZSByZXNvdXJjZSBhbmQgZG9pbmdcbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAocmVzb3VyY2UgPT4gcmVzb3VyY2UudXBkYXRlKCkpXG4gKiBgYGBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gZWRpdCB0aGUgb3BlcmF0aW9uIHRvIGVkaXQgdGhlIHJlc291cmNlXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgc291cmNlIHtAbGluayBPYnNlcnZhYmxlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlPFQgZXh0ZW5kcyBSZXNvdXJjZT4oZWRpdDogKHJlc291cmNlOiBSZWFkb25seTxUPikgPT4gVCk6XG4gICAgT3BlcmF0b3JGdW5jdGlvbjxUIHwgdW5kZWZpbmVkLCBBY2Nlc3NvciB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgICBzd2l0Y2hNYXAocmVzb3VyY2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICAgICAgICAgICAgcmV0dXJuIChlZGl0KHJlc291cmNlKSkudXBkYXRlKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIFJ4SlMgb3BlcmF0b3IgdG8gZGVsZXRlIGEgcmVzb3VyY2UgaWRlbnRpZmllZCBieVxuICogYW4ge0BsaW5rIEFjY2Vzc29yfSBvciBhIHtAbGluayBSZXNvdXJjZX0uIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAoeCA9PiBvZih1bmRlZmluZWQpKVxuICogYGBgXG4gKiBpZiB0aGUgc3RyZWFtIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgdG9cbiAqIGBgYHRzXG4gKiBzd2l0Y2hNYXAoeCA9PiB4LmRlbGV0ZSgpKVxuICogYGBgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIHNvdXJjZSB7QGxpbmsgT2JzZXJ2YWJsZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbCgpOlxuICAgIE9wZXJhdG9yRnVuY3Rpb248QWNjZXNzb3IgfCBSZXNvdXJjZSB8IHVuZGVmaW5lZCwgdm9pZD4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgICBzd2l0Y2hNYXAoYmFzZSA9PiAhYmFzZSA/IG9mKHVuZGVmaW5lZCkgOiBiYXNlLmRlbGV0ZSgpKVxuICAgICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBSeEpTIG9wZXJhdG9yIHRvIGZpbHRlciBvdXQgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBpdGVtc1xuICogZnJvbSB0aGUgc291cmNlIHtAbGluayBPYnNlcnZhYmxlfS5cbiAqXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgc291cmNlIHtAbGluayBPYnNlcnZhYmxlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lZDxUPigpOlxuICAgIE9wZXJhdG9yRnVuY3Rpb248VCB8IG51bGwgfCB1bmRlZmluZWQsIFQgZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkID8gbmV2ZXIgOiBUPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICAgIGZpbHRlcihpc0RlZmluZWQpXG4gICAgKTtcbn1cbiJdfQ==