ngx-otp-pin-input
Version:
An Angular library for OTP input fields, providing a customizable and user-friendly way to handle one-time passwords.
171 lines • 22.7 kB
JavaScript
import { Component, EventEmitter, forwardRef, Input, Output, QueryList, ViewChildren } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DEFAULT_CONFIG } from '../../../default.config';
import * as i0 from "@angular/core";
export class OtpInputComponent {
constructor() {
this.config = {
length: 4,
className: 'input',
style: {
width: 40,
height: 40,
fontSize: 26,
spacing: 12,
borderWidth: 2,
borderRadius: 4,
borderColor: '#BDBDBD',
borderFocusColor: '#3700B3'
}
};
this.disabled = false;
this.onOtpChange = new EventEmitter();
this.defaultConfig = DEFAULT_CONFIG;
this.controls = Array.from({ length: this.config.length || this.defaultConfig.length }, () => '');
this.currentIndex = 0;
this.otpInputs = new QueryList();
this.onChange = () => { };
this.onTouched = () => { };
this.value = '';
}
ngOnChanges(changes) {
if (changes['config']) {
this.controls = Array.from({ length: this.config.length || this.defaultConfig.length }, () => '');
this.config = { ...this.defaultConfig, ...this.config };
}
}
writeValue(value) {
this.value = value?.toString() || '';
this.otpInputs.forEach((input, index) => {
input.nativeElement.value = this.value[index] || '';
});
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
onInput(event) {
if (this.disabled)
return;
const target = event.target;
const val = target.value;
if (isNaN(Number(val))) {
target.value = '';
return;
}
if (val !== '') {
const next = target.nextElementSibling;
if (next) {
next.focus();
}
this.emitOtpChange();
}
}
onKeyup(event) {
if (this.disabled)
return;
const target = event.target;
const key = event.key.toLowerCase();
if (key === 'backspace' || key === 'delete') {
target.value = '';
const prev = target.previousElementSibling;
if (prev) {
prev.focus();
}
this.emitOtpChange();
return;
}
else if (key === 'arrowleft') {
const prev = target.previousElementSibling;
if (prev) {
prev.focus();
}
return;
}
else if (key === 'arrowright') {
const next = target.nextElementSibling;
if (next) {
next.focus();
}
return;
}
}
onPaste(event) {
if (this.disabled)
return;
const clipboardData = event.clipboardData;
if (!clipboardData)
return;
const pastedData = clipboardData.getData('text');
if (!/^\d+$/.test(pastedData)) {
event.preventDefault();
return;
}
this.otpInputs.forEach((input, index) => {
if (index < pastedData.length) {
input.nativeElement.value = pastedData[index];
}
else {
input.nativeElement.value = '';
}
input.nativeElement.dispatchEvent(new Event('input'));
});
this.emitOtpChange();
}
inputStyle(index) {
return {
'width': `${this.config?.style?.width ?? this.defaultConfig.style.width}px`,
'height': `${this.config?.style?.height ?? this.defaultConfig.style.height}px`,
'font-size': `${this.config?.style?.fontSize ?? this.defaultConfig.style.fontSize}px`,
'border-width': `${this.config?.style?.borderWidth ?? this.defaultConfig.style.borderWidth}px`,
'border-radius': `${this.config?.style?.borderRadius ?? this.defaultConfig.style.borderRadius}px`,
'border-color': !this.disabled && this.currentIndex == index
? (this.config?.style?.borderFocusColor ?? this.defaultConfig.style.borderFocusColor)
: (this.config?.style?.borderColor ?? this.defaultConfig.style.borderColor),
};
}
emitOtpChange() {
if (this.disabled)
return;
let otp = '';
this.otpInputs.forEach((input, index) => {
otp += input.nativeElement.value;
});
this.value = otp;
this.onOtpChange.emit(otp);
this.onChange(otp);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OtpInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OtpInputComponent, selector: "ngx-otp-input", inputs: { config: "config", disabled: "disabled" }, outputs: { onOtpChange: "onOtpChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => OtpInputComponent),
multi: true
}
], viewQueries: [{ propertyName: "otpInputs", predicate: ["otpInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"inputs\" [style.gap.px]=\"config.style?.spacing || defaultConfig.style.spacing\">\r\n @for (input of controls;let i = $index; track i) {\r\n <input (input)=\"onInput($event)\" (keyup)=\"onKeyup($event)\" (paste)=\"onPaste($event)\" (focus)=\"currentIndex = i\"\r\n type=\"text\" inputmode=\"numeric\" maxlength=\"1\" class=\"input {{config.className}}\" [style]=\"inputStyle(i)\"\r\n [disabled]=\"disabled\" #otpInput />\r\n }\r\n</div>", styles: [".inputs{display:inline-flex}.input{border:none;border-style:solid;text-align:center;outline:none}\n"] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OtpInputComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-otp-input', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => OtpInputComponent),
multi: true
}
], template: "<div class=\"inputs\" [style.gap.px]=\"config.style?.spacing || defaultConfig.style.spacing\">\r\n @for (input of controls;let i = $index; track i) {\r\n <input (input)=\"onInput($event)\" (keyup)=\"onKeyup($event)\" (paste)=\"onPaste($event)\" (focus)=\"currentIndex = i\"\r\n type=\"text\" inputmode=\"numeric\" maxlength=\"1\" class=\"input {{config.className}}\" [style]=\"inputStyle(i)\"\r\n [disabled]=\"disabled\" #otpInput />\r\n }\r\n</div>", styles: [".inputs{display:inline-flex}.input{border:none;border-style:solid;text-align:center;outline:none}\n"] }]
}], propDecorators: { config: [{
type: Input
}], disabled: [{
type: Input
}], onOtpChange: [{
type: Output
}], otpInputs: [{
type: ViewChildren,
args: ['otpInput']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL290cC1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvb3RwLWlucHV0L290cC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vdHAtaW5wdXQvc3JjL2xpYi9jb21wb25lbnRzL290cC1pbnB1dC9vdHAtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFjekQsTUFBTSxPQUFPLGlCQUFpQjtJQVo5QjtRQWNXLFdBQU0sR0FBbUI7WUFDaEMsTUFBTSxFQUFFLENBQUM7WUFDVCxTQUFTLEVBQUUsT0FBTztZQUNsQixLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLGdCQUFnQixFQUFFLFNBQVM7YUFDNUI7U0FDRixDQUFDO1FBQ08sYUFBUSxHQUFZLEtBQUssQ0FBQztRQUN6QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFbkQsa0JBQWEsR0FBRyxjQUFjLENBQUM7UUFFL0IsYUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUs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QU9tQixTQUFTO3NCQUFsQyxZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPdHBJbnB1dENvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRyB9IGZyb20gJy4uLy4uLy4uL2RlZmF1bHQuY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW90cC1pbnB1dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL290cC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL290cC1pbnB1dC5jb21wb25lbnQuY3NzJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE90cElucHV0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPdHBJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBPdHBJbnB1dENvbmZpZyA9IHtcclxuICAgIGxlbmd0aDogNCxcclxuICAgIGNsYXNzTmFtZTogJ2lucHV0JyxcclxuICAgIHN0eWxlOiB7XHJcbiAgICAgIHdpZHRoOiA0MCxcclxuICAgICAgaGVpZ2h0OiA0MCxcclxuICAgICAgZm9udFNpemU6IDI2LFxyXG4gICAgICBzcGFjaW5nOiAxMixcclxuICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICAgIGJvcmRlclJhZGl1czogNCxcclxuICAgICAgYm9yZGVyQ29sb3I6ICcjQkRCREJEJyxcclxuICAgICAgYm9yZGVyRm9jdXNDb2xvcjogJyMzNzAwQjMnXHJcbiAgICB9XHJcbiAgfTtcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBvbk90cENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBkZWZhdWx0Q29uZmlnID0gREVGQVVMVF9DT05GSUc7XHJcblxyXG4gIGNvbnRyb2xzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5jb25maWcubGVuZ3RoIHx8IHRoaXMuZGVmYXVsdENvbmZpZy5sZW5ndGggfSwgKCkgPT4gJycpO1xyXG4gIGN1cnJlbnRJbmRleCA9IDA7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ290cElucHV0Jykgb3RwSW5wdXRzOiBRdWVyeUxpc3Q8YW55PiA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlOiAoXzogYW55KSA9PiB2b2lkID0gKCkgPT4geyB9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xyXG4gIHByaXZhdGUgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcclxuICAgICAgdGhpcy5jb250cm9scyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuY29uZmlnLmxlbmd0aCB8fCB0aGlzLmRlZmF1bHRDb25maWcubGVuZ3RoIH0sICgpID0+ICcnKTtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuZGVmYXVsdENvbmZpZywgLi4udGhpcy5jb25maWcgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlPy50b1N0cmluZygpIHx8ICcnO1xyXG4gICAgdGhpcy5vdHBJbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLnZhbHVlW2luZGV4XSB8fCAnJztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCB2YWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgaWYgKGlzTmFOKE51bWJlcih2YWwpKSkge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWwgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGlmIChuZXh0KSB7XHJcbiAgICAgICAgbmV4dC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdE90cENoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25LZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKGtleSA9PT0gJ2JhY2tzcGFjZScgfHwga2V5ID09PSAnZGVsZXRlJykge1xyXG4gICAgICB0YXJnZXQudmFsdWUgPSAnJztcclxuICAgICAgY29uc3QgcHJldiA9IHRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGlmIChwcmV2KSB7XHJcbiAgICAgICAgcHJldi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdE90cENoYW5nZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChrZXkgPT09ICdhcnJvd2xlZnQnKSB7XHJcbiAgICAgIGNvbnN0IHByZXYgPSB0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpZiAocHJldikge1xyXG4gICAgICAgIHByZXYuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChrZXkgPT09ICdhcnJvd3JpZ2h0Jykge1xyXG4gICAgICBjb25zdCBuZXh0ID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgIG5leHQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhO1xyXG4gICAgaWYgKCFjbGlwYm9hcmREYXRhKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcGFzdGVkRGF0YSA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KHBhc3RlZERhdGEpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm90cElucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4IDwgcGFzdGVkRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gcGFzdGVkRGF0YVtpbmRleF07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIGlucHV0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JykpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmVtaXRPdHBDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGlucHV0U3R5bGUoaW5kZXg6IG51bWJlcik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ3dpZHRoJzogYCR7dGhpcy5jb25maWc/LnN0eWxlPy53aWR0aCA/PyB0aGlzLmRlZmF1bHRDb25maWcuc3R5bGUud2lkdGh9cHhgLFxyXG4gICAgICAnaGVpZ2h0JzogYCR7dGhpcy5jb25maWc/LnN0eWxlPy5oZWlnaHQgPz8gdGhpcy5kZWZhdWx0Q29uZmlnLnN0eWxlLmhlaWdodH1weGAsXHJcbiAgICAgICdmb250LXNpemUnOiBgJHt0aGlzLmNvbmZpZz8uc3R5bGU/LmZvbnRTaXplID8/IHRoaXMuZGVmYXVsdENvbmZpZy5zdHlsZS5mb250U2l6ZX1weGAsXHJcbiAgICAgICdib3JkZXItd2lkdGgnOiBgJHt0aGlzLmNvbmZpZz8uc3R5bGU/LmJvcmRlcldpZHRoID8/IHRoaXMuZGVmYXVsdENvbmZpZy5zdHlsZS5ib3JkZXJXaWR0aH1weGAsXHJcbiAgICAgICdib3JkZXItcmFkaXVzJzogYCR7dGhpcy5jb25maWc/LnN0eWxlPy5ib3JkZXJSYWRpdXMgPz8gdGhpcy5kZWZhdWx0Q29uZmlnLnN0eWxlLmJvcmRlclJhZGl1c31weGAsXHJcbiAgICAgICdib3JkZXItY29sb3InOiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmN1cnJlbnRJbmRleCA9PSBpbmRleFxyXG4gICAgICAgID8gKHRoaXMuY29uZmlnPy5zdHlsZT8uYm9yZGVyRm9jdXNDb2xvciA/PyB0aGlzLmRlZmF1bHRDb25maWcuc3R5bGUuYm9yZGVyRm9jdXNDb2xvcilcclxuICAgICAgICA6ICh0aGlzLmNvbmZpZz8uc3R5bGU/LmJvcmRlckNvbG9yID8/IHRoaXMuZGVmYXVsdENvbmZpZy5zdHlsZS5ib3JkZXJDb2xvciksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZW1pdE90cENoYW5nZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBsZXQgb3RwID0gJyc7XHJcbiAgICB0aGlzLm90cElucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcclxuICAgICAgb3RwICs9IGlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFsdWUgPSBvdHA7XHJcbiAgICB0aGlzLm9uT3RwQ2hhbmdlLmVtaXQob3RwKTtcclxuICAgIHRoaXMub25DaGFuZ2Uob3RwKTtcclxuICB9XHJcblxyXG59IiwiPGRpdiBjbGFzcz1cImlucHV0c1wiIFtzdHlsZS5nYXAucHhdPVwiY29uZmlnLnN0eWxlPy5zcGFjaW5nIHx8IGRlZmF1bHRDb25maWcuc3R5bGUuc3BhY2luZ1wiPlxyXG4gICAgQGZvciAoaW5wdXQgb2YgY29udHJvbHM7bGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcclxuICAgIDxpbnB1dCAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCIgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50KVwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoZm9jdXMpPVwiY3VycmVudEluZGV4ID0gaVwiXHJcbiAgICAgICAgdHlwZT1cInRleHRcIiBpbnB1dG1vZGU9XCJudW1lcmljXCIgbWF4bGVuZ3RoPVwiMVwiIGNsYXNzPVwiaW5wdXQge3tjb25maWcuY2xhc3NOYW1lfX1cIiBbc3R5bGVdPVwiaW5wdXRTdHlsZShpKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI290cElucHV0IC8+XHJcbiAgICB9XHJcbjwvZGl2PiJdfQ==