ngx-order-pipe
Version:
Angular order pipe, order collection by a field
198 lines • 19.6 kB
JavaScript
import * as tslib_1 from "tslib";
import { Pipe } from '@angular/core';
var OrderPipe = /** @class */ (function () {
function OrderPipe() {
}
OrderPipe_1 = OrderPipe;
/**
* Check if a value is a string
*
* @param value
*/
OrderPipe.isString = function (value) {
return typeof value === 'string' || value instanceof String;
};
/**
* Sorts values ignoring the case
*
* @param a
* @param b
*/
OrderPipe.caseInsensitiveSort = function (a, b) {
if (OrderPipe_1.isString(a) && OrderPipe_1.isString(b)) {
return a.localeCompare(b);
}
return OrderPipe_1.defaultCompare(a, b);
};
/**
* Default compare method
*
* @param a
* @param b
*/
OrderPipe.defaultCompare = function (a, b) {
if (a === b) {
return 0;
}
if (a == null) {
return 1;
}
if (b == null) {
return -1;
}
return a > b ? 1 : -1;
};
/**
* Parse expression, split into items
* @param expression
* @returns {string[]}
*/
OrderPipe.parseExpression = function (expression) {
expression = expression.replace(/\[(\w+)\]/g, '.$1');
expression = expression.replace(/^\./, '');
return expression.split('.');
};
/**
* Get value by expression
*
* @param object
* @param expression
* @returns {any}
*/
OrderPipe.getValue = function (object, expression) {
for (var i = 0, n = expression.length; i < n; ++i) {
var k = expression[i];
if (!(k in object)) {
return;
}
if (typeof object[k] === 'function') {
object = object[k]();
}
else {
object = object[k];
}
}
return object;
};
/**
* Set value by expression
*
* @param object
* @param value
* @param expression
*/
OrderPipe.setValue = function (object, value, expression) {
var i;
for (i = 0; i < expression.length - 1; i++) {
object = object[expression[i]];
}
object[expression[i]] = value;
};
OrderPipe.prototype.transform = function (value, expression, reverse, isCaseInsensitive, comparator) {
if (isCaseInsensitive === void 0) { isCaseInsensitive = false; }
if (!value) {
return value;
}
if (Array.isArray(expression)) {
return this.multiExpressionTransform(value, expression, reverse, isCaseInsensitive, comparator);
}
if (Array.isArray(value)) {
return this.sortArray(value.slice(), expression, reverse, isCaseInsensitive, comparator);
}
if (typeof value === 'object') {
return this.transformObject(Object.assign({}, value), expression, reverse, isCaseInsensitive, comparator);
}
return value;
};
/**
* Sort array
*
* @param value
* @param expression
* @param reverse
* @param isCaseInsensitive
* @param comparator
* @returns {any[]}
*/
OrderPipe.prototype.sortArray = function (value, expression, reverse, isCaseInsensitive, comparator) {
var isDeepLink = expression && expression.indexOf('.') !== -1;
if (isDeepLink) {
expression = OrderPipe_1.parseExpression(expression);
}
var compareFn;
if (comparator && typeof comparator === 'function') {
compareFn = comparator;
}
else {
compareFn = isCaseInsensitive ? OrderPipe_1.caseInsensitiveSort : OrderPipe_1.defaultCompare;
}
var array = value.sort(function (a, b) {
if (!expression) {
return compareFn(a, b);
}
if (!isDeepLink) {
if (a && b) {
return compareFn(a[expression], b[expression]);
}
return compareFn(a, b);
}
return compareFn(OrderPipe_1.getValue(a, expression), OrderPipe_1.getValue(b, expression));
});
if (reverse) {
return array.reverse();
}
return array;
};
/**
* Transform Object
*
* @param value
* @param expression
* @param reverse
* @param isCaseInsensitive
* @param comparator
* @returns {any[]}
*/
OrderPipe.prototype.transformObject = function (value, expression, reverse, isCaseInsensitive, comparator) {
var parsedExpression = OrderPipe_1.parseExpression(expression);
var lastPredicate = parsedExpression.pop();
var oldValue = OrderPipe_1.getValue(value, parsedExpression);
if (!Array.isArray(oldValue)) {
parsedExpression.push(lastPredicate);
lastPredicate = null;
oldValue = OrderPipe_1.getValue(value, parsedExpression);
}
if (!oldValue) {
return value;
}
OrderPipe_1.setValue(value, this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive), parsedExpression);
return value;
};
/**
* Apply multiple expressions
*
* @param value
* @param {any[]} expressions
* @param {boolean} reverse
* @param {boolean} isCaseInsensitive
* @param {Function} comparator
* @returns {any}
*/
OrderPipe.prototype.multiExpressionTransform = function (value, expressions, reverse, isCaseInsensitive, comparator) {
var _this = this;
if (isCaseInsensitive === void 0) { isCaseInsensitive = false; }
return expressions.reverse().reduce(function (result, expression) {
return _this.transform(result, expression, reverse, isCaseInsensitive, comparator);
}, value);
};
var OrderPipe_1;
OrderPipe = OrderPipe_1 = tslib_1.__decorate([
Pipe({
name: 'orderBy',
pure: false
})
], OrderPipe);
return OrderPipe;
}());
export { OrderPipe };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW9yZGVyLnBpcGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtb3JkZXItcGlwZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvb3JkZXItcGlwZS9uZ3gtb3JkZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFNcEQ7SUFBQTtJQWtOQSxDQUFDO2tCQWxOWSxTQUFTO0lBRXBCOzs7O09BSUc7SUFDSSxrQkFBUSxHQUFmLFVBQWdCLEtBQVU7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSw2QkFBbUIsR0FBMUIsVUFBMkIsQ0FBTSxFQUFFLENBQU07UUFDdkMsSUFBSSxXQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxXQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx3QkFBYyxHQUFyQixVQUFzQixDQUFNLEVBQUUsQ0FBTTtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDWDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7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O1FBSnJCLElBQUksQ0FBQztZQUNKLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO09BQ1csU0FBUyxDQWtOckI7SUFBRCxnQkFBQztDQUFBLEFBbE5ELElBa05DO1NBbE5ZLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ29yZGVyQnknLFxuICBwdXJlOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBPcmRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdmFsdWVzIGlnbm9yaW5nIHRoZSBjYXNlXG4gICAqXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlU29ydChhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChPcmRlclBpcGUuaXNTdHJpbmcoYSkgJiYgT3JkZXJQaXBlLmlzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgICByZXR1cm4gT3JkZXJQaXBlLmRlZmF1bHRDb21wYXJlKGEsIGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcGFyZSBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIGFcbiAgICogQHBhcmFtIGJcbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Q29tcGFyZShhOiBhbnksIGI6IGFueSkge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGV4cHJlc3Npb24sIHNwbGl0IGludG8gaXRlbXNcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSgvXFxbKFxcdyspXFxdL2csICcuJDEnKTtcbiAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9eXFwuLywgJycpO1xuICAgIHJldHVybiBleHByZXNzaW9uLnNwbGl0KCcuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIGdldFZhbHVlKG9iamVjdDogYW55LCBleHByZXNzaW9uOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZXhwcmVzc2lvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbnN0IGsgPSBleHByZXNzaW9uW2ldO1xuICAgICAgaWYgKCEoayBpbiBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W2tdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrXSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGJ5IGV4cHJlc3Npb25cbiAgICpcbiAgICogQHBhcmFtIG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBzZXRWYWx1ZShvYmplY3Q6IGFueSwgdmFsdWU6IGFueSwgZXhwcmVzc2lvbjogc3RyaW5nW10pIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtleHByZXNzaW9uW2ldXTtcbiAgICB9XG5cbiAgICBvYmplY3RbZXhwcmVzc2lvbltpXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55IHwgYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLCBjb21wYXJhdG9yPzogRnVuY3Rpb24pOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0QXJyYXkodmFsdWUuc2xpY2UoKSwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1PYmplY3QoT2JqZWN0LmFzc2lnbih7fSwgdmFsdWUpLCBleHByZXNzaW9uLCByZXZlcnNlLCBpc0Nhc2VJbnNlbnNpdGl2ZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHNvcnRBcnJheSh2YWx1ZTogYW55W10sIGV4cHJlc3Npb24/OiBhbnksIHJldmVyc2U/OiBib29sZWFuLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sIGNvbXBhcmF0b3I/OiBGdW5jdGlvbik6IGFueVtdIHtcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gZXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLmluZGV4T2YoJy4nKSAhPT0gLTE7XG5cbiAgICBpZiAoaXNEZWVwTGluaykge1xuICAgICAgZXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgbGV0IGNvbXBhcmVGbjogRnVuY3Rpb247XG5cbiAgICBpZiAoY29tcGFyYXRvciAmJiB0eXBlb2YgY29tcGFyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcGFyZUZuID0gY29tcGFyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyZUZuID0gaXNDYXNlSW5zZW5zaXRpdmUgPyBPcmRlclBpcGUuY2FzZUluc2Vuc2l0aXZlU29ydCA6IE9yZGVyUGlwZS5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheTogYW55W10gPSB2YWx1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGbihhLCBiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0RlZXBMaW5rKSB7XG4gICAgICAgIGlmIChhICYmIGIpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZUZuKGFbZXhwcmVzc2lvbl0sIGJbZXhwcmVzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJlRm4oYSwgYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wYXJlRm4oT3JkZXJQaXBlLmdldFZhbHVlKGEsIGV4cHJlc3Npb24pLCBPcmRlclBpcGUuZ2V0VmFsdWUoYiwgZXhwcmVzc2lvbikpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBhcnJheS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqIEBwYXJhbSByZXZlcnNlXG4gICAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZVxuICAgKiBAcGFyYW0gY29tcGFyYXRvclxuICAgKiBAcmV0dXJucyB7YW55W119XG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybU9iamVjdChcbiAgICB2YWx1ZTogYW55IHwgYW55W10sXG4gICAgZXhwcmVzc2lvbj86IGFueSxcbiAgICByZXZlcnNlPzogYm9vbGVhbixcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgY29tcGFyYXRvcj86IEZ1bmN0aW9uXG4gICk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IE9yZGVyUGlwZS5wYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgbGV0IGxhc3RQcmVkaWNhdGUgPSBwYXJzZWRFeHByZXNzaW9uLnBvcCgpO1xuICAgIGxldCBvbGRWYWx1ZSA9IE9yZGVyUGlwZS5nZXRWYWx1ZSh2YWx1ZSwgcGFyc2VkRXhwcmVzc2lvbik7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICBwYXJzZWRFeHByZXNzaW9uLnB1c2gobGFzdFByZWRpY2F0ZSk7XG4gICAgICBsYXN0UHJlZGljYXRlID0gbnVsbDtcbiAgICAgIG9sZFZhbHVlID0gT3JkZXJQaXBlLmdldFZhbHVlKHZhbHVlLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgT3JkZXJQaXBlLnNldFZhbHVlKHZhbHVlLCB0aGlzLnRyYW5zZm9ybShvbGRWYWx1ZSwgbGFzdFByZWRpY2F0ZSwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUpLCBwYXJzZWRFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgbXVsdGlwbGUgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSB7YW55W119IGV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ2FzZUluc2Vuc2l0aXZlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3JcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHByaXZhdGUgbXVsdGlFeHByZXNzaW9uVHJhbnNmb3JtKHZhbHVlOiBhbnksIGV4cHJlc3Npb25zOiBhbnlbXSwgcmV2ZXJzZTogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSwgY29tcGFyYXRvcj86IEZ1bmN0aW9uKTogYW55IHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbnMucmV2ZXJzZSgpLnJlZHVjZSgocmVzdWx0OiBhbnksIGV4cHJlc3Npb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHJlc3VsdCwgZXhwcmVzc2lvbiwgcmV2ZXJzZSwgaXNDYXNlSW5zZW5zaXRpdmUsIGNvbXBhcmF0b3IpO1xuICAgIH0sIHZhbHVlKTtcbiAgfVxufVxuIl19