@asoftwareworld/form-builder
Version:
ASW Form Builder helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same befor
97 lines • 21.9 kB
JavaScript
/**
* @license
* Copyright ASW (A Software World) All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file
*/
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { AswConfirmDialog } from '@asoftwareworld/form-builder/form-control/confirm-dialog';
import { Constants } from '@asoftwareworld/form-builder/form-control/core';
import { AswDatepickerDialog } from './datepicker-dialog';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/material/input";
import * as i5 from "@angular/material/form-field";
import * as i6 from "@angular/material/datepicker";
import * as i7 from "@angular/material/icon";
import * as i8 from "@angular/material/tooltip";
import * as i9 from "@angular/material/button";
export class AswDatepicker {
dialog;
constants = Constants;
/**
* Datepicker control
*/
control = null;
/**
* Datepicker control index to help update or delete button from drop area
*/
controlIndex;
isPreviewTemplate = false;
datepickerUpdateEvent = new EventEmitter();
datepickerDeleteEvent = new EventEmitter();
dateChange = new EventEmitter();
duplicateControl = new EventEmitter();
constructor(dialog) {
this.dialog = dialog;
}
/**
* Delete datepicker control based on control index
* @param control datepicker control items
* @param controlIndex datepicker control index
*/
deleteDatepickerDialog(control, controlIndex) {
const dialogRef = this.dialog.open(AswConfirmDialog, {
width: '350px',
data: { name: control.controlType, message: this.constants.messages.waringMessage }
});
dialogRef.afterClosed().subscribe(result => {
if (result !== undefined) {
this.datepickerDeleteEvent.emit(controlIndex);
}
});
}
editDatepickerDialog(control, controlIndex) {
const dialogRef = this.dialog.open(AswDatepickerDialog, {
disableClose: true,
width: '60%',
minWidth: '60vw',
data: control
});
dialogRef.afterClosed().subscribe(result => {
if (result !== undefined) {
this.datepickerUpdateEvent.emit({ control: result, index: controlIndex });
}
});
}
onDateChange(control) {
this.dateChange.emit(control);
}
duplicateDatepickerControl(control) {
this.duplicateControl.emit(control);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswDatepicker, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswDatepicker, selector: "asw-datepicker", inputs: { control: "control", controlIndex: "controlIndex", isPreviewTemplate: "isPreviewTemplate" }, outputs: { datepickerUpdateEvent: "datepickerUpdateEvent", datepickerDeleteEvent: "datepickerDeleteEvent", dateChange: "dateChange", duplicateControl: "duplicateControl" }, ngImport: i0, template: "<ng-container *ngIf=\"control as control\">\r\n <mat-form-field [appearance]=\"control.style\" class=\"asw-mat-form-field {{control.customClass}}\">\r\n <mat-label>{{control.label}}</mat-label>\r\n <input matInput [matDatepicker]=\"picker\" \r\n #input=\"ngModel\"\r\n [id]=\"control.id\"\r\n [(ngModel)]=\"control.value\"\r\n [matTooltip]=\"control.tooltip\"\r\n [placeholder]=\"control.label\"\r\n (dateChange)=\"onDateChange(control)\"\r\n [min]=\"control.minDate\" \r\n [max]=\"control.maxDate\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input.invalid && (input.dirty || input.touched)\">\r\n <ng-container class=\"asw-mat-error\" *ngIf=\"input?.errors?.required\">\r\n {{control.label}} is required\r\n </ng-container>\r\n </mat-error>\r\n </mat-form-field>\r\n <div class=\"row\" *ngIf=\"isPreviewTemplate\">\r\n <div class=\"col-md-12\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Duplicate\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateDatepickerControl(control)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Edit\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editDatepickerDialog(control, controlIndex)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Delete\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteDatepickerDialog(control, controlIndex)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div> \r\n </div>\r\n</ng-container>", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswDatepicker, decorators: [{
type: Component,
args: [{ selector: 'asw-datepicker', template: "<ng-container *ngIf=\"control as control\">\r\n <mat-form-field [appearance]=\"control.style\" class=\"asw-mat-form-field {{control.customClass}}\">\r\n <mat-label>{{control.label}}</mat-label>\r\n <input matInput [matDatepicker]=\"picker\" \r\n #input=\"ngModel\"\r\n [id]=\"control.id\"\r\n [(ngModel)]=\"control.value\"\r\n [matTooltip]=\"control.tooltip\"\r\n [placeholder]=\"control.label\"\r\n (dateChange)=\"onDateChange(control)\"\r\n [min]=\"control.minDate\" \r\n [max]=\"control.maxDate\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <mat-error class=\"asw-mat-error\" *ngIf=\"input.invalid && (input.dirty || input.touched)\">\r\n <ng-container class=\"asw-mat-error\" *ngIf=\"input?.errors?.required\">\r\n {{control.label}} is required\r\n </ng-container>\r\n </mat-error>\r\n </mat-form-field>\r\n <div class=\"row\" *ngIf=\"isPreviewTemplate\">\r\n <div class=\"col-md-12\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Duplicate\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateDatepickerControl(control)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Edit\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editDatepickerDialog(control, controlIndex)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"Delete\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteDatepickerDialog(control, controlIndex)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div> \r\n </div>\r\n</ng-container>" }]
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { control: [{
type: Input
}], controlIndex: [{
type: Input
}], isPreviewTemplate: [{
type: Input
}], datepickerUpdateEvent: [{
type: Output
}], datepickerDeleteEvent: [{
type: Output
}], dateChange: [{
type: Output
}], duplicateControl: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2Zvcm0tY29udHJvbC9kYXRlcGlja2VyL2RhdGVwaWNrZXIudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM1RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7O0FBTTFELE1BQU0sT0FBTyxhQUFhO0lBbUJIO0lBakJuQixTQUFTLEdBQVEsU0FBUyxDQUFDO0lBQzNCOztPQUVHO0lBQ00sT0FBTyxHQUF1QixJQUFJLENBQUM7SUFFNUM7O09BRUc7SUFDTSxZQUFZLENBQVU7SUFDdEIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBRXpCLHFCQUFxQixHQUFHLElBQUksWUFBWSxFQUEyQyxDQUFDO0lBQ3BGLHFCQUFxQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFDbkQsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7SUFDN0MsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQUU3RCxZQUFtQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO0lBQUksQ0FBQztJQUV6Qzs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsT0FBb0IsRUFBRSxZQUFvQjtRQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNqRCxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7U0FDdEYsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsT0FBb0IsRUFBRSxZQUFvQjtRQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNwRCxZQUFZLEVBQUUsSUFBSTtZQUNsQixLQUFLLEVBQUUsS0FBSztZQUNaLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLElBQUksRUFBRSxPQUFPO1NBQ2hCLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBb0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELDBCQUEwQixDQUFDLE9BQW9CO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQzt3R0ExRFEsYUFBYTs0RkFBYixhQUFhLHlVQ25CMUIsNDdFQStDZTs7NEZENUJGLGFBQWE7a0JBSnpCLFNBQVM7K0JBQ0ksZ0JBQWdCOzhFQVNqQixPQUFPO3NCQUFmLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUkscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQVNXIChBIFNvZnR3YXJlIFdvcmxkKSBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxyXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQXN3Q29uZmlybURpYWxvZyB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXIvZm9ybS1jb250cm9sL2NvbmZpcm0tZGlhbG9nJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci9mb3JtLWNvbnRyb2wvY29yZSc7XHJcbmltcG9ydCB7IERhdGVDb250cm9sIH0gZnJvbSAnLi9kYXRlLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBBc3dEYXRlcGlja2VyRGlhbG9nIH0gZnJvbSAnLi9kYXRlcGlja2VyLWRpYWxvZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXN3LWRhdGVwaWNrZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGVwaWNrZXIuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFzd0RhdGVwaWNrZXIge1xyXG5cclxuICAgIGNvbnN0YW50czogYW55ID0gQ29uc3RhbnRzO1xyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRlcGlja2VyIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgY29udHJvbDogRGF0ZUNvbnRyb2wgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGVwaWNrZXIgY29udHJvbCBpbmRleCB0byBoZWxwIHVwZGF0ZSBvciBkZWxldGUgYnV0dG9uIGZyb20gZHJvcCBhcmVhXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGNvbnRyb2xJbmRleCE6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGlzUHJldmlld1RlbXBsYXRlID0gZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIGRhdGVwaWNrZXJVcGRhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb250cm9sOiBEYXRlQ29udHJvbCwgaW5kZXg6IG51bWJlciB9PigpO1xyXG4gICAgQE91dHB1dCgpIGRhdGVwaWNrZXJEZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gICAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVDb250cm9sPigpO1xyXG4gICAgQE91dHB1dCgpIGR1cGxpY2F0ZUNvbnRyb2wgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVDb250cm9sPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGUgZGF0ZXBpY2tlciBjb250cm9sIGJhc2VkIG9uIGNvbnRyb2wgaW5kZXhcclxuICAgICAqIEBwYXJhbSBjb250cm9sIGRhdGVwaWNrZXIgY29udHJvbCBpdGVtc1xyXG4gICAgICogQHBhcmFtIGNvbnRyb2xJbmRleCBkYXRlcGlja2VyIGNvbnRyb2wgaW5kZXhcclxuICAgICAqL1xyXG4gICAgZGVsZXRlRGF0ZXBpY2tlckRpYWxvZyhjb250cm9sOiBEYXRlQ29udHJvbCwgY29udHJvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFzd0NvbmZpcm1EaWFsb2csIHtcclxuICAgICAgICAgICAgd2lkdGg6ICczNTBweCcsXHJcbiAgICAgICAgICAgIGRhdGE6IHsgbmFtZTogY29udHJvbC5jb250cm9sVHlwZSwgbWVzc2FnZTogdGhpcy5jb25zdGFudHMubWVzc2FnZXMud2FyaW5nTWVzc2FnZSB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyRGVsZXRlRXZlbnQuZW1pdChjb250cm9sSW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdERhdGVwaWNrZXJEaWFsb2coY29udHJvbDogRGF0ZUNvbnRyb2wsIGNvbnRyb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBc3dEYXRlcGlja2VyRGlhbG9nLCB7XHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgd2lkdGg6ICc2MCUnLFxyXG4gICAgICAgICAgICBtaW5XaWR0aDogJzYwdncnLFxyXG4gICAgICAgICAgICBkYXRhOiBjb250cm9sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyVXBkYXRlRXZlbnQuZW1pdCh7IGNvbnRyb2w6IHJlc3VsdCwgaW5kZXg6IGNvbnRyb2xJbmRleCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGF0ZUNoYW5nZShjb250cm9sOiBEYXRlQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGNvbnRyb2wpO1xyXG4gICAgfVxyXG5cclxuICAgIGR1cGxpY2F0ZURhdGVwaWNrZXJDb250cm9sKGNvbnRyb2w6IERhdGVDb250cm9sKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kdXBsaWNhdGVDb250cm9sLmVtaXQoY29udHJvbCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wgYXMgY29udHJvbFwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImNvbnRyb2wuc3R5bGVcIiBjbGFzcz1cImFzdy1tYXQtZm9ybS1maWVsZCB7e2NvbnRyb2wuY3VzdG9tQ2xhc3N9fVwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3tjb250cm9sLmxhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNpbnB1dD1cIm5nTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImNvbnRyb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb250cm9sLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25EYXRlQ2hhbmdlKGNvbnRyb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJjb250cm9sLm1pbkRhdGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJjb250cm9sLm1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29udHJvbC5pc1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuaXNEaXNhYmxlZCA/IHRydWUgOiBmYWxzZVwiPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiYXN3LW1hdC1lcnJvclwiICpuZ0lmPVwiaW5wdXQuaW52YWxpZCAmJiAoaW5wdXQuZGlydHkgfHwgaW5wdXQudG91Y2hlZClcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjbGFzcz1cImFzdy1tYXQtZXJyb3JcIiAqbmdJZj1cImlucHV0Py5lcnJvcnM/LnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICB7e2NvbnRyb2wubGFiZWx9fSBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJpc1ByZXZpZXdUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEdXBsaWNhdGVcIiBcclxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIiBcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlRGF0ZXBpY2tlckNvbnRyb2woY29udHJvbClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXREYXRlcGlja2VyRGlhbG9nKGNvbnRyb2wsIGNvbnRyb2xJbmRleClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZURhdGVwaWNrZXJEaWFsb2coY29udHJvbCwgY29udHJvbEluZGV4KVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+Il19