UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

264 lines • 22.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { cloneArray } from '../core/utils'; import { SortingDirection } from './sorting-expression.interface'; /** * @record */ export function ISortingStrategy() { } if (false) { /** @type {?} */ ISortingStrategy.prototype.sort; } export class DefaultSortingStrategy { /** * @protected */ constructor() { } /** * @return {?} */ static instance() { return this._instance || (this._instance = new this()); } /** * @param {?} data * @param {?} fieldName * @param {?} dir * @param {?} ignoreCase * @param {?} valueResolver * @return {?} */ sort(data, fieldName, dir, ignoreCase, valueResolver) { /** @type {?} */ const key = fieldName; /** @type {?} */ const reverse = (dir === SortingDirection.Desc ? -1 : 1); /** @type {?} */ const cmpFunc = (obj1, obj2) => { return this.compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver); }; return this.arraySort(data, cmpFunc); } /** * @param {?} a * @param {?} b * @return {?} */ compareValues(a, b) { /** @type {?} */ const an = (a === null || a === undefined); /** @type {?} */ const bn = (b === null || b === undefined); if (an) { if (bn) { return 0; } return -1; } else if (bn) { return 1; } return a > b ? 1 : a < b ? -1 : 0; } /** * @protected * @param {?} obj1 * @param {?} obj2 * @param {?} key * @param {?} reverse * @param {?} ignoreCase * @param {?} valueResolver * @return {?} */ compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver) { /** @type {?} */ let a = valueResolver(obj1, key); /** @type {?} */ let b = valueResolver(obj2, key); if (ignoreCase) { a = a && a.toLowerCase ? a.toLowerCase() : a; b = b && b.toLowerCase ? b.toLowerCase() : b; } return reverse * this.compareValues(a, b); } /** * @protected * @param {?} data * @param {?=} compareFn * @return {?} */ arraySort(data, compareFn) { return data.sort(compareFn); } } DefaultSortingStrategy._instance = null; if (false) { /** * @type {?} * @private */ DefaultSortingStrategy._instance; } export class IgxSorting { /** * @param {?} data * @param {?} expressions * @return {?} */ sort(data, expressions) { return this.sortDataRecursive(data, expressions); } /** * @private * @param {?} data * @param {?} index * @param {?} expression * @return {?} */ groupedRecordsByExpression(data, index, expression) { /** @type {?} */ let i; /** @type {?} */ let groupval; /** @type {?} */ const res = []; /** @type {?} */ const key = expression.fieldName; /** @type {?} */ const len = data.length; res.push(data[index]); groupval = this.getFieldValue(data[index], key); index++; /** @type {?} */ const comparer = expression.groupingComparer || DefaultSortingStrategy.instance().compareValues; for (i = index; i < len; i++) { if (comparer(this.getFieldValue(data[i], key), groupval) === 0) { res.push(data[i]); } else { break; } } return res; } /** * @private * @template T * @param {?} data * @param {?} expressions * @param {?=} expressionIndex * @return {?} */ sortDataRecursive(data, expressions, expressionIndex = 0) { /** @type {?} */ let i; /** @type {?} */ let j; /** @type {?} */ let expr; /** @type {?} */ let gbData; /** @type {?} */ let gbDataLen; /** @type {?} */ const exprsLen = expressions.length; /** @type {?} */ const dataLen = data.length; expressionIndex = expressionIndex || 0; if (expressionIndex >= exprsLen || dataLen <= 1) { return data; } expr = expressions[expressionIndex]; if (!expr.strategy) { expr.strategy = DefaultSortingStrategy.instance(); } data = expr.strategy.sort(data, expr.fieldName, expr.dir, expr.ignoreCase, this.getFieldValue); if (expressionIndex === exprsLen - 1) { return data; } // in case of multiple sorting for (i = 0; i < dataLen; i++) { gbData = this.groupedRecordsByExpression(data, i, expr); gbDataLen = gbData.length; if (gbDataLen > 1) { gbData = this.sortDataRecursive(gbData, expressions, expressionIndex + 1); } for (j = 0; j < gbDataLen; j++) { data[i + j] = gbData[j]; } i += gbDataLen - 1; } return data; } /** * @protected * @template T * @param {?} data * @param {?} expressions * @param {?} level * @param {?} parent * @param {?} metadata * @param {?=} groupsRecords * @return {?} */ groupDataRecursive(data, expressions, level, parent, metadata, groupsRecords = []) { /** @type {?} */ let i = 0; /** @type {?} */ let result = []; while (i < data.length) { /** @type {?} */ const group = this.groupedRecordsByExpression(data, i, expressions[level]); /** @type {?} */ const groupRow = { expression: expressions[level], level, records: cloneArray(group), value: group[0][expressions[level].fieldName], groupParent: parent, groups: [] }; if (parent) { parent.groups.push(groupRow); } else { groupsRecords.push(groupRow); } if (level < expressions.length - 1) { result = result.concat(this.groupDataRecursive(group, expressions, level + 1, groupRow, metadata, groupsRecords)); } else { for (const groupItem of group) { metadata.push(groupRow); result.push(groupItem); } } i += group.length; } return result; } /** * @protected * @param {?} obj * @param {?} key * @return {?} */ getFieldValue(obj, key) { return obj[key]; } } export class IgxDataRecordSorting extends IgxSorting { /** * @protected * @param {?} obj * @param {?} key * @return {?} */ getFieldValue(obj, key) { return obj.data[key]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBR3RGLHNDQU1DOzs7SUFMRyxnQ0FJK0Q7O0FBR25FLE1BQU0sT0FBTyxzQkFBc0I7Ozs7SUFHL0IsZ0JBQXlCLENBQUM7Ozs7SUFFbkIsTUFBTSxDQUFDLFFBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7Ozs7Ozs7O0lBRU0sSUFBSSxDQUFDLElBQVcsRUFDWCxTQUFpQixFQUNqQixHQUFxQixFQUNyQixVQUFtQixFQUNuQixhQUE2Qzs7Y0FDL0MsR0FBRyxHQUFHLFNBQVM7O2NBQ2YsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FDbEQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7OztJQUVNLGFBQWEsQ0FBQyxDQUFNLEVBQUUsQ0FBTTs7Y0FDekIsRUFBRSxH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QUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUNySDtpQkFBTTtnQkFDSCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssRUFBRTtvQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDMUI7YUFDSjtZQUNELENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzs7Ozs7OztJQUNTLGFBQWEsQ0FBQyxHQUFRLEVBQUUsR0FBVztRQUN6QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTs7Ozs7OztJQUN0QyxhQUFhLENBQUMsR0FBUSxFQUFFLEdBQVc7UUFDekMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsb25lQXJyYXkgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElHcm91cEJ5UmVjb3JkIH0gZnJvbSAnLi9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uLCBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElHcm91cGluZ0V4cHJlc3Npb24gfSBmcm9tICcuL2dyb3VwaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJU29ydGluZ1N0cmF0ZWd5IHtcbiAgICBzb3J0OiAoZGF0YTogYW55W10sXG4gICAgICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICAgICBkaXI6IFNvcnRpbmdEaXJlY3Rpb24sXG4gICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgIHZhbHVlUmVzb2x2ZXI6IChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueSkgPT4gYW55W107XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVNvcnRpbmdTdHJhdGVneSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5ID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlKCk6IERlZmF1bHRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sXG4gICAgICAgICAgICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZGlyOiBTb3J0aW5nRGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgdmFsdWVSZXNvbHZlcjogKG9iajogYW55LCBrZXk6IHN0cmluZykgPT4gYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkTmFtZTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IChkaXIgPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IGNtcEZ1bmMgPSAob2JqMSwgb2JqMikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMiwga2V5LCByZXZlcnNlLCBpZ25vcmVDYXNlLCB2YWx1ZVJlc29sdmVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlTb3J0KGRhdGEsIGNtcEZ1bmMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KSB7XG4gICAgICAgIGNvbnN0IGFuID0gKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgYm4gPSAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoYW4pIHtcbiAgICAgICAgICAgIGlmIChibikge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGJuKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbXBhcmVPYmplY3RzKG9iajE6IG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqMjogb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVJlc29sdmVyOiAob2JqOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpIHtcbiAgICAgICAgbGV0IGEgPSB2YWx1ZVJlc29sdmVyKG9iajEsIGtleSk7XG4gICAgICAgIGxldCBiID0gdmFsdWVSZXNvbHZlcihvYmoyLCBrZXkpO1xuICAgICAgICBpZiAoaWdub3JlQ2FzZSkge1xuICAgICAgICAgICAgYSA9IGEgJiYgYS50b0xvd2VyQ2FzZSA/IGEudG9Mb3dlckNhc2UoKSA6IGE7XG4gICAgICAgICAgICBiID0gYiAmJiBiLnRvTG93ZXJDYXNlID8gYi50b0xvd2VyQ2FzZSgpIDogYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV2ZXJzZSAqIHRoaXMuY29tcGFyZVZhbHVlcyhhLCBiKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXJyYXlTb3J0KGRhdGE6IGFueVtdLCBjb21wYXJlRm4/KTogYW55W10ge1xuICAgICAgICByZXR1cm4gZGF0YS5zb3J0KGNvbXBhcmVGbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWd4U29ydGluZyB7XG4gICAgcHVibGljIHNvcnQoZGF0YTogYW55W10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZGF0YSwgZXhwcmVzc2lvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ3JvdXBlZFJlY29yZHNCeUV4cHJlc3Npb24oZGF0YTogYW55W10sXG4gICAgICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogSUdyb3VwaW5nRXhwcmVzc2lvbik6IGFueVtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBncm91cHZhbDtcbiAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgIGNvbnN0IGtleSA9IGV4cHJlc3Npb24uZmllbGROYW1lO1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmVzLnB1c2goZGF0YVtpbmRleF0pO1xuICAgICAgICBncm91cHZhbCA9IHRoaXMuZ2V0RmllbGRWYWx1ZShkYXRhW2luZGV4XSwga2V5KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29uc3QgY29tcGFyZXIgPSBleHByZXNzaW9uLmdyb3VwaW5nQ29tcGFyZXIgfHwgRGVmYXVsdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpLmNvbXBhcmVWYWx1ZXM7XG4gICAgICAgIGZvciAoaSA9IGluZGV4OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlcih0aGlzLmdldEZpZWxkVmFsdWUoZGF0YVtpXSwga2V5KSwgZ3JvdXB2YWwpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goZGF0YVtpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHByaXZhdGUgc29ydERhdGFSZWN1cnNpdmU8VD4oZGF0YTogVFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnM6IElTb3J0aW5nRXhwcmVzc2lvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkluZGV4OiBudW1iZXIgPSAwKTogVFtdIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBqO1xuICAgICAgICBsZXQgZXhwcjogSVNvcnRpbmdFeHByZXNzaW9uO1xuICAgICAgICBsZXQgZ2JEYXRhO1xuICAgICAgICBsZXQgZ2JEYXRhTGVuO1xuICAgICAgICBjb25zdCBleHByc0xlbiA9IGV4cHJlc3Npb25zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGF0YUxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBleHByZXNzaW9uSW5kZXggPSBleHByZXNzaW9uSW5kZXggfHwgMDtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA+PSBleHByc0xlbiB8fCBkYXRhTGVuIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIgPSBleHByZXNzaW9uc1tleHByZXNzaW9uSW5kZXhdO1xuICAgICAgICBpZiAoIWV4cHIuc3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGV4cHIuc3RyYXRlZ3kgPSBEZWZhdWx0U29ydGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGV4cHIuc3RyYXRlZ3kuc29ydChkYXRhLCBleHByLmZpZWxkTmFtZSwgZXhwci5kaXIsIGV4cHIuaWdub3JlQ2FzZSwgdGhpcy5nZXRGaWVsZFZhbHVlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JbmRleCA9PT0gZXhwcnNMZW4gLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiBjYXNlIG9mIG11bHRpcGxlIHNvcnRpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW47IGkrKykge1xuICAgICAgICAgICAgZ2JEYXRhID0gdGhpcy5ncm91cGVkUmVjb3Jkc0J5RXhwcmVzc2lvbihkYXRhLCBpLCBleHByKTtcbiAgICAgICAgICAgIGdiRGF0YUxlbiA9IGdiRGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZ2JEYXRhTGVuID4gMSkge1xuICAgICAgICAgICAgICAgIGdiRGF0YSA9IHRoaXMuc29ydERhdGFSZWN1cnNpdmUoZ2JEYXRhLCBleHByZXNzaW9ucywgZXhwcmVzc2lvbkluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2JEYXRhTGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBkYXRhW2kgKyBqXSA9IGdiRGF0YVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgKz0gZ2JEYXRhTGVuIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdyb3VwRGF0YVJlY3Vyc2l2ZTxUPihkYXRhOiBUW10sIGV4cHJlc3Npb25zOiBJU29ydGluZ0V4cHJlc3Npb25bXSwgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgcGFyZW50OiBJR3JvdXBCeVJlY29yZCwgbWV0YWRhdGE6IElHcm91cEJ5UmVjb3JkW10sIGdyb3Vwc1JlY29yZHM6IGFueVtdID0gW10pOiBUW10ge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwZWRSZWNvcmRzQnlFeHByZXNzaW9uKGRhdGEsIGksIGV4cHJlc3Npb25zW2xldmVsXSk7XG4gICAgICAgICAgICBjb25zdCBncm91cFJvdzogSUdyb3VwQnlSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbnNbbGV2ZWxdLFxuICAgICAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgICAgIHJlY29yZHM6IGNsb25lQXJyYXkoZ3JvdXApLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBncm91cFswXVtleHByZXNzaW9uc1tsZXZlbF0uZmllbGROYW1lXSxcbiAgICAgICAgICAgICAgICBncm91cFBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgICAgIGdyb3VwczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Lmdyb3Vwcy5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzUmVjb3Jkcy5wdXNoKGdyb3VwUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZXZlbCA8IGV4cHJlc3Npb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuZ3JvdXBEYXRhUmVjdXJzaXZlKGdyb3VwLCBleHByZXNzaW9ucywgbGV2ZWwgKyAxLCBncm91cFJvdywgbWV0YWRhdGEsIGdyb3Vwc1JlY29yZHMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBncm91cEl0ZW0gb2YgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHVzaChncm91cFJvdyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSBncm91cC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElneERhdGFSZWNvcmRTb3J0aW5nIGV4dGVuZHMgSWd4U29ydGluZyB7XG4gICAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWUob2JqOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG9iai5kYXRhW2tleV07XG4gICAgfVxufVxuIl19