systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
105 lines • 17.5 kB
JavaScript
import { Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
import { APP_CONFIG } from '../../systelab-components.module.config';
import { DEFAULT_SYSTELAB_DIALOG_CONFIG } from '../systelab-dialog-config';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/drag-drop";
export class DialogHeaderComponent {
constructor(config) {
this.config = config;
this.withClose = true;
this.withInfo = false;
this.withProgressBar = false;
this.withTextProgressBar = false;
this.withHome = false;
this.withMinimize = false;
this.withDrag = true;
this.close = new EventEmitter();
this.info = new EventEmitter();
this.home = new EventEmitter();
this.minimize = new EventEmitter();
this.withDrag = config?.dialogConfig?.dialogsDraggableByDefault !== undefined ?
config.dialogConfig.dialogsDraggableByDefault : DEFAULT_SYSTELAB_DIALOG_CONFIG.dialogsDraggableByDefault;
}
ngAfterViewInit() {
}
doClose() {
this.close.emit();
}
doInfo() {
this.info.emit();
}
doHome() {
this.home.emit();
}
doMinimize() {
this.minimize.emit();
}
go(n, textProgress) {
if (this.withProgressBar || this.withTextProgressBar) {
if (n > 100) {
n = 100;
}
if (n >= 0) {
this.here = n;
if (!this.on) {
this.on = 1;
this.move(n);
}
}
else if (this.on) {
this.move(n);
}
this.textProgress = textProgress ?? `${n}%`;
}
}
// animation loop
move(width) {
const dist = width - this.here;
if (dist < 0.1 && dist > -0.1) {
this.place(this.here);
this.on = 0;
}
else {
this.place(width - dist / 4);
}
}
// set bar width
place(num) {
this.progress = num;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DialogHeaderComponent, deps: [{ token: APP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: DialogHeaderComponent, selector: "systelab-dialog-header", inputs: { withClose: "withClose", withInfo: "withInfo", withProgressBar: "withProgressBar", withTextProgressBar: "withTextProgressBar", withHome: "withHome", withMinimize: "withMinimize", withDrag: "withDrag" }, outputs: { close: "close", info: "info", home: "home", minimize: "minimize" }, ngImport: i0, template: "<ng-template #headerContent>\n <div class=\"d-inline-block text-truncate\">\n <ng-content></ng-content>\n </div>\n <div class=\"d-flex\">\n <div *ngIf=\"withHome\" class=\"slab-dialog-header-button slab-dialog-home mr-1\" (click)=\"doHome()\"></div>\n <div *ngIf=\"withMinimize\" class=\"slab-dialog-header-button slab-dialog-minimize mr-1\" (click)=\"doMinimize()\"></div>\n <div *ngIf=\"withInfo\" class=\"slab-dialog-header-button slab-dialog-info mr-1\" (click)=\"doInfo()\"></div>\n <div *ngIf=\"withClose\" class=\"slab-dialog-header-button slab-dialog-close\" (click)=\"doClose()\"></div>\n </div>\n</ng-template>\n\n<div *ngIf=\"withDrag\" class=\"slab-dialog-header slab-draggable d-flex justify-content-between\"\n cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle>\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n<div *ngIf=\"!withDrag\" class=\"slab-dialog-header d-flex justify-content-between\">\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n\n<div *ngIf=\"(withProgressBar || withTextProgressBar) && progress\" class=\"slab-dialog-header-progress text-center\"\n [ngClass]=\"{'slab-dialog-header-progress-bar-with-text':withTextProgressBar}\">\n <div class=\"slab-dialog-header-progress-bar\" role=\"progressbar\" [style.width.%]=\"progress\" [attr.aria-valuenow]=\"progress\"\n aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n <span *ngIf=\"withTextProgressBar\" class=\"slab-dialog-header-progress-bar-text h-100 d-flex align-items-center justify-content-center\">{{textProgress}}</span>\n</div>\n", styles: [":host{width:100%}.slab-draggable{cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DialogHeaderComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-dialog-header', template: "<ng-template #headerContent>\n <div class=\"d-inline-block text-truncate\">\n <ng-content></ng-content>\n </div>\n <div class=\"d-flex\">\n <div *ngIf=\"withHome\" class=\"slab-dialog-header-button slab-dialog-home mr-1\" (click)=\"doHome()\"></div>\n <div *ngIf=\"withMinimize\" class=\"slab-dialog-header-button slab-dialog-minimize mr-1\" (click)=\"doMinimize()\"></div>\n <div *ngIf=\"withInfo\" class=\"slab-dialog-header-button slab-dialog-info mr-1\" (click)=\"doInfo()\"></div>\n <div *ngIf=\"withClose\" class=\"slab-dialog-header-button slab-dialog-close\" (click)=\"doClose()\"></div>\n </div>\n</ng-template>\n\n<div *ngIf=\"withDrag\" class=\"slab-dialog-header slab-draggable d-flex justify-content-between\"\n cdkDrag cdkDragRootElement=\".cdk-overlay-pane\" cdkDragHandle>\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n<div *ngIf=\"!withDrag\" class=\"slab-dialog-header d-flex justify-content-between\">\n <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n</div>\n\n<div *ngIf=\"(withProgressBar || withTextProgressBar) && progress\" class=\"slab-dialog-header-progress text-center\"\n [ngClass]=\"{'slab-dialog-header-progress-bar-with-text':withTextProgressBar}\">\n <div class=\"slab-dialog-header-progress-bar\" role=\"progressbar\" [style.width.%]=\"progress\" [attr.aria-valuenow]=\"progress\"\n aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n <span *ngIf=\"withTextProgressBar\" class=\"slab-dialog-header-progress-bar-text h-100 d-flex align-items-center justify-content-center\">{{textProgress}}</span>\n</div>\n", styles: [":host{width:100%}.slab-draggable{cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}\n"] }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [APP_CONFIG]
}] }], propDecorators: { withClose: [{
type: Input
}], withInfo: [{
type: Input
}], withProgressBar: [{
type: Input
}], withTextProgressBar: [{
type: Input
}], withHome: [{
type: Input
}], withMinimize: [{
type: Input
}], withDrag: [{
type: Input
}], close: [{
type: Output
}], info: [{
type: Output
}], home: [{
type: Output
}], minimize: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvbW9kYWwvaGVhZGVyL2RpYWxvZy1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL21vZGFsL2hlYWRlci9kaWFsb2ctaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBaUIzRSxNQUFNLE9BQU8scUJBQXFCO0lBb0JqQyxZQUFvRCxNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBbEI1RCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVSLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBUTlDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM5RSxNQUFNLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyx5QkFBeUIsQ0FBQztJQUMzRyxDQUFDO0lBRU0sZUFBZTtJQUN0QixDQUFDO0lBRU0sT0FBTztRQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLE1BQU07UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxNQUFNO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sVUFBVTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxFQUFFLENBQUMsQ0FBUyxFQUFFLFlBQXFCO1FBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDckQsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO2dCQUNaLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDUjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiO2FBQ0Q7aUJBQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2I7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQzVDO0lBQ0YsQ0FBQztJQUVELGlCQUFpQjtJQUNULElBQUksQ0FBQyxLQUFhO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDWjthQUFNO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0lBQ0YsQ0FBQztJQUVELGdCQUFnQjtJQUNSLEtBQUssQ0FBQyxHQUFXO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLENBQUM7OEdBNUVXLHFCQUFxQixrQkFvQkQsVUFBVTtrR0FwQjlCLHFCQUFxQixpV0NuQmxDLGtvREEwQkE7OzJGRFBhLHFCQUFxQjtrQkFmakMsU0FBUzsrQkFDSSx3QkFBd0I7OzBCQWtDeEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVO3lDQWxCakMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVXLEtBQUs7c0JBQXJCLE1BQU07Z0JBQ1UsSUFBSTtzQkFBcEIsTUFBTTtnQkFDVSxJQUFJO3NCQUFwQixNQUFNO2dCQUNVLFFBQVE7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVBQX0NPTkZJRywgQXBwQ29uZmlnIH0gZnJvbSAnLi4vLi4vc3lzdGVsYWItY29tcG9uZW50cy5tb2R1bGUuY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfU1lTVEVMQUJfRElBTE9HX0NPTkZJRyB9IGZyb20gJy4uL3N5c3RlbGFiLWRpYWxvZy1jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICAgICdzeXN0ZWxhYi1kaWFsb2ctaGVhZGVyJyxcblx0dGVtcGxhdGVVcmw6ICdkaWFsb2ctaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVzOiAgICAgIFtgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICAgIC5zbGFiLWRyYWdnYWJsZSB7XG4gICAgICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgICAgICBjdXJzb3I6IGdyYWI7XG4gICAgICAgICAgICBjdXJzb3I6IC1tb3otZ3JhYjtcbiAgICAgICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiO1xuICAgICAgICB9XG5cdGBdXG59KVxuZXhwb3J0IGNsYXNzIERpYWxvZ0hlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG5cdEBJbnB1dCgpIHdpdGhDbG9zZSA9IHRydWU7XG5cdEBJbnB1dCgpIHdpdGhJbmZvID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhQcm9ncmVzc0JhciA9IGZhbHNlO1xuXHRASW5wdXQoKSB3aXRoVGV4dFByb2dyZXNzQmFyID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhIb21lID0gZmFsc2U7XG5cdEBJbnB1dCgpIHdpdGhNaW5pbWl6ZSA9IGZhbHNlO1xuXHRASW5wdXQoKSB3aXRoRHJhZyA9IHRydWU7XG5cblx0QE91dHB1dCgpIHB1YmxpYyBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHB1YmxpYyBpbmZvID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcHVibGljIGhvbWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwdWJsaWMgbWluaW1pemUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0cHVibGljIHRleHRQcm9ncmVzczogc3RyaW5nO1xuXHRwdWJsaWMgcHJvZ3Jlc3M6IG51bWJlcjtcblx0cHJpdmF0ZSBvbjogbnVtYmVyO1xuXHRwcml2YXRlIGhlcmU6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBBcHBDb25maWcpIHtcblx0XHR0aGlzLndpdGhEcmFnID0gY29uZmlnPy5kaWFsb2dDb25maWc/LmRpYWxvZ3NEcmFnZ2FibGVCeURlZmF1bHQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRjb25maWcuZGlhbG9nQ29uZmlnLmRpYWxvZ3NEcmFnZ2FibGVCeURlZmF1bHQgOiBERUZBVUxUX1NZU1RFTEFCX0RJQUxPR19DT05GSUcuZGlhbG9nc0RyYWdnYWJsZUJ5RGVmYXVsdDtcblx0fVxuXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG5cdH1cblxuXHRwdWJsaWMgZG9DbG9zZSgpIHtcblx0XHR0aGlzLmNsb3NlLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb0luZm8oKSB7XG5cdFx0dGhpcy5pbmZvLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb0hvbWUoKSB7XG5cdFx0dGhpcy5ob21lLmVtaXQoKTtcblx0fVxuXG5cdHB1YmxpYyBkb01pbmltaXplKCkge1xuXHRcdHRoaXMubWluaW1pemUuZW1pdCgpO1xuXHR9XG5cblx0cHVibGljIGdvKG46IG51bWJlciwgdGV4dFByb2dyZXNzPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMud2l0aFByb2dyZXNzQmFyIHx8IHRoaXMud2l0aFRleHRQcm9ncmVzc0Jhcikge1xuXHRcdFx0aWYgKG4gPiAxMDApIHtcblx0XHRcdFx0biA9IDEwMDtcblx0XHRcdH1cblx0XHRcdGlmIChuID49IDApIHtcblx0XHRcdFx0dGhpcy5oZXJlID0gbjtcblx0XHRcdFx0aWYgKCF0aGlzLm9uKSB7XG5cdFx0XHRcdFx0dGhpcy5vbiA9IDE7XG5cdFx0XHRcdFx0dGhpcy5tb3ZlKG4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub24pIHtcblx0XHRcdFx0dGhpcy5tb3ZlKG4pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy50ZXh0UHJvZ3Jlc3MgPSB0ZXh0UHJvZ3Jlc3MgPz8gYCR7bn0lYDtcblx0XHR9XG5cdH1cblxuXHQvLyBhbmltYXRpb24gbG9vcFxuXHRwcml2YXRlIG1vdmUod2lkdGg6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IGRpc3QgPSB3aWR0aCAtIHRoaXMuaGVyZTtcblx0XHRpZiAoZGlzdCA8IDAuMSAmJiBkaXN0ID4gLTAuMSkge1xuXHRcdFx0dGhpcy5wbGFjZSh0aGlzLmhlcmUpO1xuXHRcdFx0dGhpcy5vbiA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucGxhY2Uod2lkdGggLSBkaXN0IC8gNCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gc2V0IGJhciB3aWR0aFxuXHRwcml2YXRlIHBsYWNlKG51bTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9ncmVzcyA9IG51bTtcblx0fVxuXG59XG4iLCI8bmctdGVtcGxhdGUgI2hlYWRlckNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhIb21lXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItYnV0dG9uIHNsYWItZGlhbG9nLWhvbWUgbXItMVwiIChjbGljayk9XCJkb0hvbWUoKVwiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aE1pbmltaXplXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItYnV0dG9uIHNsYWItZGlhbG9nLW1pbmltaXplIG1yLTFcIiAoY2xpY2spPVwiZG9NaW5pbWl6ZSgpXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ3aXRoSW5mb1wiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLWJ1dHRvbiBzbGFiLWRpYWxvZy1pbmZvIG1yLTFcIiAoY2xpY2spPVwiZG9JbmZvKClcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhDbG9zZVwiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLWJ1dHRvbiBzbGFiLWRpYWxvZy1jbG9zZVwiIChjbGljayk9XCJkb0Nsb3NlKClcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJ3aXRoRHJhZ1wiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyIHNsYWItZHJhZ2dhYmxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgIGNka0RyYWcgY2RrRHJhZ1Jvb3RFbGVtZW50PVwiLmNkay1vdmVybGF5LXBhbmVcIiBjZGtEcmFnSGFuZGxlPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhd2l0aERyYWdcIiBjbGFzcz1cInNsYWItZGlhbG9nLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCIod2l0aFByb2dyZXNzQmFyIHx8IHdpdGhUZXh0UHJvZ3Jlc3NCYXIpICYmIHByb2dyZXNzXCIgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItcHJvZ3Jlc3MgdGV4dC1jZW50ZXJcIlxuICAgICBbbmdDbGFzc109XCJ7J3NsYWItZGlhbG9nLWhlYWRlci1wcm9ncmVzcy1iYXItd2l0aC10ZXh0Jzp3aXRoVGV4dFByb2dyZXNzQmFyfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzbGFiLWRpYWxvZy1oZWFkZXItcHJvZ3Jlc3MtYmFyXCIgcm9sZT1cInByb2dyZXNzYmFyXCIgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIiBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInByb2dyZXNzXCJcbiAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiPjwvZGl2PlxuICAgIDxzcGFuICpuZ0lmPVwid2l0aFRleHRQcm9ncmVzc0JhclwiIGNsYXNzPVwic2xhYi1kaWFsb2ctaGVhZGVyLXByb2dyZXNzLWJhci10ZXh0IGgtMTAwIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPnt7dGV4dFByb2dyZXNzfX08L3NwYW4+XG48L2Rpdj5cbiJdfQ==