UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

638 lines 38.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { delay, map, switchMap, take } from 'rxjs/operators'; import { BehaviorSubject, from, isObservable } from 'rxjs'; import { AkitaPlugin } from '../plugin'; import { applyTransaction } from '../../transaction'; import { isUndefined } from '../../isUndefined'; import { action, logAction } from '../../actions'; import { isNil } from '../../isNil'; /** * @record * @template E */ export function PaginationResponse() { } if (false) { /** @type {?} */ PaginationResponse.prototype.currentPage; /** @type {?} */ PaginationResponse.prototype.perPage; /** @type {?} */ PaginationResponse.prototype.lastPage; /** @type {?} */ PaginationResponse.prototype.data; /** @type {?|undefined} */ PaginationResponse.prototype.total; /** @type {?|undefined} */ PaginationResponse.prototype.from; /** @type {?|undefined} */ PaginationResponse.prototype.to; /** @type {?|undefined} */ PaginationResponse.prototype.pageControls; } /** @type {?} */ var paginatorDefaults = { pagesControls: false, range: false, startWith: 1, cacheTimeout: undefined, clearStoreWithCache: true }; /** * @template State */ var PaginatorPlugin = /** @class */ (function (_super) { tslib_1.__extends(PaginatorPlugin, _super); function PaginatorPlugin(query, config) { if (config === void 0) { config = {}; } var _this = _super.call(this, query, { resetFn: (/** * @return {?} */ function () { _this.initial = false; _this.destroy({ clearCache: true, currentPage: 1 }); }) }) || this; _this.query = query; _this.config = config; /** * Save current filters, sorting, etc. in cache */ _this.metadata = new Map(); _this.pages = new Map(); _this.pagination = { currentPage: 1, perPage: 0, total: 0, lastPage: 0, data: [] }; /** * When the user navigates to a different page and return * we don't want to call `clearCache` on first time. */ _this.initial = true; /** * Proxy to the query loading */ _this.isLoading$ = _this.query.selectLoading().pipe(delay(0)); _this.config = Object.assign(paginatorDefaults, config); var _a = _this.config, startWith = _a.startWith, cacheTimeout = _a.cacheTimeout; _this.page = new BehaviorSubject(startWith); if (isObservable(cacheTimeout)) { _this.clearCacheSubscription = cacheTimeout.subscribe((/** * @return {?} */ function () { return _this.clearCache(); })); } return _this; } Object.defineProperty(PaginatorPlugin.prototype, "pageChanges", { /** * Listen to page changes */ get: /** * Listen to page changes * @return {?} */ function () { return this.page.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(PaginatorPlugin.prototype, "currentPage", { /** * Get the current page number */ get: /** * Get the current page number * @return {?} */ function () { return this.pagination.currentPage; }, enumerable: true, configurable: true }); Object.defineProperty(PaginatorPlugin.prototype, "isFirst", { /** * Check if current page is the first one */ get: /** * Check if current page is the first one * @return {?} */ function () { return this.currentPage === 1; }, enumerable: true, configurable: true }); Object.defineProperty(PaginatorPlugin.prototype, "isLast", { /** * Check if current page is the last one */ get: /** * Check if current page is the last one * @return {?} */ function () { return this.currentPage === this.pagination.lastPage; }, enumerable: true, configurable: true }); /** * Whether to generate an array of pages for *ngFor * [1, 2, 3, 4] */ /** * Whether to generate an array of pages for *ngFor * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ PaginatorPlugin.prototype.withControls = /** * Whether to generate an array of pages for *ngFor * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ function () { (/** @type {?} */ (this)).config.pagesControls = true; return (/** @type {?} */ (this)); }; /** * Whether to generate the `from` and `to` keys * [1, 2, 3, 4] */ /** * Whether to generate the `from` and `to` keys * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ PaginatorPlugin.prototype.withRange = /** * Whether to generate the `from` and `to` keys * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ function () { (/** @type {?} */ (this)).config.range = true; return (/** @type {?} */ (this)); }; /** * Set the loading state */ /** * Set the loading state * @param {?=} value * @return {?} */ PaginatorPlugin.prototype.setLoading = /** * Set the loading state * @param {?=} value * @return {?} */ function (value) { if (value === void 0) { value = true; } this.getStore().setLoading(value); }; /** * Update the pagination object and add the page */ /** * Update the pagination object and add the page * @param {?} response * @return {?} */ PaginatorPlugin.prototype.update = /** * Update the pagination object and add the page * @param {?} response * @return {?} */ function (response) { this.pagination = response; this.addPage(response.data); }; /** * * Set the ids and add the page to store */ /** * * Set the ids and add the page to store * @param {?} data * @return {?} */ PaginatorPlugin.prototype.addPage = /** * * Set the ids and add the page to store * @param {?} data * @return {?} */ function (data) { var _this = this; this.pages.set(this.currentPage, { ids: data.map((/** * @param {?} entity * @return {?} */ function (entity) { return entity[_this.getStore().idKey]; })) }); this.getStore().add(data); }; /** * Clear the cache. */ /** * Clear the cache. * @param {?=} options * @return {?} */ PaginatorPlugin.prototype.clearCache = /** * Clear the cache. * @param {?=} options * @return {?} */ function (options) { if (options === void 0) { options = {}; } if (!this.initial) { logAction('@Pagination - Clear Cache'); if (options.clearStore !== false && (this.config.clearStoreWithCache || options.clearStore)) { this.getStore().remove(); } this.pages = new Map(); this.metadata = new Map(); } this.initial = false; }; /** * @param {?} page * @return {?} */ PaginatorPlugin.prototype.clearPage = /** * @param {?} page * @return {?} */ function (page) { this.pages.delete(page); }; /** * Clear the cache timeout and optionally the pages */ /** * Clear the cache timeout and optionally the pages * @param {?=} __0 * @return {?} */ PaginatorPlugin.prototype.destroy = /** * Clear the cache timeout and optionally the pages * @param {?=} __0 * @return {?} */ function (_a) { var _b = _a === void 0 ? {} : _a, clearCache = _b.clearCache, currentPage = _b.currentPage; if (this.clearCacheSubscription) { this.clearCacheSubscription.unsubscribe(); } if (clearCache) { this.clearCache(); } if (!isUndefined(currentPage)) { this.setPage(currentPage); } this.initial = true; }; /** * Whether the provided page is active */ /** * Whether the provided page is active * @param {?} page * @return {?} */ PaginatorPlugin.prototype.isPageActive = /** * Whether the provided page is active * @param {?} page * @return {?} */ function (page) { return this.currentPage === page; }; /** * Set the current page */ /** * Set the current page * @param {?} page * @return {?} */ PaginatorPlugin.prototype.setPage = /** * Set the current page * @param {?} page * @return {?} */ function (page) { if (page !== this.currentPage || !this.hasPage(page)) { this.page.next((this.pagination.currentPage = page)); } }; /** * Increment current page */ /** * Increment current page * @return {?} */ PaginatorPlugin.prototype.nextPage = /** * Increment current page * @return {?} */ function () { if (this.currentPage !== this.pagination.lastPage) { this.setPage(this.pagination.currentPage + 1); } }; /** * Decrement current page */ /** * Decrement current page * @return {?} */ PaginatorPlugin.prototype.prevPage = /** * Decrement current page * @return {?} */ function () { if (this.pagination.currentPage > 1) { this.setPage(this.pagination.currentPage - 1); } }; /** * Set current page to last */ /** * Set current page to last * @return {?} */ PaginatorPlugin.prototype.setLastPage = /** * Set current page to last * @return {?} */ function () { this.setPage(this.pagination.lastPage); }; /** * Set current page to first */ /** * Set current page to first * @return {?} */ PaginatorPlugin.prototype.setFirstPage = /** * Set current page to first * @return {?} */ function () { this.setPage(1); }; /** * Check if page exists in cache */ /** * Check if page exists in cache * @param {?} page * @return {?} */ PaginatorPlugin.prototype.hasPage = /** * Check if page exists in cache * @param {?} page * @return {?} */ function (page) { return this.pages.has(page); }; /** * Get the current page if it's in cache, otherwise invoke the request */ /** * Get the current page if it's in cache, otherwise invoke the request * @param {?} req * @return {?} */ PaginatorPlugin.prototype.getPage = /** * Get the current page if it's in cache, otherwise invoke the request * @param {?} req * @return {?} */ function (req) { var _this = this; /** @type {?} */ var page = this.pagination.currentPage; if (this.hasPage(page)) { return this.selectPage(page); } else { this.setLoading(true); return from(req()).pipe(switchMap((/** * @param {?} config * @return {?} */ function (config) { page = config.currentPage; applyTransaction((/** * @return {?} */ function () { _this.setLoading(false); _this.update(config); })); return _this.selectPage(page); }))); } }; /** * @return {?} */ PaginatorPlugin.prototype.getQuery = /** * @return {?} */ function () { return this.query; }; /** * @return {?} */ PaginatorPlugin.prototype.refreshCurrentPage = /** * @return {?} */ function () { if (isNil(this.currentPage) === false) { this.clearPage(this.currentPage); this.setPage(this.currentPage); } }; /** * @private * @return {?} */ PaginatorPlugin.prototype.getFrom = /** * @private * @return {?} */ function () { if (this.isFirst) { return 1; } return (this.currentPage - 1) * this.pagination.perPage + 1; }; /** * @private * @return {?} */ PaginatorPlugin.prototype.getTo = /** * @private * @return {?} */ function () { if (this.isLast) { return this.pagination.total; } return this.currentPage * this.pagination.perPage; }; /** * Select the page */ /** * Select the page * @private * @param {?} page * @return {?} */ PaginatorPlugin.prototype.selectPage = /** * Select the page * @private * @param {?} page * @return {?} */ function (page) { var _this = this; return this.query.selectAll({ asObject: true }).pipe(take(1), map((/** * @param {?} entities * @return {?} */ function (entities) { /** @type {?} */ var response = tslib_1.__assign({}, _this.pagination, { data: _this.pages.get(page).ids.map((/** * @param {?} id * @return {?} */ function (id) { return entities[id]; })) }); var _a = _this.config, range = _a.range, pagesControls = _a.pagesControls; /** If no total - calc it */ if (isNaN(_this.pagination.total)) { if (response.lastPage === 1) { response.total = response.data ? response.data.length : 0; } else { response.total = response.perPage * response.lastPage; } _this.pagination.total = response.total; } if (range) { response.from = _this.getFrom(); response.to = _this.getTo(); } if (pagesControls) { response.pageControls = generatePages(_this.pagination.total, _this.pagination.perPage); } return response; }))); }; tslib_1.__decorate([ action('@Pagination - New Page'), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [Object]), tslib_1.__metadata("design:returntype", void 0) ], PaginatorPlugin.prototype, "update", null); return PaginatorPlugin; }(AkitaPlugin)); export { PaginatorPlugin }; if (false) { /** * Save current filters, sorting, etc. in cache * @type {?} */ PaginatorPlugin.prototype.metadata; /** * @type {?} * @private */ PaginatorPlugin.prototype.page; /** * @type {?} * @private */ PaginatorPlugin.prototype.pages; /** * @type {?} * @private */ PaginatorPlugin.prototype.clearCacheSubscription; /** * @type {?} * @private */ PaginatorPlugin.prototype.pagination; /** * When the user navigates to a different page and return * we don't want to call `clearCache` on first time. * @type {?} * @private */ PaginatorPlugin.prototype.initial; /** * Proxy to the query loading * @type {?} */ PaginatorPlugin.prototype.isLoading$; /** * @type {?} * @protected */ PaginatorPlugin.prototype.query; /** @type {?} */ PaginatorPlugin.prototype.config; } /** * Generate an array so we can ngFor them to navigate between pages * @param {?} total * @param {?} perPage * @return {?} */ function generatePages(total, perPage) { /** @type {?} */ var len = Math.ceil(total / perPage); /** @type {?} */ var arr = []; for (var i = 0; i < len; i++) { arr.push(i + 1); } return arr; } /** * backward compatibility * @type {?} */ export var Paginator = PaginatorPlugin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yUGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL3BsdWdpbnMvcGFnaW5hdG9yL3BhZ2luYXRvclBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7O0FBRXBDLHdDQVNDOzs7SUFSQyx5Q0FBb0I7O0lBQ3BCLHFDQUFnQjs7SUFDaEIsc0NBQWlCOztJQUNqQixrQ0FBVTs7SUFDVixtQ0FBZTs7SUFDZixrQ0FBYzs7SUFDZCxnQ0FBWTs7SUFDWiwwQ0FBd0I7OztJQVdwQixpQkFBaUIsR0FBb0I7SUFDekMsYUFBYSxFQUFFLEtBQUs7SUFDcEIsS0FBSyxFQUFFLEtBQUs7SUFDWixTQUFTLEVBQUUsQ0FBQztJQUNaLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLG1CQUFtQixFQUFFLElBQUk7Q0FDMUI7Ozs7QUFFRDtJQUFnRSwyQ0FBa0I7SUFzQmhGLHlCQUFzQixLQUF5QixFQUFTLE1BQTRCO1FBQTVCLHVCQUFBLEVBQUEsV0FBNEI7UUFBcEYsWUFDRSxrQkFBTSxLQUFLLEVBQUU7WUFDWCxPQUFPOzs7WUFBRTtnQkFDUCxLQUFJLENB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QUF3QixDQUFDOzs7O2lEQUloQztJQTJMSCxzQkFBQztDQUFBLEFBalNELENBQWdFLFdBQVcsR0FpUzFFO1NBalNZLGVBQWU7Ozs7OztJQUUxQixtQ0FBcUI7Ozs7O0lBRXJCLCtCQUFzQzs7Ozs7SUFDdEMsZ0NBQWlEOzs7OztJQUNqRCxpREFBc0Q7Ozs7O0lBRXRELHFDQU1FOzs7Ozs7O0lBTUYsa0NBQXVCOzs7OztJQW9CdkIscUNBQXVEOzs7OztJQWxCM0MsZ0NBQW1DOztJQUFFLGlDQUFtQzs7Ozs7Ozs7QUFnUnRGLFNBQVMsYUFBYSxDQUFDLEtBQWEsRUFBRSxPQUFlOztRQUM3QyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDOztRQUNsQyxHQUFHLEdBQUcsRUFBRTtJQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDakI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7Ozs7O0FBR0QsTUFBTSxLQUFPLFNBQVMsR0FBRyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVlcnlFbnRpdHkgfSBmcm9tICcuLi8uLi9xdWVyeUVudGl0eSc7XG5pbXBvcnQgeyBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSwgSUQsIGdldEVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBa2l0YVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBhcHBseVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICcuLi8uLi9pc1VuZGVmaW5lZCc7XG5pbXBvcnQgeyBhY3Rpb24sIGxvZ0FjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi9pc05pbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblJlc3BvbnNlPEU+IHtcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgcGVyUGFnZTogbnVtYmVyO1xuICBsYXN0UGFnZTogbnVtYmVyO1xuICBkYXRhOiBFW107XG4gIHRvdGFsPzogbnVtYmVyO1xuICBmcm9tPzogbnVtYmVyO1xuICB0bz86IG51bWJlcjtcbiAgcGFnZUNvbnRyb2xzPzogbnVtYmVyW107XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9scz86IGJvb2xlYW47XG4gIHJhbmdlPzogYm9vbGVhbjtcbiAgc3RhcnRXaXRoPzogbnVtYmVyO1xuICBjYWNoZVRpbWVvdXQ/OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGNsZWFyU3RvcmVXaXRoQ2FjaGU/OiBib29sZWFuO1xufTtcblxuY29uc3QgcGFnaW5hdG9yRGVmYXVsdHM6IFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9sczogZmFsc2UsXG4gIHJhbmdlOiBmYWxzZSxcbiAgc3RhcnRXaXRoOiAxLFxuICBjYWNoZVRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgY2xlYXJTdG9yZVdpdGhDYWNoZTogdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRvclBsdWdpbjxTdGF0ZSBleHRlbmRzIEVudGl0eVN0YXRlPiBleHRlbmRzIEFraXRhUGx1Z2luPFN0YXRlPiB7XG4gIC8qKiBTYXZlIGN1cnJlbnQgZmlsdGVycywgc29ydGluZywgZXRjLiBpbiBjYWNoZSAqL1xuICBtZXRhZGF0YSA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHBhZ2U6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuICBwcml2YXRlIHBhZ2VzID0gbmV3IE1hcDxudW1iZXIsIHsgaWRzOiBJRFtdIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xlYXJDYWNoZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcGFnaW5hdGlvbjogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBwZXJQYWdlOiAwLFxuICAgIHRvdGFsOiAwLFxuICAgIGxhc3RQYWdlOiAwLFxuICAgIGRhdGE6IFtdXG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIHRvIGEgZGlmZmVyZW50IHBhZ2UgYW5kIHJldHVyblxuICAgKiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYGNsZWFyQ2FjaGVgIG9uIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnlFbnRpdHk8U3RhdGU+LCBwdWJsaWMgY29uZmlnOiBQYWdpbmF0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKHF1ZXJ5LCB7XG4gICAgICByZXNldEZuOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3koeyBjbGVhckNhY2hlOiB0cnVlLCBjdXJyZW50UGFnZTogMSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24ocGFnaW5hdG9yRGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdGFydFdpdGgsIGNhY2hlVGltZW91dCB9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5wYWdlID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGFydFdpdGgpO1xuICAgIGlmIChpc09ic2VydmFibGUoY2FjaGVUaW1lb3V0KSkge1xuICAgICAgdGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uID0gY2FjaGVUaW1lb3V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3h5IHRvIHRoZSBxdWVyeSBsb2FkaW5nXG4gICAqL1xuICBpc0xvYWRpbmckID0gdGhpcy5xdWVyeS5zZWxlY3RMb2FkaW5nKCkucGlwZShkZWxheSgwKSk7XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBwYWdlIGNoYW5nZXNcbiAgICovXG4gIGdldCBwYWdlQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlIG51bWJlclxuICAgKi9cbiAgZ2V0IGN1cnJlbnRQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmVcbiAgICovXG4gIGdldCBpc0ZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmVcbiAgICovXG4gIGdldCBpc0xhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnaW5hdGlvbi5sYXN0UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGFuIGFycmF5IG9mIHBhZ2VzIGZvciAqbmdGb3JcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoQ29udHJvbHMoKSB7XG4gICAgdGhpcy5jb25maWcucGFnZXNDb250cm9scyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgYGZyb21gIGFuZCBgdG9gIGtleXNcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoUmFuZ2UoKSB7XG4gICAgdGhpcy5jb25maWcucmFuZ2UgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgc2V0TG9hZGluZyh2YWx1ZSA9IHRydWUpIHtcbiAgICB0aGlzLmdldFN0b3JlKCkuc2V0TG9hZGluZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYWdpbmF0aW9uIG9iamVjdCBhbmQgYWRkIHRoZSBwYWdlXG4gICAqL1xuICBAYWN0aW9uKCdAUGFnaW5hdGlvbiAtIE5ldyBQYWdlJylcbiAgdXBkYXRlKHJlc3BvbnNlOiBQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+KSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0gcmVzcG9uc2U7XG4gICAgdGhpcy5hZGRQYWdlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFNldCB0aGUgaWRzIGFuZCBhZGQgdGhlIHBhZ2UgdG8gc3RvcmVcbiAgICovXG4gIGFkZFBhZ2UoZGF0YTogZ2V0RW50aXR5VHlwZTxTdGF0ZT5bXSkge1xuICAgIHRoaXMucGFnZXMuc2V0KHRoaXMuY3VycmVudFBhZ2UsIHsgaWRzOiBkYXRhLm1hcChlbnRpdHkgPT4gZW50aXR5W3RoaXMuZ2V0U3RvcmUoKS5pZEtleV0pIH0pO1xuICAgIHRoaXMuZ2V0U3RvcmUoKS5hZGQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxuICAgKi9cbiAgY2xlYXJDYWNoZShvcHRpb25zOiB7IGNsZWFyU3RvcmU/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pbml0aWFsKSB7XG4gICAgICBsb2dBY3Rpb24oJ0BQYWdpbmF0aW9uIC0gQ2xlYXIgQ2FjaGUnKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY2xlYXJTdG9yZSAhPT0gZmFsc2UgJiYgKHRoaXMuY29uZmlnLmNsZWFyU3RvcmVXaXRoQ2FjaGUgfHwgb3B0aW9ucy5jbGVhclN0b3JlKSkge1xuICAgICAgICB0aGlzLmdldFN0b3JlKCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFnZXMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWwgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VzLmRlbGV0ZShwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGUgdGltZW91dCBhbmQgb3B0aW9uYWxseSB0aGUgcGFnZXNcbiAgICovXG4gIGRlc3Ryb3koeyBjbGVhckNhY2hlLCBjdXJyZW50UGFnZSB9OiB7IGNsZWFyQ2FjaGU/OiBib29sZWFuOyBjdXJyZW50UGFnZT86IG51bWJlciB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyQ2FjaGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQ2FjaGUpIHtcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGN1cnJlbnRQYWdlKSkge1xuICAgICAgdGhpcy5zZXRQYWdlKGN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCBwYWdlIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNQYWdlQWN0aXZlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSBwYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBzZXRQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlIHx8ICF0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHRoaXMucGFnZS5uZXh0KCh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgPSBwYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBjdXJyZW50IHBhZ2VcbiAgICovXG4gIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSB0aGlzLnBhZ2luYXRpb24ubGFzdFBhZ2UpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGN1cnJlbnQgcGFnZVxuICAgKi9cbiAgcHJldlBhZ2UoKSB7XG4gICAgaWYgKHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSA+IDEpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgcGFnZSB0byBsYXN0XG4gICAqL1xuICBzZXRMYXN0UGFnZSgpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYWdpbmF0aW9uLmxhc3RQYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCBwYWdlIHRvIGZpcnN0XG4gICAqL1xuICBzZXRGaXJzdFBhZ2UoKSB7XG4gICAgdGhpcy5zZXRQYWdlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhZ2UgZXhpc3RzIGluIGNhY2hlXG4gICAqL1xuICBoYXNQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmhhcyhwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBpZiBpdCdzIGluIGNhY2hlLCBvdGhlcndpc2UgaW52b2tlIHRoZSByZXF1ZXN0XG4gICAqL1xuICBnZXRQYWdlKHJlcTogKCkgPT4gT2JzZXJ2YWJsZTxQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+Pikge1xuICAgIGxldCBwYWdlID0gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdFBhZ2UocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgIHJldHVybiBmcm9tKHJlcSgpKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbmZpZzogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PikgPT4ge1xuICAgICAgICAgIHBhZ2UgPSBjb25maWcuY3VycmVudFBhZ2U7XG4gICAgICAgICAgYXBwbHlUcmFuc2FjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoY29uZmlnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RQYWdlKHBhZ2UpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRRdWVyeSgpOiBRdWVyeUVudGl0eTxTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG5cbiAgcmVmcmVzaEN1cnJlbnRQYWdlKCkge1xuICAgIGlmIChpc05pbCh0aGlzLmN1cnJlbnRQYWdlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY2xlYXJQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5zZXRQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RnJvbSgpIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSArIDE7XG4gIH1cblxuICBwcml2YXRlIGdldFRvKCkge1xuICAgIGlmICh0aGlzLmlzTGFzdCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbi50b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIHBhZ2VcbiAgICovXG4gIHByaXZhdGUgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIpOiBPYnNlcnZhYmxlPFBhZ2luYXRpb25SZXNwb25zZTxnZXRFbnRpdHlUeXBlPFN0YXRlPj4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeS5zZWxlY3RBbGwoeyBhc09iamVjdDogdHJ1ZSB9KS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcChlbnRpdGllcyA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZTogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgICAgZGF0YTogdGhpcy5wYWdlcy5nZXQocGFnZSkuaWRzLm1hcChpZCA9PiBlbnRpdGllc1tpZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyByYW5nZSwgcGFnZXNDb250cm9scyB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgLyoqIElmIG5vIHRvdGFsIC0gY2FsYyBpdCAqL1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5wYWdpbmF0aW9uLnRvdGFsKSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5sYXN0UGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgcmVzcG9uc2UudG90YWwgPSByZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5sZW5ndGggOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS50b3RhbCA9IHJlc3BvbnNlLnBlclBhZ2UgKiByZXNwb25zZS5sYXN0UGFnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnRvdGFsID0gcmVzcG9uc2UudG90YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICByZXNwb25zZS5mcm9tID0gdGhpcy5nZXRGcm9tKCk7XG4gICAgICAgICAgcmVzcG9uc2UudG8gPSB0aGlzLmdldFRvKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZXNDb250cm9scykge1xuICAgICAgICAgIHJlc3BvbnNlLnBhZ2VDb250cm9scyA9IGdlbmVyYXRlUGFnZXModGhpcy5wYWdpbmF0aW9uLnRvdGFsLCB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBzbyB3ZSBjYW4gbmdGb3IgdGhlbSB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUGFnZXModG90YWw6IG51bWJlciwgcGVyUGFnZTogbnVtYmVyKSB7XG4gIGNvbnN0IGxlbiA9IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpO1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChpICsgMSk7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi9cbmV4cG9ydCBjb25zdCBQYWdpbmF0b3IgPSBQYWdpbmF0b3JQbHVnaW47XG4iXX0=