@datorama/akita
Version:
State Management Tailored-Made for JS Applications
373 lines • 33.5 kB
JavaScript
/**
* @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==