angular-pipes
Version:
Angular pipes library
252 lines • 28.4 kB
JavaScript
import * as tslib_1 from "tslib";
export function isUndefined(value) {
return typeof value === 'undefined';
}
export function isNull(value) {
return value === null;
}
export function isNumber(value) {
return typeof value === 'number';
}
export function isNumberFinite(value) {
return isNumber(value) && isFinite(value);
}
// Not strict positive
export function isPositive(value) {
return value >= 0;
}
export function isInteger(value) {
// No rest, is an integer
return value % 1 === 0;
}
export function isNil(value) {
return value === null || typeof value === 'undefined';
}
export function isString(value) {
return typeof value === 'string';
}
export function isObject(value) {
return value !== null && typeof value === 'object';
}
export function isArray(value) {
return Array.isArray(value);
}
export function isFunction(value) {
return typeof value === 'function';
}
export function toDecimal(value, decimal) {
return Math.round(value * Math.pow(10, decimal)) / Math.pow(10, decimal);
}
export function upperFirst(value) {
return value.slice(0, 1).toUpperCase() + value.slice(1);
}
export function createRound(method) {
// <any>Math to suppress error
var func = Math[method];
return function (value, precision) {
if (precision === void 0) { precision = 0; }
if (typeof value === 'string') {
throw new TypeError('Rounding method needs a number');
}
if (typeof precision !== 'number' || isNaN(precision)) {
precision = 0;
}
if (precision) {
var pair = (value + "e").split('e');
var val = func(pair[0] + "e" + (+pair[1] + precision));
pair = (val + "e").split('e');
return +(pair[0] + 'e' + (+pair[1] - precision));
}
return func(value);
};
}
export function leftPad(str, len, ch) {
if (len === void 0) { len = 0; }
if (ch === void 0) { ch = ' '; }
str = String(str);
ch = toString(ch);
var i = -1;
var length = len - str.length;
while (++i < length && str.length + ch.length <= len) {
str = ch + str;
}
return str;
}
export function rightPad(str, len, ch) {
if (len === void 0) { len = 0; }
if (ch === void 0) { ch = ' '; }
str = String(str);
ch = toString(ch);
var i = -1;
var length = len - str.length;
while (++i < length && str.length + ch.length <= len) {
str += ch;
}
return str;
}
export function toString(value) {
return "" + value;
}
export function pad(str, len, ch) {
if (len === void 0) { len = 0; }
if (ch === void 0) { ch = ' '; }
str = String(str);
ch = toString(ch);
var i = -1;
var length = len - str.length;
var left = true;
while (++i < length) {
var l = str.length + ch.length <= len ? str.length + ch.length : str.length + 1;
if (left) {
str = leftPad(str, l, ch);
}
else {
str = rightPad(str, l, ch);
}
left = !left;
}
return str;
}
export function flatten(input, index) {
if (index === void 0) { index = 0; }
if (index >= input.length) {
return input;
}
if (isArray(input[index])) {
return flatten(input.slice(0, index).concat(input[index], input.slice(index + 1)), index);
}
return flatten(input, index + 1);
}
export function getProperty(value, key) {
var e_1, _a;
if (isNil(value) || !isObject(value)) {
return undefined;
}
var keys = key.split('.');
var result = value[keys.shift()];
try {
for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
var key_1 = keys_1_1.value;
if (isNil(result) || !isObject(result)) {
return undefined;
}
result = result[key_1];
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
}
finally { if (e_1) throw e_1.error; }
}
return result;
}
export function sum(input, initial) {
if (initial === void 0) { initial = 0; }
return input.reduce(function (previous, current) { return previous + current; }, initial);
}
// http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript
export function shuffle(input) {
if (!isArray(input)) {
return input;
}
var copy = tslib_1.__spread(input);
for (var i = copy.length; i; --i) {
var j = Math.floor(Math.random() * i);
var x = copy[i - 1];
copy[i - 1] = copy[j];
copy[j] = x;
}
return copy;
}
export function deepIndexOf(collection, value) {
var index = -1;
var length = collection.length;
while (++index < length) {
if (deepEqual(value, collection[index])) {
return index;
}
}
return -1;
}
export function deepEqual(a, b) {
if (a === b) {
return true;
}
if (!(typeof a === 'object' && typeof b === 'object')) {
return a === b;
}
var keysA = Object.keys(a);
var keysB = Object.keys(b);
if (keysA.length !== keysB.length) {
return false;
}
// Test for A's keys different from B.
var hasOwn = Object.prototype.hasOwnProperty;
for (var i = 0; i < keysA.length; i++) {
var key = keysA[i];
if (!hasOwn.call(b, keysA[i]) || !deepEqual(a[key], b[key])) {
return false;
}
}
return true;
}
export function isDeepObject(object) {
return object.__isDeepObject__;
}
export function wrapDeep(object) {
return new DeepWrapper(object);
}
export function unwrapDeep(object) {
if (isDeepObject(object)) {
return object.data;
}
return object;
}
var DeepWrapper = /** @class */ (function () {
function DeepWrapper(data) {
this.data = data;
this.__isDeepObject__ = true;
}
return DeepWrapper;
}());
export { DeepWrapper };
export function count(input) {
if (!isArray(input) && !isObject(input) && !isString(input)) {
return input;
}
if (isObject(input)) {
return Object.keys(input).map(function (value) { return input[value]; }).length;
}
return input.length;
}
export function empty(input) {
if (!isArray(input)) {
return input;
}
return input.length === 0;
}
export function every(input, predicate) {
if (!isArray(input) || !predicate) {
return input;
}
var result = true;
var i = -1;
while (++i < input.length && result) {
result = predicate(input[i], i, input);
}
return result;
}
export function takeUntil(input, predicate) {
var i = -1;
var result = [];
while (++i < input.length && !predicate(input[i], i, input)) {
result[i] = input[i];
}
return result;
}
export function takeWhile(input, predicate) {
return takeUntil(input, function (item, index, collection) { return !predicate(item, index, collection); });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXBpcGVzLyIsInNvdXJjZXMiOlsidXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBVTtJQUNwQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFVO0lBQy9CLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQVU7SUFDdkMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxzQkFBc0I7QUFDdEIsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLHlCQUF5QjtJQUN6QixPQUFPLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQVU7SUFDakMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUNyRCxDQUFDO0FB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LEVBQUUsVUFBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLFVBQWlCLElBQUssT0FBQSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFuQyxDQUFtQyxDQUFDLENBQUM7QUFDaEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENvbGxlY3Rpb25QcmVkaWNhdGUgPSAoaXRlbT86IGFueSwgaW5kZXg/OiBudW1iZXIsIGNvbGxlY3Rpb24/OiBhbnlbXSkgPT4gYm9vbGVhbjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogYW55KTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVsbCB7XHJcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckZpbml0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVtYmVyIHtcclxuICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIGlzRmluaXRlKHZhbHVlKTtcclxufVxyXG5cclxuLy8gTm90IHN0cmljdCBwb3NpdGl2ZVxyXG5leHBvcnQgZnVuY3Rpb24gaXNQb3NpdGl2ZSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHZhbHVlID49IDA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gIC8vIE5vIHJlc3QsIGlzIGFuIGludGVnZXJcclxuICByZXR1cm4gdmFsdWUgJSAxID09PSAwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xyXG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IGFueSk6IHZhbHVlIGlzIHN0cmluZyB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9EZWNpbWFsKHZhbHVlOiBudW1iZXIsIGRlY2ltYWw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBNYXRoLnBvdygxMCwgZGVjaW1hbCkpIC8gTWF0aC5wb3coMTAsIGRlY2ltYWwpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBwZXJGaXJzdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gdmFsdWUuc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kOiBzdHJpbmcpOiBGdW5jdGlvbiB7XHJcbiAgLy8gPGFueT5NYXRoIHRvIHN1cHByZXNzIGVycm9yXHJcbiAgY29uc3QgZnVuYzogYW55ID0gKDxhbnk+TWF0aClbbWV0aG9kXTtcclxuICByZXR1cm4gZnVuY3Rpb24odmFsdWU6IG51bWJlciwgcHJlY2lzaW9uOiBudW1iZXIgPSAwKSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb3VuZGluZyBtZXRob2QgbmVlZHMgYSBudW1iZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHByZWNpc2lvbiAhPT0gJ251bWJlcicgfHwgaXNOYU4ocHJlY2lzaW9uKSkge1xyXG4gICAgICBwcmVjaXNpb24gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmVjaXNpb24pIHtcclxuICAgICAgbGV0IHBhaXIgPSBgJHt2YWx1ZX1lYC5zcGxpdCgnZScpO1xyXG4gICAgICBjb25zdCB2YWwgPSBmdW5jKGAke3BhaXJbMF19ZWAgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcclxuXHJcbiAgICAgIHBhaXIgPSBgJHt2YWx9ZWAuc3BsaXQoJ2UnKTtcclxuICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGVmdFBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKSB7XHJcbiAgc3RyID0gU3RyaW5nKHN0cik7XHJcbiAgY2ggPSB0b1N0cmluZyhjaCk7XHJcbiAgbGV0IGkgPSAtMTtcclxuICBjb25zdCBsZW5ndGggPSBsZW4gLSBzdHIubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAoKytpIDwgbGVuZ3RoICYmIHN0ci5sZW5ndGggKyBjaC5sZW5ndGggPD0gbGVuKSB7XHJcbiAgICBzdHIgPSBjaCArIHN0cjtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByaWdodFBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKSB7XHJcbiAgc3RyID0gU3RyaW5nKHN0cik7XHJcbiAgY2ggPSB0b1N0cmluZyhjaCk7XHJcblxyXG4gIGxldCBpID0gLTE7XHJcbiAgY29uc3QgbGVuZ3RoID0gbGVuIC0gc3RyLmxlbmd0aDtcclxuXHJcbiAgd2hpbGUgKCsraSA8IGxlbmd0aCAmJiBzdHIubGVuZ3RoICsgY2gubGVuZ3RoIDw9IGxlbikge1xyXG4gICAgc3RyICs9IGNoO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0cjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICByZXR1cm4gYCR7dmFsdWV9YDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhZChzdHI6IHN0cmluZywgbGVuOiBudW1iZXIgPSAwLCBjaDogYW55ID0gJyAnKTogc3RyaW5nIHtcclxuICBzdHIgPSBTdHJpbmcoc3RyKTtcclxuICBjaCA9IHRvU3RyaW5nKGNoKTtcclxuICBsZXQgaSA9IC0xO1xyXG4gIGNvbnN0IGxlbmd0aCA9IGxlbiAtIHN0ci5sZW5ndGg7XHJcblxyXG4gIGxldCBsZWZ0ID0gdHJ1ZTtcclxuICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XHJcbiAgICBjb25zdCBsID0gc3RyLmxlbmd0aCArIGNoLmxlbmd0aCA8PSBsZW4gPyBzdHIubGVuZ3RoICsgY2gubGVuZ3RoIDogc3RyLmxlbmd0aCArIDE7XHJcblxyXG4gICAgaWYgKGxlZnQpIHtcclxuICAgICAgc3RyID0gbGVmdFBhZChzdHIsIGwsIGNoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0ciA9IHJpZ2h0UGFkKHN0ciwgbCwgY2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGxlZnQgPSAhbGVmdDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGlucHV0OiBhbnlbXSwgaW5kZXg6IG51bWJlciA9IDApOiBhbnlbXSB7XHJcbiAgaWYgKGluZGV4ID49IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzQXJyYXkoaW5wdXRbaW5kZXhdKSkge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW4oaW5wdXQuc2xpY2UoMCwgaW5kZXgpLmNvbmNhdChpbnB1dFtpbmRleF0sIGlucHV0LnNsaWNlKGluZGV4ICsgMSkpLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmxhdHRlbihpbnB1dCwgaW5kZXggKyAxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5KHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgaWYgKGlzTmlsKHZhbHVlKSB8fCAhaXNPYmplY3QodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBrZXkuc3BsaXQoJy4nKTtcclxuICBsZXQgcmVzdWx0OiBhbnkgPSB2YWx1ZVtrZXlzLnNoaWZ0KCkhXTtcclxuXHJcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgaWYgKGlzTmlsKHJlc3VsdCkgfHwgIWlzT2JqZWN0KHJlc3VsdCkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHQgPSByZXN1bHRba2V5XTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdW0oaW5wdXQ6IEFycmF5PG51bWJlcj4sIGluaXRpYWwgPSAwKTogbnVtYmVyIHtcclxuICByZXR1cm4gaW5wdXQucmVkdWNlKChwcmV2aW91czogbnVtYmVyLCBjdXJyZW50OiBudW1iZXIpID0+IHByZXZpb3VzICsgY3VycmVudCwgaW5pdGlhbCk7XHJcbn1cclxuXHJcbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjI3NDMzOS9ob3ctY2FuLWktc2h1ZmZsZS1hbi1hcnJheS1pbi1qYXZhc2NyaXB0XHJcbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlKGlucHV0OiBhbnkpOiBhbnkge1xyXG4gIGlmICghaXNBcnJheShpbnB1dCkpIHtcclxuICAgIHJldHVybiBpbnB1dDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNvcHkgPSBbLi4uaW5wdXRdO1xyXG5cclxuICBmb3IgKGxldCBpID0gY29weS5sZW5ndGg7IGk7IC0taSkge1xyXG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpO1xyXG4gICAgY29uc3QgeCA9IGNvcHlbaSAtIDFdO1xyXG4gICAgY29weVtpIC0gMV0gPSBjb3B5W2pdO1xyXG4gICAgY29weVtqXSA9IHg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBJbmRleE9mKGNvbGxlY3Rpb246IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgbGV0IGluZGV4ID0gLTE7XHJcbiAgY29uc3QgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoZGVlcEVxdWFsKHZhbHVlLCBjb2xsZWN0aW9uW2luZGV4XSkpIHtcclxuICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KSB7XHJcbiAgaWYgKGEgPT09IGIpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKCEodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0JykpIHtcclxuICAgIHJldHVybiBhID09PSBiO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcclxuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xyXG5cclxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXHJcbiAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3Qga2V5ID0ga2V5c0FbaV07XHJcbiAgICBpZiAoIWhhc093bi5jYWxsKGIsIGtleXNBW2ldKSB8fCAhZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVlcE9iamVjdChvYmplY3Q6IGFueSkge1xyXG4gIHJldHVybiBvYmplY3QuX19pc0RlZXBPYmplY3RfXztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZWVwKG9iamVjdDogYW55KSB7XHJcbiAgcmV0dXJuIG5ldyBEZWVwV3JhcHBlcihvYmplY3QpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwRGVlcChvYmplY3Q6IGFueSkge1xyXG4gIGlmIChpc0RlZXBPYmplY3Qob2JqZWN0KSkge1xyXG4gICAgcmV0dXJuIG9iamVjdC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERlZXBXcmFwcGVyIHtcclxuICBwdWJsaWMgX19pc0RlZXBPYmplY3RfXzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBhbnkpIHt9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3VudChpbnB1dDogYW55KTogYW55IHtcclxuICBpZiAoIWlzQXJyYXkoaW5wdXQpICYmICFpc09iamVjdChpbnB1dCkgJiYgIWlzU3RyaW5nKGlucHV0KSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGlucHV0KS5tYXAodmFsdWUgPT4gaW5wdXRbdmFsdWVdKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5wdXQubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZW1wdHkoaW5wdXQ6IGFueSk6IGFueSB7XHJcbiAgaWYgKCFpc0FycmF5KGlucHV0KSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGlucHV0Lmxlbmd0aCA9PT0gMDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5KGlucHV0OiBhbnksIHByZWRpY2F0ZTogQ29sbGVjdGlvblByZWRpY2F0ZSkge1xyXG4gIGlmICghaXNBcnJheShpbnB1dCkgfHwgIXByZWRpY2F0ZSkge1xyXG4gICAgcmV0dXJuIGlucHV0O1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgbGV0IGkgPSAtMTtcclxuXHJcbiAgd2hpbGUgKCsraSA8IGlucHV0Lmxlbmd0aCAmJiByZXN1bHQpIHtcclxuICAgIHJlc3VsdCA9IHByZWRpY2F0ZShpbnB1dFtpXSwgaSwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRha2VVbnRpbChpbnB1dDogYW55W10sIHByZWRpY2F0ZTogQ29sbGVjdGlvblByZWRpY2F0ZSkge1xyXG4gIGxldCBpID0gLTE7XHJcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSBbXTtcclxuICB3aGlsZSAoKytpIDwgaW5wdXQubGVuZ3RoICYmICFwcmVkaWNhdGUoaW5wdXRbaV0sIGksIGlucHV0KSkge1xyXG4gICAgcmVzdWx0W2ldID0gaW5wdXRbaV07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGFrZVdoaWxlKGlucHV0OiBhbnlbXSwgcHJlZGljYXRlOiBDb2xsZWN0aW9uUHJlZGljYXRlKSB7XHJcbiAgcmV0dXJuIHRha2VVbnRpbChpbnB1dCwgKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgY29sbGVjdGlvbjogYW55W10pID0+ICFwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIGNvbGxlY3Rpb24pKTtcclxufVxyXG4iXX0=