ngx-base-state
Version:
Base classes for creation state service via Rxjs observable
208 lines • 20 kB
JavaScript
import { __decorate } from "tslib";
import { ɵAction as Action } from '../decorators';
import { BaseState } from './base.state';
/**
* @class
* @abstract
* @classdes Array state class. Implementing base array functionality.
*/
export class ArrayState extends BaseState {
/**
* Return item by quired index.
* @public
* @param {Number} index - Quired index
* @deprecated use `this.data[index]` instead
* @return {Generic} quired item.
*/
getByIndex(index) {
const items = this.data;
return items[index];
}
/**
* Unshift item to array in state.
* @public
* @param {Generic} item - Item needs to unshift.
*/
unshiftItem(item) {
const items = this.data;
items.unshift(item);
this.setNewValue(items);
}
/**
* Shift array in state.
* @public
*/
shift() {
const items = this.data;
items.shift();
this.setNewValue(items);
}
/**
* Pop array in state.
* @public
*/
pop() {
const items = this.data;
items.pop();
this.setNewValue(items);
}
/**
* Concat current state with another array.
* @param {T[]} array - Another array to concat with the current state.
* @public
*/
concatWith(array) {
const items = this.data;
const newItems = items.concat(array);
this.setNewValue(newItems);
}
/**
* Push item to array in state.
* @public
* @param {Generic} item - Item needs to push
*/
pushItem(item) {
const items = this.data;
items.push(item);
this.setNewValue(items);
}
/**
* Insert item in array by index.
* @public
* @param {number} index - Index where to insert new item.
* @param {Generic} item - Item need to insert.
*/
insertItemByIndex(index, item) {
const items = this.data;
items.splice(index, 0, item);
this.setNewValue(items);
}
/**
* Remove item in array by item identify param (using `compareItems` method).
* @public
* @param {Generic} itemId - Id of item you want to remove.
*/
removeItem(item) {
const index = this.data.findIndex((_item) => this.compareItems(item, _item));
return this.removeItemByIndex(index);
}
/**
* Remove item in array by item id (using `getItemId` method).
* @public
* @param {Generic} itemId - Id of item you want to remove.
*/
removeItemById(itemId) {
const index = this.data.findIndex((_item) => itemId === this.getItemId(_item));
return this.removeItemByIndex(index);
}
/**
* Remove item in array by index.
* @public
* @param {number} index - Index of item you want to remove.
*/
removeItemByIndex(index) {
const items = this.data;
const removedItem = this.data[index];
items.splice(index, 1);
this.setNewValue(items);
return removedItem;
}
/**
* Update item in array by item identify param (using `compareItems` method).
* @public
* @param {Generic} itemToUpdate - item that will be update.
*/
updateItem(itemToUpdate) {
const items = this.data;
const newItemToUpdate = { ...itemToUpdate };
const itemIndex = items.findIndex((_currentItem) => this.compareItems(_currentItem, newItemToUpdate));
items[itemIndex] = newItemToUpdate;
this.setNewValue(items);
}
/**
* Update item in array by index.
* @public
* @param {Generic} itemToUpdate - item that will be update.
* @param {Generic} index - index of item that need to update.
*/
updateItemByIndex(itemToUpdate, index) {
const items = this.data;
items[index] = itemToUpdate;
this.setNewValue(items);
}
setNewValue(value) {
if (value) {
this.validateDataType(value);
super.setNewValue([...value]);
}
else {
super.setNewValue(null);
}
}
catchError(error, actionName) {
if (error instanceof TypeError) {
throw new Error(`\n${this.constructor.name} [${actionName}]: ` +
`Firstly set Array.\n\n${error.message}`);
}
super.catchError(error, actionName);
}
/**
* Must return identify param of item.
* Method must be filled in child classes.
* Used for compare two any items.
* @protected
* @param {Generic} item - item of your state.
* @return {any} identify param of item.
*/
getItemId(item) {
return item;
}
validateDataType(data) {
if (!Array.isArray(data)) {
throw new Error(`${this.constructor.name}: Expected data in Array format!`);
}
}
/**
* Compare two items via `getItemId`
* @private
* @param {Generic} itemToUpdate - item that will be update.
* @return {boolean} result of comparing two items via `getItemId`.
*/
compareItems(firstItem, secondItem) {
return (this.getItemId(firstItem) === this.getItemId(secondItem));
}
}
__decorate([
Action
], ArrayState.prototype, "unshiftItem", null);
__decorate([
Action
], ArrayState.prototype, "shift", null);
__decorate([
Action
], ArrayState.prototype, "pop", null);
__decorate([
Action
], ArrayState.prototype, "concatWith", null);
__decorate([
Action
], ArrayState.prototype, "pushItem", null);
__decorate([
Action
], ArrayState.prototype, "insertItemByIndex", null);
__decorate([
Action
], ArrayState.prototype, "removeItem", null);
__decorate([
Action
], ArrayState.prototype, "removeItemById", null);
__decorate([
Action
], ArrayState.prototype, "removeItemByIndex", null);
__decorate([
Action
], ArrayState.prototype, "updateItem", null);
__decorate([
Action
], ArrayState.prototype, "updateItemByIndex", null);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWJyYXJ5L3NyYy9saWIvc3RhdGVzL2FycmF5LnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQWdCLFVBQWMsU0FBUSxTQUFjO0lBQ3REOzs7Ozs7T0FNRztJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsT0FBTyxLQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFFSSxXQUFXLENBQUMsSUFBTztRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXhCLEtBQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBRUksS0FBSztRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsS0FBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBRUksR0FBRztRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsS0FBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUVJLFVBQVUsQ0FBQyxLQUFV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Q0FPTjtBQVFEO0lBREMsTUFBTTtnREFPTjtBQVFEO0lBREMsTUFBTTttREFVTjtBQVFEO0lBREMsTUFBTTs0Q0FZTjtBQVNEO0lBREMsTUFBTTttREFPTiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IMm1QWN0aW9uIGFzIEFjdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlU3RhdGUgfSBmcm9tICcuL2Jhc2Uuc3RhdGUnO1xyXG5cclxuLyoqXHJcbiAqXHRAY2xhc3NcclxuICpcdEBhYnN0cmFjdFxyXG4gKlx0QGNsYXNzZGVzIEFycmF5IHN0YXRlIGNsYXNzLiBJbXBsZW1lbnRpbmcgYmFzZSBhcnJheSBmdW5jdGlvbmFsaXR5LlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFycmF5U3RhdGU8VD4gZXh0ZW5kcyBCYXNlU3RhdGU8VFtdPiB7XHJcbiAgICAvKipcclxuICAgICAqIFx0UmV0dXJuIGl0ZW0gYnkgcXVpcmVkIGluZGV4LlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge051bWJlcn0gaW5kZXggLSBRdWlyZWQgaW5kZXhcclxuICAgICAqICBAZGVwcmVjYXRlZCB1c2UgYHRoaXMuZGF0YVtpbmRleF1gIGluc3RlYWRcclxuICAgICAqXHRAcmV0dXJuIHtHZW5lcmljfSBxdWlyZWQgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kYXRhO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXMhW2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0VW5zaGlmdCBpdGVtIHRvIGFycmF5IGluIHN0YXRlLlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW0gLSBJdGVtIG5lZWRzIHRvIHVuc2hpZnQuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyB1bnNoaWZ0SXRlbShpdGVtOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS51bnNoaWZ0KGl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0U2hpZnQgYXJyYXkgaW4gc3RhdGUuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgc2hpZnQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS5zaGlmdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0UG9wIGFycmF5IGluIHN0YXRlLlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHBvcCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgICAgaXRlbXMhLnBvcCgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0Q29uY2F0IGN1cnJlbnQgc3RhdGUgd2l0aCBhbm90aGVyIGFycmF5LlxyXG4gICAgICpcdEBwYXJhbSB7VFtdfSBhcnJheSAtIEFub3RoZXIgYXJyYXkgdG8gY29uY2F0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgY29uY2F0V2l0aChhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcyEuY29uY2F0KGFycmF5KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdJdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFB1c2ggaXRlbSB0byBhcnJheSBpbiBzdGF0ZS5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtIC0gSXRlbSBuZWVkcyB0byBwdXNoXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyBwdXNoSXRlbShpdGVtOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS5wdXNoKGl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0SW5zZXJ0IGl0ZW0gaW4gYXJyYXkgYnkgaW5kZXguXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICpcdEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIEluZGV4IHdoZXJlIHRvIGluc2VydCBuZXcgaXRlbS5cclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW0gLSBJdGVtIG5lZWQgdG8gaW5zZXJ0LlxyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgaW5zZXJ0SXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kYXRhO1xyXG5cclxuICAgICAgICBpdGVtcyEuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0UmVtb3ZlIGl0ZW0gaW4gYXJyYXkgYnkgaXRlbSBpZGVudGlmeSBwYXJhbSAodXNpbmcgYGNvbXBhcmVJdGVtc2AgbWV0aG9kKS5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtSWQgLSBJZCBvZiBpdGVtIHlvdSB3YW50IHRvIHJlbW92ZS5cclxuICAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhIS5maW5kSW5kZXgoKF9pdGVtKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVJdGVtcyhpdGVtLCBfaXRlbSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtQnlJbmRleChpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFJlbW92ZSBpdGVtIGluIGFycmF5IGJ5IGl0ZW0gaWQgKHVzaW5nIGBnZXRJdGVtSWRgIG1ldGhvZCkuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICpcdEBwYXJhbSB7R2VuZXJpY30gaXRlbUlkIC0gSWQgb2YgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyByZW1vdmVJdGVtQnlJZChpdGVtSWQ6IHVua25vd24pOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YSEuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoX2l0ZW0pID0+IGl0ZW1JZCA9PT0gdGhpcy5nZXRJdGVtSWQoX2l0ZW0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUJ5SW5kZXgoaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHRSZW1vdmUgaXRlbSBpbiBhcnJheSBieSBpbmRleC5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gSW5kZXggb2YgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyByZW1vdmVJdGVtQnlJbmRleChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmRhdGEhW2luZGV4XTtcclxuXHJcbiAgICAgICAgaXRlbXMhLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUoaXRlbXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVtb3ZlZEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFVwZGF0ZSBpdGVtIGluIGFycmF5IGJ5IGl0ZW0gaWRlbnRpZnkgcGFyYW0gKHVzaW5nIGBjb21wYXJlSXRlbXNgIG1ldGhvZCkuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtVG9VcGRhdGUgLSBpdGVtIHRoYXQgd2lsbCBiZSB1cGRhdGUuXHJcbiAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHVwZGF0ZUl0ZW0oaXRlbVRvVXBkYXRlOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbVRvVXBkYXRlID0geyAuLi5pdGVtVG9VcGRhdGUgfTtcclxuXHJcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gaXRlbXMhLmZpbmRJbmRleCgoX2N1cnJlbnRJdGVtKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVJdGVtcyhfY3VycmVudEl0ZW0sIG5ld0l0ZW1Ub1VwZGF0ZSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpdGVtcyFbaXRlbUluZGV4XSA9IG5ld0l0ZW1Ub1VwZGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShpdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFVwZGF0ZSBpdGVtIGluIGFycmF5IGJ5IGluZGV4LlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW1Ub1VwZGF0ZSAtIGl0ZW0gdGhhdCB3aWxsIGJlIHVwZGF0ZS5cclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGluZGV4IC0gaW5kZXggb2YgaXRlbSB0aGF0IG5lZWQgdG8gdXBkYXRlLlxyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgdXBkYXRlSXRlbUJ5SW5kZXgoaXRlbVRvVXBkYXRlOiBULCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIVtpbmRleF0gPSBpdGVtVG9VcGRhdGU7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUoaXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXROZXdWYWx1ZSh2YWx1ZTogVFtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlRGF0YVR5cGUodmFsdWUpO1xyXG4gICAgICAgICAgICBzdXBlci5zZXROZXdWYWx1ZShbLi4udmFsdWVdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdXBlci5zZXROZXdWYWx1ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhdGNoRXJyb3IoZXJyb3I6IEVycm9yIHwgVHlwZUVycm9yLCBhY3Rpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYFxcbiR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBbJHthY3Rpb25OYW1lfV06IGAgK1xyXG4gICAgICAgICAgICAgICAgYEZpcnN0bHkgc2V0IEFycmF5LlxcblxcbiR7ZXJyb3IubWVzc2FnZX1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5jYXRjaEVycm9yKGVycm9yLCBhY3Rpb25OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHRNdXN0IHJldHVybiBpZGVudGlmeSBwYXJhbSBvZiBpdGVtLlxyXG4gICAgICpcdE1ldGhvZCBtdXN0IGJlIGZpbGxlZCBpbiBjaGlsZCBjbGFzc2VzLlxyXG4gICAgICpcdFVzZWQgZm9yIGNvbXBhcmUgdHdvIGFueSBpdGVtcy5cclxuICAgICAqICBAcHJvdGVjdGVkXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtIC0gaXRlbSBvZiB5b3VyIHN0YXRlLlxyXG4gICAgICpcdEByZXR1cm4ge2FueX0gaWRlbnRpZnkgcGFyYW0gb2YgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1JZChpdGVtOiBUKTogYW55IHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGVEYXRhVHlwZShkYXRhOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBFeHBlY3RlZCBkYXRhIGluIEFycmF5IGZvcm1hdCFgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdENvbXBhcmUgdHdvIGl0ZW1zIHZpYSBgZ2V0SXRlbUlkYFxyXG4gICAgICpcdEBwcml2YXRlXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtVG9VcGRhdGUgLSBpdGVtIHRoYXQgd2lsbCBiZSB1cGRhdGUuXHJcbiAgICAgKlx0QHJldHVybiB7Ym9vbGVhbn0gcmVzdWx0IG9mIGNvbXBhcmluZyB0d28gaXRlbXMgdmlhIGBnZXRJdGVtSWRgLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbXBhcmVJdGVtcyhmaXJzdEl0ZW06IFQsIHNlY29uZEl0ZW06IFQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0SXRlbUlkKGZpcnN0SXRlbSkgPT09IHRoaXMuZ2V0SXRlbUlkKHNlY29uZEl0ZW0pKTtcclxuICAgIH1cclxufVxyXG4iXX0=