@experteam-mx/ngx-input-number
Version:
Angular input number for Experteam apps
181 lines • 24.3 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import { IMaskDirective } from 'angular-imask';
import * as i0 from "@angular/core";
import * as i1 from "./ngx-input-number.service";
import * as i2 from "@angular/forms";
import * as i3 from "angular-imask";
export class NgxInputNumberComponent {
_ChangeDetectorRef;
_NgxInputNumberService;
inputElement;
iMaskDir;
control;
negative;
autofocus = false;
decimals;
max;
idForLabel = '';
tabIndex;
addClass = 'form-control-sm';
groupSeparator;
radixPoint;
lblKeyInvalid;
lblKeyInvalidRender;
imask;
placeholder = '0';
resetControl = false;
prevValue = '';
validateError = false;
constructor(_ChangeDetectorRef, _NgxInputNumberService) {
this._ChangeDetectorRef = _ChangeDetectorRef;
this._NgxInputNumberService = _NgxInputNumberService;
}
ngAfterViewInit() {
this.iMaskDir.maskRef?.updateValue();
if (this.autofocus) {
setTimeout(() => {
this.inputElement.nativeElement.focus();
});
}
}
render() {
this.control.setValue(String(this.control.value).replace('.', this._NgxInputNumberService.radixPoint));
this._ChangeDetectorRef.detectChanges();
this.lblKeyInvalidRender = this._NgxInputNumberService.lblKeyInvalid;
this.imask = {
mask: Number,
scale: this._NgxInputNumberService.decimals,
thousandsSeparator: this._NgxInputNumberService.groupSeparator,
padFractionalZeros: true,
normalizeZeros: true,
radix: this._NgxInputNumberService.radixPoint,
max: this._NgxInputNumberService.max,
min: this._NgxInputNumberService.negative ? -999999999999999999999999999999999 : 0,
format: (x) => {
if (typeof x !== 'string' && x === null && !this.resetControl) {
this.resetControl = true;
this.inputElement.nativeElement.value = null;
this.iMaskDir.maskRef?.updateValue();
setTimeout(() => {
this.iMaskDir.maskRef?.updateControl();
this.control.setValue(null);
this.resetControl = false;
});
return null;
}
return Number(x).toFixed(this._NgxInputNumberService.decimals);
}
};
if (this.lblKeyInvalid !== undefined) {
this.lblKeyInvalidRender = this.lblKeyInvalid;
}
if (this.negative !== undefined) {
this.imask.min = this.negative ? -999999999999999999999999999999999 : 0;
}
if (this.max !== undefined) {
this.imask.max = this.max;
}
if (this.groupSeparator !== undefined) {
this.imask.thousandsSeparator = this.groupSeparator;
}
if (this.radixPoint !== undefined) {
this.imask.radix = this.radixPoint;
}
if (this.decimals !== undefined) {
this.imask.scale = this.decimals;
}
setTimeout(() => {
if (this.inputElement.nativeElement.value == '' && (this.control.value === null || this.control.value === '' || this.control.value === 0)) {
this.control.setValue('');
}
});
}
ngOnInit() {
this._NgxInputNumberService.getChangeEvent().subscribe((configs) => {
if (configs) {
this.render();
}
});
}
ngOnChanges() {
this.render();
}
onKeydown(e) {
this.prevValue = e.target.value;
}
onBlur() {
this.validateError = false;
}
onFocus() {
setTimeout(() => {
this.validateError = true;
}, 1000);
}
onKeyup(e) {
if (!this.validateError)
return;
let scapeKeys = [
'ArrowLeft',
'ArrowRight',
'ArrowUp',
'ArrowDown',
'Escape',
'Backspace',
'Delete',
'.',
',',
'-',
'Tab',
];
if (e.target.value == ''
&&
!scapeKeys.includes(e.key)) {
this.control.setValue('');
}
if (!scapeKeys.includes(e.key)
&&
this.prevValue === e.target.value
&&
e.key != this.prevValue) {
this.inputElement.nativeElement.classList.add('key-invalid');
setTimeout(() => {
this.inputElement.nativeElement.classList.remove('key-invalid');
}, 1000);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputNumberComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgxInputNumberService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgxInputNumberComponent, selector: "app-input-number", inputs: { control: "control", negative: "negative", autofocus: "autofocus", decimals: "decimals", max: "max", idForLabel: "idForLabel", tabIndex: "tabIndex", addClass: "addClass", groupSeparator: "groupSeparator", radixPoint: "radixPoint", lblKeyInvalid: "lblKeyInvalid" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "iMaskDir", first: true, predicate: IMaskDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"text-end form-control {{ addClass }}\"\r\n [class.is-invalid]=\"control.touched && control.invalid\"\r\n [formControl]=\"control\"\r\n [tabindex]=\"tabIndex\"\r\n [id]=\"idForLabel\"\r\n [imask]=\"imask\"\r\n [unmask]=\"'typed'\"\r\n (keyup)=\"onKeyup($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n >\r\n <label class=\"lbl-key-invalid position-absolute top-100 end-0 p-2 d-none\" [innerHTML]=\"lblKeyInvalidRender\"></label>\r\n</div>\r\n", styles: ["input.key-invalid{border-color:#dc3545!important;box-shadow:0 0 0 .25rem #dc354540!important}input.key-invalid+.lbl-key-invalid{background-color:#dc3545;color:#fff;display:block!important;z-index:1}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.IMaskDirective, selector: "[imask]", inputs: ["imask", "unmask", "imaskElement"], outputs: ["accept", "complete"], exportAs: ["imask"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputNumberComponent, decorators: [{
type: Component,
args: [{ selector: 'app-input-number', template: "<div class=\"position-relative\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"text-end form-control {{ addClass }}\"\r\n [class.is-invalid]=\"control.touched && control.invalid\"\r\n [formControl]=\"control\"\r\n [tabindex]=\"tabIndex\"\r\n [id]=\"idForLabel\"\r\n [imask]=\"imask\"\r\n [unmask]=\"'typed'\"\r\n (keyup)=\"onKeyup($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n >\r\n <label class=\"lbl-key-invalid position-absolute top-100 end-0 p-2 d-none\" [innerHTML]=\"lblKeyInvalidRender\"></label>\r\n</div>\r\n", styles: ["input.key-invalid{border-color:#dc3545!important;box-shadow:0 0 0 .25rem #dc354540!important}input.key-invalid+.lbl-key-invalid{background-color:#dc3545;color:#fff;display:block!important;z-index:1}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NgxInputNumberService }], propDecorators: { inputElement: [{
type: ViewChild,
args: ['inputElement']
}], iMaskDir: [{
type: ViewChild,
args: [IMaskDirective, { static: false }]
}], control: [{
type: Input
}], negative: [{
type: Input
}], autofocus: [{
type: Input
}], decimals: [{
type: Input
}], max: [{
type: Input
}], idForLabel: [{
type: Input
}], tabIndex: [{
type: Input
}], addClass: [{
type: Input
}], groupSeparator: [{
type: Input
}], radixPoint: [{
type: Input
}], lblKeyInvalid: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlucHV0LW51bWJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHBlcnRlYW0tbXgvbmd4LWlucHV0LW51bWJlci9zcmMvbGliL25neC1pbnB1dC1udW1iZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1pbnB1dC1udW1iZXIvc3JjL2xpYi9uZ3gtaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFBOzs7OztBQVE5QyxNQUFNLE9BQU8sdUJBQXVCO0lBdUJ4QjtJQUNBO0lBdEJpQixZQUFZLENBQWE7SUFDTixRQUFRLENBQStCO0lBQzVFLE9BQU8sQ0FBYztJQUNyQixRQUFRLENBQU07SUFDZCxTQUFTLEdBQVEsS0FBSyxDQUFBO0lBQ3RCLFFBQVEsQ0FBSztJQUNiLEdBQUcsQ0FBSztJQUNSLFVBQVUsR0FBUSxFQUFFLENBQUE7SUFDcEIsUUFBUSxDQUFLO0lBQ2IsUUFBUSxHQUFRLGlCQUFpQixDQUFBO0lBQ2pDLGNBQWMsQ0FBSztJQUNuQixVQUFVLENBQUs7SUFDZixhQUFhLENBQUs7SUFDM0IsbUJBQW1CLENBQUs7SUFDeEIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFBO0lBQ3BCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDbkIsYUFBYSxHQUFZLEtBQUssQ0FBQTtJQUU5QixZQUNVLGtCQUFxQyxFQUNyQyxzQkFBNkM7UUFEN0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVC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QyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ2pFLENBQUMsRUFDRCxJQUFJLENBQ0wsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO3dHQWhMVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixtZEFHdkIsY0FBYyxxRUN2QjNCLCtxQkFrQkE7OzRGREVhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxrQkFBa0I7MEhBTUQsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNxQixRQUFRO3NCQUFyRCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ25DLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xyXG5pbXBvcnQgeyBOZ3hJbnB1dE51bWJlclNlcnZpY2UgfSBmcm9tICcuL25neC1pbnB1dC1udW1iZXIuc2VydmljZSdcclxuaW1wb3J0IHsgSU1hc2tEaXJlY3RpdmUgfSBmcm9tICdhbmd1bGFyLWltYXNrJ1xyXG5pbXBvcnQgeyBNYXNrZWROdW1iZXIgfSBmcm9tICdpbWFzaydcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWlucHV0LW51bWJlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1pbnB1dC1udW1iZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC1pbnB1dC1udW1iZXIuY29tcG9uZW50LnNhc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4SW5wdXROdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RWxlbWVudCcpIGlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWZcclxuICBAVmlld0NoaWxkKElNYXNrRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgaU1hc2tEaXIhOiBJTWFza0RpcmVjdGl2ZTxNYXNrZWROdW1iZXI+XHJcbiAgQElucHV0KCkgY29udHJvbCE6IEZvcm1Db250cm9sXHJcbiAgQElucHV0KCkgbmVnYXRpdmUhOiBhbnlcclxuICBASW5wdXQoKSBhdXRvZm9jdXM6IGFueSA9IGZhbHNlXHJcbiAgQElucHV0KCkgZGVjaW1hbHM6IGFueVxyXG4gIEBJbnB1dCgpIG1heDogYW55XHJcbiAgQElucHV0KCkgaWRGb3JMYWJlbDogYW55ID0gJydcclxuICBASW5wdXQoKSB0YWJJbmRleDogYW55XHJcbiAgQElucHV0KCkgYWRkQ2xhc3M6IGFueSA9ICdmb3JtLWNvbnRyb2wtc20nXHJcbiAgQElucHV0KCkgZ3JvdXBTZXBhcmF0b3I6IGFueVxyXG4gIEBJbnB1dCgpIHJhZGl4UG9pbnQ6IGFueVxyXG4gIEBJbnB1dCgpIGxibEtleUludmFsaWQ6IGFueVxyXG4gIGxibEtleUludmFsaWRSZW5kZXI6IGFueVxyXG4gIGltYXNrOiBhbnlcclxuICBwbGFjZWhvbGRlciA9ICcwJ1xyXG4gIHJlc2V0Q29udHJvbCA9IGZhbHNlXHJcbiAgcHJldlZhbHVlOiBhbnkgPSAnJ1xyXG4gIHZhbGlkYXRlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICBjb25zdHJ1Y3RvciAoXHJcbiAgICBwcml2YXRlIF9DaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9OZ3hJbnB1dE51bWJlclNlcnZpY2U6IE5neElucHV0TnVtYmVyU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pTWFza0Rpci5tYXNrUmVmPy51cGRhdGVWYWx1ZSgpXHJcblxyXG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyICgpIHtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShTdHJpbmcodGhpcy5jb250cm9sLnZhbHVlKS5yZXBsYWNlKCcuJywgdGhpcy5fTmd4SW5wdXROdW1iZXJTZXJ2aWNlLnJhZGl4UG9pbnQpKVxyXG5cclxuICAgIHRoaXMuX0NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG5cclxuICAgIHRoaXMubGJsS2V5SW52YWxpZFJlbmRlciA9IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5sYmxLZXlJbnZhbGlkXHJcblxyXG4gICAgdGhpcy5pbWFzayA9IHtcclxuICAgICAgbWFzazogTnVtYmVyLFxyXG4gICAgICBzY2FsZTogdGhpcy5fTmd4SW5wdXROdW1iZXJTZXJ2aWNlLmRlY2ltYWxzLFxyXG4gICAgICB0aG91c2FuZHNTZXBhcmF0b3I6IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5ncm91cFNlcGFyYXRvcixcclxuICAgICAgcGFkRnJhY3Rpb25hbFplcm9zOiB0cnVlLFxyXG4gICAgICBub3JtYWxpemVaZXJvczogdHJ1ZSxcclxuICAgICAgcmFkaXg6IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5yYWRpeFBvaW50LFxyXG4gICAgICBtYXg6IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5tYXgsXHJcbiAgICAgIG1pbjogdGhpcy5fTmd4SW5wdXROdW1iZXJTZXJ2aWNlLm5lZ2F0aXZlID8gLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA6IDAsXHJcbiAgICAgIGZvcm1hdDogKHg6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgeCAhPT0gJ3N0cmluZycgJiYgeCA9PT0gbnVsbCAmJiAhdGhpcy5yZXNldENvbnRyb2wpIHtcclxuICAgICAgICAgIHRoaXMucmVzZXRDb250cm9sID0gdHJ1ZVxyXG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGxcclxuICAgICAgICAgIHRoaXMuaU1hc2tEaXIubWFza1JlZj8udXBkYXRlVmFsdWUoKVxyXG4gICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaU1hc2tEaXIubWFza1JlZj8udXBkYXRlQ29udHJvbCgpXHJcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpXHJcbiAgICAgICAgICAgICAgdGhpcy5yZXNldENvbnRyb2wgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBOdW1iZXIoeCkudG9GaXhlZCh0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UuZGVjaW1hbHMpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYmxLZXlJbnZhbGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5sYmxLZXlJbnZhbGlkUmVuZGVyID0gdGhpcy5sYmxLZXlJbnZhbGlkXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmltYXNrLm1pbiA9IHRoaXMubmVnYXRpdmUgPyAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDogMFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2subWF4ID0gdGhpcy5tYXhcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncm91cFNlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2sudGhvdXNhbmRzU2VwYXJhdG9yID0gdGhpcy5ncm91cFNlcGFyYXRvclxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmFkaXhQb2ludCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2sucmFkaXggPSB0aGlzLnJhZGl4UG9pbnRcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kZWNpbWFscyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2suc2NhbGUgPSB0aGlzLmRlY2ltYWxzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID09ICcnICYmICh0aGlzLmNvbnRyb2wudmFsdWUgPT09IG51bGwgfHwgdGhpcy5jb250cm9sLnZhbHVlID09PSAnJyB8fCB0aGlzLmNvbnRyb2wudmFsdWUgPT09IDApKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoJycpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UuZ2V0Q2hhbmdlRXZlbnQoKS5zdWJzY3JpYmUoXHJcbiAgICAgIChjb25maWdzKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZ3MpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzICgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyKClcclxuICB9XHJcblxyXG4gIG9uS2V5ZG93biAoZTogYW55KSB7XHJcbiAgICB0aGlzLnByZXZWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgfVxyXG5cclxuICBvbkJsdXIgKCkge1xyXG4gICAgdGhpcy52YWxpZGF0ZUVycm9yID0gZmFsc2VcclxuICB9XHJcblxyXG4gIG9uRm9jdXMgKCkge1xyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVFcnJvciA9IHRydWVcclxuICAgICAgfSxcclxuICAgICAgMTAwMFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgb25LZXl1cCAoZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFcnJvcikgcmV0dXJuXHJcblxyXG4gICAgbGV0IHNjYXBlS2V5czogYW55W10gPSBbXHJcbiAgICAgICdBcnJvd0xlZnQnLFxyXG4gICAgICAnQXJyb3dSaWdodCcsXHJcbiAgICAgICdBcnJvd1VwJyxcclxuICAgICAgJ0Fycm93RG93bicsXHJcbiAgICAgICdFc2NhcGUnLFxyXG4gICAgICAnQmFja3NwYWNlJyxcclxuICAgICAgJ0RlbGV0ZScsXHJcbiAgICAgICcuJyxcclxuICAgICAgJywnLFxyXG4gICAgICAnLScsXHJcbiAgICAgICdUYWInLFxyXG4gICAgXVxyXG5cclxuICAgIGlmKFxyXG4gICAgICBlLnRhcmdldC52YWx1ZSA9PSAnJ1xyXG4gICAgICAmJlxyXG4gICAgICAhc2NhcGVLZXlzLmluY2x1ZGVzKGUua2V5KVxyXG4gICAgKXtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKCcnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmKFxyXG4gICAgICAhc2NhcGVLZXlzLmluY2x1ZGVzKGUua2V5KVxyXG4gICAgICAmJlxyXG4gICAgICB0aGlzLnByZXZWYWx1ZSA9PT0gZS50YXJnZXQudmFsdWVcclxuICAgICAgJiZcclxuICAgICAgZS5rZXkgIT0gdGhpcy5wcmV2VmFsdWVcclxuICAgICl7XHJcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgna2V5LWludmFsaWQnKVxyXG4gICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgna2V5LWludmFsaWQnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgMTAwMFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgICAgI2lucHV0RWxlbWVudFxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICBjbGFzcz1cInRleHQtZW5kIGZvcm0tY29udHJvbCB7eyBhZGRDbGFzcyB9fVwiXHJcbiAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuaW52YWxpZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgW2lkXT1cImlkRm9yTGFiZWxcIlxyXG4gICAgICAgIFtpbWFza109XCJpbWFza1wiXHJcbiAgICAgICAgW3VubWFza109XCIndHlwZWQnXCJcclxuICAgICAgICAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwibGJsLWtleS1pbnZhbGlkIHBvc2l0aW9uLWFic29sdXRlIHRvcC0xMDAgZW5kLTAgcC0yIGQtbm9uZVwiIFtpbm5lckhUTUxdPVwibGJsS2V5SW52YWxpZFJlbmRlclwiPjwvbGFiZWw+XHJcbjwvZGl2PlxyXG4iXX0=