primeng
Version:
[](https://badge.fury.io/js/primeng) [](https://www.npmjs.com/package/primeng) [ => KeyFilter),
multi: true
};
const DEFAULT_MASKS = {
pint: /^[\d]*$/,
int: /^[-]?[\d]*$/,
pnum: /^[\d\.]*$/,
money: /^[\d\.\s,]*$/,
num: /^[-]?[\d\.]*$/,
hex: /^[0-9a-f]*$/i,
email: /^[a-z0-9_\.\-@]*$/i,
alpha: /^[a-z_]*$/i,
alphanum: /^[a-z0-9_]*$/i
};
const KEYS = {
TAB: 9,
RETURN: 13,
ESC: 27,
BACKSPACE: 8,
DELETE: 46
};
const SAFARI_KEYS = {
63234: 37, // left
63235: 39, // right
63232: 38, // up
63233: 40, // down
63276: 33, // page up
63277: 34, // page down
63272: 46, // delete
63273: 36, // home
63275: 35 // end
};
/**
* KeyFilter Directive is a built-in feature of InputText to restrict user input based on a regular expression.
* @group Components
*/
export class KeyFilter {
document;
platformId;
el;
/**
* When enabled, instead of blocking keys, input is validated internally to test against the regular expression.
* @group Props
*/
pValidateOnly;
/**
* Sets the pattern for key filtering.
* @group Props
*/
set pattern(_pattern) {
this._pattern = _pattern;
if (_pattern instanceof RegExp) {
this.regex = _pattern;
}
else if (_pattern in DEFAULT_MASKS) {
this.regex = DEFAULT_MASKS[_pattern];
}
else {
this.regex = /./;
}
}
get pattern() {
return this._pattern;
}
/**
* Emits a value whenever the ngModel of the component changes.
* @param {(string | number)} modelValue - Custom model change event.
* @group Emits
*/
ngModelChange = new EventEmitter();
regex = /./;
_pattern;
isAndroid;
lastValue;
constructor(document, platformId, el) {
this.document = document;
this.platformId = platformId;
this.el = el;
if (isPlatformBrowser(this.platformId)) {
this.isAndroid = DomHandler.isAndroid();
}
else {
this.isAndroid = false;
}
}
isNavKeyPress(e) {
let k = e.keyCode;
k = DomHandler.getBrowser().safari ? SAFARI_KEYS[k] || k : k;
return (k >= 33 && k <= 40) || k == KEYS.RETURN || k == KEYS.TAB || k == KEYS.ESC;
}
isSpecialKey(e) {
let k = e.keyCode || e.charCode;
return k == 9 || k == 13 || k == 27 || k == 16 || k == 17 || (k >= 18 && k <= 20) || (DomHandler.getBrowser().opera && !e.shiftKey && (k == 8 || (k >= 33 && k <= 35) || (k >= 36 && k <= 39) || (k >= 44 && k <= 45)));
}
getKey(e) {
let k = e.keyCode || e.charCode;
return DomHandler.getBrowser().safari ? SAFARI_KEYS[k] || k : k;
}
getCharCode(e) {
return e.charCode || e.keyCode || e.which;
}
findDelta(value, prevValue) {
let delta = '';
for (let i = 0; i < value.length; i++) {
let str = value.substr(0, i) + value.substr(i + value.length - prevValue.length);
if (str === prevValue)
delta = value.substr(i, value.length - prevValue.length);
}
return delta;
}
isValidChar(c) {
return this.regex.test(c);
}
isValidString(str) {
for (let i = 0; i < str.length; i++) {
if (!this.isValidChar(str.substr(i, 1))) {
return false;
}
}
return true;
}
onInput(e) {
if (this.isAndroid && !this.pValidateOnly) {
let val = this.el.nativeElement.value;
let lastVal = this.lastValue || '';
let inserted = this.findDelta(val, lastVal);
let removed = this.findDelta(lastVal, val);
let pasted = inserted.length > 1 || (!inserted && !removed);
if (pasted) {
if (!this.isValidString(val)) {
this.el.nativeElement.value = lastVal;
this.ngModelChange.emit(lastVal);
}
}
else if (!removed) {
if (!this.isValidChar(inserted)) {
this.el.nativeElement.value = lastVal;
this.ngModelChange.emit(lastVal);
}
}
val = this.el.nativeElement.value;
if (this.isValidString(val)) {
this.lastValue = val;
}
}
}
onKeyPress(e) {
if (this.isAndroid || this.pValidateOnly) {
return;
}
let browser = DomHandler.getBrowser();
let k = this.getKey(e);
if (browser.mozilla && (e.ctrlKey || e.altKey)) {
return;
}
else if (k == 17 || k == 18) {
return;
}
// Enter key
if (k == 13) {
return;
}
let c = this.getCharCode(e);
let cc = String.fromCharCode(c);
let ok = true;
if (!browser.mozilla && (this.isSpecialKey(e) || !cc)) {
return;
}
let valueCheck = this.el.nativeElement.value || '';
let val = valueCheck + cc;
ok = this.regex.test(val);
if (!ok) {
e.preventDefault();
}
}
onPaste(e) {
const clipboardData = e.clipboardData || this.document.defaultView.clipboardData.getData('text');
if (clipboardData) {
let pattern = /\{[0-9]+\}/;
const pastedText = clipboardData.getData('text');
if (pattern.test(this.regex.toString())) {
if (!this.regex.test(pastedText)) {
e.preventDefault();
return;
}
}
else {
for (let char of pastedText.toString()) {
if (!this.regex.test(char)) {
e.preventDefault();
return;
}
}
}
}
}
validate(c) {
if (this.pValidateOnly) {
let value = this.el.nativeElement.value;
if (value && !this.regex.test(value)) {
return {
validatePattern: false
};
}
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: KeyFilter, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.0.1", type: KeyFilter, selector: "[pKeyFilter]", inputs: { pValidateOnly: ["pValidateOnly", "pValidateOnly", booleanAttribute], pattern: ["pKeyFilter", "pattern"] }, outputs: { ngModelChange: "ngModelChange" }, host: { listeners: { "input": "onInput($event)", "keypress": "onKeyPress($event)", "paste": "onPaste($event)" }, classAttribute: "p-element" }, providers: [KEYFILTER_VALIDATOR], ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: KeyFilter, decorators: [{
type: Directive,
args: [{
selector: '[pKeyFilter]',
providers: [KEYFILTER_VALIDATOR],
host: {
class: 'p-element'
}
}]
}], ctorParameters: () => [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i0.ElementRef }], propDecorators: { pValidateOnly: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], pattern: [{
type: Input,
args: ['pKeyFilter']
}], ngModelChange: [{
type: Output
}], onInput: [{
type: HostListener,
args: ['input', ['$event']]
}], onKeyPress: [{
type: HostListener,
args: ['keypress', ['$event']]
}], onPaste: [{
type: HostListener,
args: ['paste', ['$event']]
}] } });
export class KeyFilterModule {
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: KeyFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.1", ngImport: i0, type: KeyFilterModule, declarations: [KeyFilter], imports: [CommonModule], exports: [KeyFilter] });
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: KeyFilterModule, imports: [CommonModule] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: KeyFilterModule, decorators: [{
type: NgModule,
args: [{
imports: [CommonModule],
exports: [KeyFilter],
declarations: [KeyFilter]
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5ZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2tleWZpbHRlci9rZXlmaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBWSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEssT0FBTyxFQUFtQixhQUFhLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUd6QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBYTtJQUN6QyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUN4QyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFzQkYsTUFBTSxhQUFhLEdBQXFDO0lBQ3BELElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLGFBQWE7SUFDbEIsSUFBSSxFQUFFLFdBQVc7SUFDakIsS0FBSyxFQUFFLGNBQWM7SUFDckIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsS0FBSyxFQUFFLG9CQUFvQjtJQUMzQixLQUFLLEVBQUUsWUFBWTtJQUNuQixRQUFRLEVBQUUsZUFBZTtDQUM1QixDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQVM7SUFDZixHQUFHLEVBQUUsQ0FBQztJQUNOLE1BQU0sRUFBRSxFQUFFO0lBQ1YsR0FBRyxFQUFFLEVBQUU7SUFDUCxTQUFTLEVBQUUsQ0FBQztJQUNaLE1BQU0sRUFBRSxFQUFF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QUNyQjtpQkFDSjs7MEJBMkNRLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsTUFBTTsyQkFBQyxXQUFXO2tFQXRDaUIsYUFBYTtzQkFBcEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFNYixPQUFPO3NCQUEvQixLQUFLO3VCQUFDLFlBQVk7Z0JBb0JULGFBQWE7c0JBQXRCLE1BQU07Z0JBdUVQLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBOEJqQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdDcEMsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7QUF1Q3JDLE1BQU0sT0FBTyxlQUFlO3VHQUFmLGVBQWU7d0dBQWYsZUFBZSxpQkFoTmYsU0FBUyxhQTRNUixZQUFZLGFBNU1iLFNBQVM7d0dBZ05ULGVBQWUsWUFKZCxZQUFZOzsyRkFJYixlQUFlO2tCQUwzQixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO29CQUNwQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7aUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgTmdNb2R1bGUsIE91dHB1dCwgUExBVEZPUk1fSUQsIFByb3ZpZGVyLCBib29sZWFuQXR0cmlidXRlLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5HX1ZBTElEQVRPUlMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICdwcmltZW5nL2RvbSc7XG5pbXBvcnQgeyBLZXlGaWx0ZXJQYXR0ZXJuIH0gZnJvbSAnLi9rZXlmaWx0ZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IEtFWUZJTFRFUl9WQUxJREFUT1I6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gS2V5RmlsdGVyKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxudHlwZSBTYWZhcmlLZXlzID0ge1xuICAgIDYzMjM0OiBudW1iZXI7XG4gICAgNjMyMzU6IG51bWJlcjtcbiAgICA2MzIzMjogbnVtYmVyO1xuICAgIDYzMjMzOiBudW1iZXI7XG4gICAgNjMyNzY6IG51bWJlcjtcbiAgICA2MzI3NzogbnVtYmVyO1xuICAgIDYzMjcyOiBudW1iZXI7XG4gICAgNjMyNzM6IG51bWJlcjtcbiAgICA2MzI3NTogbnVtYmVyO1xufTtcblxudHlwZSBLZXlzID0ge1xuICAgIFRBQjogbnVtYmVyO1xuICAgIFJFVFVSTjogbnVtYmVyO1xuICAgIEVTQzogbnVtYmVyO1xuICAgIEJBQ0tTUEFDRTogbnVtYmVyO1xuICAgIERFTEVURTogbnVtYmVyO1xufTtcblxuY29uc3QgREVGQVVMVF9NQVNLUzogUmVjb3JkPEtleUZpbHRlclBhdHRlcm4sIFJlZ0V4cD4gPSB7XG4gICAgcGludDogL15bXFxkXSokLyxcbiAgICBpbnQ6IC9eWy1dP1tcXGRdKiQvLFxuICAgIHBudW06IC9eW1xcZFxcLl0qJC8sXG4gICAgbW9uZXk6IC9eW1xcZFxcLlxccyxdKiQvLFxuICAgIG51bTogL15bLV0/W1xcZFxcLl0qJC8sXG4gICAgaGV4OiAvXlswLTlhLWZdKiQvaSxcbiAgICBlbWFpbDogL15bYS16MC05X1xcLlxcLUBdKiQvaSxcbiAgICBhbHBoYTogL15bYS16X10qJC9pLFxuICAgIGFscGhhbnVtOiAvXlthLXowLTlfXSokL2lcbn07XG5cbmNvbnN0IEtFWVM6IEtleXMgPSB7XG4gICAgVEFCOiA5LFxuICAgIFJFVFVSTjogMTMsXG4gICAgRVNDOiAyNyxcbiAgICBCQUNLU1BBQ0U6IDgsXG4gICAgREVMRVRFOiA0NlxufTtcblxuY29uc3QgU0FGQVJJX0tFWVM6IFNhZmFyaUtleXMgPSB7XG4gICAgNjMyMzQ6IDM3LCAvLyBsZWZ0XG4gICAgNjMyMzU6IDM5LCAvLyByaWdodFxuICAgIDYzMjMyOiAzOCwgLy8gdXBcbiAgICA2MzIzMzogNDAsIC8vIGRvd25cbiAgICA2MzI3NjogMzMsIC8vIHBhZ2UgdXBcbiAgICA2MzI3NzogMzQsIC8vIHBhZ2UgZG93blxuICAgIDYzMjcyOiA0NiwgLy8gZGVsZXRlXG4gICAgNjMyNzM6IDM2LCAvLyBob21lXG4gICAgNjMyNzU6IDM1IC8vIGVuZFxufTtcbi8qKlxuICogS2V5RmlsdGVyIERpcmVjdGl2ZSBpcyBhIGJ1aWx0LWluIGZlYXR1cmUgb2YgSW5wdXRUZXh0IHRvIHJlc3RyaWN0IHVzZXIgaW5wdXQgYmFzZWQgb24gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAZ3JvdXAgQ29tcG9uZW50c1xuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twS2V5RmlsdGVyXScsXG4gICAgcHJvdmlkZXJzOiBbS0VZRklMVEVSX1ZBTElEQVRPUl0sXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3AtZWxlbWVudCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEtleUZpbHRlciBpbXBsZW1lbnRzIFZhbGlkYXRvciB7XG4gICAgLyoqXG4gICAgICogV2hlbiBlbmFibGVkLCBpbnN0ZWFkIG9mIGJsb2NraW5nIGtleXMsIGlucHV0IGlzIHZhbGlkYXRlZCBpbnRlcm5hbGx5IHRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAqIEBncm91cCBQcm9wc1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwVmFsaWRhdGVPbmx5OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBhdHRlcm4gZm9yIGtleSBmaWx0ZXJpbmcuXG4gICAgICogQGdyb3VwIFByb3BzXG4gICAgICovXG5cbiAgICBASW5wdXQoJ3BLZXlGaWx0ZXInKSBzZXQgcGF0dGVybihfcGF0dGVybjogUmVnRXhwIHwgS2V5RmlsdGVyUGF0dGVybiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IF9wYXR0ZXJuO1xuXG4gICAgICAgIGlmIChfcGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgdGhpcy5yZWdleCA9IF9wYXR0ZXJuO1xuICAgICAgICB9IGVsc2UgaWYgKF9wYXR0ZXJuIGluIERFRkFVTFRfTUFTS1MpIHtcbiAgICAgICAgICAgIHRoaXMucmVnZXggPSBERUZBVUxUX01BU0tTW19wYXR0ZXJuXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVnZXggPSAvLi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHBhdHRlcm4oKTogUmVnRXhwIHwgS2V5RmlsdGVyUGF0dGVybiB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0dGVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIHZhbHVlIHdoZW5ldmVyIHRoZSBuZ01vZGVsIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0geyhzdHJpbmcgfCBudW1iZXIpfSBtb2RlbFZhbHVlIC0gQ3VzdG9tIG1vZGVsIGNoYW5nZSBldmVudC5cbiAgICAgKiBAZ3JvdXAgRW1pdHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgbmdNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bWJlcj4oKTtcblxuICAgIHJlZ2V4OiBSZWdFeHAgPSAvLi87XG5cbiAgICBfcGF0dGVybjogUmVnRXhwIHwgS2V5RmlsdGVyUGF0dGVybiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICBpc0FuZHJvaWQ6IGJvb2xlYW47XG5cbiAgICBsYXN0VmFsdWU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBhbnksXG4gICAgICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZlxuICAgICkge1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgdGhpcy5pc0FuZHJvaWQgPSBEb21IYW5kbGVyLmlzQW5kcm9pZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0FuZHJvaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTmF2S2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBsZXQgayA9IGUua2V5Q29kZTtcbiAgICAgICAgayA9IERvbUhhbmRsZXIuZ2V0QnJvd3NlcigpLnNhZmFyaSA/IChTQUZBUklfS0VZUyBhcyBhbnkpW2tdIHx8IGsgOiBrO1xuXG4gICAgICAgIHJldHVybiAoayA+PSAzMyAmJiBrIDw9IDQwKSB8fCBrID09IEtFWVMuUkVUVVJOIHx8IGsgPT0gS0VZUy5UQUIgfHwgayA9PSBLRVlTLkVTQztcbiAgICB9XG5cbiAgICBpc1NwZWNpYWxLZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBsZXQgayA9IGUua2V5Q29kZSB8fCBlLmNoYXJDb2RlO1xuXG4gICAgICAgIHJldHVybiBrID09IDkgfHwgayA9PSAxMyB8fCBrID09IDI3IHx8IGsgPT0gMTYgfHwgayA9PSAxNyB8fCAoayA+PSAxOCAmJiBrIDw9IDIwKSB8fCAoRG9tSGFuZGxlci5nZXRCcm93c2VyKCkub3BlcmEgJiYgIWUuc2hpZnRLZXkgJiYgKGsgPT0gOCB8fCAoayA+PSAzMyAmJiBrIDw9IDM1KSB8fCAoayA+PSAzNiAmJiBrIDw9IDM5KSB8fCAoayA+PSA0NCAmJiBrIDw9IDQ1KSkpO1xuICAgIH1cblxuICAgIGdldEtleShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGxldCBrID0gZS5rZXlDb2RlIHx8IGUuY2hhckNvZGU7XG4gICAgICAgIHJldHVybiBEb21IYW5kbGVyLmdldEJyb3dzZXIoKS5zYWZhcmkgPyAoU0FGQVJJX0tFWVMgYXMgYW55KVtrXSB8fCBrIDogaztcbiAgICB9XG5cbiAgICBnZXRDaGFyQ29kZShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHJldHVybiBlLmNoYXJDb2RlIHx8IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuICAgIH1cblxuICAgIGZpbmREZWx0YSh2YWx1ZTogc3RyaW5nLCBwcmV2VmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgZGVsdGEgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gdmFsdWUuc3Vic3RyKDAsIGkpICsgdmFsdWUuc3Vic3RyKGkgKyB2YWx1ZS5sZW5ndGggLSBwcmV2VmFsdWUubGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKHN0ciA9PT0gcHJldlZhbHVlKSBkZWx0YSA9IHZhbHVlLnN1YnN0cihpLCB2YWx1ZS5sZW5ndGggLSBwcmV2VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWx0YTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkQ2hhcihjOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICg8UmVnRXhwPnRoaXMucmVnZXgpLnRlc3QoYyk7XG4gICAgfVxuXG4gICAgaXNWYWxpZFN0cmluZyhzdHI6IHN0cmluZykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDaGFyKHN0ci5zdWJzdHIoaSwgMSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICAgIG9uSW5wdXQoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0FuZHJvaWQgJiYgIXRoaXMucFZhbGlkYXRlT25seSkge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgIGxldCBsYXN0VmFsID0gdGhpcy5sYXN0VmFsdWUgfHwgJyc7XG5cbiAgICAgICAgICAgIGxldCBpbnNlcnRlZCA9IHRoaXMuZmluZERlbHRhKHZhbCwgbGFzdFZhbCk7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IHRoaXMuZmluZERlbHRhKGxhc3RWYWwsIHZhbCk7XG4gICAgICAgICAgICBsZXQgcGFzdGVkID0gaW5zZXJ0ZWQubGVuZ3RoID4gMSB8fCAoIWluc2VydGVkICYmICFyZW1vdmVkKTtcblxuICAgICAgICAgICAgaWYgKHBhc3RlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbGFzdFZhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQobGFzdFZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkQ2hhcihpbnNlcnRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbGFzdFZhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQobGFzdFZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleXByZXNzJywgWyckZXZlbnQnXSlcbiAgICBvbktleVByZXNzKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbmRyb2lkIHx8IHRoaXMucFZhbGlkYXRlT25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJyb3dzZXIgPSBEb21IYW5kbGVyLmdldEJyb3dzZXIoKTtcbiAgICAgICAgbGV0IGsgPSB0aGlzLmdldEtleShlKTtcblxuICAgICAgICBpZiAoYnJvd3Nlci5tb3ppbGxhICYmIChlLmN0cmxLZXkgfHwgZS5hbHRLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoayA9PSAxNyB8fCBrID09IDE4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnRlciBrZXlcbiAgICAgICAgaWYgKGsgPT0gMTMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjID0gdGhpcy5nZXRDaGFyQ29kZShlKTtcbiAgICAgICAgbGV0IGNjID0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgbGV0IG9rID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWJyb3dzZXIubW96aWxsYSAmJiAodGhpcy5pc1NwZWNpYWxLZXkoZSkgfHwgIWNjKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlQ2hlY2sgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgfHwgJyc7XG5cbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlQ2hlY2sgKyBjYztcblxuICAgICAgICBvayA9ICg8UmVnRXhwPnRoaXMucmVnZXgpLnRlc3QodmFsKTtcblxuICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXG4gICAgb25QYXN0ZShlOiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8ICg8YW55PnRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcpLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSAvXFx7WzAtOV0rXFx9LztcbiAgICAgICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnRlc3QodGhpcy5yZWdleC50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWdleC50ZXN0KHBhc3RlZFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhciBvZiBwYXN0ZWRUZXh0LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlZ2V4LnRlc3QoY2hhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKGM6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBhbnkge1xuICAgICAgICBpZiAodGhpcy5wVmFsaWRhdGVPbmx5KSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMucmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm46IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICBleHBvcnRzOiBbS2V5RmlsdGVyXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtLZXlGaWx0ZXJdXG59KVxuZXhwb3J0IGNsYXNzIEtleUZpbHRlck1vZHVsZSB7fVxuIl19