@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
123 lines • 20.3 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Pipe } from '@angular/core';
import { GridBaseAPIService } from '../api.service';
import { GridSummaryCalculationMode, GridSummaryPosition } from '../common/enums';
/** @hidden */
let IgxGridSummaryPipe = class IgxGridSummaryPipe {
constructor(gridAPI) {
this.gridAPI = gridAPI;
}
transform(collection, hasSummary, summaryCalculationMode, summaryPosition, id, pipeTrigger, summaryPipeTrigger) {
if (!collection.data || !hasSummary || summaryCalculationMode === GridSummaryCalculationMode.rootLevelOnly) {
return collection.data;
}
return this.addSummaryRows(id, collection, summaryPosition);
}
addSummaryRows(gridId, collection, summaryPosition) {
const recordsWithSummary = [];
const lastChildMap = new Map();
const grid = this.gridAPI.grid;
const maxSummaryHeight = grid.summaryService.calcMaxSummaryHeight();
if (collection.metadata.length && !grid.isGroupByRecord(collection.data[0]) &&
grid.isGroupByRecord(collection.metadata[0]) && summaryPosition === GridSummaryPosition.bottom) {
const groups = [];
groups.push(collection.metadata[0]);
while (groups[groups.length - 1].groupParent) {
groups.push(groups[groups.length - 1].groupParent);
}
groups.reverse();
groups.forEach(g => g.skip = true);
collection.data.splice(0, 0, ...groups);
}
for (let i = 0; i < collection.data.length; i++) {
const record = collection.data[i];
let skipAdd = false;
let recordId;
let groupByRecord = null;
if (grid.isGroupByRecord(record)) {
skipAdd = !!record.skip;
record.skip = null;
groupByRecord = record;
recordId = this.gridAPI.get_groupBy_record_id(groupByRecord);
}
else {
recordId = this.gridAPI.get_row_id(record);
}
if (!skipAdd) {
recordsWithSummary.push(record);
}
if (summaryPosition === GridSummaryPosition.bottom && lastChildMap.has(recordId)) {
const groupRecords = lastChildMap.get(recordId);
for (let j = 0; j < groupRecords.length; j++) {
const groupRecord = groupRecords[j];
const groupRecordId = this.gridAPI.get_groupBy_record_id(groupRecord);
const records = this.removeDeletedRecord(grid, groupRecord.records.slice());
const summaries = grid.summaryService.calculateSummaries(groupRecordId, records);
const summaryRecord = {
summaries: summaries,
max: maxSummaryHeight
};
recordsWithSummary.push(summaryRecord);
}
}
if (groupByRecord === null || !grid.isExpandedGroup(groupByRecord)) {
continue;
}
if (summaryPosition === GridSummaryPosition.top) {
const records = this.removeDeletedRecord(grid, groupByRecord.records.slice());
const summaries = grid.summaryService.calculateSummaries(recordId, records);
const summaryRecord = {
summaries: summaries,
max: maxSummaryHeight
};
recordsWithSummary.push(summaryRecord);
}
else if (summaryPosition === GridSummaryPosition.bottom) {
let lastChild = groupByRecord;
while (lastChild.groups && lastChild.groups.length > 0 && grid.isExpandedGroup(lastChild)) {
lastChild = lastChild.groups[lastChild.groups.length - 1];
}
let lastChildId;
if (grid.isExpandedGroup(lastChild)) {
lastChildId = this.gridAPI.get_row_id(lastChild.records[lastChild.records.length - 1]);
}
else {
lastChildId = this.gridAPI.get_groupBy_record_id(lastChild);
}
let groupRecords = lastChildMap.get(lastChildId);
if (!groupRecords) {
groupRecords = [];
lastChildMap.set(lastChildId, groupRecords);
}
groupRecords.unshift(groupByRecord);
}
}
return recordsWithSummary;
}
removeDeletedRecord(grid, data) {
if (!grid.transactions.enabled) {
return data;
}
const deletedRows = grid.transactions.getTransactionLog().filter(t => t.type === 'delete').map(t => t.id);
deletedRows.forEach(rowID => {
const tempData = grid.primaryKey ? data.map(rec => rec[grid.primaryKey]) : data;
const index = tempData.indexOf(rowID);
if (index !== -1) {
data.splice(index, 1);
}
});
return data;
}
};
IgxGridSummaryPipe.ctorParameters = () => [
{ type: GridBaseAPIService }
];
IgxGridSummaryPipe = __decorate([
Pipe({
name: 'gridSummary',
pure: true
}),
__metadata("design:paramtypes", [GridBaseAPIService])
], IgxGridSummaryPipe);
export { IgxGridSummaryPipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zdW1tYXJ5LnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2dyaWQvZ3JpZC5zdW1tYXJ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRXBELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTXBELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUWxGLGNBQWM7QUFLZCxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQUczQixZQUFZLE9BQTREO1FBQ3BFLElBQUksQ0FBQyxPQUFPLEdBQXNCLE9BQU8sQ0FBQztJQUM5QyxDQUFDO0lBRU0sU0FBUyxDQUFDLFVBQTBCLEVBQ3ZDLFVBQW1CLEVBQ25CLHNCQUFrRCxFQUNsRCxlQUFvQyxFQUNwQyxFQUFVLEVBQUUsV0FBbUIsRUFBRSxrQkFBMEI7UUFFM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksc0JBQXNCLEtBQUssMEJBQTBCLENBQUMsYUFBYSxFQUFFO1lBQ3hHLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztTQUMxQjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYyxFQUFFLFVBQTBCLEVBQUUsZUFBb0M7UUFDbkcsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQXFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFD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QUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDekI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSixDQUFBOztZQXZId0Isa0JBQWtCOztBQUg5QixrQkFBa0I7SUFKOUIsSUFBSSxDQUFDO1FBQ0YsSUFBSSxFQUFFLGFBQWE7UUFDbkIsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFDO3FDQUl1QixrQkFBa0I7R0FIOUIsa0JBQWtCLENBMEg5QjtTQTFIWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQVBJU2VydmljZSB9IGZyb20gJy4vZ3JpZC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkQmFzZUFQSVNlcnZpY2UgfSBmcm9tICcuLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVN1bW1hcnlSZWNvcmQgfSBmcm9tICcuLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5JztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2dyb3VwYnktcmVjb3JkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlc3VsdCB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGluZy1yZXN1bHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLCBHcmlkU3VtbWFyeVBvc2l0aW9uIH0gZnJvbSAnLi4vY29tbW9uL2VudW1zJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcblxuLyoqIEBoaWRkZW4gKi9cbmludGVyZmFjZSBJU2tpcFJlY29yZCB7XG4gICAgc2tpcD86IGJvb2xlYW47XG59XG5cbi8qKiBAaGlkZGVuICovXG5AUGlwZSh7XG4gICAgbmFtZTogJ2dyaWRTdW1tYXJ5JyxcbiAgICBwdXJlOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRTdW1tYXJ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAgIHByaXZhdGUgZ3JpZEFQSTogSWd4R3JpZEFQSVNlcnZpY2U7XG5cbiAgICBjb25zdHJ1Y3RvcihncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4pIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJID0gPElneEdyaWRBUElTZXJ2aWNlPmdyaWRBUEk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybShjb2xsZWN0aW9uOiBJR3JvdXBCeVJlc3VsdCxcbiAgICAgICAgaGFzU3VtbWFyeTogYm9vbGVhbixcbiAgICAgICAgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTogR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUsXG4gICAgICAgIHN1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbixcbiAgICAgICAgaWQ6IHN0cmluZywgcGlwZVRyaWdnZXI6IG51bWJlciwgc3VtbWFyeVBpcGVUcmlnZ2VyOiBudW1iZXIpOiBhbnlbXSB7XG5cbiAgICAgICAgaWYgKCFjb2xsZWN0aW9uLmRhdGEgfHwgIWhhc1N1bW1hcnkgfHwgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9PT0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdExldmVsT25seSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFN1bW1hcnlSb3dzKGlkLCBjb2xsZWN0aW9uLCBzdW1tYXJ5UG9zaXRpb24pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkU3VtbWFyeVJvd3MoZ3JpZElkOiBzdHJpbmcsIGNvbGxlY3Rpb246IElHcm91cEJ5UmVzdWx0LCBzdW1tYXJ5UG9zaXRpb246IEdyaWRTdW1tYXJ5UG9zaXRpb24pOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IHJlY29yZHNXaXRoU3VtbWFyeSA9IFtdO1xuICAgICAgICBjb25zdCBsYXN0Q2hpbGRNYXAgPSBuZXcgTWFwPGFueSwgSUdyb3VwQnlSZWNvcmRbXT4oKTtcbiAgICAgICAgY29uc3QgZ3JpZDogSWd4R3JpZENvbXBvbmVudCA9IHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgICAgICBjb25zdCBtYXhTdW1tYXJ5SGVpZ2h0ID0gZ3JpZC5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uLm1ldGFkYXRhLmxlbmd0aCAmJiAhZ3JpZC5pc0dyb3VwQnlSZWNvcmQoY29sbGVjdGlvbi5kYXRhWzBdKSAmJlxuICAgICAgICAgICAgZ3JpZC5pc0dyb3VwQnlSZWNvcmQoY29sbGVjdGlvbi5tZXRhZGF0YVswXSkgJiYgc3VtbWFyeVBvc2l0aW9uID09PSBHcmlkU3VtbWFyeVBvc2l0aW9uLmJvdHRvbSkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiBBcnJheTxJR3JvdXBCeVJlY29yZCAmIElTa2lwUmVjb3JkPiA9IFtdO1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2goY29sbGVjdGlvbi5tZXRhZGF0YVswXSk7XG4gICAgICAgICAgICB3aGlsZSAoZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXS5ncm91cFBhcmVudCkge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMV0uZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKGcgPT4gZy5za2lwID0gdHJ1ZSk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLmRhdGEuc3BsaWNlKDAsIDAsIC4uLmdyb3Vwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGNvbGxlY3Rpb24uZGF0YVtpXTtcbiAgICAgICAgICAgIGxldCBza2lwQWRkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmVjb3JkSWQ7XG4gICAgICAgICAgICBsZXQgZ3JvdXBCeVJlY29yZDogSUdyb3VwQnlSZWNvcmQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGdyaWQuaXNHcm91cEJ5UmVjb3JkKHJlY29yZCkpIHtcbiAgICAgICAgICAgICAgICBza2lwQWRkID0gISFyZWNvcmQuc2tpcDtcbiAgICAgICAgICAgICAgICByZWNvcmQuc2tpcCA9IG51bGw7XG4gICAgICAgICAgICAgICAgZ3JvdXBCeVJlY29yZCA9IHJlY29yZCBhcyBJR3JvdXBCeVJlY29yZDtcbiAgICAgICAgICAgICAgICByZWNvcmRJZCA9IHRoaXMuZ3JpZEFQSS5nZXRfZ3JvdXBCeV9yZWNvcmRfaWQoZ3JvdXBCeVJlY29yZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29yZElkID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaWQocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAgICAgICAgIHJlY29yZHNXaXRoU3VtbWFyeS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdW1tYXJ5UG9zaXRpb24gPT09IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tICYmIGxhc3RDaGlsZE1hcC5oYXMocmVjb3JkSWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBSZWNvcmRzID0gbGFzdENoaWxkTWFwLmdldChyZWNvcmRJZCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdyb3VwUmVjb3Jkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cFJlY29yZCA9IGdyb3VwUmVjb3Jkc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBSZWNvcmRJZCA9IHRoaXMuZ3JpZEFQSS5nZXRfZ3JvdXBCeV9yZWNvcmRfaWQoZ3JvdXBSZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRzID0gdGhpcy5yZW1vdmVEZWxldGVkUmVjb3JkKGdyaWQsIGdyb3VwUmVjb3JkLnJlY29yZHMuc2xpY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcmllcyA9IGdyaWQuc3VtbWFyeVNlcnZpY2UuY2FsY3VsYXRlU3VtbWFyaWVzKGdyb3VwUmVjb3JkSWQsIHJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5UmVjb3JkOiBJU3VtbWFyeVJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmllczogc3VtbWFyaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiBtYXhTdW1tYXJ5SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZHNXaXRoU3VtbWFyeS5wdXNoKHN1bW1hcnlSZWNvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyb3VwQnlSZWNvcmQgPT09IG51bGwgfHwgIWdyaWQuaXNFeHBhbmRlZEdyb3VwKGdyb3VwQnlSZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdW1tYXJ5UG9zaXRpb24gPT09IEdyaWRTdW1tYXJ5UG9zaXRpb24udG9wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IHRoaXMucmVtb3ZlRGVsZXRlZFJlY29yZChncmlkLCBncm91cEJ5UmVjb3JkLnJlY29yZHMuc2xpY2UoKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyaWVzID0gZ3JpZC5zdW1tYXJ5U2VydmljZS5jYWxjdWxhdGVTdW1tYXJpZXMocmVjb3JkSWQsIHJlY29yZHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSZWNvcmQ6IElTdW1tYXJ5UmVjb3JkID0ge1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJpZXM6IHN1bW1hcmllcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBtYXhTdW1tYXJ5SGVpZ2h0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWNvcmRzV2l0aFN1bW1hcnkucHVzaChzdW1tYXJ5UmVjb3JkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtbWFyeVBvc2l0aW9uID09PSBHcmlkU3VtbWFyeVBvc2l0aW9uLmJvdHRvbSkge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSBncm91cEJ5UmVjb3JkO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGxhc3RDaGlsZC5ncm91cHMgJiYgbGFzdENoaWxkLmdyb3Vwcy5sZW5ndGggPiAwICYmIGdyaWQuaXNFeHBhbmRlZEdyb3VwKGxhc3RDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkID0gbGFzdENoaWxkLmdyb3Vwc1tsYXN0Q2hpbGQuZ3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsYXN0Q2hpbGRJZDtcbiAgICAgICAgICAgICAgICBpZiAoZ3JpZC5pc0V4cGFuZGVkR3JvdXAobGFzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0Q2hpbGRJZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2lkKGxhc3RDaGlsZC5yZWNvcmRzW2xhc3RDaGlsZC5yZWNvcmRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsYXN0Q2hpbGRJZCA9IHRoaXMuZ3JpZEFQSS5nZXRfZ3JvdXBCeV9yZWNvcmRfaWQobGFzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBSZWNvcmRzID0gbGFzdENoaWxkTWFwLmdldChsYXN0Q2hpbGRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFncm91cFJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBSZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZE1hcC5zZXQobGFzdENoaWxkSWQsIGdyb3VwUmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdyb3VwUmVjb3Jkcy51bnNoaWZ0KGdyb3VwQnlSZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZHNXaXRoU3VtbWFyeTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZURlbGV0ZWRSZWNvcmQoZ3JpZCwgZGF0YSkge1xuICAgICAgICBpZiAoIWdyaWQudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRSb3dzID0gZ3JpZC50cmFuc2FjdGlvbnMuZ2V0VHJhbnNhY3Rpb25Mb2coKS5maWx0ZXIodCA9PiB0LnR5cGUgPT09ICdkZWxldGUnKS5tYXAodCA9PiB0LmlkKTtcbiAgICAgICAgZGVsZXRlZFJvd3MuZm9yRWFjaChyb3dJRCA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IGdyaWQucHJpbWFyeUtleSA/IGRhdGEubWFwKHJlYyA9PiByZWNbZ3JpZC5wcmltYXJ5S2V5XSkgOiBkYXRhO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0ZW1wRGF0YS5pbmRleE9mKHJvd0lEKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59XG4iXX0=