@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
105 lines • 18.6 kB
JavaScript
import { Component, HostListener, Inject, Optional, ViewChild } from '@angular/core';
import { DATA_FIELD_PORTAL_DATA, AbstractSimpleTextFieldComponent } from '@netgrif/components-core';
import { filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "@angular/common";
import * as i3 from "@ngbracket/ngx-layout/extended";
import * as i4 from "@angular/material/button";
export class SignaturePadFieldComponent extends AbstractSimpleTextFieldComponent {
_translate;
_ngZone;
signPad;
canvasDiv;
signatureImg;
signPadElement;
context;
isDrawing;
canvasWidth;
canvasHeight;
aspectRatio = 0.2;
constructor(_translate, _ngZone, dataFieldPortalData) {
super(_translate, dataFieldPortalData);
this._translate = _translate;
this._ngZone = _ngZone;
}
ngAfterViewInit() {
setTimeout(() => {
this.signPadElement = this.signPad.nativeElement;
this.context = this.signPadElement.getContext('2d');
this.canvasWidth = this.canvasDiv.nativeElement.clientWidth - 2;
this.canvasHeight = this.canvasWidth * this.aspectRatio;
this.formControlRef.valueChanges.pipe(filter(value => value !== this.signatureImg)).subscribe(value => {
this.signatureImg = value;
const img = new Image();
img.onload = () => {
this.context.drawImage(img, 0, 0, this.canvasWidth, this.canvasHeight);
};
img.src = this.signatureImg;
});
});
}
onMouseDown(e) {
this.isDrawing = true;
const coords = this.relativeCoords(e);
this.context.moveTo(coords.x, coords.y);
}
onMouseUp(e) {
this.isDrawing = false;
}
mouseUp(e) {
this.isDrawing = false;
this.saveSignature();
}
onMouseMove(e) {
if (this.isDrawing) {
const coords = this.relativeCoords(e);
this.context.lineTo(coords.x, coords.y);
this.context.stroke();
}
}
clearSignature() {
this.signatureImg = undefined;
this.context.clearRect(0, 0, this.signPadElement.width, this.signPadElement.height);
this.context.beginPath();
this.formControlRef.setValue(undefined);
}
saveSignature() {
this.signatureImg = this.signPadElement.toDataURL('image/png');
this.formControlRef.setValue(this.signatureImg);
}
relativeCoords(event) {
const bounds = event.target.getBoundingClientRect();
const cords = {
clientX: event.clientX || event.changedTouches[0].clientX,
clientY: event.clientY || event.changedTouches[0].clientY
};
const x = cords.clientX - bounds.left;
const y = cords.clientY - bounds.top;
return { x, y };
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignaturePadFieldComponent, deps: [{ token: i1.TranslateService }, { token: i0.NgZone }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SignaturePadFieldComponent, selector: "nc-signature-pad-field", host: { listeners: { "document:mouseup": "onMouseUp($event)", "document:blur": "mouseUp($event)" } }, viewQueries: [{ propertyName: "signPad", first: true, predicate: ["signPad"], descendants: true }, { propertyName: "canvasDiv", first: true, predicate: ["canvasDiv"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"canvas-div\" #canvasDiv [ngClass]=\"{'canvas-disabled': formControlRef.disabled}\" (blur)=\"mouseUp($event)\">\n <canvas (mousedown)=\"onMouseDown($event)\" (mousemove)=\"onMouseMove($event)\" (touchmove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\" #signPad width=\"{{canvasWidth}}\" (blur)=\"mouseUp($event)\" height=\"{{canvasHeight}}\"\n class=\"canvas\" [ngClass]=\"{'canvas-background-disabled': formControlRef.disabled}\">\n </canvas>\n</div>\n<button mat-stroked-button color=\"primary\" *ngIf=\"!formControlRef.disabled\" (click)=\"clearSignature()\">{{'dataField.clear' | translate }}</button>\n<button mat-stroked-button *ngIf=\"!formControlRef.disabled\" (click)=\"saveSignature()\">{{'dataField.save' | translate }}</button>\n\n", styles: [".canvas-div{width:100%;height:100%}.canvas{border:1px solid #64748B;border-radius:6px;-webkit-text-stroke-color:#000}.canvas-disabled{cursor:not-allowed;pointer-events:none}.canvas-background-disabled{background-color:#cbd5e1;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignaturePadFieldComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-signature-pad-field', template: "<div class=\"canvas-div\" #canvasDiv [ngClass]=\"{'canvas-disabled': formControlRef.disabled}\" (blur)=\"mouseUp($event)\">\n <canvas (mousedown)=\"onMouseDown($event)\" (mousemove)=\"onMouseMove($event)\" (touchmove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\" #signPad width=\"{{canvasWidth}}\" (blur)=\"mouseUp($event)\" height=\"{{canvasHeight}}\"\n class=\"canvas\" [ngClass]=\"{'canvas-background-disabled': formControlRef.disabled}\">\n </canvas>\n</div>\n<button mat-stroked-button color=\"primary\" *ngIf=\"!formControlRef.disabled\" (click)=\"clearSignature()\">{{'dataField.clear' | translate }}</button>\n<button mat-stroked-button *ngIf=\"!formControlRef.disabled\" (click)=\"saveSignature()\">{{'dataField.save' | translate }}</button>\n\n", styles: [".canvas-div{width:100%;height:100%}.canvas{border:1px solid #64748B;border-radius:6px;-webkit-text-stroke-color:#000}.canvas-disabled{cursor:not-allowed;pointer-events:none}.canvas-background-disabled{background-color:#cbd5e1;pointer-events:none}\n"] }]
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.NgZone }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATA_FIELD_PORTAL_DATA]
}] }], propDecorators: { signPad: [{
type: ViewChild,
args: ['signPad', { static: false }]
}], canvasDiv: [{
type: ViewChild,
args: ['canvasDiv']
}], onMouseUp: [{
type: HostListener,
args: ['document:mouseup', ['$event']]
}], mouseUp: [{
type: HostListener,
args: ['document:blur', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLXBhZC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9kYXRhLWZpZWxkcy90ZXh0LWZpZWxkL3NpZ25hdHVyZS1wYWQtZmllbGQvc2lnbmF0dXJlLXBhZC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9kYXRhLWZpZWxkcy90ZXh0LWZpZWxkL3NpZ25hdHVyZS1wYWQtZmllbGQvc2lnbmF0dXJlLXBhZC1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsc0JBQXNCLEVBR3RCLGdDQUFnQyxFQUNuQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBT3RDLE1BQU0sT0FBTywwQkFBMkIsU0FBUSxnQ0FBZ0M7SUFZdEQ7SUFBd0M7SUFWdkIsT0FBTyxDQUFpQztJQUN2RCxTQUFTLENBQWlDO0lBQ3hELFlBQVksQ0FBVTtJQUN0QixjQUFjLENBQU07SUFDcEIsT0FBTyxDQUFNO0lBQ2IsU0FBUyxDQUFXO0lBQ3ZCLFdBQVcsQ0FBUztJQUNwQixZQUFZLENBQVM7SUFDckIsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUV6QixZQUFzQixVQUE0QixFQUFZLE9BQWUsRUFDckIsbUJBQXVEO1FBQzNHLEtBQUssQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUZyQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUFZLFlBQU8sR0FBUCxPQUFPLENB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SSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxjQUFjLENBQUMsS0FBVTtRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUc7WUFDVixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDekQsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1NBQzVELENBQUM7UUFDRixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3JDLE9BQU8sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEIsQ0FBQzt3R0FsRlEsMEJBQTBCLHdFQWFILHNCQUFzQjs0RkFiN0MsMEJBQTBCLHdYQ3hCdkMsa3lCQVNBOzs0RkRlYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0ksd0JBQXdCOzswQkFpQnJCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCO3lDQVhmLE9BQU87c0JBQTdDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDYixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBd0N0QixTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTTVDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBOZ1pvbmUsXG4gICAgT3B0aW9uYWwsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gICAgREFUQV9GSUVMRF9QT1JUQUxfREFUQSxcbiAgICBEYXRhRmllbGRQb3J0YWxEYXRhLFxuICAgIFRleHRBcmVhRmllbGQsXG4gICAgQWJzdHJhY3RTaW1wbGVUZXh0RmllbGRDb21wb25lbnRcbn0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtc2lnbmF0dXJlLXBhZC1maWVsZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NpZ25hdHVyZS1wYWQtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NpZ25hdHVyZS1wYWQtZmllbGQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTaWduYXR1cmVQYWRGaWVsZENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0U2ltcGxlVGV4dEZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICBAVmlld0NoaWxkKCdzaWduUGFkJywge3N0YXRpYzogZmFsc2V9KSBzaWduUGFkITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgnY2FudmFzRGl2JykgY2FudmFzRGl2ITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG4gICAgcHJvdGVjdGVkIHNpZ25hdHVyZUltZz86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgc2lnblBhZEVsZW1lbnQ6IGFueTtcbiAgICBwcm90ZWN0ZWQgY29udGV4dDogYW55O1xuICAgIHByb3RlY3RlZCBpc0RyYXdpbmchOiBib29sZWFuO1xuICAgIHB1YmxpYyBjYW52YXNXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBjYW52YXNIZWlnaHQ6IG51bWJlcjtcbiAgICBwdWJsaWMgYXNwZWN0UmF0aW8gPSAwLjI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSwgcHJvdGVjdGVkIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfRklFTERfUE9SVEFMX0RBVEEpIGRhdGFGaWVsZFBvcnRhbERhdGE6IERhdGFGaWVsZFBvcnRhbERhdGE8VGV4dEFyZWFGaWVsZD4pIHtcbiAgICAgICAgc3VwZXIoX3RyYW5zbGF0ZSwgZGF0YUZpZWxkUG9ydGFsRGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNpZ25QYWRFbGVtZW50ID0gdGhpcy5zaWduUGFkLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLnNpZ25QYWRFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc1dpZHRoID0gdGhpcy5jYW52YXNEaXYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtIDI7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHRoaXMuY2FudmFzV2lkdGggKiB0aGlzLmFzcGVjdFJhdGlvO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbFJlZi52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IHRoaXMuc2lnbmF0dXJlSW1nKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlSW1nID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHRoaXMuY2FudmFzV2lkdGgsIHRoaXMuY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGltZy5zcmMgPSB0aGlzLnNpZ25hdHVyZUltZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbk1vdXNlRG93bihlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0RyYXdpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb29yZHMgPSB0aGlzLnJlbGF0aXZlQ29vcmRzKGUpO1xuICAgICAgICB0aGlzLmNvbnRleHQubW92ZVRvKGNvb3Jkcy54LCBjb29yZHMueSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gICAgb25Nb3VzZVVwKGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRHJhd2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmJsdXInLCBbJyRldmVudCddKVxuICAgIG1vdXNlVXAoZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZVNpZ25hdHVyZSgpO1xuICAgIH1cblxuICAgIG9uTW91c2VNb3ZlKGU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RyYXdpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucmVsYXRpdmVDb29yZHMoZSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVRvKGNvb3Jkcy54LCBjb29yZHMueSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhclNpZ25hdHVyZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaWduYXR1cmVJbWcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaWduUGFkRWxlbWVudC53aWR0aCwgdGhpcy5zaWduUGFkRWxlbWVudC5oZWlnaHQpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xSZWYuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBzYXZlU2lnbmF0dXJlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNpZ25hdHVyZUltZyA9IHRoaXMuc2lnblBhZEVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbFJlZi5zZXRWYWx1ZSh0aGlzLnNpZ25hdHVyZUltZyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlbGF0aXZlQ29vcmRzKGV2ZW50OiBhbnkpOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCBib3VuZHMgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNvcmRzID0ge1xuICAgICAgICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHggPSBjb3Jkcy5jbGllbnRYIC0gYm91bmRzLmxlZnQ7XG4gICAgICAgIGNvbnN0IHkgPSBjb3Jkcy5jbGllbnRZIC0gYm91bmRzLnRvcDtcbiAgICAgICAgcmV0dXJuIHt4LCB5fTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzLWRpdlwiICNjYW52YXNEaXYgW25nQ2xhc3NdPVwieydjYW52YXMtZGlzYWJsZWQnOiBmb3JtQ29udHJvbFJlZi5kaXNhYmxlZH1cIiAoYmx1cik9XCJtb3VzZVVwKCRldmVudClcIj5cbiAgICA8Y2FudmFzIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiICh0b3VjaG1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAodG91Y2hzdGFydCk9XCJvbk1vdXNlRG93bigkZXZlbnQpXCIgI3NpZ25QYWQgd2lkdGg9XCJ7e2NhbnZhc1dpZHRofX1cIiAoYmx1cik9XCJtb3VzZVVwKCRldmVudClcIiBoZWlnaHQ9XCJ7e2NhbnZhc0hlaWdodH19XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FudmFzXCIgW25nQ2xhc3NdPVwieydjYW52YXMtYmFja2dyb3VuZC1kaXNhYmxlZCc6IGZvcm1Db250cm9sUmVmLmRpc2FibGVkfVwiPlxuICAgIDwvY2FudmFzPlxuPC9kaXY+XG48YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAqbmdJZj1cIiFmb3JtQ29udHJvbFJlZi5kaXNhYmxlZFwiIChjbGljayk9XCJjbGVhclNpZ25hdHVyZSgpXCI+e3snZGF0YUZpZWxkLmNsZWFyJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKm5nSWY9XCIhZm9ybUNvbnRyb2xSZWYuZGlzYWJsZWRcIiAoY2xpY2spPVwic2F2ZVNpZ25hdHVyZSgpXCI+e3snZGF0YUZpZWxkLnNhdmUnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG5cbiJdfQ==