@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
445 lines • 55.9 kB
JavaScript
import { __values } from "tslib";
/**
* @hidden
*/
export var MASK_FLAGS = ['C', '&', 'a', 'A', '?', 'L', '9', '0', '#'];
/**
* @hidden
*/
export var KEYS = {
Ctrl: 17,
Z: 90,
Y: 89,
X: 88,
BACKSPACE: 8,
DELETE: 46
};
/**
* @hidden
*/
var MaskHelper = /** @class */ (function () {
function MaskHelper() {
}
Object.defineProperty(MaskHelper.prototype, "cursor", {
get: function () {
return this._cursor;
},
enumerable: true,
configurable: true
});
MaskHelper.prototype.parseValueByMask = function (value, maskOptions, cursor) {
var inputValue = value;
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
var literalKeys = Array.from(literals.keys());
var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
if (inputValue.length < mask.length) { // BACKSPACE, DELETE
if (inputValue === '' && cursor === -1) {
this._cursor = 0;
return this.parseValueByMaskOnInit(value, maskOptions);
} // workaround for IE 'x' button
if (nonLiteralIndeces.indexOf(cursor + 1) !== -1) {
inputValue = this.insertCharAt(inputValue, cursor + 1, maskOptions.promptChar);
this._cursor = cursor + 1;
}
else {
inputValue = this.insertCharAt(inputValue, cursor + 1, mask[cursor + 1]);
this._cursor = cursor + 1;
for (var i = this._cursor; i < 0; i--) {
if (literalKeys.indexOf(this._cursor) !== -1) {
this._cursor--;
}
else {
break;
}
}
}
}
else {
var char = inputValue[cursor];
var isCharValid = this.validateCharOnPostion(char, cursor, mask);
if (nonLiteralIndeces.indexOf(cursor) !== -1) {
inputValue = this.replaceCharAt(inputValue, cursor, '');
if (isCharValid) {
inputValue = this.replaceCharAt(inputValue, cursor, char);
this._cursor = cursor + 1;
}
else {
this._cursor = cursor;
}
}
else {
inputValue = this.replaceCharAt(inputValue, cursor, '');
this._cursor = ++cursor;
for (var i = cursor; i < mask.length; i++) {
if (literalKeys.indexOf(this._cursor) !== -1) {
this._cursor = ++cursor;
}
else {
isCharValid = this.validateCharOnPostion(char, cursor, mask);
if (isCharValid) {
inputValue = this.replaceCharAt(inputValue, cursor, char);
this._cursor = ++cursor;
break;
}
else {
break;
}
}
}
}
}
return inputValue;
};
MaskHelper.prototype.parseMask = function (maskOptions) {
var e_1, _a;
var _this = this;
var outputVal = '';
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
try {
for (var mask_1 = __values(mask), mask_1_1 = mask_1.next(); !mask_1_1.done; mask_1_1 = mask_1.next()) {
var maskSym = mask_1_1.value;
outputVal += maskOptions.promptChar;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (mask_1_1 && !mask_1_1.done && (_a = mask_1.return)) _a.call(mask_1);
}
finally { if (e_1) throw e_1.error; }
}
literals.forEach(function (val, key) {
outputVal = _this.replaceCharAt(outputVal, key, val);
});
return outputVal;
};
MaskHelper.prototype.parseValueByMaskOnInit = function (inputVal, maskOptions) {
var e_2, _a, e_3, _b;
var _this = this;
var outputVal = '';
var value = '';
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
var literalKeys = Array.from(literals.keys());
var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
var literalValues = Array.from(literals.values());
if (inputVal != null) {
value = inputVal.toString();
}
try {
for (var mask_2 = __values(mask), mask_2_1 = mask_2.next(); !mask_2_1.done; mask_2_1 = mask_2.next()) {
var maskSym = mask_2_1.value;
outputVal += maskOptions.promptChar;
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (mask_2_1 && !mask_2_1.done && (_a = mask_2.return)) _a.call(mask_2);
}
finally { if (e_2) throw e_2.error; }
}
literals.forEach(function (val, key) {
outputVal = _this.replaceCharAt(outputVal, key, val);
});
if (!value) {
return outputVal;
}
var nonLiteralValues = this.getNonLiteralValues(value, literalValues);
for (var i = 0; i < nonLiteralValues.length; i++) {
var char = nonLiteralValues[i];
var isCharValid = this.validateCharOnPostion(char, nonLiteralIndeces[i], mask);
if (!isCharValid && char !== maskOptions.promptChar) {
nonLiteralValues[i] = maskOptions.promptChar;
}
}
if (nonLiteralValues.length > nonLiteralIndeces.length) {
nonLiteralValues.splice(nonLiteralIndeces.length);
}
var pos = 0;
try {
for (var nonLiteralValues_1 = __values(nonLiteralValues), nonLiteralValues_1_1 = nonLiteralValues_1.next(); !nonLiteralValues_1_1.done; nonLiteralValues_1_1 = nonLiteralValues_1.next()) {
var nonLiteralValue = nonLiteralValues_1_1.value;
var char = nonLiteralValue;
outputVal = this.replaceCharAt(outputVal, nonLiteralIndeces[pos++], char);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (nonLiteralValues_1_1 && !nonLiteralValues_1_1.done && (_b = nonLiteralValues_1.return)) _b.call(nonLiteralValues_1);
}
finally { if (e_3) throw e_3.error; }
}
return outputVal;
};
MaskHelper.prototype.restoreValueFromMask = function (value, maskOptions) {
var e_4, _a;
var outputVal = '';
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
var literalValues = Array.from(literals.values());
try {
for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
var val = value_1_1.value;
if (literalValues.indexOf(val) === -1) {
if (val !== maskOptions.promptChar) {
outputVal += val;
}
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);
}
finally { if (e_4) throw e_4.error; }
}
return outputVal;
};
MaskHelper.prototype.parseValueByMaskUponSelection = function (value, maskOptions, cursor, selection) {
var isCharValid;
var inputValue = value;
var char = inputValue[cursor];
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
var literalKeys = Array.from(literals.keys());
var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
if (!this.data) {
this._cursor = cursor < 0 ? ++cursor : cursor;
if (nonLiteralIndeces.indexOf(this._cursor) !== -1) {
isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
inputValue = isCharValid ? this.replaceCharAt(inputValue, this._cursor++, char) :
inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar);
selection--;
if (selection > 0) {
for (var i = 0; i < selection; i++) {
cursor++;
inputValue = nonLiteralIndeces.indexOf(cursor) !== -1 ?
this.insertCharAt(inputValue, cursor, maskOptions.promptChar) :
this.insertCharAt(inputValue, cursor, mask[cursor]);
}
}
}
else {
inputValue = this.replaceCharAt(inputValue, this._cursor, mask[this._cursor]);
this._cursor++;
selection--;
var isMarked = false;
if (selection > 0) {
cursor = this._cursor;
for (var i = 0; i < selection; i++) {
if (nonLiteralIndeces.indexOf(cursor) !== -1) {
isCharValid = this.validateCharOnPostion(char, cursor, mask);
if (isCharValid && !isMarked) {
inputValue = this.insertCharAt(inputValue, cursor, char);
cursor++;
this._cursor++;
isMarked = true;
}
else {
inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar);
cursor++;
}
}
else {
inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]);
if (cursor === this._cursor) {
this._cursor++;
}
cursor++;
}
}
}
}
}
else {
if (inputValue === '' && cursor === -1) {
this._cursor = 0;
return this.parseValueByMaskOnInit(value, maskOptions);
} // workaround for IE 'x' button
if (this._cursor < 0) {
this._cursor++;
cursor++;
}
cursor++;
this._cursor = cursor;
for (var i = 0; i < selection; i++) {
if (nonLiteralIndeces.indexOf(cursor) !== -1) {
inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar);
cursor++;
}
else {
inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]);
cursor++;
}
}
}
return inputValue;
};
MaskHelper.prototype.parseValueByMaskUponCopyPaste = function (value, maskOptions, cursor, clipboardData, selection) {
var e_5, _a;
var inputValue = value;
var mask = maskOptions.format;
var literals = this.getMaskLiterals(mask);
var literalKeys = Array.from(literals.keys());
var nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
var selectionEnd = cursor + selection;
this._cursor = cursor;
try {
for (var clipboardData_1 = __values(clipboardData), clipboardData_1_1 = clipboardData_1.next(); !clipboardData_1_1.done; clipboardData_1_1 = clipboardData_1.next()) {
var clipboardSym = clipboardData_1_1.value;
var char = clipboardSym;
if (this._cursor > mask.length) {
return inputValue;
}
if (nonLiteralIndeces.indexOf(this._cursor) !== -1) {
var isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
if (isCharValid) {
inputValue = this.replaceCharAt(inputValue, this._cursor++, char);
}
}
else {
for (var i = cursor; i < mask.length; i++) {
if (literalKeys.indexOf(this._cursor) !== -1) {
this._cursor++;
}
else {
var isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
if (isCharValid) {
inputValue = this.replaceCharAt(inputValue, this._cursor++, char);
}
break;
}
}
}
selection--;
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (clipboardData_1_1 && !clipboardData_1_1.done && (_a = clipboardData_1.return)) _a.call(clipboardData_1);
}
finally { if (e_5) throw e_5.error; }
}
if (selection > 0) {
for (var i = this._cursor; i < selectionEnd; i++) {
if (literalKeys.indexOf(this._cursor) !== -1) {
this._cursor++;
}
else {
inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar);
}
}
}
return inputValue;
};
MaskHelper.prototype.validateCharOnPostion = function (inputChar, position, mask) {
var regex;
var isValid;
var letterOrDigitRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]';
var letterDigitOrSpaceRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]';
var letterRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]';
var letteSpaceRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]';
var digitRegEx = '[\\d]';
var digitSpaceRegEx = '[\\d\\u0020]';
var digitSpecialRegEx = '[\\d-\\+]';
switch (mask.charAt(position)) {
case 'C':
isValid = inputChar !== '';
break;
case '&':
regex = new RegExp('[\\u0020]');
isValid = !regex.test(inputChar);
break;
case 'a':
regex = new RegExp(letterDigitOrSpaceRegEx);
isValid = regex.test(inputChar);
break;
case 'A':
regex = new RegExp(letterOrDigitRegEx);
isValid = regex.test(inputChar);
break;
case '?':
regex = new RegExp(letteSpaceRegEx);
isValid = regex.test(inputChar);
break;
case 'L':
regex = new RegExp(letterRegEx);
isValid = regex.test(inputChar);
break;
case '0':
regex = new RegExp(digitRegEx);
isValid = regex.test(inputChar);
break;
case '9':
regex = new RegExp(digitSpaceRegEx);
isValid = regex.test(inputChar);
break;
case '#':
regex = new RegExp(digitSpecialRegEx);
isValid = regex.test(inputChar);
break;
default: {
isValid = null;
}
}
return isValid;
};
MaskHelper.prototype.replaceCharAt = function (strValue, index, char) {
if (strValue !== undefined) {
return strValue.substring(0, index) + char + strValue.substring(index + 1);
}
};
MaskHelper.prototype.insertCharAt = function (strValue, index, char) {
if (strValue !== undefined) {
return strValue.substring(0, index) + char + strValue.substring(index);
}
};
MaskHelper.prototype.getMaskLiterals = function (mask) {
var literals = new Map();
for (var i = 0; i < mask.length; i++) {
var char = mask.charAt(i);
if (MASK_FLAGS.indexOf(char) === -1) {
literals.set(i, char);
}
}
return literals;
};
MaskHelper.prototype.getNonLiteralIndeces = function (mask, literalKeys) {
var nonLiteralsIndeces = new Array();
for (var i = 0; i < mask.length; i++) {
if (literalKeys.indexOf(i) === -1) {
nonLiteralsIndeces.push(i);
}
}
return nonLiteralsIndeces;
};
MaskHelper.prototype.getNonLiteralValues = function (value, literalValues) {
var e_6, _a;
var nonLiteralValues = new Array();
try {
for (var value_2 = __values(value), value_2_1 = value_2.next(); !value_2_1.done; value_2_1 = value_2.next()) {
var val = value_2_1.value;
if (literalValues.indexOf(val) === -1) {
nonLiteralValues.push(val);
}
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (value_2_1 && !value_2_1.done && (_a = value_2.return)) _a.call(value_2);
}
finally { if (e_6) throw e_6.error; }
}
return nonLiteralValues;
};
return MaskHelper;
}());
export { MaskHelper };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1oZWxwZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvbWFzay9tYXNrLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsSUFBTSxVQUFVLEdBQUcsQ0FBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBRSxDQUFDO0FBRTFFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFHO0lBQ2hCLElBQUksRUFBRyxFQUFFO0lBQ1QsQ0FBQyxFQUFHLEVBQUU7SUFDTixDQUFDLEVBQUcsRUFBRTtJQUNOLENBQUMsRUFBRyxFQUFFO0lBQ04sU0FBUyxFQUFHLENBQUM7SUFDYixNQUFNLEVBQUcsRUFBRTtDQUNaLENBQUM7QUFHSjs7R0FFRztBQUNIO0lBQUE7SUEyWEEsQ0FBQztJQXpYRyxzQkFBVyw4QkFBTTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUdNLHFDQUFnQixHQUF2QixVQUF3QixLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU07UUFDOUMsSUFBSSxVQUFVLEdBQVcsS0FBSyxDQUFDO1FBQy9CLElBQU0sSUFBSSxHQUFXLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDeEMsSUFBTSxRQUFRLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFNLGlCQUFpQixHQUFhLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFakYsSUFBSSxVQUFV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QUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDSjtRQUVELE9BQU8sa0JBQWtCLENBQUM7SUFDOUIsQ0FBQztJQUNPLHdDQUFtQixHQUEzQixVQUE0QixLQUFhLEVBQUUsYUFBdUI7O1FBQzlELElBQU0sZ0JBQWdCLEdBQWEsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7WUFFL0MsS0FBa0IsSUFBQSxVQUFBLFNBQUEsS0FBSyxDQUFBLDRCQUFBLCtDQUFFO2dCQUFwQixJQUFNLEdBQUcsa0JBQUE7Z0JBQ1YsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNuQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzlCO2FBQ0o7Ozs7Ozs7OztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQyxBQTNYRCxJQTJYQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgTUFTS19GTEFHUyA9IFsgJ0MnLCAnJicsICdhJywgJ0EnLCAnPycsICdMJywgJzknLCAnMCcsICcjJyBdO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IEtFWVMgPSB7XG4gICAgQ3RybCA6IDE3LFxuICAgIFogOiA5MCxcbiAgICBZIDogODksXG4gICAgWCA6IDg4LFxuICAgIEJBQ0tTUEFDRSA6IDgsXG4gICAgREVMRVRFIDogNDZcbiAgfTtcblxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc2tIZWxwZXIge1xuICAgIHByaXZhdGUgX2N1cnNvcjtcbiAgICBwdWJsaWMgZ2V0IGN1cnNvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnNvcjtcbiAgICB9XG4gICAgcHVibGljIGRhdGE6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZUJ5TWFzayh2YWx1ZSwgbWFza09wdGlvbnMsIGN1cnNvcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBpbnB1dFZhbHVlOiBzdHJpbmcgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgbWFzazogc3RyaW5nID0gbWFza09wdGlvbnMuZm9ybWF0O1xuICAgICAgICBjb25zdCBsaXRlcmFsczogTWFwPG51bWJlciwgc3RyaW5nPiA9IHRoaXMuZ2V0TWFza0xpdGVyYWxzKG1hc2spO1xuICAgICAgICBjb25zdCBsaXRlcmFsS2V5czogbnVtYmVyW10gPSBBcnJheS5mcm9tKGxpdGVyYWxzLmtleXMoKSk7XG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxJbmRlY2VzOiBudW1iZXJbXSA9IHRoaXMuZ2V0Tm9uTGl0ZXJhbEluZGVjZXMobWFzaywgbGl0ZXJhbEtleXMpO1xuXG4gICAgICAgIGlmIChpbnB1dFZhbHVlLmxlbmd0aCA8IG1hc2subGVuZ3RoKSB7IC8vIEJBQ0tTUEFDRSwgREVMRVRFXG4gICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gJycgJiYgY3Vyc29yID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZUJ5TWFza09uSW5pdCh2YWx1ZSwgbWFza09wdGlvbnMpO1xuICAgICAgICAgICAgfSAvLyB3b3JrYXJvdW5kIGZvciBJRSAneCcgYnV0dG9uXG5cbiAgICAgICAgICAgIGlmIChub25MaXRlcmFsSW5kZWNlcy5pbmRleE9mKGN1cnNvciArIDEpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmluc2VydENoYXJBdChpbnB1dFZhbHVlLCBjdXJzb3IgKyAxLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yICsgMSwgbWFza1tjdXJzb3IgKyAxXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fY3Vyc29yOyBpIDwgMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFsS2V5cy5pbmRleE9mKHRoaXMuX2N1cnNvcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3ItLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGlucHV0VmFsdWVbY3Vyc29yXTtcbiAgICAgICAgICAgIGxldCBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIGN1cnNvciwgbWFzayk7XG4gICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hhclZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5yZXBsYWNlQ2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9ICsrY3Vyc29yO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjdXJzb3I7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFsS2V5cy5pbmRleE9mKHRoaXMuX2N1cnNvcikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSArK2N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhclZhbGlkID0gdGhpcy52YWxpZGF0ZUNoYXJPblBvc3Rpb24oY2hhciwgY3Vyc29yLCBtYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NoYXJWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBjaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSArK2N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VNYXNrKG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBjb25zdCBtYXNrOiBzdHJpbmcgPSBtYXNrT3B0aW9ucy5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxzOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gdGhpcy5nZXRNYXNrTGl0ZXJhbHMobWFzayk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXNrU3ltIG9mIG1hc2spIHtcbiAgICAgICAgICAgIG91dHB1dFZhbCArPSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGl0ZXJhbHMuZm9yRWFjaCgodmFsOiBzdHJpbmcsIGtleTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBvdXRwdXRWYWwgPSB0aGlzLnJlcGxhY2VDaGFyQXQob3V0cHV0VmFsLCBrZXksIHZhbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBvdXRwdXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVCeU1hc2tPbkluaXQoaW5wdXRWYWwsIG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgICAgY29uc3QgbWFzazogc3RyaW5nID0gbWFza09wdGlvbnMuZm9ybWF0O1xuICAgICAgICBjb25zdCBsaXRlcmFsczogTWFwPG51bWJlciwgc3RyaW5nPiA9IHRoaXMuZ2V0TWFza0xpdGVyYWxzKG1hc2spO1xuICAgICAgICBjb25zdCBsaXRlcmFsS2V5czogbnVtYmVyW10gPSBBcnJheS5mcm9tKGxpdGVyYWxzLmtleXMoKSk7XG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxJbmRlY2VzOiBudW1iZXJbXSA9IHRoaXMuZ2V0Tm9uTGl0ZXJhbEluZGVjZXMobWFzaywgbGl0ZXJhbEtleXMpO1xuICAgICAgICBjb25zdCBsaXRlcmFsVmFsdWVzOiBzdHJpbmdbXSA9IEFycmF5LmZyb20obGl0ZXJhbHMudmFsdWVzKCkpO1xuXG4gICAgICAgIGlmIChpbnB1dFZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGlucHV0VmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG1hc2tTeW0gb2YgbWFzaykge1xuICAgICAgICAgICAgb3V0cHV0VmFsICs9IG1hc2tPcHRpb25zLnByb21wdENoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBsaXRlcmFscy5mb3JFYWNoKCh2YWw6IHN0cmluZywga2V5OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG91dHB1dFZhbCA9IHRoaXMucmVwbGFjZUNoYXJBdChvdXRwdXRWYWwsIGtleSwgdmFsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vbkxpdGVyYWxWYWx1ZXM6IHN0cmluZ1tdID0gdGhpcy5nZXROb25MaXRlcmFsVmFsdWVzKHZhbHVlLCBsaXRlcmFsVmFsdWVzKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vbkxpdGVyYWxWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBub25MaXRlcmFsVmFsdWVzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDaGFyVmFsaWQgPSB0aGlzLnZhbGlkYXRlQ2hhck9uUG9zdGlvbihjaGFyLCBub25MaXRlcmFsSW5kZWNlc1tpXSwgbWFzayk7XG5cbiAgICAgICAgICAgIGlmICghaXNDaGFyVmFsaWQgJiYgY2hhciAhPT0gbWFza09wdGlvbnMucHJvbXB0Q2hhcikge1xuICAgICAgICAgICAgICAgIG5vbkxpdGVyYWxWYWx1ZXNbaV0gPSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vbkxpdGVyYWxWYWx1ZXMubGVuZ3RoID4gbm9uTGl0ZXJhbEluZGVjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBub25MaXRlcmFsVmFsdWVzLnNwbGljZShub25MaXRlcmFsSW5kZWNlcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qgbm9uTGl0ZXJhbFZhbHVlIG9mIG5vbkxpdGVyYWxWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBub25MaXRlcmFsVmFsdWU7XG4gICAgICAgICAgICBvdXRwdXRWYWwgPSB0aGlzLnJlcGxhY2VDaGFyQXQob3V0cHV0VmFsLCBub25MaXRlcmFsSW5kZWNlc1twb3MrK10sIGNoYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdG9yZVZhbHVlRnJvbU1hc2sodmFsdWUsIG1hc2tPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dFZhbCA9ICcnO1xuICAgICAgICBjb25zdCBtYXNrOiBzdHJpbmcgPSBtYXNrT3B0aW9ucy5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxzOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gdGhpcy5nZXRNYXNrTGl0ZXJhbHMobWFzayk7XG4gICAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZXM6IHN0cmluZ1tdID0gQXJyYXkuZnJvbShsaXRlcmFscy52YWx1ZXMoKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsVmFsdWVzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9PSBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFZhbCArPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZUJ5TWFza1Vwb25TZWxlY3Rpb24odmFsdWUsIG1hc2tPcHRpb25zLCBjdXJzb3IsIHNlbGVjdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGxldCBpc0NoYXJWYWxpZDogYm9vbGVhbjtcbiAgICAgICAgbGV0IGlucHV0VmFsdWU6IHN0cmluZyA9IHZhbHVlO1xuICAgICAgICBjb25zdCBjaGFyOiBzdHJpbmcgPSBpbnB1dFZhbHVlW2N1cnNvcl07XG4gICAgICAgIGNvbnN0IG1hc2s6IHN0cmluZyA9IG1hc2tPcHRpb25zLmZvcm1hdDtcbiAgICAgICAgY29uc3QgbGl0ZXJhbHM6IE1hcDxudW1iZXIsIHN0cmluZz4gPSB0aGlzLmdldE1hc2tMaXRlcmFscyhtYXNrKTtcbiAgICAgICAgY29uc3QgbGl0ZXJhbEtleXM6IG51bWJlcltdID0gQXJyYXkuZnJvbShsaXRlcmFscy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBub25MaXRlcmFsSW5kZWNlczogbnVtYmVyW10gPSB0aGlzLmdldE5vbkxpdGVyYWxJbmRlY2VzKG1hc2ssIGxpdGVyYWxLZXlzKTtcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yIDwgMCA/ICsrY3Vyc29yIDogY3Vyc29yO1xuICAgICAgICAgICAgaWYgKG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIHRoaXMuX2N1cnNvciwgbWFzayk7XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlzQ2hhclZhbGlkID8gdGhpcy5yZXBsYWNlQ2hhckF0KGlucHV0VmFsdWUsIHRoaXMuX2N1cnNvcisrLCBjaGFyKSA6XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgdGhpcy5fY3Vyc29yKyssIG1hc2tPcHRpb25zLnByb21wdENoYXIpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi0tO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YoY3Vyc29yKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza09wdGlvbnMucHJvbXB0Q2hhcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza1tjdXJzb3JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMucmVwbGFjZUNoYXJBdChpbnB1dFZhbHVlLCB0aGlzLl9jdXJzb3IsIG1hc2tbdGhpcy5fY3Vyc29yXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLS07XG4gICAgICAgICAgICAgICAgbGV0IGlzTWFya2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhclZhbGlkID0gdGhpcy52YWxpZGF0ZUNoYXJPblBvc3Rpb24oY2hhciwgY3Vyc29yLCBtYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGFyVmFsaWQgJiYgIWlzTWFya2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmluc2VydENoYXJBdChpbnB1dFZhbHVlLCBjdXJzb3IsIGNoYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFya2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrW2N1cnNvcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT09IHRoaXMuX2N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gJycgJiYgY3Vyc29yID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZUJ5TWFza09uSW5pdCh2YWx1ZSwgbWFza09wdGlvbnMpO1xuICAgICAgICAgICAgfSAvLyB3b3JrYXJvdW5kIGZvciBJRSAneCcgYnV0dG9uXG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJzb3IgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9uTGl0ZXJhbEluZGVjZXMuaW5kZXhPZihjdXJzb3IpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5pbnNlcnRDaGFyQXQoaW5wdXRWYWx1ZSwgY3Vyc29yLCBtYXNrT3B0aW9ucy5wcm9tcHRDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuaW5zZXJ0Q2hhckF0KGlucHV0VmFsdWUsIGN1cnNvciwgbWFza1tjdXJzb3JdKTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVCeU1hc2tVcG9uQ29weVBhc3RlKHZhbHVlLCBtYXNrT3B0aW9ucywgY3Vyc29yLCBjbGlwYm9hcmREYXRhLCBzZWxlY3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQgaW5wdXRWYWx1ZTogc3RyaW5nID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IG1hc2s6IHN0cmluZyA9IG1hc2tPcHRpb25zLmZvcm1hdDtcbiAgICAgICAgY29uc3QgbGl0ZXJhbHM6IE1hcDxudW1iZXIsIHN0cmluZz4gPSB0aGlzLmdldE1hc2tMaXRlcmFscyhtYXNrKTtcbiAgICAgICAgY29uc3QgbGl0ZXJhbEtleXM6IG51bWJlcltdID0gQXJyYXkuZnJvbShsaXRlcmFscy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBub25MaXRlcmFsSW5kZWNlczogbnVtYmVyW10gPSB0aGlzLmdldE5vbkxpdGVyYWxJbmRlY2VzKG1hc2ssIGxpdGVyYWxLZXlzKTtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmQgPSBjdXJzb3IgKyBzZWxlY3Rpb247XG5cbiAgICAgICAgdGhpcy5fY3Vyc29yID0gY3Vyc29yO1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBib2FyZFN5bSBvZiBjbGlwYm9hcmREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gY2xpcGJvYXJkU3ltO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yID4gbWFzay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vbkxpdGVyYWxJbmRlY2VzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NoYXJWYWxpZCA9IHRoaXMudmFsaWRhdGVDaGFyT25Qb3N0aW9uKGNoYXIsIHRoaXMuX2N1cnNvciwgbWFzayk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hhclZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLnJlcGxhY2VDaGFyQXQoaW5wdXRWYWx1ZSwgdGhpcy5fY3Vyc29yKyssIGNoYXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGN1cnNvcjsgaSA8IG1hc2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpdGVyYWxLZXlzLmluZGV4T2YodGhpcy5fY3Vyc29yKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDaGFyVmFsaWQgPSB0aGlzLnZhbGlkYXRlQ2hhck9uUG9zdGlvbihjaGFyLCB0aGl