UNPKG

ornamentum

Version:
264 lines 23.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { ReplaySubject, of } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { orderBy, get } from '../../utility/services/object-utility.class'; /** * Data table resource service; Manage data table client side data querying. * @template T */ var DataTableResourceService = /** @class */ (function () { function DataTableResourceService() { } /** * Set data source stream to query. * @param dataSource Data source stream. */ /** * Set data source stream to query. * @param {?} dataSource Data source stream. * @return {?} */ DataTableResourceService.prototype.setDataSource = /** * Set data source stream to query. * @param {?} dataSource Data source stream. * @return {?} */ function (dataSource) { var _this = this; this.dispose(); if (this.itemDataStream && !this.itemDataStream.closed) { this.itemDataStream.complete(); } this.itemDataStream = new ReplaySubject(1); this.dataSourceSubscription = dataSource.subscribe((/** * @param {?} items * @return {?} */ function (items) { _this.itemDataStream.next(items); })); }; /** * Query items by data table request params. * @param params Data table parameters object. * @return Query result stream. */ /** * Query items by data table request params. * @param {?} params Data table parameters object. * @return {?} Query result stream. */ DataTableResourceService.prototype.query = /** * Query items by data table request params. * @param {?} params Data table parameters object. * @return {?} Query result stream. */ function (params) { return this.itemDataStream.pipe(switchMap((/** * @param {?} items * @return {?} */ function (items) { /** @type {?} */ var itemCount = items.length; /** @type {?} */ var result = items.slice(); if (params.fields.length) { /** @type {?} */ var filterFields_1 = params.fields.filter((/** * @param {?} field * @return {?} */ function (field) { return field.filterable; })); if (filterFields_1.length) { result = items.filter((/** * @param {?} item * @return {?} */ function (item) { return filterFields_1.every((/** * @param {?} filterColumn * @return {?} */ function (filterColumn) { if (filterColumn.filterExpression) { return filterColumn.filterExpression(item, filterColumn.field, filterColumn.filterValue); } if (filterColumn.filterValue === undefined || filterColumn.filterValue === '') { return true; } /** @type {?} */ var fieldValue = get(item, filterColumn.field); if (fieldValue === undefined) { return true; } if (Array.isArray(filterColumn.filterValue)) { return filterColumn.filterValue.length === 0 || filterColumn.filterValue.includes(fieldValue); } /** @type {?} */ var value = String(fieldValue).toLowerCase(); /** @type {?} */ var filterValue = String(filterColumn.filterValue).toLowerCase(); return value.includes(filterValue); })); })); itemCount = result.length; } /** @type {?} */ var sortColumns = params.fields.filter((/** * @param {?} column * @return {?} */ function (column) { return column.sortable && column.sortOrder !== ''; })); if (sortColumns.length) { /** @type {?} */ var orderedSortColumns = sortColumns; if (sortColumns.length > 1) { orderedSortColumns = sortColumns.concat().sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.sortPriority - b.sortPriority; })); } /** @type {?} */ var orderParams = orderedSortColumns.reduce((/** * @param {?} accumulator * @param {?} column * @return {?} */ function (accumulator, column) { if (accumulator) { accumulator.fields.push(column.field); accumulator.orders.push(column.sortOrder); } return accumulator; }), { fields: [], orders: [] }); result = orderBy(result, orderParams.fields, orderParams.orders); } } if (params.offset !== undefined) { /** @type {?} */ var offset = params.offset + 1 > result.length ? 0 : params.offset; if (params.limit === undefined) { result = result.slice(offset, result.length); } else { result = result.slice(offset, offset + params.limit); } } return of({ items: result, count: itemCount }); }))); }; /** * Extract data table filter options. * @param filterColumn Data table column component. * @return Filter options collection stream. */ /** * Extract data table filter options. * @param {?} filterColumn Data table column component. * @return {?} Filter options collection stream. */ DataTableResourceService.prototype.extractFilterOptions = /** * Extract data table filter options. * @param {?} filterColumn Data table column component. * @return {?} Filter options collection stream. */ function (filterColumn) { return this.itemDataStream.pipe(switchMap((/** * @param {?} items * @return {?} */ function (items) { /** @type {?} */ var filteredItems = items .reduce((/** * @param {?} acc * @param {?} item * @param {?} index * @return {?} */ function (acc, item, index) { if (filterColumn.filterFieldMapper) { return acc.concat(filterColumn.filterFieldMapper(item, index)); } /** @type {?} */ var filterField = filterColumn.filterField || filterColumn.field; /** @type {?} */ var filterValue = get(item, filterField); acc.push({ key: filterValue, value: filterValue }); return acc; }), []) .filter((/** * @param {?} value * @param {?} index * @param {?} self * @return {?} */ function (value, index, self) { return self.findIndex((/** * @param {?} item * @return {?} */ function (item) { return item.key === value.key; })) === index; })); return of(filteredItems); }))); }; /** * Dispose client data source streams. */ /** * Dispose client data source streams. * @return {?} */ DataTableResourceService.prototype.dispose = /** * Dispose client data source streams. * @return {?} */ function () { if (this.dataSourceSubscription) { this.dataSourceSubscription.unsubscribe(); this.dataSourceSubscription = null; } if (this.itemDataStream && !this.itemDataStream.closed) { this.itemDataStream.complete(); } }; DataTableResourceService.decorators = [ { type: Injectable } ]; return DataTableResourceService; }()); export { DataTableResourceService }; if (false) { /** * @type {?} * @private */ DataTableResourceService.prototype.itemDataStream; /** * @type {?} * @private */ DataTableResourceService.prototype.dataSourceSubscription; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1yZXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vb3JuYW1lbnR1bS8iLCJzb3VyY2VzIjpbImRhdGEtdGFibGUvc2VydmljZXMvZGF0YS10YWJsZS1yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxhQUFhLEVBQWdCLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7QUFZM0U7SUFBQTtJQTZKQSxDQUFDO0lBeEpDOzs7T0FHRzs7Ozs7O0lBQ0ksZ0RBQWE7Ozs7O0lBQXBCLFVBQXFCLFVBQTJCO1FBQWhELGlCQVdDO1FBVkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWYsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoQztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQyxLQUFVO1lBQzVELEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7Ozs7OztJQUNJLHdDQUFLOzs7OztJQUFaLFVBQWEsTUFBOEI7UUFDekMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDN0IsU0FBUzs7OztRQUFDLFVB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SW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IG9yZGVyQnksIGdldCB9IGZyb20gJy4uLy4uL3V0aWxpdHkvc2VydmljZXMvb2JqZWN0LXV0aWxpdHkuY2xhc3MnO1xuXG5pbXBvcnQgeyBEYXRhVGFibGVSZXF1ZXN0UGFyYW1zIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEtdGFibGUtcmVxdWVzdC1wYXJhbXMubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlUXVlcnlSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS10YWJsZS1xdWVyeS1yZXN1bHQubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyT3B0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEtdGFibGUtZmlsdGVyLW9wdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhVGFibGVRdWVyeUZpZWxkIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEtdGFibGUtcXVlcnktZmllbGQubW9kZWwnO1xuXG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2RhdGEtdGFibGUtY29sdW1uL2RhdGEtdGFibGUtY29sdW1uLmNvbXBvbmVudCc7XG5cbi8qKlxuICogRGF0YSB0YWJsZSByZXNvdXJjZSBzZXJ2aWNlOyBNYW5hZ2UgZGF0YSB0YWJsZSBjbGllbnQgc2lkZSBkYXRhIHF1ZXJ5aW5nLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVzb3VyY2VTZXJ2aWNlPFQ+IHtcbiAgcHJpdmF0ZSBpdGVtRGF0YVN0cmVhbTogUmVwbGF5U3ViamVjdDxUW10+O1xuICBwcml2YXRlIGRhdGFTb3VyY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU2V0IGRhdGEgc291cmNlIHN0cmVhbSB0byBxdWVyeS5cbiAgICogQHBhcmFtIGRhdGFTb3VyY2UgRGF0YSBzb3VyY2Ugc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIHNldERhdGFTb3VyY2UoZGF0YVNvdXJjZTogT2JzZXJ2YWJsZTxUW10+KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG5cbiAgICBpZiAodGhpcy5pdGVtRGF0YVN0cmVhbSAmJiAhdGhpcy5pdGVtRGF0YVN0cmVhbS5jbG9zZWQpIHtcbiAgICAgIHRoaXMuaXRlbURhdGFTdHJlYW0uY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLml0ZW1EYXRhU3RyZWFtID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcbiAgICB0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24gPSBkYXRhU291cmNlLnN1YnNjcmliZSgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgdGhpcy5pdGVtRGF0YVN0cmVhbS5uZXh0KGl0ZW1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSBpdGVtcyBieSBkYXRhIHRhYmxlIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0gcGFyYW1zIERhdGEgdGFibGUgcGFyYW1ldGVycyBvYmplY3QuXG4gICAqIEByZXR1cm4gUXVlcnkgcmVzdWx0IHN0cmVhbS5cbiAgICovXG4gIHB1YmxpYyBxdWVyeShwYXJhbXM6IERhdGFUYWJsZVJlcXVlc3RQYXJhbXMpOiBPYnNlcnZhYmxlPERhdGFUYWJsZVF1ZXJ5UmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbURhdGFTdHJlYW0ucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgICBsZXQgaXRlbUNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0OiBUW10gPSBpdGVtcy5zbGljZSgpO1xuXG4gICAgICAgIGlmIChwYXJhbXMuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckZpZWxkcyA9IHBhcmFtcy5maWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmZpbHRlcmFibGUpO1xuXG4gICAgICAgICAgaWYgKGZpbHRlckZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZpZWxkcy5ldmVyeSgoZmlsdGVyQ29sdW1uOiBEYXRhVGFibGVRdWVyeUZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlckNvbHVtbi5maWx0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyQ29sdW1uLmZpbHRlckV4cHJlc3Npb24oaXRlbSwgZmlsdGVyQ29sdW1uLmZpZWxkLCBmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJDb2x1bW4uZmlsdGVyVmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gZ2V0KGl0ZW0sIGZpbHRlckNvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQ29sdW1uLmZpbHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckNvbHVtbi5maWx0ZXJWYWx1ZS5sZW5ndGggPT09IDAgfHwgZmlsdGVyQ29sdW1uLmZpbHRlclZhbHVlLmluY2x1ZGVzKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGZpZWxkVmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBTdHJpbmcoZmlsdGVyQ29sdW1uLmZpbHRlclZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpdGVtQ291bnQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5zID0gcGFyYW1zLmZpZWxkcy5maWx0ZXIoKGNvbHVtbjogRGF0YVRhYmxlUXVlcnlGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydE9yZGVyICE9PSAnJztcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzb3J0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBvcmRlcmVkU29ydENvbHVtbnMgPSBzb3J0Q29sdW1ucztcbiAgICAgICAgICAgIGlmIChzb3J0Q29sdW1ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIG9yZGVyZWRTb3J0Q29sdW1ucyA9IHNvcnRDb2x1bW5zLmNvbmNhdCgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5zb3J0UHJpb3JpdHkgLSBiLnNvcnRQcmlvcml0eTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9yZGVyUGFyYW1zID0gb3JkZXJlZFNvcnRDb2x1bW5zLnJlZHVjZSgoYWNjdW11bGF0b3I6IGFueSwgY29sdW1uOiBEYXRhVGFibGVRdWVyeUZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjY3VtdWxhdG9yKSB7XG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5maWVsZHMucHVzaChjb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgICAgICAgYWNjdW11bGF0b3Iub3JkZXJzLnB1c2goY29sdW1uLnNvcnRPcmRlcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgICAgICAgICAgICBvcmRlcnM6IFtdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IG9yZGVyQnkocmVzdWx0LCBvcmRlclBhcmFtcy5maWVsZHMsIG9yZGVyUGFyYW1zLm9yZGVycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtcy5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHBhcmFtcy5vZmZzZXQgKyAxID4gcmVzdWx0Lmxlbmd0aCA/IDAgOiBwYXJhbXMub2Zmc2V0O1xuXG4gICAgICAgICAgaWYgKHBhcmFtcy5saW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2Uob2Zmc2V0LCByZXN1bHQubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcGFyYW1zLmxpbWl0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgIGl0ZW1zOiByZXN1bHQsXG4gICAgICAgICAgY291bnQ6IGl0ZW1Db3VudFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGRhdGEgdGFibGUgZmlsdGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSBmaWx0ZXJDb2x1bW4gRGF0YSB0YWJsZSBjb2x1bW4gY29tcG9uZW50LlxuICAgKiBAcmV0dXJuIEZpbHRlciBvcHRpb25zIGNvbGxlY3Rpb24gc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RGaWx0ZXJPcHRpb25zKGZpbHRlckNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogT2JzZXJ2YWJsZTxEYXRhVGFibGVGaWx0ZXJPcHRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1EYXRhU3RyZWFtLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGl0ZW1zOiBUW10pID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRJdGVtcyA9IGl0ZW1zXG4gICAgICAgICAgLnJlZHVjZSgoYWNjOiBEYXRhVGFibGVGaWx0ZXJPcHRpb25bXSwgaXRlbTogVCwgaW5kZXg6IG51bWJlcik6IERhdGFUYWJsZUZpbHRlck9wdGlvbltdID0+IHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJDb2x1bW4uZmlsdGVyRmllbGRNYXBwZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZmlsdGVyQ29sdW1uLmZpbHRlckZpZWxkTWFwcGVyKGl0ZW0sIGluZGV4KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZpZWxkID0gZmlsdGVyQ29sdW1uLmZpbHRlckZpZWxkIHx8IGZpbHRlckNvbHVtbi5maWVsZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ2V0KGl0ZW0sIGZpbHRlckZpZWxkKTtcbiAgICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgICAga2V5OiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlclZhbHVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCBbXSlcbiAgICAgICAgICAuZmlsdGVyKCh2YWx1ZTogRGF0YVRhYmxlRmlsdGVyT3B0aW9uLCBpbmRleCwgc2VsZikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IHZhbHVlLmtleSkgPT09IGluZGV4O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBvZihmaWx0ZXJlZEl0ZW1zKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIGNsaWVudCBkYXRhIHNvdXJjZSBzdHJlYW1zLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kYXRhU291cmNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLml0ZW1EYXRhU3RyZWFtICYmICF0aGlzLml0ZW1EYXRhU3RyZWFtLmNsb3NlZCkge1xuICAgICAgdGhpcy5pdGVtRGF0YVN0cmVhbS5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19