@firestitch/app-acl 15.0.0 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/app/components/acl-entries/acl-entries.component.d.ts +1 -1
  2. package/app/components/acl-object-roles/acl-object-roles.component.d.ts +1 -1
  3. package/app/components/acl-permission-popover/acl-permission-popover.component.d.ts +1 -1
  4. package/app/components/acl-role-popover/acl-role-popover.component.d.ts +1 -1
  5. package/app/components/acl-roles/acl-roles.component.d.ts +1 -1
  6. package/esm2022/app/components/acl-entries/acl-entries.component.mjs +182 -0
  7. package/esm2022/app/components/acl-entry/acl-entry.component.mjs +99 -0
  8. package/esm2022/app/components/acl-object-roles/acl-object-roles.component.mjs +50 -0
  9. package/esm2022/app/components/acl-permission-popover/acl-permission-popover.component.mjs +32 -0
  10. package/esm2022/app/components/acl-role/acl-role.component.mjs +265 -0
  11. package/esm2022/app/components/acl-role-popover/acl-role-popover.component.mjs +37 -0
  12. package/esm2022/app/components/acl-roles/acl-roles.component.mjs +181 -0
  13. package/{esm2020 → esm2022}/app/fs-app-acl.module.mjs +53 -53
  14. package/esm2022/app/pipes/acl-role-permission-available.pipe.mjs +21 -0
  15. package/{esm2020 → esm2022}/app/pipes/bulk-options-filter.pipe.mjs +4 -4
  16. package/esm2022/app/services/app-acl.service.mjs +54 -0
  17. package/{fesm2020 → fesm2022}/firestitch-app-acl.mjs +217 -176
  18. package/fesm2022/firestitch-app-acl.mjs.map +1 -0
  19. package/package.json +5 -11
  20. package/esm2020/app/components/acl-entries/acl-entries.component.mjs +0 -176
  21. package/esm2020/app/components/acl-entry/acl-entry.component.mjs +0 -93
  22. package/esm2020/app/components/acl-object-roles/acl-object-roles.component.mjs +0 -52
  23. package/esm2020/app/components/acl-permission-popover/acl-permission-popover.component.mjs +0 -29
  24. package/esm2020/app/components/acl-role/acl-role.component.mjs +0 -254
  25. package/esm2020/app/components/acl-role-popover/acl-role-popover.component.mjs +0 -34
  26. package/esm2020/app/components/acl-roles/acl-roles.component.mjs +0 -170
  27. package/esm2020/app/pipes/acl-role-permission-available.pipe.mjs +0 -21
  28. package/esm2020/app/services/app-acl.service.mjs +0 -51
  29. package/fesm2015/firestitch-app-acl.mjs +0 -950
  30. package/fesm2015/firestitch-app-acl.mjs.map +0 -1
  31. package/fesm2020/firestitch-app-acl.mjs.map +0 -1
  32. /package/{esm2020 → esm2022}/app/consts/acl-role-accesses.mjs +0 -0
  33. /package/{esm2020 → esm2022}/app/enums/acl-role-access.mjs +0 -0
  34. /package/{esm2020 → esm2022}/app/injectors/app-acl-config.injector.mjs +0 -0
  35. /package/{esm2020 → esm2022}/app/interfaces/acl-entry-data.mjs +0 -0
  36. /package/{esm2020 → esm2022}/app/interfaces/acl-entry.mjs +0 -0
  37. /package/{esm2020 → esm2022}/app/interfaces/acl-level.mjs +0 -0
  38. /package/{esm2020 → esm2022}/app/interfaces/acl-object-entry.mjs +0 -0
  39. /package/{esm2020 → esm2022}/app/interfaces/acl-object-role.mjs +0 -0
  40. /package/{esm2020 → esm2022}/app/interfaces/acl-object.mjs +0 -0
  41. /package/{esm2020 → esm2022}/app/interfaces/acl-permission.mjs +0 -0
  42. /package/{esm2020 → esm2022}/app/interfaces/acl-role-config.mjs +0 -0
  43. /package/{esm2020 → esm2022}/app/interfaces/acl-role.mjs +0 -0
  44. /package/{esm2020 → esm2022}/app/interfaces/app-acl-config.mjs +0 -0
  45. /package/{esm2020 → esm2022}/app/interfaces/index.mjs +0 -0
  46. /package/{esm2020 → esm2022}/app/interfaces/name-value.mjs +0 -0
  47. /package/{esm2020 → esm2022}/app/interfaces/role-config.mjs +0 -0
  48. /package/{esm2020 → esm2022}/app/pipes/index.mjs +0 -0
  49. /package/{esm2020 → esm2022}/firestitch-app-acl.mjs +0 -0
  50. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
@@ -1,52 +0,0 @@
1
- import { ControlContainer, NgForm } from '@angular/forms';
2
- import { Component, Input, EventEmitter, Output } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "@angular/material/form-field";
7
- import * as i4 from "@angular/material/checkbox";
8
- import * as i5 from "@angular/material/select";
9
- import * as i6 from "@angular/material/core";
10
- import * as i7 from "@firestitch/form";
11
- import * as i8 from "@firestitch/checkboxgroup";
12
- export class FsAclObjectRolesComponent {
13
- constructor() {
14
- this.aclRoles = [];
15
- this.required = false;
16
- this.multiple = false;
17
- this.disabled = false;
18
- this.aclObjectRoles = [];
19
- this.rolesLabel = 'Roles';
20
- this.levelLabel = '';
21
- this.change = new EventEmitter();
22
- this.compareAclRole = (o1, o2) => {
23
- return o1 && o2 && o1.id === o2.id;
24
- };
25
- }
26
- changed() {
27
- this.change.emit(this.aclObjectRoles);
28
- }
29
- }
30
- FsAclObjectRolesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclObjectRolesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
- FsAclObjectRolesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FsAclObjectRolesComponent, selector: "fs-acl-object-roles", inputs: { aclRoles: "aclRoles", required: "required", multiple: "multiple", disabled: "disabled", aclObjectRoles: "aclObjectRoles", rolesLabel: "rolesLabel", levelLabel: "levelLabel" }, outputs: { change: "change" }, ngImport: i0, template: "<ng-container *ngIf=\"!multiple\">\n <ng-container *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <fs-checkbox-group\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n (ngModelChange)=\"changed()\"\n name=\"roles\"\n [compareWith]=\"compareAclRole\"\n [disabled]=\"disabled\"\n [label]=\"rolesLabel\"\n [fsFormRequired]=\"required\"\n orientation=\"vertical\">\n <mat-checkbox [disabled]=\"disabled\" *ngFor=\"let aclRole of aclRoles\" [value]=\"$any(aclRole)\">\n {{ aclRole.name }}\n </mat-checkbox>\n </fs-checkbox-group>\n </ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"multiple\">\n <table>\n <tr>\n <td>\n <small>{{levelLabel}}</small>\n </td>\n <td>\n <small>{{rolesLabel}}</small>\n </td>\n </tr>\n <tr *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <td>{{aclObjectRole.object.name}}</td>\n <td>\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n multiple=\"true\"\n [disabled]=\"disabled\"\n [compareWith]=\"compareAclRole\"\n (ngModelChange)=\"changed()\"\n name=\"aclRole_{{ aclObjectRole.object.id }}\">\n <mat-option *ngFor=\"let aclRole of aclRoles\" [value]=\"aclRole\">\n {{ aclRole.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </td>\n </tr>\n </table>\n</ng-container>\n", styles: ["table tr td:first-child{padding-right:15px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i7.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "component", type: i8.FsCheckboxGroupComponent, selector: "fs-checkbox-group", inputs: ["orientation", "position", "label", "disabled", "compareWith"], outputs: ["change"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclObjectRolesComponent, decorators: [{
33
- type: Component,
34
- args: [{ selector: 'fs-acl-object-roles', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<ng-container *ngIf=\"!multiple\">\n <ng-container *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <fs-checkbox-group\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n (ngModelChange)=\"changed()\"\n name=\"roles\"\n [compareWith]=\"compareAclRole\"\n [disabled]=\"disabled\"\n [label]=\"rolesLabel\"\n [fsFormRequired]=\"required\"\n orientation=\"vertical\">\n <mat-checkbox [disabled]=\"disabled\" *ngFor=\"let aclRole of aclRoles\" [value]=\"$any(aclRole)\">\n {{ aclRole.name }}\n </mat-checkbox>\n </fs-checkbox-group>\n </ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"multiple\">\n <table>\n <tr>\n <td>\n <small>{{levelLabel}}</small>\n </td>\n <td>\n <small>{{rolesLabel}}</small>\n </td>\n </tr>\n <tr *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <td>{{aclObjectRole.object.name}}</td>\n <td>\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n multiple=\"true\"\n [disabled]=\"disabled\"\n [compareWith]=\"compareAclRole\"\n (ngModelChange)=\"changed()\"\n name=\"aclRole_{{ aclObjectRole.object.id }}\">\n <mat-option *ngFor=\"let aclRole of aclRoles\" [value]=\"aclRole\">\n {{ aclRole.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </td>\n </tr>\n </table>\n</ng-container>\n", styles: ["table tr td:first-child{padding-right:15px}\n"] }]
35
- }], propDecorators: { aclRoles: [{
36
- type: Input
37
- }], required: [{
38
- type: Input
39
- }], multiple: [{
40
- type: Input
41
- }], disabled: [{
42
- type: Input
43
- }], aclObjectRoles: [{
44
- type: Input
45
- }], rolesLabel: [{
46
- type: Input
47
- }], levelLabel: [{
48
- type: Input
49
- }], change: [{
50
- type: Output
51
- }] } });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLW9iamVjdC1yb2xlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvYWNsLW9iamVjdC1yb2xlcy9hY2wtb2JqZWN0LXJvbGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtb2JqZWN0LXJvbGVzL2FjbC1vYmplY3Qtcm9sZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7QUFZdkUsTUFBTSxPQUFPLHlCQUF5QjtJQU50QztRQVFXLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFDekIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxPQUFPLENBQUM7UUFDckIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNmLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUVoRCxtQkFBYyxHQUFHLENBQUMsRUFBTyxFQUFFLEVBQU8sRUFBRSxFQUFFO1lBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFBO0tBS0Y7SUFIUSxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7O3VIQWpCVSx5QkFBeUI7MkdBQXpCLHlCQUF5QixvUkNidEMsMC9DQWdEQSxtakVEckNpQixDQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBRTs0RkFFMUQseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNFLHFCQUFxQixpQkFHaEIsQ0FBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUU7OEJBSTVELFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQWNsT2JqZWN0Um9sZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLW9iamVjdC1yb2xlJztcbmltcG9ydCB7IEFjbFJvbGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1yb2xlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1hY2wtb2JqZWN0LXJvbGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjbC1vYmplY3Qtcm9sZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hY2wtb2JqZWN0LXJvbGVzLmNvbXBvbmVudC5zY3NzJ10sXG4gIHZpZXdQcm92aWRlcnM6IFsgeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH0gXVxufSlcbmV4cG9ydCBjbGFzcyBGc0FjbE9iamVjdFJvbGVzQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBhY2xSb2xlczogQWNsUm9sZVtdID0gW107XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFjbE9iamVjdFJvbGVzOiBBY2xPYmplY3RSb2xlW10gPSBbXTtcbiAgQElucHV0KCkgcm9sZXNMYWJlbCA9ICdSb2xlcyc7XG4gIEBJbnB1dCgpIGxldmVsTGFiZWwgPSAnJztcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWNsT2JqZWN0Um9sZVtdPigpO1xuXG4gIHB1YmxpYyBjb21wYXJlQWNsUm9sZSA9IChvMTogYW55LCBvMjogYW55KSA9PiB7XG4gICAgcmV0dXJuIG8xICYmIG8yICYmIG8xLmlkID09PSBvMi5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VkKCkge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5hY2xPYmplY3RSb2xlcyk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGVcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWNsT2JqZWN0Um9sZSBvZiBhY2xPYmplY3RSb2xlc1wiPlxuICAgIDxmcy1jaGVja2JveC1ncm91cFxuICAgICAgWyhuZ01vZGVsKV09XCJhY2xPYmplY3RSb2xlLmFjbFJvbGVzXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZWQoKVwiXG4gICAgICBuYW1lPVwicm9sZXNcIlxuICAgICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVBY2xSb2xlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbbGFiZWxdPVwicm9sZXNMYWJlbFwiXG4gICAgICBbZnNGb3JtUmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiPlxuICAgICAgPG1hdC1jaGVja2JveCBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAqbmdGb3I9XCJsZXQgYWNsUm9sZSBvZiBhY2xSb2xlc1wiIFt2YWx1ZV09XCIkYW55KGFjbFJvbGUpXCI+XG4gICAgICAgIHt7IGFjbFJvbGUubmFtZSB9fVxuICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgPC9mcy1jaGVja2JveC1ncm91cD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpcGxlXCI+XG4gIDx0YWJsZT5cbiAgICA8dHI+XG4gICAgICA8dGQ+XG4gICAgICAgIDxzbWFsbD57e2xldmVsTGFiZWx9fTwvc21hbGw+XG4gICAgICA8L3RkPlxuICAgICAgPHRkPlxuICAgICAgICA8c21hbGw+e3tyb2xlc0xhYmVsfX08L3NtYWxsPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgYWNsT2JqZWN0Um9sZSBvZiBhY2xPYmplY3RSb2xlc1wiPlxuICAgICAgPHRkPnt7YWNsT2JqZWN0Um9sZS5vYmplY3QubmFtZX19PC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS1maWVsZC1wYWRsZXNzXCI+XG4gICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsT2JqZWN0Um9sZS5hY2xSb2xlc1wiXG4gICAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlQWNsUm9sZVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VkKClcIlxuICAgICAgICAgICAgbmFtZT1cImFjbFJvbGVfe3sgYWNsT2JqZWN0Um9sZS5vYmplY3QuaWQgfX1cIj5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhY2xSb2xlIG9mIGFjbFJvbGVzXCIgW3ZhbHVlXT1cImFjbFJvbGVcIj5cbiAgICAgICAgICAgICAge3sgYWNsUm9sZS5uYW1lIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3RhYmxlPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
@@ -1,29 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { FsAppAclService } from './../../services/app-acl.service';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./../../services/app-acl.service";
5
- import * as i2 from "@firestitch/popover";
6
- export class FsAclPermissionPopoverComponent {
7
- constructor(_appAclService) {
8
- this._appAclService = _appAclService;
9
- }
10
- ngOnInit() {
11
- this._appAclService.getPermissions()
12
- .subscribe(permissions => {
13
- this.description = permissions.filter(item => {
14
- return item.value === this.permission.value;
15
- }).map(item => {
16
- return item.description;
17
- })[0];
18
- });
19
- }
20
- }
21
- FsAclPermissionPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclPermissionPopoverComponent, deps: [{ token: i1.FsAppAclService }], target: i0.ɵɵFactoryTarget.Component });
22
- FsAclPermissionPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FsAclPermissionPopoverComponent, selector: "acl-permission-popover", inputs: { permission: "permission" }, ngImport: i0, template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n {{permission.name}}\n <div class=\"small\">{{description}}</div>\n</ng-template>\n\n", styles: [":host{cursor:pointer}\n"], dependencies: [{ kind: "component", type: i2.FsPopoverComponent, selector: "fs-popover" }] });
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclPermissionPopoverComponent, decorators: [{
24
- type: Component,
25
- args: [{ selector: 'acl-permission-popover', template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n {{permission.name}}\n <div class=\"small\">{{description}}</div>\n</ng-template>\n\n", styles: [":host{cursor:pointer}\n"] }]
26
- }], ctorParameters: function () { return [{ type: i1.FsAppAclService }]; }, propDecorators: { permission: [{
27
- type: Input
28
- }] } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXBlcm1pc3Npb24tcG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvYWNsLXBlcm1pc3Npb24tcG9wb3Zlci9hY2wtcGVybWlzc2lvbi1wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcGVybWlzc2lvbi1wb3BvdmVyL2FjbC1wZXJtaXNzaW9uLXBvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBT25FLE1BQU0sT0FBTywrQkFBK0I7SUFNMUMsWUFDVSxjQUErQjtRQUEvQixtQkFBYyxHQUFkLGNBQWMsQ0FBaUI7SUFDckMsQ0FBQztJQUVFLFFBQVE7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRTthQUNuQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NkhBbkJVLCtCQUErQjtpSEFBL0IsK0JBQStCLG9HQ1I1Qyx5TkFVQTs0RkRGYSwrQkFBK0I7a0JBTDNDLFNBQVM7K0JBQ0Usd0JBQXdCO3NHQU16QixVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZzQXBwQWNsU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYXBwLWFjbC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXBlcm1pc3Npb24tcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2wtcGVybWlzc2lvbi1wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNsLXBlcm1pc3Npb24tcG9wb3Zlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZzQWNsUGVybWlzc2lvblBvcG92ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHBlcm1pc3Npb247XG5cbiAgcHVibGljIGRlc2NyaXB0aW9uO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hcHBBY2xTZXJ2aWNlOiBGc0FwcEFjbFNlcnZpY2VcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fYXBwQWNsU2VydmljZS5nZXRQZXJtaXNzaW9ucygpXG4gICAgLnN1YnNjcmliZShwZXJtaXNzaW9ucyA9PiB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gcGVybWlzc2lvbnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdGhpcy5wZXJtaXNzaW9uLnZhbHVlO1xuICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5kZXNjcmlwdGlvbjtcbiAgICAgIH0pWzBdO1xuICAgIH0pO1xuICB9XG59XG4iLCJcbjxmcy1wb3BvdmVyIFt0ZW1wbGF0ZV09XCJwb3BvdmVyXCIgW21heFdpZHRoXT1cIjQwMFwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2ZzLXBvcG92ZXI+XG5cbjxuZy10ZW1wbGF0ZSAjcG9wb3Zlcj5cbiAge3twZXJtaXNzaW9uLm5hbWV9fVxuICA8ZGl2IGNsYXNzPVwic21hbGxcIj57e2Rlc2NyaXB0aW9ufX08L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
@@ -1,254 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
2
- import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
3
- import { AclRoleAccesses } from './../../consts/acl-role-accesses';
4
- import { takeUntil, tap } from 'rxjs/operators';
5
- import { FsMessage } from '@firestitch/message';
6
- import { list } from '@firestitch/common';
7
- import { FsListComponent } from '@firestitch/list';
8
- import { forkJoin, of, Subject } from 'rxjs';
9
- import { FsAppAclService } from './../../services/app-acl.service';
10
- import { AclRoleAccess } from '../../enums/acl-role-access';
11
- import { MatButton } from '@angular/material/button';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "./../../services/app-acl.service";
14
- import * as i2 from "@angular/material/dialog";
15
- import * as i3 from "@firestitch/message";
16
- import * as i4 from "@angular/common";
17
- import * as i5 from "@angular/forms";
18
- import * as i6 from "@angular/material/form-field";
19
- import * as i7 from "@angular/material/checkbox";
20
- import * as i8 from "@angular/material/select";
21
- import * as i9 from "@angular/material/core";
22
- import * as i10 from "@angular/material/button";
23
- import * as i11 from "@angular/material/radio";
24
- import * as i12 from "@angular/material/input";
25
- import * as i13 from "@firestitch/list";
26
- import * as i14 from "@firestitch/dialog";
27
- import * as i15 from "@firestitch/form";
28
- import * as i16 from "@firestitch/label";
29
- import * as i17 from "@firestitch/radiogroup";
30
- import * as i18 from "@firestitch/menu";
31
- import * as i19 from "../../pipes/bulk-options-filter.pipe";
32
- import * as i20 from "../../pipes/acl-role-permission-available.pipe";
33
- export class FsAclRoleComponent {
34
- constructor(_data, _appAclService, _dialogRef, _message, _cdRef) {
35
- this._data = _data;
36
- this._appAclService = _appAclService;
37
- this._dialogRef = _dialogRef;
38
- this._message = _message;
39
- this._cdRef = _cdRef;
40
- this.aclRole = null;
41
- this.permissions = [];
42
- this.levelPermissions = [];
43
- this.AclRoleAccesses = AclRoleAccesses;
44
- this.indexedAccesses = {};
45
- this.aclLevels = [];
46
- this.indexedAclLevels = {};
47
- this.onlyFullAccess = false;
48
- this.AclLevels = {};
49
- this.roleConfigs = [];
50
- this.aclRoleConfigValues = {};
51
- this.aclRolePermissions = {};
52
- this._destroy$ = new Subject();
53
- this.save = () => {
54
- const aclRoleConfigs = this.roleConfigs
55
- .map((roleConfig) => {
56
- return {
57
- name: roleConfig.name,
58
- value: this.aclRoleConfigValues[roleConfig.name],
59
- };
60
- });
61
- const aclRole = {
62
- ...this.aclRole,
63
- permissions: this.levelPermissions.map((permission) => {
64
- return {
65
- value: permission.value,
66
- access: this.aclRolePermissions[permission.value] || 0,
67
- };
68
- }),
69
- aclRoleConfigs,
70
- };
71
- return this._data.saveAclRole(aclRole)
72
- .pipe(tap((response) => {
73
- this._message.success('Saved Changes');
74
- this.close(response);
75
- }));
76
- };
77
- }
78
- ngOnInit() {
79
- forkJoin(this.getRole(), this._appAclService.getPermissions())
80
- .pipe(takeUntil(this._destroy$))
81
- .subscribe(([aclRole, aclPermissions,]) => {
82
- this.permissions = aclPermissions;
83
- this.aclLevels = this._data.aclLevels;
84
- this.disabled = this._data.disabled;
85
- this.indexedAclLevels = list(this.aclLevels, 'name', 'value');
86
- this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');
87
- this.aclRole = {
88
- ...{
89
- aclPermissions: [],
90
- allPermissions: true,
91
- aclRoleConfigs: [],
92
- permissions: {},
93
- level: this.aclLevels[0].value,
94
- },
95
- ...aclRole,
96
- };
97
- this.aclRoleConfigValues = (aclRole.aclRoleConfigs || [])
98
- .reduce((accum, aclRoleConfig) => {
99
- return {
100
- ...accum,
101
- [aclRoleConfig.name]: aclRoleConfig.value,
102
- };
103
- }, {});
104
- if (this.aclRole.id) {
105
- this.permissions.forEach((permission) => {
106
- let access = 0;
107
- const aclPermission = this.aclRole.aclPermissions.find((item) => {
108
- return item.permission === permission.value;
109
- });
110
- if (aclPermission) {
111
- access = aclPermission.access;
112
- }
113
- this.aclRolePermissions[permission.value] = access;
114
- });
115
- }
116
- if (this.aclRole.allPermissions) {
117
- this._applyMaxPermissionAccess();
118
- }
119
- this._updatePermissions();
120
- this._updateRoleConfigs();
121
- this._cdRef.markForCheck();
122
- });
123
- this.listConfig = {
124
- status: false,
125
- paging: false,
126
- rowHoverHighlight: false,
127
- noResults: {
128
- message: '',
129
- },
130
- group: {
131
- initialExpand: true,
132
- groupBy: (data) => {
133
- return data;
134
- },
135
- compareBy: (data) => {
136
- return data.category || 'General';
137
- },
138
- },
139
- fetch: () => {
140
- return of({
141
- data: this.levelPermissions.sort((a, b) => {
142
- a = a.name.toUpperCase();
143
- b = b.name.toUpperCase();
144
- if (a < b) {
145
- return -1;
146
- }
147
- else if (a > b) {
148
- return 1;
149
- }
150
- return 0;
151
- }),
152
- });
153
- },
154
- };
155
- }
156
- bulkChange(value, groupChildren, group) {
157
- groupChildren
158
- .forEach((permission) => {
159
- const access = permission.accesses
160
- .find((access) => value === access);
161
- if (access || !value) {
162
- this.aclRolePermissions[permission.value] = value;
163
- }
164
- });
165
- setTimeout(() => {
166
- this.submitButton.disabled = false;
167
- this.permissionChange();
168
- });
169
- }
170
- permissionChange() {
171
- this.aclRolePermissions = {
172
- ...this.aclRolePermissions,
173
- };
174
- this._cdRef.markForCheck();
175
- }
176
- levelChange() {
177
- this._updatePermissions();
178
- this._updateRoleConfigs();
179
- this.list.reload();
180
- }
181
- getRole() {
182
- if (!this._data.aclRole.id) {
183
- return of(this._data.aclRole);
184
- }
185
- const query = {
186
- aclPermissions: true,
187
- aclRoleConfigs: true,
188
- };
189
- if (!this.environment) {
190
- query.environmentId = null;
191
- }
192
- return this._data.loadAclRole(this._data.aclRole, query);
193
- }
194
- close(data = null) {
195
- this._dialogRef.close(data);
196
- }
197
- allPermissionsChange(all) {
198
- this._updatePermissions();
199
- if (all) {
200
- this._applyMaxPermissionAccess();
201
- }
202
- else {
203
- this._applyNonePermissionAccess();
204
- }
205
- }
206
- ngOnDestroy() {
207
- this._destroy$.next();
208
- this._destroy$.complete();
209
- }
210
- _updatePermissions() {
211
- this.levelPermissions = this.permissions
212
- .filter((permission) => {
213
- return permission.levels.some((item) => {
214
- return item === this.aclRole.level;
215
- });
216
- });
217
- }
218
- _updateRoleConfigs() {
219
- if (this._data.loadRoleConfigs) {
220
- this._data.loadRoleConfigs()
221
- .subscribe((roleConfigs) => {
222
- this.roleConfigs = roleConfigs
223
- .filter((roleConfig) => roleConfig.level === this.aclRole.level);
224
- this._cdRef.markForCheck();
225
- });
226
- }
227
- }
228
- _applyMaxPermissionAccess() {
229
- this.permissions.forEach((permission) => {
230
- this.aclRolePermissions[permission.value] = Math.max(...permission.accesses);
231
- });
232
- }
233
- _applyNonePermissionAccess() {
234
- this.permissions.forEach((permission) => {
235
- this.aclRolePermissions[permission.value] = AclRoleAccess.None;
236
- });
237
- }
238
- }
239
- FsAclRoleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
240
- FsAclRoleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }, { propertyName: "submitButton", first: true, predicate: ["submit"], descendants: true }], ngImport: i0, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">{{ aclRole.id ? 'Edit' : 'Create' }}</ng-container>\n <ng-container *ngIf=\"disabled\">View</ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field> \n <mat-label>Name</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Description</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>Level</fs-label>\n {{indexedAclLevels[aclRole.level]}}\n </fs-label-field>\n\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>All Permissions</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n\n <div class=\"fs-column\" *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>{{roleConfig.label}}</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </fs-label-message>\n </fs-label-field>\n\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"aclRole.level\" [hidden]=\"!levelPermissions.length\" class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-group-cell let-row=\"row\" class=\"permission-group\">\n <div class=\"permission-group\">{{row.category || 'General'}}</div>\n </ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permission\">{{ row.name }}</div>\n <div class=\"description small\">{{ row.description }}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Access\" width=\"1%\" class=\"access\">\n <ng-template \n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template fs-list-cell let-row=\"permission\" let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{indexedAccesses[aclRolePermissions[permission.value]]}}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{access.name}}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button mat-button [mat-dialog-close]=\"null\" type=\"button\">{{ disabled ? 'Done' : 'Cancel' }}</button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>\n", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.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: i13.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i13.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i13.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i13.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { kind: "component", type: i14.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "directive", type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i15.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i15.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i16.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i16.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i16.FsLabelMessageComponent, selector: "fs-label-message" }, { kind: "component", type: i17.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { kind: "component", type: i18.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i18.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: i19.BulkOptionsFilterPipe, name: "builkOptionsFilter" }, { kind: "pipe", type: i20.AclRolePermissionAvailablePipe, name: "aclRolePermissionAvailable" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclRoleComponent, decorators: [{
242
- type: Component,
243
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">{{ aclRole.id ? 'Edit' : 'Create' }}</ng-container>\n <ng-container *ngIf=\"disabled\">View</ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field> \n <mat-label>Name</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Description</mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>Level</fs-label>\n {{indexedAclLevels[aclRole.level]}}\n </fs-label-field>\n\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>All Permissions</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n\n <div class=\"fs-column\" *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>{{roleConfig.label}}</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </fs-label-message>\n </fs-label-field>\n\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>{{roleConfig.description}}</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"aclRole.level\" [hidden]=\"!levelPermissions.length\" class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-group-cell let-row=\"row\" class=\"permission-group\">\n <div class=\"permission-group\">{{row.category || 'General'}}</div>\n </ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permission\">{{ row.name }}</div>\n <div class=\"description small\">{{ row.description }}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Access\" width=\"1%\" class=\"access\">\n <ng-template \n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template fs-list-cell let-row=\"permission\" let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{indexedAccesses[aclRolePermissions[permission.value]]}}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{access.name}}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button mat-button [mat-dialog-close]=\"null\" type=\"button\">{{ disabled ? 'Done' : 'Cancel' }}</button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>\n", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"] }]
244
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
245
- type: Inject,
246
- args: [MAT_DIALOG_DATA]
247
- }] }, { type: i1.FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { list: [{
248
- type: ViewChild,
249
- args: [FsListComponent]
250
- }], submitButton: [{
251
- type: ViewChild,
252
- args: ['submit', { static: false }]
253
- }] } });
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1yb2xlL2FjbC1yb2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRckQsTUFBTSxPQUFPLGtCQUFrQjtJQTJCN0IsWUFDNEMsS0FBVSxFQUNuQyxjQUErQixFQUMvQixVQUE0QyxFQUM1QyxRQUFtQixFQUM1QixNQUF5QjtRQUpT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ZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgQWNsUm9sZUFjY2Vzc2VzIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvYWNsLXJvbGUtYWNjZXNzZXMnO1xuaW1wb3J0IHsgQWNsUm9sZSB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9hY2wtcm9sZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBsaXN0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRnNBcHBBY2xTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hcHAtYWNsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm9sZUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWNsUm9sZUFjY2VzcyB9IGZyb20gJy4uLy4uL2VudW1zL2FjbC1yb2xlLWFjY2Vzcyc7XG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuXG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vYWNsLXJvbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hY2wtcm9sZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRnNBY2xSb2xlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgbGlzdDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgc3VibWl0QnV0dG9uOiBNYXRCdXR0b247XG5cbiAgcHVibGljIGFjbFJvbGU6IEFjbFJvbGUgPSBudWxsO1xuICBwdWJsaWMgZW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBwZXJtaXNzaW9uczogYW55W10gPSBbXTtcbiAgcHVibGljIGxpc3RDb25maWc6IEZzTGlzdENvbmZpZztcbiAgcHVibGljIGxldmVsUGVybWlzc2lvbnMgPSBbXTtcbiAgcHVibGljIEFjbFJvbGVBY2Nlc3NlcyA9IEFjbFJvbGVBY2Nlc3NlcztcbiAgcHVibGljIGluZGV4ZWRBY2Nlc3NlcyA9IHt9O1xuICBwdWJsaWMgYWNsTGV2ZWxzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgaW5kZXhlZEFjbExldmVscyA9IHt9O1xuICBwdWJsaWMgb25seUZ1bGxBY2Nlc3MgPSBmYWxzZTtcbiAgcHVibGljIEFjbExldmVscyA9IHt9O1xuICBwdWJsaWMgcm9sZUNvbmZpZ3M6IFJvbGVDb25maWdbXSA9IFtdO1xuICBwdWJsaWMgYWNsUm9sZUNvbmZpZ1ZhbHVlcyA9IHt9O1xuICBwdWJsaWMgYWNsUm9sZVBlcm1pc3Npb25zID0ge307XG4gIHB1YmxpYyBsb2FkUm9sZUNvbmZpZ3M6IChhY2xSb2xlOiBBY2xSb2xlLCBxdWVyeSkgPT4gT2JzZXJ2YWJsZTxSb2xlQ29uZmlnW10+O1xuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiBhbnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwQWNsU2VydmljZTogRnNBcHBBY2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEZzQWNsUm9sZUNvbXBvbmVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgZm9ya0pvaW4oXG4gICAgICB0aGlzLmdldFJvbGUoKSxcbiAgICAgIHRoaXMuX2FwcEFjbFNlcnZpY2UuZ2V0UGVybWlzc2lvbnMoKSxcbiAgICApXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW1xuICAgICAgICBhY2xSb2xlLFxuICAgICAgICBhY2xQZXJtaXNzaW9ucyxcbiAgICAgIF0pID0+IHtcblxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gYWNsUGVybWlzc2lvbnM7XG4gICAgICAgIHRoaXMuYWNsTGV2ZWxzID0gdGhpcy5fZGF0YS5hY2xMZXZlbHM7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0aGlzLl9kYXRhLmRpc2FibGVkO1xuXG4gICAgICAgIHRoaXMuaW5kZXhlZEFjbExldmVscyA9IGxpc3QodGhpcy5hY2xMZXZlbHMsICduYW1lJywgJ3ZhbHVlJyk7XG4gICAgICAgIHRoaXMuaW5kZXhlZEFjY2Vzc2VzID0gbGlzdChBY2xSb2xlQWNjZXNzZXMsICduYW1lJywgJ3ZhbHVlJyk7XG5cbiAgICAgICAgdGhpcy5hY2xSb2xlID0ge1xuICAgICAgICAgIC4uLntcbiAgICAgICAgICAgIGFjbFBlcm1pc3Npb25zOiBbXSxcbiAgICAgICAgICAgIGFsbFBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZUNvbmZpZ3M6IFtdLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHt9LFxuICAgICAgICAgICAgbGV2ZWw6IHRoaXMuYWNsTGV2ZWxzWzBdLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYWNsUm9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFjbFJvbGVDb25maWdWYWx1ZXMgPSAoYWNsUm9sZS5hY2xSb2xlQ29uZmlncyB8fCBbXSlcbiAgICAgICAgICAucmVkdWNlKChhY2N1bSwgYWNsUm9sZUNvbmZpZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uYWNjdW0sXG4gICAgICAgICAgICAgIFthY2xSb2xlQ29uZmlnLm5hbWVdOiBhY2xSb2xlQ29uZmlnLnZhbHVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICBpZiAodGhpcy5hY2xSb2xlLmlkKSB7XG4gICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWNjZXNzID0gMDtcblxuICAgICAgICAgICAgY29uc3QgYWNsUGVybWlzc2lvbiA9IHRoaXMuYWNsUm9sZS5hY2xQZXJtaXNzaW9ucy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLnBlcm1pc3Npb24gPT09IHBlcm1pc3Npb24udmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFjbFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgICAgYWNjZXNzID0gYWNsUGVybWlzc2lvbi5hY2Nlc3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gYWNjZXNzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWNsUm9sZS5hbGxQZXJtaXNzaW9ucykge1xuICAgICAgICAgIHRoaXMuX2FwcGx5TWF4UGVybWlzc2lvbkFjY2VzcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUm9sZUNvbmZpZ3MoKTtcblxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5saXN0Q29uZmlnID0ge1xuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICByb3dIb3ZlckhpZ2hsaWdodDogZmFsc2UsXG4gICAgICBub1Jlc3VsdHM6IHtcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICB9LFxuICAgICAgZ3JvdXA6IHtcbiAgICAgICAgaW5pdGlhbEV4cGFuZDogdHJ1ZSxcbiAgICAgICAgZ3JvdXBCeTogKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGFyZUJ5OiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhLmNhdGVnb3J5IHx8ICdHZW5lcmFsJztcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmZXRjaDogKCkgPT4ge1xuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgIGRhdGE6IHRoaXMubGV2ZWxQZXJtaXNzaW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBhID0gYS5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBiID0gYi5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGJ1bGtDaGFuZ2UodmFsdWU6IG51bWJlciwgZ3JvdXBDaGlsZHJlbiwgZ3JvdXApOiB2b2lkIHtcbiAgICBncm91cENoaWxkcmVuXG4gICAgICAuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICBjb25zdCBhY2Nlc3MgPSBwZXJtaXNzaW9uLmFjY2Vzc2VzXG4gICAgICAgICAgLmZpbmQoKGFjY2VzcykgPT4gdmFsdWUgPT09IGFjY2Vzcyk7XG5cbiAgICAgICAgaWYoYWNjZXNzIHx8ICF2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5wZXJtaXNzaW9uQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcGVybWlzc2lvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjbFJvbGVQZXJtaXNzaW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuYWNsUm9sZVBlcm1pc3Npb25zLCAgICAgICAgXG4gICAgfTtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBsZXZlbENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZVJvbGVDb25maWdzKCk7XG4gICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICB9XG5cbiAgcHVibGljIGdldFJvbGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuYWNsUm9sZS5pZCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuX2RhdGEuYWNsUm9sZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHtcbiAgICAgIGFjbFBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgYWNsUm9sZUNvbmZpZ3M6IHRydWUsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5lbnZpcm9ubWVudCkge1xuICAgICAgcXVlcnkuZW52aXJvbm1lbnRJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGEubG9hZEFjbFJvbGUodGhpcy5fZGF0YS5hY2xSb2xlLCBxdWVyeSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSA9ICgpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgIGNvbnN0IGFjbFJvbGVDb25maWdzID0gdGhpcy5yb2xlQ29uZmlnc1xuICAgICAgLm1hcCgocm9sZUNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHJvbGVDb25maWcubmFtZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5hY2xSb2xlQ29uZmlnVmFsdWVzW3JvbGVDb25maWcubmFtZV0sXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29uc3QgYWNsUm9sZSA9IHtcbiAgICAgIC4uLnRoaXMuYWNsUm9sZSxcbiAgICAgIHBlcm1pc3Npb25zOiB0aGlzLmxldmVsUGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHBlcm1pc3Npb24udmFsdWUsXG4gICAgICAgICAgYWNjZXNzOiB0aGlzLmFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSB8fCAwLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBhY2xSb2xlQ29uZmlncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuc2F2ZUFjbFJvbGUoYWNsUm9sZSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBDaGFuZ2VzJyk7XG4gICAgICAgICAgdGhpcy5jbG9zZShyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZShkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGFsbFBlcm1pc3Npb25zQ2hhbmdlKGFsbDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVBlcm1pc3Npb25zKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgdGhpcy5fYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FwcGx5Tm9uZVBlcm1pc3Npb25BY2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVQZXJtaXNzaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsUGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zXG4gICAgLmZpbHRlcigocGVybWlzc2lvbikgPT4ge1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb24ubGV2ZWxzLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gPT09IHRoaXMuYWNsUm9sZS5sZXZlbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUm9sZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYodGhpcy5fZGF0YS5sb2FkUm9sZUNvbmZpZ3MpIHtcbiAgICAgIHRoaXMuX2RhdGEubG9hZFJvbGVDb25maWdzKClcbiAgICAgIC5zdWJzY3JpYmUoKHJvbGVDb25maWdzOiBSb2xlQ29uZmlnW10pID0+IHtcbiAgICAgICAgdGhpcy5yb2xlQ29uZmlncyA9IHJvbGVDb25maWdzXG4gICAgICAgICAgLmZpbHRlcigocm9sZUNvbmZpZykgPT4gcm9sZUNvbmZpZy5sZXZlbCA9PT0gdGhpcy5hY2xSb2xlLmxldmVsKTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICB0aGlzLmFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSA9IE1hdGgubWF4KC4uLnBlcm1pc3Npb24uYWNjZXNzZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlOb25lUGVybWlzc2lvbkFjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gQWNsUm9sZUFjY2Vzcy5Ob25lO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmb3JtIGZzRm9ybSBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWNsUm9sZVwiPlxuICAgICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc2FibGVkXCI+e3sgYWNsUm9sZS5pZCA/ICdFZGl0JyA6ICdDcmVhdGUnIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNhYmxlZFwiPlZpZXc8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgUm9sZVxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sYXJnZS5hbGlnbi1zdGFydFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gbGVmdC1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5OYW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIGZzRm9ybVJlcXVpcmVkPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPkRlc2NyaXB0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYWNsUm9sZS5pZCB8fCBhY2xMZXZlbHMubGVuZ3RoID09PSAxOyBlbHNlIGxldmVsc1wiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+TGV2ZWw8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICB7e2luZGV4ZWRBY2xMZXZlbHNbYWNsUm9sZS5sZXZlbF19fVxuICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsZXZlbHM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxmcy1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjbFJvbGUubGV2ZWxcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsZXZlbENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgZnNGb3JtUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJMZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwibGV2ZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWNsTGV2ZWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9mcy1yYWRpby1ncm91cD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+QWxsIFBlcm1pc3Npb25zPC9mcy1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmFsbFBlcm1pc3Npb25zXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImFsbFBlcm1pc3Npb25zQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWQgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImFsbFBlcm1pc3Npb25zXCI+XG4gICAgICAgICAgICAgICAgRW5hYmxlXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtblwiICpuZ0Zvcj1cImxldCByb2xlQ29uZmlnIG9mIHJvbGVDb25maWdzXCI+XG4gICAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cInJvbGVDb25maWcudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbD57e3JvbGVDb25maWcubGFiZWx9fTwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjbFJvbGVDb25maWdWYWx1ZXNbcm9sZUNvbmZpZy5uYW1lXVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInJvbGVDb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgRW5hYmxlXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPGZzLWxhYmVsLW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+e3tyb2xlQ29uZmlnLmRlc2NyaXB0aW9ufX08L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtbWVzc2FnZT5cbiAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb2xlQ29uZmlnLnR5cGUgPT09ICdzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlQ29uZmlnVmFsdWVzW3JvbGVDb25maWcubmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJyb2xlQ29uZmlnLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicm9sZUNvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJyb2xlQ29uZmlnLmxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJvbGVDb25maWcudmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPG1hdC1oaW50Pnt7cm9sZUNvbmZpZy5kZXNjcmlwdGlvbn19PC9tYXQtaGludD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjbFJvbGUubGV2ZWxcIiBbaGlkZGVuXT1cIiFsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiIGNsYXNzPVwicGVybWlzc2lvbnMgZnMtY29sdW1uXCI+XG4gICAgICAgICAgICA8ZnMtbGlzdCBbY29uZmlnXT1cImxpc3RDb25maWdcIj5cbiAgICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiUGVybWlzc2lvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1ncm91cC1jZWxsIGxldC1yb3c9XCJyb3dcIiBjbGFzcz1cInBlcm1pc3Npb24tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwXCI+e3tyb3cuY2F0ZWdvcnkgfHwgJ0dlbmVyYWwnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcm1pc3Npb25cIj57eyByb3cubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uIHNtYWxsXCI+e3sgcm93LmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiQWNjZXNzXCIgd2lkdGg9XCIxJVwiIGNsYXNzPVwiYWNjZXNzXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFxuICAgICAgICAgICAgICAgICAgICBmcy1saXN0LWdyb3VwLWNlbGxcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvdz1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1ncm91cD1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWdyb3VwQ2hpbGRyZW49XCJncm91cENoaWxkcmVuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgYWxpZ249XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhY2xSb2xlLmFsbFBlcm1pc3Npb25zICYmICFkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY2Nlc3Mgb2YgQWNsUm9sZUFjY2Vzc2VzIHwgYnVpbGtPcHRpb25zRmlsdGVyOiBncm91cENoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnVsa0NoYW5nZShhY2Nlc3MudmFsdWUsIGdyb3VwQ2hpbGRyZW4sIGdyb3VwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhY2Nlc3MubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9mcy1tZW51PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJwZXJtaXNzaW9uXCIgbGV0LXBlcm1pc3Npb249XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWNsUm9sZS5hbGxQZXJtaXNzaW9ucyB8fCBkaXNhYmxlZDsgZWxzZSBlbHNlQWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aW5kZXhlZEFjY2Vzc2VzW2FjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXV19fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQWxsPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVybWlzc2lvbnxhY2xSb2xlUGVybWlzc2lvbkF2YWlsYWJsZTphY2xSb2xlUGVybWlzc2lvbnM7IGVsc2UgcGVybWlzc2lvblJlcXVpcmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2FjY2Vzcy0nICsgcGVybWlzc2lvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGVybWlzc2lvbkNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjY2VzcyBvZiBBY2xSb2xlQWNjZXNzZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjY2Vzcy52YWx1ZSA9PT0gMCB8fCBwZXJtaXNzaW9uLmFjY2Vzc2VzLmluZGV4T2YoYWNjZXNzLnZhbHVlKSAhPT0gLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYWNjZXNzLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FjY2Vzcy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Blcm1pc3Npb25SZXF1aXJlcz5cbiAgICAgICAgICAgICAgICAgICAgICBVbmF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgPC9mcy1saXN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgI3N1Ym1pdFxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICB7eyBhY2xSb2xlLmlkID8gJ1NhdmUnIDogJ0NyZWF0ZScgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCIgdHlwZT1cImJ1dHRvblwiPnt7IGRpc2FibGVkID8gJ0RvbmUnIDogJ0NhbmNlbCcgfX08L2J1dHRvbj5cbiAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT5cbiJdfQ==
@@ -1,34 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { FsAppAclService } from './../../services/app-acl.service';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./../../services/app-acl.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@firestitch/popover";
7
- export class FsAclRolePopoverComponent {
8
- constructor(_appAclService) {
9
- this._appAclService = _appAclService;
10
- this.permissions = [];
11
- }
12
- ngOnInit() {
13
- const aclRolePermissions = this.aclRole.permissions || [];
14
- this._appAclService.getPermissions()
15
- .subscribe((response) => {
16
- this.permissions = response.filter(item => {
17
- return aclRolePermissions.some(permission => {
18
- return item.value === permission.value;
19
- });
20
- });
21
- });
22
- }
23
- }
24
- FsAclRolePopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclRolePopoverComponent, deps: [{ token: i1.FsAppAclService }], target: i0.ɵɵFactoryTarget.Component });
25
- FsAclRolePopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: { aclRole: "aclRole", objectName: "objectName" }, ngImport: i0, template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n <div class=\"name small\">{{aclRole.name}}<span *ngIf=\"objectName\">: {{objectName}}</span></div>\n\n <ng-container *ngIf=\"permissions.length; else nonePermission\">\n <div *ngFor=\"let permission of permissions\" class=\"permission\">\n <div>{{permission.name}}</div>\n <div class=\"small\">{{permission.description}}</div>\n </div>\n </ng-container>\n\n <ng-template #nonePermission>\n None\n </ng-template>\n</ng-template>\n", styles: [".name{padding-bottom:10px}.permission+.permission{padding-top:5px}:host{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FsPopoverComponent, selector: "fs-popover" }] });
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FsAclRolePopoverComponent, decorators: [{
27
- type: Component,
28
- args: [{ selector: 'fs-acl-role-popover', template: "\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n <div class=\"name small\">{{aclRole.name}}<span *ngIf=\"objectName\">: {{objectName}}</span></div>\n\n <ng-container *ngIf=\"permissions.length; else nonePermission\">\n <div *ngFor=\"let permission of permissions\" class=\"permission\">\n <div>{{permission.name}}</div>\n <div class=\"small\">{{permission.description}}</div>\n </div>\n </ng-container>\n\n <ng-template #nonePermission>\n None\n </ng-template>\n</ng-template>\n", styles: [".name{padding-bottom:10px}.permission+.permission{padding-top:5px}:host{cursor:pointer}\n"] }]
29
- }], ctorParameters: function () { return [{ type: i1.FsAppAclService }]; }, propDecorators: { aclRole: [{
30
- type: Input
31
- }], objectName: [{
32
- type: Input
33
- }] } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUtcG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvYWNsLXJvbGUtcG9wb3Zlci9hY2wtcm9sZS1wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS1wb3BvdmVyL2FjbC1yb2xlLXBvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7OztBQU9uRSxNQUFNLE9BQU8seUJBQXlCO0lBT3BDLFlBQ21CLGNBQStCO1FBQS9CLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtRQUgzQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQUlyQixDQUFDO0lBRUcsUUFBUTtRQUNiLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBRTFELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFO2FBQ2pDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEMsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUN6QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzt1SEF0QlUseUJBQXlCOzJHQUF6Qix5QkFBeUIscUhDUnRDLHdrQkFtQkE7NEZEWGEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHFCQUFxQjtzR0FNdEIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZzQXBwQWNsU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYXBwLWFjbC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWNsLXJvbGUtcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2wtcm9sZS1wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNsLXJvbGUtcG9wb3Zlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZzQWNsUm9sZVBvcG92ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGFjbFJvbGU7XG4gIEBJbnB1dCgpIG9iamVjdE5hbWU7XG5cbiAgcHVibGljIHBlcm1pc3Npb25zID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FwcEFjbFNlcnZpY2U6IEZzQXBwQWNsU2VydmljZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBhY2xSb2xlUGVybWlzc2lvbnMgPSB0aGlzLmFjbFJvbGUucGVybWlzc2lvbnMgfHwgW107XG5cbiAgICB0aGlzLl9hcHBBY2xTZXJ2aWNlLmdldFBlcm1pc3Npb25zKClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSByZXNwb25zZS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFjbFJvbGVQZXJtaXNzaW9ucy5zb21lKHBlcm1pc3Npb24gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWUgPT09IHBlcm1pc3Npb24udmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiXG48ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwicG9wb3ZlclwiIFttYXhXaWR0aF09XCI0MDBcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9mcy1wb3BvdmVyPlxuXG48bmctdGVtcGxhdGUgI3BvcG92ZXI+XG4gIDxkaXYgY2xhc3M9XCJuYW1lIHNtYWxsXCI+e3thY2xSb2xlLm5hbWV9fTxzcGFuICpuZ0lmPVwib2JqZWN0TmFtZVwiPjoge3tvYmplY3ROYW1lfX08L3NwYW4+PC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlcm1pc3Npb25zLmxlbmd0aDsgZWxzZSBub25lUGVybWlzc2lvblwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnNcIiBjbGFzcz1cInBlcm1pc3Npb25cIj5cbiAgICAgIDxkaXY+e3twZXJtaXNzaW9uLm5hbWV9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+e3twZXJtaXNzaW9uLmRlc2NyaXB0aW9ufX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICNub25lUGVybWlzc2lvbj5cbiAgICBOb25lXG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19