UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

76 lines 20.2 kB
import { Component, Inject } from '@angular/core'; import { UserListService } from '@netgrif/components-core'; import { FormControl } from '@angular/forms'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@angular/common"; import * as i3 from "@ngbracket/ngx-layout"; import * as i4 from "@angular/material/button"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/input"; import * as i7 from "@angular/material/form-field"; import * as i8 from "@angular/forms"; import * as i9 from "../../side-menu/content-components/multi-user-assign/multi-user-assign-list/multi-user-assign-list.component"; import * as i10 from "@ngx-translate/core"; export class MultiUserAssignDialogComponent { _dialogRef; _data; searchUserControl = new FormControl(); injectedData; _currentUsers; constructor(_dialogRef, _data) { this._dialogRef = _dialogRef; this._data = _data; this._currentUsers = []; if (this._data) { this.injectedData = this._data; if (!!this.injectedData.value) { this._currentUsers.push(...this.injectedData.value.userValues.values()); } } } get initiallySelectedUsers() { return this.injectedData?.value ? [...this.injectedData.value.userValues.values()] : undefined; } get roles() { return this.injectedData ? this.injectedData.roles : []; } get negativeRoles() { return this.injectedData ? this.injectedData.negativeRoles : []; } get currentUsers() { return this._currentUsers; } userWasUnselected(user) { const index = this._currentUsers.findIndex(v => v.id === user.id); if (index > -1) { this._currentUsers.splice(index, 1); } } userWasSelected(user) { this._currentUsers.push(user); } /** * On save button close side menu with selected user as data and message about confirm. */ save() { if (this._currentUsers !== undefined) { this._dialogRef.close({ opened: false, message: 'Selected users were confirmed', data: this._currentUsers }); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiUserAssignDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiUserAssignDialogComponent, selector: "nc-multi-user-assign-dialog", providers: [UserListService], ngImport: i0, template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.user.assign' | translate }}\n</div>\n<div mat-dialog-content fxLayoutAlign=\"start stretch\" class=\"height-fix\">\n <div class=\"user-assign-container side-menu-root\" fxFlex fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <input matInput placeholder=\"{{ 'side-menu.user.choose' | translate }}\"\n [formControl]=\"searchUserControl\">\n <button mat-stroked-button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <nc-multi-user-assign-list fxFlex class=\"height-100\"\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUsers]=\"initiallySelectedUsers\"\n (userSelected)=\"userWasSelected($event)\"\n (userUnselected)=\"userWasUnselected($event)\">\n </nc-multi-user-assign-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"save()\">{{ 'dataField.user.save' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n\n", styles: [".user-assign-container{padding:16px;position:relative;height:100%}.user-assign-search{width:100%}.prefix-icon{font-size:18px;color:#64748b}.height-100{height:100%}.height-fix{height:calc(100% - 44px)}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.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: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.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: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.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: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i9.MultiUserAssignListComponent, selector: "nc-multi-user-assign-list" }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiUserAssignDialogComponent, decorators: [{ type: Component, args: [{ selector: 'nc-multi-user-assign-dialog', providers: [UserListService], template: "<div class=\"mat-dialog-title\" fxLayout=\"column\" fxLayoutAlign=\"center none\">\n {{ 'side-menu.user.assign' | translate }}\n</div>\n<div mat-dialog-content fxLayoutAlign=\"start stretch\" class=\"height-fix\">\n <div class=\"user-assign-container side-menu-root\" fxFlex fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <input matInput placeholder=\"{{ 'side-menu.user.choose' | translate }}\"\n [formControl]=\"searchUserControl\">\n <button mat-stroked-button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <nc-multi-user-assign-list fxFlex class=\"height-100\"\n [searchUserControl]=\"searchUserControl\"\n [roles]=\"roles\"\n [negativeRoles]=\"negativeRoles\"\n [initiallySelectedUsers]=\"initiallySelectedUsers\"\n (userSelected)=\"userWasSelected($event)\"\n (userUnselected)=\"userWasUnselected($event)\">\n </nc-multi-user-assign-list>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"primary\"\n (click)=\"save()\">{{ 'dataField.user.save' | translate | uppercase }}</button>\n </div>\n </div>\n</div>\n\n", styles: [".user-assign-container{padding:16px;position:relative;height:100%}.user-assign-search{width:100%}.prefix-icon{font-size:18px;color:#64748b}.height-100{height:100%}.height-fix{height:calc(100% - 44px)}\n"] }] }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9tdWx0aS11c2VyLWFzc2lnbi1kaWFsb2cvbXVsdGktdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2RpYWxvZy9tdWx0aS11c2VyLWFzc2lnbi1kaWFsb2cvbXVsdGktdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBb0MsZUFBZSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQ3RILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFlLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQVF2RSxNQUFNLE9BQU8sOEJBQThCO0lBUWpCO0lBQ21DO0lBUGxELGlCQUFpQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFdEMsWUFBWSxDQUF1QjtJQUVoQyxhQUFhLENBQW1CO0lBRTFDLFlBQXNCLFVBQXdELEVBQ3JCLEtBQTJCO1FBRDlELGVBQVUsR0FBVixVQUFVLENBQThDO1FBQ3JCLFVBQUssR0FBTCxLQUFLLENBQXNCO1FBQ2hGLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQTZCLENBQUM7WUFDdkQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUF1QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQzlGO1NBQ0o7SUFDTCxDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBdUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQWU7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFTSxlQUFlLENBQUMsSUFBZTtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1AsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDbEIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsT0FBTyxFQUFFLCtCQUErQjtnQkFDeEMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhO2FBQzNCLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzt3R0F6RFEsOEJBQThCLDhDQVNULGVBQWU7NEZBVHBDLDhCQUE4QixzREFGNUIsQ0FBQyxlQUFlLENBQUMsMEJDVGhDLHN5REFpQ0E7OzRGRHRCYSw4QkFBOEI7a0JBTjFDLFNBQVM7K0JBQ0ksNkJBQTZCLGFBRzVCLENBQUMsZUFBZSxDQUFDOzswQkFXTCxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvY2Vzc1JvbGUsIFVzZXJMaXN0SW5qZWN0ZWREYXRhLCBVc2VyTGlzdFNlcnZpY2UsIFVzZXJMaXN0VmFsdWUsIFVzZXJWYWx1ZX0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtbXVsdGktdXNlci1hc3NpZ24tZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktdXNlci1hc3NpZ24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tdWx0aS11c2VyLWFzc2lnbi1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtVc2VyTGlzdFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpVXNlckFzc2lnbkRpYWxvZ0NvbXBvbmVudCB7XG5cbiAgICBwdWJsaWMgc2VhcmNoVXNlckNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcblxuICAgIHB1YmxpYyBpbmplY3RlZERhdGE6IFVzZXJMaXN0SW5qZWN0ZWREYXRhO1xuXG4gICAgcHJvdGVjdGVkIF9jdXJyZW50VXNlcnM6IEFycmF5PFVzZXJWYWx1ZT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE11bHRpVXNlckFzc2lnbkRpYWxvZ0NvbXBvbmVudD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcm90ZWN0ZWQgX2RhdGE6IFVzZXJMaXN0SW5qZWN0ZWREYXRhKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRVc2VycyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pbmplY3RlZERhdGEgPSB0aGlzLl9kYXRhIGFzIFVzZXJMaXN0SW5qZWN0ZWREYXRhO1xuICAgICAgICAgICAgaWYgKCEhdGhpcy5pbmplY3RlZERhdGEudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlcnMucHVzaCguLi4odGhpcy5pbmplY3RlZERhdGEudmFsdWUgYXMgVXNlckxpc3RWYWx1ZSkudXNlclZhbHVlcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxseVNlbGVjdGVkVXNlcnMoKTogQXJyYXk8VXNlclZhbHVlPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGVkRGF0YT8udmFsdWUgPyBbLi4uKHRoaXMuaW5qZWN0ZWREYXRhLnZhbHVlIGFzIFVzZXJMaXN0VmFsdWUpLnVzZXJWYWx1ZXMudmFsdWVzKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm9sZXMoKTogQXJyYXk8c3RyaW5nPiB8IEFycmF5PFByb2Nlc3NSb2xlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGVkRGF0YSA/IHRoaXMuaW5qZWN0ZWREYXRhLnJvbGVzIDogW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuZWdhdGl2ZVJvbGVzKCk6IEFycmF5PHN0cmluZz4gfCBBcnJheTxQcm9jZXNzUm9sZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RlZERhdGEgPyB0aGlzLmluamVjdGVkRGF0YS5uZWdhdGl2ZVJvbGVzIDogW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VXNlcnMoKTogQXJyYXk8VXNlclZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VXNlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZXJXYXNVbnNlbGVjdGVkKHVzZXI6IFVzZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2N1cnJlbnRVc2Vycy5maW5kSW5kZXgodiA9PiB2LmlkID09PSB1c2VyLmlkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRVc2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVzZXJXYXNTZWxlY3RlZCh1c2VyOiBVc2VyVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFVzZXJzLnB1c2godXNlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gc2F2ZSBidXR0b24gY2xvc2Ugc2lkZSBtZW51IHdpdGggc2VsZWN0ZWQgdXNlciBhcyBkYXRhIGFuZCBtZXNzYWdlIGFib3V0IGNvbmZpcm0uXG4gICAgICovXG4gICAgcHVibGljIHNhdmUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VXNlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHtcbiAgICAgICAgICAgICAgICBvcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdTZWxlY3RlZCB1c2VycyB3ZXJlIGNvbmZpcm1lZCcsXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5fY3VycmVudFVzZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgbm9uZVwiPlxuICAgIHt7ICdzaWRlLW1lbnUudXNlci5hc3NpZ24nIHwgdHJhbnNsYXRlICB9fVxuPC9kaXY+XG48ZGl2IG1hdC1kaWFsb2ctY29udGVudCBmeExheW91dEFsaWduPVwic3RhcnQgc3RyZXRjaFwiIGNsYXNzPVwiaGVpZ2h0LWZpeFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWFzc2lnbi1jb250YWluZXIgc2lkZS1tZW51LXJvb3RcIiBmeEZsZXggZnhMYXlvdXQ9XCJjb2x1bW5cIj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBjbGFzcz1cIm5ldGdyaWYtaW5wdXQgbmV0Z3JpZi1pbnB1dC1maXhcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBjbGFzcz1cInVzZXItYXNzaWduLXNlYXJjaFwiIGNvbG9yPVwicHJpbWFyeVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFByZWZpeCBjbGFzcz1cInByZWZpeC1pY29uXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJ7eyAnc2lkZS1tZW51LnVzZXIuY2hvb3NlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWFyY2hVc2VyQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwic2VhcmNoVXNlckNvbnRyb2wudmFsdWVcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoVXNlckNvbnRyb2wuc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmMtbXVsdGktdXNlci1hc3NpZ24tbGlzdCBmeEZsZXggY2xhc3M9XCJoZWlnaHQtMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaFVzZXJDb250cm9sXT1cInNlYXJjaFVzZXJDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVzXT1cInJvbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25lZ2F0aXZlUm9sZXNdPVwibmVnYXRpdmVSb2xlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbml0aWFsbHlTZWxlY3RlZFVzZXJzXT1cImluaXRpYWxseVNlbGVjdGVkVXNlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlclNlbGVjdGVkKT1cInVzZXJXYXNTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJVbnNlbGVjdGVkKT1cInVzZXJXYXNVbnNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPC9uYy1tdWx0aS11c2VyLWFzc2lnbi1saXN0PlxuXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCI+e3sgJ2RhdGFGaWVsZC51c2VyLnNhdmUnIHwgdHJhbnNsYXRlIHwgdXBwZXJjYXNlIH19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==