UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

373 lines 33.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { of } from 'rxjs'; import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; import { isDefined } from './isDefined'; import { Query } from './query'; import { isFunction } from './isFunction'; import { toBoolean } from './toBoolean'; import { sortByOptions } from './sortByOptions'; import { entitiesToArray } from './entitiesToArray'; import { entitiesToMap } from './entitiesToMap'; import { isArray } from './isArray'; import { isNil } from './isNil'; import { findEntityByPredicate, getEntity } from './getEntity'; import { isUndefined } from './isUndefined'; import { distinctUntilArrayItemChanged } from './arrayFind'; import { mapSkipUndefined } from './mapSkipUndefined'; /** * * The Entity Query is similar to the general Query, with additional functionality tailored for EntityStores. * * class WidgetsQuery extends QueryEntity<WidgetsState> { * constructor(protected store: WidgetsStore) { * super(store); * } * } * * * * @template S, EntityType, IDType */ export class QueryEntity extends Query { /** * @param {?} store * @param {?=} options */ constructor(store, options = {}) { super(store); this.options = options; this.__store__ = store; } /** * @param {?=} options * @return {?} */ selectAll(options = { asObject: false }) { return this.select((/** * @param {?} state * @return {?} */ state => state.entities)).pipe(map((/** * @return {?} */ () => this.getAll(options)))); } /** * @param {?=} options * @return {?} */ getAll(options = { asObject: false, filterBy: undefined, limitTo: undefined }) { if (options.asObject) { return entitiesToMap(this.getValue(), options); } sortByOptions(options, this.config || this.options); return entitiesToArray(this.getValue(), options); } /** * @template R * @param {?} ids * @param {?=} project * @return {?} */ selectMany(ids, project) { if (!ids || !ids.length) return of([]); return this.select((/** * @param {?} state * @return {?} */ state => state.entities)).pipe(map((/** * @param {?} entities * @return {?} */ entities => mapSkipUndefined(ids, (/** * @param {?} id * @return {?} */ id => getEntity(id, project)(entities))))), distinctUntilArrayItemChanged()); } /** * @template R * @param {?} idOrPredicate * @param {?=} project * @return {?} */ selectEntity(idOrPredicate, project) { /** @type {?} */ let id = idOrPredicate; if (isFunction(idOrPredicate)) { // For performance reason we expect the entity to be in the store ((/** @type {?} */ (id))) = findEntityByPredicate(idOrPredicate, this.getValue().entities); } return this.select((/** * @param {?} state * @return {?} */ state => state.entities)).pipe(map(getEntity(id, project)), distinctUntilChanged()); } /** * Get an entity by id * * \@example * * this.query.getEntity(1); * @param {?} id * @return {?} */ getEntity(id) { return this.getValue().entities[(/** @type {?} */ (id))]; } /** * Select the active entity's id * * \@example * * this.query.selectActiveId() * @return {?} */ selectActiveId() { return this.select((/** * @param {?} state * @return {?} */ state => ((/** @type {?} */ (state))).active)); } /** * Get the active id * * \@example * * this.query.getActiveId() * @return {?} */ getActiveId() { return this.getValue().active; } /** * @template R * @param {?=} project * @return {?} */ selectActive(project) { if (isArray(this.getActive())) { return this.selectActiveId().pipe(switchMap((/** * @param {?} ids * @return {?} */ ids => this.selectMany(ids, project)))); } return this.selectActiveId().pipe(switchMap((/** * @param {?} ids * @return {?} */ ids => this.selectEntity(ids, project)))); } /** * @return {?} */ getActive() { /** @type {?} */ const activeId = this.getActiveId(); if (isArray(activeId)) { return activeId.map((/** * @param {?} id * @return {?} */ id => this.getValue().entities[(/** @type {?} */ (id))])); } return toBoolean(activeId) ? this.getEntity(activeId) : undefined; } /** * Select the store's entity collection length * * \@example * * this.query.selectCount() * this.query.selectCount(entity => entity.completed) * @param {?=} predicate * @return {?} */ selectCount(predicate) { return this.select((/** * @param {?} state * @return {?} */ state => state.entities)).pipe(map((/** * @return {?} */ () => this.getCount(predicate)))); } /** * Get the store's entity collection length * * \@example * * this.query.getCount() * this.query.getCount(entity => entity.completed) * @param {?=} predicate * @return {?} */ getCount(predicate) { if (isFunction(predicate)) { return this.getAll().filter(predicate).length; } return this.getValue().ids.length; } /** * @template R * @param {?=} project * @return {?} */ selectLast(project) { return this.selectAt((/** * @param {?} ids * @return {?} */ ids => ids[ids.length - 1]), project); } /** * @template R * @param {?=} project * @return {?} */ selectFirst(project) { return this.selectAt((/** * @param {?} ids * @return {?} */ ids => ids[0]), project); } /** * @param {?=} action * @return {?} */ selectEntityAction(action) { if (isUndefined(action)) { return this.store.selectEntityAction$; } return this.store.selectEntityAction$.pipe(filter((/** * @param {?} ac * @return {?} */ ac => ac.type === action)), map((/** * @param {?} action * @return {?} */ action => action.ids))); } /** * @param {?=} projectOrIds * @return {?} */ hasEntity(projectOrIds) { if (isNil(projectOrIds)) { return this.getValue().ids.length > 0; } if (isFunction(projectOrIds)) { return this.getAll().some(projectOrIds); } if (isArray(projectOrIds)) { return projectOrIds.every((/** * @param {?} id * @return {?} */ id => ((/** @type {?} */ (id))) in this.getValue().entities)); } return ((/** @type {?} */ (projectOrIds))) in this.getValue().entities; } /** * Returns whether entity store has an active entity * * \@example * * this.query.hasActive() * this.query.hasActive(3) * * @param {?=} id * @return {?} */ hasActive(id) { /** @type {?} */ const active = this.getValue().active; if (Array.isArray(active)) { if (isDefined(id)) { return active.includes(id); } return active.length > 0; } return isDefined(active); } /** * * Create sub UI query for querying Entity's UI state * * \@example * * * export class ProductsQuery extends QueryEntity<ProductsState> { * ui: EntityUIQuery<ProductsUIState>; * * constructor(protected store: ProductsStore) { * super(store); * this.createUIQuery(); * } * * } * @return {?} */ createUIQuery() { this.ui = new EntityUIQuery(this.__store__.ui); } /** * @private * @template R * @param {?} mapFn * @param {?=} project * @return {?} */ selectAt(mapFn, project) { return this.select((/** * @param {?} state * @return {?} */ state => (/** @type {?} */ (state.ids)))).pipe(map(mapFn), distinctUntilChanged(), switchMap((/** * @param {?} id * @return {?} */ (id) => this.selectEntity(id, project)))); } } if (false) { /** @type {?} */ QueryEntity.prototype.ui; /** * @type {?} * @protected */ QueryEntity.prototype.store; /** @type {?} */ QueryEntity.prototype.__store__; /** * @type {?} * @private */ QueryEntity.prototype.options; } // @internal /** * @template UIState, DEPRECATED */ export class EntityUIQuery extends QueryEntity { /** * @param {?} store */ constructor(store) { super(store); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlFbnRpdHkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvcXVlcnlFbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZXRELE1BQU0sT0FBTyxXQUF5RixTQUFRLEtBQVE7Ozs7O0lBT3BILFlBQVksS0FBcUIsRUFBVSxVQUE4QixFQUFFO1FBQ3pFLEtBQUss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QUFFLEVBQ3RCLFNBQVM7Ozs7UUFBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7Q0FDRjs7O0lBdFdDLHlCQUFtQzs7Ozs7SUFDbkMsNEJBQWdDOztJQUdoQyxnQ0FBVTs7Ozs7SUFFeUIsOEJBQXdDOzs7Ozs7QUFtVzdFLE1BQU0sT0FBTyxhQUF5QyxTQUFRLFdBQW9COzs7O0lBQ2hGLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gJy4vaXNEZWZpbmVkJztcbmltcG9ydCB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi9lbnRpdHlTdG9yZSc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuaW1wb3J0IHsgRW50aXR5U3RhdGUsIEhhc2hNYXAsIElELCBJdGVtUHJlZGljYXRlLCBPckFycmF5LCBTZWxlY3RPcHRpb25zLCBnZXRFbnRpdHlUeXBlLCBnZXRJRFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL2lzRnVuY3Rpb24nO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnLi90b0Jvb2xlYW4nO1xuaW1wb3J0IHsgc29ydEJ5T3B0aW9ucyB9IGZyb20gJy4vc29ydEJ5T3B0aW9ucyc7XG5pbXBvcnQgeyBlbnRpdGllc1RvQXJyYXkgfSBmcm9tICcuL2VudGl0aWVzVG9BcnJheSc7XG5pbXBvcnQgeyBlbnRpdGllc1RvTWFwIH0gZnJvbSAnLi9lbnRpdGllc1RvTWFwJztcbmltcG9ydCB7IFNlbGVjdEFsbE9wdGlvbnNBLCBTZWxlY3RBbGxPcHRpb25zQiwgU2VsZWN0QWxsT3B0aW9uc0MsIFNlbGVjdEFsbE9wdGlvbnNELCBTZWxlY3RBbGxPcHRpb25zRSB9IGZyb20gJy4vc2VsZWN0QWxsT3ZlcmxvYWRzJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL2lzQXJyYXknO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuL2lzTmlsJztcbmltcG9ydCB7IGZpbmRFbnRpdHlCeVByZWRpY2F0ZSwgZ2V0RW50aXR5IH0gZnJvbSAnLi9nZXRFbnRpdHknO1xuaW1wb3J0IHsgRW50aXR5QWN0aW9uLCBFbnRpdHlBY3Rpb25zIH0gZnJvbSAnLi9lbnRpdHlBY3Rpb25zJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkIH0gZnJvbSAnLi9pc1VuZGVmaW5lZCc7XG5pbXBvcnQgeyBRdWVyeUNvbmZpZ09wdGlvbnMgfSBmcm9tICcuL3F1ZXJ5Q29uZmlnJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxBcnJheUl0ZW1DaGFuZ2VkIH0gZnJvbSAnLi9hcnJheUZpbmQnO1xuaW1wb3J0IHsgbWFwU2tpcFVuZGVmaW5lZCB9IGZyb20gJy4vbWFwU2tpcFVuZGVmaW5lZCc7XG5cbi8qKlxuICpcbiAqICBUaGUgRW50aXR5IFF1ZXJ5IGlzIHNpbWlsYXIgdG8gdGhlIGdlbmVyYWwgUXVlcnksIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRhaWxvcmVkIGZvciBFbnRpdHlTdG9yZXMuXG4gKlxuICogIGNsYXNzIFdpZGdldHNRdWVyeSBleHRlbmRzIFF1ZXJ5RW50aXR5PFdpZGdldHNTdGF0ZT4ge1xuICogICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yZTogV2lkZ2V0c1N0b3JlKSB7XG4gKiAgICAgICBzdXBlcihzdG9yZSk7XG4gKiAgICAgfVxuICogIH1cbiAqXG4gKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RW50aXR5PFMgZXh0ZW5kcyBFbnRpdHlTdGF0ZSwgRW50aXR5VHlwZSA9IGdldEVudGl0eVR5cGU8Uz4sIElEVHlwZSA9IGdldElEVHlwZTxTPj4gZXh0ZW5kcyBRdWVyeTxTPiB7XG4gIHVpOiBFbnRpdHlVSVF1ZXJ5PGFueSwgRW50aXR5VHlwZT47XG4gIHByb3RlY3RlZCBzdG9yZTogRW50aXR5U3RvcmU8Uz47XG5cbiAgLy8gQGludGVybmFsXG4gIF9fc3RvcmVfXztcblxuICBjb25zdHJ1Y3RvcihzdG9yZTogRW50aXR5U3RvcmU8Uz4sIHByaXZhdGUgb3B0aW9uczogUXVlcnlDb25maWdPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihzdG9yZSk7XG4gICAgdGhpcy5fX3N0b3JlX18gPSBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGVudGlyZSBzdG9yZSdzIGVudGl0eSBjb2xsZWN0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0QWxsKClcbiAgICpcbiAgICogdGhpcy5xdWVyeS5zZWxlY3RBbGwoe1xuICAgKiAgIGxpbWl0VG86IDVcbiAgICogICBmaWx0ZXJCeTogZW50aXR5ID0+IGVudGl0eS5jb21wbGV0ZWQgPT09IHRydWVcbiAgICogfSlcbiAgICpcbiAgICogdGhpcy5xdWVyeS5zZWxlY3RBbGwoe1xuICAgKiAgIGFzT2JqZWN0OiB0cnVlLFxuICAgKiAgIGxpbWl0VG86IDNcbiAgICogfSlcbiAgICpcbiAgICogIHRoaXMucXVlcnkuc2VsZWN0QWxsKHtcbiAgICogICBzb3J0Qnk6ICdwcmljZScsXG4gICAqICAgc29ydEJ5T3JkZXI6IE9yZGVyLkRFU0NcbiAgICogfSlcbiAgICpcbiAgICovXG4gIHNlbGVjdEFsbChvcHRpb25zOiBTZWxlY3RBbGxPcHRpb25zQTxFbnRpdHlUeXBlPik6IE9ic2VydmFibGU8SGFzaE1hcDxFbnRpdHlUeXBlPj47XG4gIHNlbGVjdEFsbChvcHRpb25zOiBTZWxlY3RBbGxPcHRpb25zQjxFbnRpdHlUeXBlPik6IE9ic2VydmFibGU8RW50aXR5VHlwZVtdPjtcbiAgc2VsZWN0QWxsKG9wdGlvbnM6IFNlbGVjdEFsbE9wdGlvbnNDPEVudGl0eVR5cGU+KTogT2JzZXJ2YWJsZTxIYXNoTWFwPEVudGl0eVR5cGU+PjtcbiAgc2VsZWN0QWxsKG9wdGlvbnM6IFNlbGVjdEFsbE9wdGlvbnNEPEVudGl0eVR5cGU+KTogT2JzZXJ2YWJsZTxFbnRpdHlUeXBlW10+O1xuICBzZWxlY3RBbGwob3B0aW9uczogU2VsZWN0QWxsT3B0aW9uc0U8RW50aXR5VHlwZT4pOiBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXT47XG4gIHNlbGVjdEFsbCgpOiBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXT47XG4gIHNlbGVjdEFsbChcbiAgICBvcHRpb25zOiBTZWxlY3RPcHRpb25zPEVudGl0eVR5cGU+ID0ge1xuICAgICAgYXNPYmplY3Q6IGZhbHNlXG4gICAgfVxuICApOiBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXSB8IEhhc2hNYXA8RW50aXR5VHlwZT4+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZW50aXRpZXMpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0QWxsKG9wdGlvbnMpKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbnRpcmUgc3RvcmUncyBlbnRpdHkgY29sbGVjdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0aGlzLnF1ZXJ5LmdldEFsbCgpXG4gICAqXG4gICAqIHRoaXMucXVlcnkuZ2V0QWxsKHtcbiAgICogICBsaW1pdFRvOiA1XG4gICAqICAgZmlsdGVyQnk6IGVudGl0eSA9PiBlbnRpdHkuY29tcGxldGVkID09PSB0cnVlXG4gICAqIH0pXG4gICAqXG4gICAqIHRoaXMucXVlcnkuZ2V0QWxsKHtcbiAgICogICBhc09iamVjdDogdHJ1ZSxcbiAgICogICBsaW1pdFRvOiAzXG4gICAqIH0pXG4gICAqXG4gICAqICB0aGlzLnF1ZXJ5LmdldEFsbCh7XG4gICAqICAgc29ydEJ5OiAncHJpY2UnLFxuICAgKiAgIHNvcnRCeU9yZGVyOiBPcmRlci5ERVNDXG4gICAqIH0pXG4gICAqL1xuICBnZXRBbGwob3B0aW9uczogU2VsZWN0QWxsT3B0aW9uc0E8RW50aXR5VHlwZT4pOiBIYXNoTWFwPEVudGl0eVR5cGU+O1xuICBnZXRBbGwob3B0aW9uczogU2VsZWN0QWxsT3B0aW9uc0I8RW50aXR5VHlwZT4pOiBFbnRpdHlUeXBlW107XG4gIGdldEFsbChvcHRpb25zOiBTZWxlY3RBbGxPcHRpb25zQzxFbnRpdHlUeXBlPik6IEhhc2hNYXA8RW50aXR5VHlwZT47XG4gIGdldEFsbChvcHRpb25zOiBTZWxlY3RBbGxPcHRpb25zRDxFbnRpdHlUeXBlPik6IEVudGl0eVR5cGVbXTtcbiAgZ2V0QWxsKG9wdGlvbnM6IFNlbGVjdEFsbE9wdGlvbnNFPEVudGl0eVR5cGU+KTogRW50aXR5VHlwZVtdO1xuICBnZXRBbGwoKTogRW50aXR5VHlwZVtdO1xuICBnZXRBbGwob3B0aW9uczogU2VsZWN0T3B0aW9uczxFbnRpdHlUeXBlPiA9IHsgYXNPYmplY3Q6IGZhbHNlLCBmaWx0ZXJCeTogdW5kZWZpbmVkLCBsaW1pdFRvOiB1bmRlZmluZWQgfSk6IEVudGl0eVR5cGVbXSB8IEhhc2hNYXA8RW50aXR5VHlwZT4ge1xuICAgIGlmIChvcHRpb25zLmFzT2JqZWN0KSB7XG4gICAgICByZXR1cm4gZW50aXRpZXNUb01hcCh0aGlzLmdldFZhbHVlKCksIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzb3J0QnlPcHRpb25zKG9wdGlvbnMsIHRoaXMuY29uZmlnIHx8IHRoaXMub3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZW50aXRpZXNUb0FycmF5KHRoaXMuZ2V0VmFsdWUoKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IG11bHRpcGxlIGVudGl0aWVzIGZyb20gdGhlIHN0b3JlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0TWFueShbMSwyLDNdKVxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdE1hbnkoWzEsMl0sIGVudGl0eSA9PiBlbnRpdHkudGl0bGUpXG4gICAqL1xuICBzZWxlY3RNYW55PFI+KGlkczogSURUeXBlW10pOiBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXT47XG4gIHNlbGVjdE1hbnk8Uj4oaWRzOiBJRFR5cGVbXSwgcHJvamVjdDogKGVudGl0eTogRW50aXR5VHlwZSkgPT4gUik6IE9ic2VydmFibGU8UltdPjtcbiAgc2VsZWN0TWFueTxSPihpZHM6IElEVHlwZVtdLCBwcm9qZWN0PzogKGVudGl0eTogRW50aXR5VHlwZSkgPT4gUik6IE9ic2VydmFibGU8RW50aXR5VHlwZVtdIHwgUltdPiB7XG4gICAgaWYgKCFpZHMgfHwgIWlkcy5sZW5ndGgpIHJldHVybiBvZihbXSk7XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZW50aXRpZXMpLnBpcGUoXG4gICAgICBtYXAoZW50aXRpZXMgPT4gbWFwU2tpcFVuZGVmaW5lZChpZHMsIGlkID0+IGdldEVudGl0eShpZCwgcHJvamVjdCkoZW50aXRpZXMpKSksXG4gICAgICBkaXN0aW5jdFVudGlsQXJyYXlJdGVtQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZW50aXR5IG9yIGEgc2xpY2Ugb2YgYW4gZW50aXR5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0RW50aXR5KDEpXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0RW50aXR5KDEsIGVudGl0eSA9PiBlbnRpdHkuY29uZmlnLmRhdGUpXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0RW50aXR5KDEsICdjb21tZW50cycpXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0RW50aXR5KGUgPT4gZS50aXRsZSA9PT0gJ3RpdGxlJylcbiAgICpcbiAgICovXG4gIHNlbGVjdEVudGl0eTxSPihpZDogSURUeXBlKTogT2JzZXJ2YWJsZTxFbnRpdHlUeXBlPjtcbiAgc2VsZWN0RW50aXR5PEsgZXh0ZW5kcyBrZXlvZiBFbnRpdHlUeXBlPihpZDogSURUeXBlLCBwcm9qZWN0PzogSyk6IE9ic2VydmFibGU8RW50aXR5VHlwZVtLXT47XG4gIHNlbGVjdEVudGl0eTxSPihpZDogSURUeXBlLCBwcm9qZWN0OiAoZW50aXR5OiBFbnRpdHlUeXBlKSA9PiBSKTogT2JzZXJ2YWJsZTxSPjtcbiAgc2VsZWN0RW50aXR5PFI+KHByZWRpY2F0ZTogSXRlbVByZWRpY2F0ZTxFbnRpdHlUeXBlPik6IE9ic2VydmFibGU8RW50aXR5VHlwZT47XG4gIHNlbGVjdEVudGl0eTxSPihpZE9yUHJlZGljYXRlOiBJRFR5cGUgfCBJdGVtUHJlZGljYXRlPEVudGl0eVR5cGU+LCBwcm9qZWN0PzogKChlbnRpdHk6IEVudGl0eVR5cGUpID0+IFIpIHwga2V5b2YgRW50aXR5VHlwZSk6IE9ic2VydmFibGU8UiB8IEVudGl0eVR5cGU+IHtcbiAgICBsZXQgaWQgPSBpZE9yUHJlZGljYXRlO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oaWRPclByZWRpY2F0ZSkpIHtcbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb24gd2UgZXhwZWN0IHRoZSBlbnRpdHkgdG8gYmUgaW4gdGhlIHN0b3JlXG4gICAgICAoaWQgYXMgYW55KSA9IGZpbmRFbnRpdHlCeVByZWRpY2F0ZShpZE9yUHJlZGljYXRlLCB0aGlzLmdldFZhbHVlKCkuZW50aXRpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5lbnRpdGllcykucGlwZShcbiAgICAgIG1hcChnZXRFbnRpdHkoaWQsIHByb2plY3QpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBlbnRpdHkgYnkgaWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5nZXRFbnRpdHkoMSk7XG4gICAqL1xuICBnZXRFbnRpdHkoaWQ6IElEVHlwZSk6IEVudGl0eVR5cGUge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCkuZW50aXRpZXNbaWQgYXMgYW55XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGFjdGl2ZSBlbnRpdHkncyBpZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdEFjdGl2ZUlkKClcbiAgICovXG4gIHNlbGVjdEFjdGl2ZUlkKCk6IE9ic2VydmFibGU8U1snYWN0aXZlJ10+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gKHN0YXRlIGFzIFMgJiB7IGFjdGl2ZTogU1snYWN0aXZlJ10gfSkuYWN0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFjdGl2ZSBpZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0aGlzLnF1ZXJ5LmdldEFjdGl2ZUlkKClcbiAgICovXG4gIGdldEFjdGl2ZUlkKCk6IFNbJ2FjdGl2ZSddIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGFjdGl2ZSBlbnRpdHlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5zZWxlY3RBY3RpdmUoKVxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdEFjdGl2ZShlbnRpdHkgPT4gZW50aXR5LnRpdGxlKVxuICAgKi9cbiAgc2VsZWN0QWN0aXZlPFI+KCk6IFNbJ2FjdGl2ZSddIGV4dGVuZHMgYW55W10gPyBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXT4gOiBPYnNlcnZhYmxlPEVudGl0eVR5cGU+O1xuICBzZWxlY3RBY3RpdmU8Uj4ocHJvamVjdD86IChlbnRpdHk6IEVudGl0eVR5cGUpID0+IFIpOiBTWydhY3RpdmUnXSBleHRlbmRzIGFueVtdID8gT2JzZXJ2YWJsZTxSW10+IDogT2JzZXJ2YWJsZTxSPjtcbiAgc2VsZWN0QWN0aXZlPFI+KHByb2plY3Q/OiAoZW50aXR5OiBFbnRpdHlUeXBlKSA9PiBSKTogT2JzZXJ2YWJsZTxSIHwgRW50aXR5VHlwZT4gfCBPYnNlcnZhYmxlPEVudGl0eVR5cGVbXSB8IFJbXT4ge1xuICAgIGlmIChpc0FycmF5KHRoaXMuZ2V0QWN0aXZlKCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RBY3RpdmVJZCgpLnBpcGUoc3dpdGNoTWFwKGlkcyA9PiB0aGlzLnNlbGVjdE1hbnkoaWRzLCBwcm9qZWN0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBY3RpdmVJZCgpLnBpcGUoc3dpdGNoTWFwKGlkcyA9PiB0aGlzLnNlbGVjdEVudGl0eShpZHMsIHByb2plY3QpKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhY3RpdmUgZW50aXR5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuZ2V0QWN0aXZlKClcbiAgICovXG4gIGdldEFjdGl2ZSgpOiBTWydhY3RpdmUnXSBleHRlbmRzIGFueVtdID8gRW50aXR5VHlwZVtdIDogRW50aXR5VHlwZTtcbiAgZ2V0QWN0aXZlKCk6IE9yQXJyYXk8RW50aXR5VHlwZT4ge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5nZXRBY3RpdmVJZCgpO1xuICAgIGlmIChpc0FycmF5KGFjdGl2ZUlkKSkge1xuICAgICAgcmV0dXJuIGFjdGl2ZUlkLm1hcChpZCA9PiB0aGlzLmdldFZhbHVlKCkuZW50aXRpZXNbaWQgYXMgYW55XSk7XG4gICAgfVxuICAgIHJldHVybiB0b0Jvb2xlYW4oYWN0aXZlSWQpID8gdGhpcy5nZXRFbnRpdHkoYWN0aXZlSWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgc3RvcmUncyBlbnRpdHkgY29sbGVjdGlvbiBsZW5ndGhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5zZWxlY3RDb3VudCgpXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0Q291bnQoZW50aXR5ID0+IGVudGl0eS5jb21wbGV0ZWQpXG4gICAqL1xuICBzZWxlY3RDb3VudChwcmVkaWNhdGU/OiAoZW50aXR5OiBFbnRpdHlUeXBlLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZW50aXRpZXMpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0Q291bnQocHJlZGljYXRlKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RvcmUncyBlbnRpdHkgY29sbGVjdGlvbiBsZW5ndGhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5nZXRDb3VudCgpXG4gICAqIHRoaXMucXVlcnkuZ2V0Q291bnQoZW50aXR5ID0+IGVudGl0eS5jb21wbGV0ZWQpXG4gICAqL1xuICBnZXRDb3VudChwcmVkaWNhdGU/OiAoZW50aXR5OiBFbnRpdHlUeXBlLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAoaXNGdW5jdGlvbihwcmVkaWNhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBbGwoKS5maWx0ZXIocHJlZGljYXRlKS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCkuaWRzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTZWxlY3QgdGhlIGxhc3QgZW50aXR5IGZyb20gdGhlIHN0b3JlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0TGFzdCgpXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0TGFzdCh0b2RvID0+IHRvZG8udGl0bGUpXG4gICAqL1xuICBzZWxlY3RMYXN0PFI+KCk6IE9ic2VydmFibGU8RW50aXR5VHlwZT47XG4gIHNlbGVjdExhc3Q8Uj4ocHJvamVjdDogKGVudGl0eTogRW50aXR5VHlwZSkgPT4gUik6IE9ic2VydmFibGU8Uj47XG4gIHNlbGVjdExhc3Q8Uj4ocHJvamVjdD86IChlbnRpdHk6IEVudGl0eVR5cGUpID0+IFIpOiBPYnNlcnZhYmxlPFIgfCBFbnRpdHlUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QXQoaWRzID0+IGlkc1tpZHMubGVuZ3RoIC0gMV0sIHByb2plY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFNlbGVjdCB0aGUgZmlyc3QgZW50aXR5IGZyb20gdGhlIHN0b3JlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0Rmlyc3QoKVxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdEZpcnN0KHRvZG8gPT4gdG9kby50aXRsZSlcbiAgICovXG4gIHNlbGVjdEZpcnN0PFI+KCk6IE9ic2VydmFibGU8RW50aXR5VHlwZT47XG4gIHNlbGVjdEZpcnN0PFI+KHByb2plY3Q6IChlbnRpdHk6IEVudGl0eVR5cGUpID0+IFIpOiBPYnNlcnZhYmxlPFI+O1xuICBzZWxlY3RGaXJzdDxSPihwcm9qZWN0PzogKGVudGl0eTogRW50aXR5VHlwZSkgPT4gUik6IE9ic2VydmFibGU8UiB8IEVudGl0eVR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBdChpZHMgPT4gaWRzWzBdLCBwcm9qZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBMaXN0ZW4gZm9yIGVudGl0eSBhY3Rpb25zXG4gICAqXG4gICAqICBAZXhhbXBsZVxuICAgKlxuICAgKiAgdGhpcy5xdWVyeS5zZWxlY3RFbnRpdHlBY3Rpb24oRW50aXR5QWN0aW9ucy5BZGQpO1xuICAgKiAgdGhpcy5xdWVyeS5zZWxlY3RFbnRpdHlBY3Rpb24oRW50aXR5QWN0aW9ucy5VcGRhdGUpO1xuICAgKiAgdGhpcy5xdWVyeS5zZWxlY3RFbnRpdHlBY3Rpb24oRW50aXR5QWN0aW9ucy5SZW1vdmUpO1xuICAgKlxuICAgKiAgdGhpcy5xdWVyeS5zZWxlY3RFbnRpdHlBY3Rpb24oKTtcbiAgICovXG4gIHNlbGVjdEVudGl0eUFjdGlvbihhY3Rpb246IEVudGl0eUFjdGlvbnMpOiBPYnNlcnZhYmxlPElEW10+O1xuICBzZWxlY3RFbnRpdHlBY3Rpb24oKTogT2JzZXJ2YWJsZTxFbnRpdHlBY3Rpb248RW50aXR5VHlwZT4+O1xuICBzZWxlY3RFbnRpdHlBY3Rpb24oYWN0aW9uPzogRW50aXR5QWN0aW9ucyk6IE9ic2VydmFibGU8SURbXSB8IEVudGl0eUFjdGlvbjxFbnRpdHlUeXBlPj4ge1xuICAgIGlmIChpc1VuZGVmaW5lZChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS5zZWxlY3RFbnRpdHlBY3Rpb24kO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zZWxlY3RFbnRpdHlBY3Rpb24kLnBpcGUoXG4gICAgICBmaWx0ZXIoYWMgPT4gYWMudHlwZSA9PT0gYWN0aW9uKSxcbiAgICAgIG1hcChhY3Rpb24gPT4gYWN0aW9uLmlkcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBlbnRpdHkgZXhpc3RzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuaGFzRW50aXR5KDIpXG4gICAqIHRoaXMucXVlcnkuaGFzRW50aXR5KGVudGl0eSA9PiBlbnRpdHkuY29tcGxldGVkKVxuICAgKiB0aGlzLnF1ZXJ5Lmhhc0VudGl0eShbMSwgMiwgMzNdKVxuICAgKlxuICAgKi9cbiAgaGFzRW50aXR5KGlkOiBJRFR5cGUpOiBib29sZWFuO1xuICBoYXNFbnRpdHkoaWQ6IElEVHlwZVtdKTogYm9vbGVhbjtcbiAgaGFzRW50aXR5KHByb2plY3Q6IChlbnRpdHk6IEVudGl0eVR5cGUpID0+IGJvb2xlYW4pOiBib29sZWFuO1xuICBoYXNFbnRpdHkoKTogYm9vbGVhbjtcbiAgaGFzRW50aXR5KHByb2plY3RPcklkcz86IElEVHlwZSB8IElEVHlwZVtdIHwgKChlbnRpdHk6IEVudGl0eVR5cGUpID0+IGJvb2xlYW4pKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTmlsKHByb2plY3RPcklkcykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCkuaWRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ocHJvamVjdE9ySWRzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsKCkuc29tZShwcm9qZWN0T3JJZHMpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KHByb2plY3RPcklkcykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0T3JJZHMuZXZlcnkoaWQgPT4gKGlkIGFzIGFueSkgaW4gdGhpcy5nZXRWYWx1ZSgpLmVudGl0aWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHByb2plY3RPcklkcyBhcyBhbnkpIGluIHRoaXMuZ2V0VmFsdWUoKS5lbnRpdGllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgZW50aXR5IHN0b3JlIGhhcyBhbiBhY3RpdmUgZW50aXR5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuaGFzQWN0aXZlKClcbiAgICogdGhpcy5xdWVyeS5oYXNBY3RpdmUoMylcbiAgICpcbiAgICovXG4gIGhhc0FjdGl2ZShpZD86IElEVHlwZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuZ2V0VmFsdWUoKS5hY3RpdmU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0aXZlKSkge1xuICAgICAgaWYgKGlzRGVmaW5lZChpZCkpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5pbmNsdWRlcyhpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aXZlLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIHJldHVybiBpc0RlZmluZWQoYWN0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBDcmVhdGUgc3ViIFVJIHF1ZXJ5IGZvciBxdWVyeWluZyBFbnRpdHkncyBVSSBzdGF0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKlxuICAgKiBleHBvcnQgY2xhc3MgUHJvZHVjdHNRdWVyeSBleHRlbmRzIFF1ZXJ5RW50aXR5PFByb2R1Y3RzU3RhdGU+IHtcbiAgICogICB1aTogRW50aXR5VUlRdWVyeTxQcm9kdWN0c1VJU3RhdGU+O1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yZTogUHJvZHVjdHNTdG9yZSkge1xuICAgKiAgICAgc3VwZXIoc3RvcmUpO1xuICAgKiAgICAgdGhpcy5jcmVhdGVVSVF1ZXJ5KCk7XG4gICAqICAgfVxuICAgKlxuICAgKiB9XG4gICAqL1xuICBjcmVhdGVVSVF1ZXJ5KCkge1xuICAgIHRoaXMudWkgPSBuZXcgRW50aXR5VUlRdWVyeSh0aGlzLl9fc3RvcmVfXy51aSk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEF0PFI+KG1hcEZuOiAoaWRzOiBJRFR5cGVbXSkgPT4gSURUeXBlLCBwcm9qZWN0PzogKGVudGl0eTogRW50aXR5VHlwZSkgPT4gUikge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5pZHMgYXMgYW55W10pLnBpcGUoXG4gICAgICBtYXAobWFwRm4pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcCgoaWQ6IElEVHlwZSkgPT4gdGhpcy5zZWxlY3RFbnRpdHkoaWQsIHByb2plY3QpKVxuICAgICk7XG4gIH1cbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgY2xhc3MgRW50aXR5VUlRdWVyeTxVSVN0YXRlLCBERVBSRUNBVEVEID0gYW55PiBleHRlbmRzIFF1ZXJ5RW50aXR5PFVJU3RhdGU+IHtcbiAgY29uc3RydWN0b3Ioc3RvcmUpIHtcbiAgICBzdXBlcihzdG9yZSk7XG4gIH1cbn1cbiJdfQ==