@dangl/angular-ava 0.1.1-fe--1-add-tree-p0053

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 (62) hide show
  1. package/README.md +1 -0
  2. package/esm2022/dangl-angular-ava.mjs +5 -0
  3. package/esm2022/lib/angular-ava.module.mjs +88 -0
  4. package/esm2022/lib/ava-tree/tree/components/ava-tree/ava-tree.component.mjs +356 -0
  5. package/esm2022/lib/ava-tree/tree/components/list-structure/list-structure.component.mjs +38 -0
  6. package/esm2022/lib/ava-tree/tree/components/table-structure/table-structure.component.mjs +99 -0
  7. package/esm2022/lib/ava-tree/tree/components/tree-item/tree-item.component.mjs +89 -0
  8. package/esm2022/lib/ava-tree/tree/components/tree-node/tree-node.component.mjs +52 -0
  9. package/esm2022/lib/ava-tree/tree/components/tree-structure/tree-structure.component.mjs +30 -0
  10. package/esm2022/lib/ava-tree/tree/constants/defaultFilters.mjs +6 -0
  11. package/esm2022/lib/ava-tree/tree/constants/defaultTextWords.mjs +11 -0
  12. package/esm2022/lib/ava-tree/tree/constants/index.mjs +4 -0
  13. package/esm2022/lib/ava-tree/tree/directives/save-changing-view.directive.mjs +43 -0
  14. package/esm2022/lib/ava-tree/tree/model/ava-models.mjs +199 -0
  15. package/esm2022/lib/ava-tree/tree/model/context-menu-data.model.mjs +2 -0
  16. package/esm2022/lib/ava-tree/tree/model/function-view-line.model.mjs +2 -0
  17. package/esm2022/lib/ava-tree/tree/model/index.mjs +4 -0
  18. package/esm2022/lib/ava-tree/tree/model/selecting.model.mjs +2 -0
  19. package/esm2022/lib/ava-tree/tree/model/tableColumnType.mjs +2 -0
  20. package/esm2022/lib/ava-tree/tree/model/tree-mode.model.mjs +7 -0
  21. package/esm2022/lib/ava-tree/tree/pipes/element-icon-name.pipe.mjs +27 -0
  22. package/esm2022/lib/ava-tree/tree/pipes/element-item-number.pipe.mjs +23 -0
  23. package/esm2022/lib/ava-tree/tree/pipes/element-text.pipe.mjs +27 -0
  24. package/esm2022/lib/ava-tree/tree/services/expand-parent-group.service.mjs +32 -0
  25. package/esm2022/lib/ava-tree/tree/services/flat-elements.service.mjs +99 -0
  26. package/esm2022/lib/ava-tree/tree/services/keyboard-operation.service.mjs +114 -0
  27. package/esm2022/lib/ava-tree/tree/services/select-element.service.mjs +37 -0
  28. package/esm2022/lib/ava-tree/tree/services/tree-node-selection.service.mjs +133 -0
  29. package/esm2022/lib/version.mjs +10 -0
  30. package/esm2022/public-api.mjs +8 -0
  31. package/fesm2022/dangl-angular-ava.mjs +1174 -0
  32. package/fesm2022/dangl-angular-ava.mjs.map +1 -0
  33. package/index.d.ts +5 -0
  34. package/lib/angular-ava.module.d.ts +26 -0
  35. package/lib/ava-tree/tree/components/ava-tree/ava-tree.component.d.ts +77 -0
  36. package/lib/ava-tree/tree/components/list-structure/list-structure.component.d.ts +16 -0
  37. package/lib/ava-tree/tree/components/table-structure/table-structure.component.d.ts +34 -0
  38. package/lib/ava-tree/tree/components/tree-item/tree-item.component.d.ts +34 -0
  39. package/lib/ava-tree/tree/components/tree-node/tree-node.component.d.ts +22 -0
  40. package/lib/ava-tree/tree/components/tree-structure/tree-structure.component.d.ts +13 -0
  41. package/lib/ava-tree/tree/constants/defaultFilters.d.ts +1 -0
  42. package/lib/ava-tree/tree/constants/defaultTextWords.d.ts +11 -0
  43. package/lib/ava-tree/tree/constants/index.d.ts +3 -0
  44. package/lib/ava-tree/tree/directives/save-changing-view.directive.d.ts +12 -0
  45. package/lib/ava-tree/tree/model/ava-models.d.ts +1041 -0
  46. package/lib/ava-tree/tree/model/context-menu-data.model.d.ts +8 -0
  47. package/lib/ava-tree/tree/model/function-view-line.model.d.ts +11 -0
  48. package/lib/ava-tree/tree/model/index.d.ts +7 -0
  49. package/lib/ava-tree/tree/model/selecting.model.d.ts +14 -0
  50. package/lib/ava-tree/tree/model/tableColumnType.d.ts +6 -0
  51. package/lib/ava-tree/tree/model/tree-mode.model.d.ts +5 -0
  52. package/lib/ava-tree/tree/pipes/element-icon-name.pipe.d.ts +8 -0
  53. package/lib/ava-tree/tree/pipes/element-item-number.pipe.d.ts +8 -0
  54. package/lib/ava-tree/tree/pipes/element-text.pipe.d.ts +8 -0
  55. package/lib/ava-tree/tree/services/expand-parent-group.service.d.ts +7 -0
  56. package/lib/ava-tree/tree/services/flat-elements.service.d.ts +28 -0
  57. package/lib/ava-tree/tree/services/keyboard-operation.service.d.ts +32 -0
  58. package/lib/ava-tree/tree/services/select-element.service.d.ts +30 -0
  59. package/lib/ava-tree/tree/services/tree-node-selection.service.d.ts +23 -0
  60. package/lib/version.d.ts +8 -0
  61. package/package.json +31 -0
  62. package/public-api.d.ts +4 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Dangl.AngularAva
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtYW5ndWxhci1hdmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF2YS9zcmMvZGFuZ2wtYW5ndWxhci1hdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,88 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatCheckboxModule } from '@angular/material/checkbox';
6
+ import { MatRippleModule } from '@angular/material/core';
7
+ import { MatFormFieldModule } from '@angular/material/form-field';
8
+ import { MatIconModule } from '@angular/material/icon';
9
+ import { MatInputModule } from '@angular/material/input';
10
+ import { MatTableModule } from '@angular/material/table';
11
+ import { MatTooltipModule } from '@angular/material/tooltip';
12
+ import { AvaTreeComponent } from './ava-tree/tree/components/ava-tree/ava-tree.component';
13
+ import { ListStructureComponent } from './ava-tree/tree/components/list-structure/list-structure.component';
14
+ import { TableStructureComponent } from './ava-tree/tree/components/table-structure/table-structure.component';
15
+ import { TreeItemComponent } from './ava-tree/tree/components/tree-item/tree-item.component';
16
+ import { TreeNodeComponent } from './ava-tree/tree/components/tree-node/tree-node.component';
17
+ import { TreeStructureComponent } from './ava-tree/tree/components/tree-structure/tree-structure.component';
18
+ import { SaveChangingViewDirective } from './ava-tree/tree/directives/save-changing-view.directive';
19
+ import { ElementIconNamePipe } from './ava-tree/tree/pipes/element-icon-name.pipe';
20
+ import { ElementItemNumberPipe } from './ava-tree/tree/pipes/element-item-number.pipe';
21
+ import { ElementTextPipe } from './ava-tree/tree/pipes/element-text.pipe';
22
+ import * as i0 from "@angular/core";
23
+ export class AngularAvaModule {
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, declarations: [TreeStructureComponent,
26
+ TreeNodeComponent,
27
+ AvaTreeComponent,
28
+ TreeItemComponent,
29
+ ListStructureComponent,
30
+ TableStructureComponent,
31
+ ElementIconNamePipe,
32
+ ElementTextPipe,
33
+ ElementItemNumberPipe,
34
+ SaveChangingViewDirective], imports: [CommonModule,
35
+ MatIconModule,
36
+ MatRippleModule,
37
+ MatInputModule,
38
+ MatFormFieldModule,
39
+ ReactiveFormsModule,
40
+ FormsModule,
41
+ MatButtonModule,
42
+ MatCheckboxModule,
43
+ MatTableModule,
44
+ MatTooltipModule], exports: [AvaTreeComponent] }); }
45
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, imports: [CommonModule,
46
+ MatIconModule,
47
+ MatRippleModule,
48
+ MatInputModule,
49
+ MatFormFieldModule,
50
+ ReactiveFormsModule,
51
+ FormsModule,
52
+ MatButtonModule,
53
+ MatCheckboxModule,
54
+ MatTableModule,
55
+ MatTooltipModule] }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, decorators: [{
58
+ type: NgModule,
59
+ args: [{
60
+ declarations: [
61
+ TreeStructureComponent,
62
+ TreeNodeComponent,
63
+ AvaTreeComponent,
64
+ TreeItemComponent,
65
+ ListStructureComponent,
66
+ TableStructureComponent,
67
+ ElementIconNamePipe,
68
+ ElementTextPipe,
69
+ ElementItemNumberPipe,
70
+ SaveChangingViewDirective
71
+ ],
72
+ imports: [
73
+ CommonModule,
74
+ MatIconModule,
75
+ MatRippleModule,
76
+ MatInputModule,
77
+ MatFormFieldModule,
78
+ ReactiveFormsModule,
79
+ FormsModule,
80
+ MatButtonModule,
81
+ MatCheckboxModule,
82
+ MatTableModule,
83
+ MatTooltipModule
84
+ ],
85
+ exports: [AvaTreeComponent]
86
+ }]
87
+ }] });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hdmEubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hbmd1bGFyLWF2YS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDcEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQThCMUUsTUFBTSxPQUFPLGdCQUFnQjs4R0FBaEIsZ0JBQWdCOytHQUFoQixnQkFBZ0IsaUJBMUJ6QixzQkFBc0I7WUFDdEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsc0JBQXNCO1lBQ3RCLHVCQUF1QjtZQUN2QixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLHFCQUFxQjtZQUNyQix5QkFBeUIsYUFHekIsWUFBWTtZQUNaLGFBQWE7WUFDYixlQUFlO1lBQ2YsY0FBYztZQUNkLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsV0FBVztZQUNYLGVBQWU7WUFDZixpQkFBaUI7WUFDakIsY0FBYztZQUNkLGdCQUFnQixhQUVSLGdCQUFnQjsrR0FFZixnQkFBZ0IsWUFkekIsWUFBWTtZQUNaLGFBQWE7WUFDYixlQUFlO1lBQ2YsY0FBYztZQUNkLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsV0FBVztZQUNYLGVBQWU7WUFDZixpQkFBaUI7WUFDakIsY0FBYztZQUNkLGdCQUFnQjs7MkZBSVAsZ0JBQWdCO2tCQTVCNUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osc0JBQXNCO3dCQUN0QixpQkFBaUI7d0JBQ2pCLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQixzQkFBc0I7d0JBQ3RCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIseUJBQXlCO3FCQUMxQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0UmlwcGxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgQXZhVHJlZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL2F2YS10cmVlL2F2YS10cmVlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExpc3RTdHJ1Y3R1cmVDb21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy9saXN0LXN0cnVjdHVyZS9saXN0LXN0cnVjdHVyZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUYWJsZVN0cnVjdHVyZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL3RhYmxlLXN0cnVjdHVyZS90YWJsZS1zdHJ1Y3R1cmUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHJlZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLWl0ZW0vdHJlZS1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvdHJlZS1ub2RlL3RyZWUtbm9kZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmVlU3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvdHJlZS1zdHJ1Y3R1cmUvdHJlZS1zdHJ1Y3R1cmUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2F2ZUNoYW5naW5nVmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9kaXJlY3RpdmVzL3NhdmUtY2hhbmdpbmctdmlldy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFbGVtZW50SWNvbk5hbWVQaXBlIH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL3BpcGVzL2VsZW1lbnQtaWNvbi1uYW1lLnBpcGUnO1xyXG5pbXBvcnQgeyBFbGVtZW50SXRlbU51bWJlclBpcGUgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvcGlwZXMvZWxlbWVudC1pdGVtLW51bWJlci5waXBlJztcclxuaW1wb3J0IHsgRWxlbWVudFRleHRQaXBlIH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL3BpcGVzL2VsZW1lbnQtdGV4dC5waXBlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBUcmVlU3RydWN0dXJlQ29tcG9uZW50LFxyXG4gICAgVHJlZU5vZGVDb21wb25lbnQsXHJcbiAgICBBdmFUcmVlQ29tcG9uZW50LFxyXG4gICAgVHJlZUl0ZW1Db21wb25lbnQsXHJcbiAgICBMaXN0U3RydWN0dXJlQ29tcG9uZW50LFxyXG4gICAgVGFibGVTdHJ1Y3R1cmVDb21wb25lbnQsXHJcbiAgICBFbGVtZW50SWNvbk5hbWVQaXBlLFxyXG4gICAgRWxlbWVudFRleHRQaXBlLFxyXG4gICAgRWxlbWVudEl0ZW1OdW1iZXJQaXBlLFxyXG4gICAgU2F2ZUNoYW5naW5nVmlld0RpcmVjdGl2ZVxyXG4gIF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFJpcHBsZU1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGVcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtBdmFUcmVlQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckF2YU1vZHVsZSB7fVxyXG4iXX0=
@@ -0,0 +1,356 @@
1
+ import { Component, EventEmitter, Input, Output, Self, ViewChild } from '@angular/core';
2
+ import { ReplaySubject, Subject, debounceTime, filter, fromEvent, takeUntil } from 'rxjs';
3
+ import { DEFAULT_FILTERS, DEFAULT_TEXT_WORDS } from '../../constants';
4
+ import { ModeViewType } from '../../model';
5
+ import { FlatElementsService } from '../../services/flat-elements.service';
6
+ import { SelectElementService } from '../../services/select-element.service';
7
+ import { ExpandParentGroupService } from 'projects/angular-ava/src/lib/ava-tree/tree/services/expand-parent-group.service';
8
+ import { KeyboardOperationService, KeyboardOperationType } from 'projects/angular-ava/src/lib/ava-tree/tree/services/keyboard-operation.service';
9
+ import { TreeNodeSelectionService } from 'projects/angular-ava/src/lib/ava-tree/tree/services/tree-node-selection.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../services/flat-elements.service";
12
+ import * as i2 from "../../services/select-element.service";
13
+ import * as i3 from "projects/angular-ava/src/lib/ava-tree/tree/services/tree-node-selection.service";
14
+ import * as i4 from "projects/angular-ava/src/lib/ava-tree/tree/services/expand-parent-group.service";
15
+ import * as i5 from "projects/angular-ava/src/lib/ava-tree/tree/services/keyboard-operation.service";
16
+ import * as i6 from "@angular/common";
17
+ import * as i7 from "@angular/material/icon";
18
+ import * as i8 from "@angular/material/input";
19
+ import * as i9 from "@angular/material/form-field";
20
+ import * as i10 from "@angular/forms";
21
+ import * as i11 from "@angular/material/button";
22
+ import * as i12 from "@angular/material/tooltip";
23
+ import * as i13 from "../tree-structure/tree-structure.component";
24
+ import * as i14 from "../list-structure/list-structure.component";
25
+ import * as i15 from "../table-structure/table-structure.component";
26
+ export class AvaTreeComponent {
27
+ /**With this parameter, we can configure which keys will be listen to switch the tree elements,
28
+ * and also to disable the functionality of the keys */
29
+ set customKeyboardOperationConfig(config) {
30
+ this.keyboardOperationService.mergeConfigOperation(config);
31
+ }
32
+ // ***************************************************
33
+ // functionView: Array of objects
34
+ // {
35
+ // name: string, // name of view part: you can add/remove it when it need
36
+ // func: (element: any, result?: any) => boolean, // this filter function calculate condition to change view
37
+ // view: {
38
+ // iconName?: string, // changed name of icon
39
+ // iconColor?: string, // changed color of icon
40
+ // textBold?: string, // changed weight of text
41
+ // textColor?: string // changed color of text
42
+ // }
43
+ // }
44
+ // ****************************************************
45
+ set textWords(words) {
46
+ this._textWords = { ...this.textWords, ...words };
47
+ } // allow to translate all texts to other language
48
+ get textWords() {
49
+ return this._textWords;
50
+ }
51
+ constructor(flatElementsService, selectElementService, treeNodeSelectionService, expandParentGroupService, keyboardOperationService, ngZone) {
52
+ this.flatElementsService = flatElementsService;
53
+ this.selectElementService = selectElementService;
54
+ this.treeNodeSelectionService = treeNodeSelectionService;
55
+ this.expandParentGroupService = expandParentGroupService;
56
+ this.keyboardOperationService = keyboardOperationService;
57
+ this.ngZone = ngZone;
58
+ this.project = null; // main data
59
+ this.expansionState = {}; // object with expanded groups at the begin
60
+ this.selectedNodeId = null; // id if selected element at the begin
61
+ this.indent = '20px'; // optional - for changing indents each group
62
+ this.selectedColor = null; // optional - for changing background of selected line (default: primary form MaterialUI)
63
+ this.modeView = ModeViewType.Tree; // structure view: Tree(default) / List / Table
64
+ this.limitedControl = true; // use keyboard only if cursor is over of tree
65
+ this.isSelectionMode = false; // mode for selecting by checkbox
66
+ this.selectingElements = null; // optional - selected elements at the begin
67
+ this.listFilterFunc = DEFAULT_FILTERS; // allow to program filtering by filter function: (element: any, filter: string) => boolean
68
+ this.addTableColumns = []; // optional - allow to add displayed columns for table
69
+ // ***************************************************
70
+ // addTableColumns: Array of objects
71
+ // {
72
+ // name: string, // name of column
73
+ // title: string, // showed title of column
74
+ // align?: string, // optional alight: left(default) / center / right
75
+ // numberFormat?: string // optional format of number value, example: '1.2-2'
76
+ // }
77
+ // ***************************************************
78
+ this.functionView = null; // allow to program view for each element by filter
79
+ this._textWords = null;
80
+ // *******************************************************
81
+ // {
82
+ // textSearch: string,
83
+ // textNothing: string,
84
+ // textNothingFiltered: string,
85
+ // textAll: string,
86
+ // tooltipAllOpen: string,
87
+ // tooltipAllClose: string,
88
+ // tooltipAllAdd:string,
89
+ // tooltipAllRemove: string,
90
+ // }
91
+ // ********************************************************
92
+ this.selectClick = new EventEmitter(); // event after element selected by click
93
+ this.selectDblClick = new EventEmitter(); // event after element selected by double click
94
+ this.contextMenuEvent = new EventEmitter(); // event after element call context menu by right button click
95
+ this.selectedElementsChanged = new EventEmitter(); // event after changed selecting in selecting mode
96
+ this.selectedElement = null;
97
+ this.isListenKeyboard = false;
98
+ this.isEmiteSelectedElements = false;
99
+ this.selectingElementsTreeData = [];
100
+ this.flatElements = null;
101
+ this.preselectedElement = null;
102
+ this.filterInput = '';
103
+ this.listModeViewType = ModeViewType;
104
+ this.filter = '';
105
+ this.$filter = new ReplaySubject(1);
106
+ this.filteredElementList = [];
107
+ this.$destroy = new Subject();
108
+ this._textWords = { ...DEFAULT_TEXT_WORDS };
109
+ }
110
+ ngOnInit() {
111
+ this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((e) => (this.preselectedElement = e));
112
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => {
113
+ this.selectedElement = e;
114
+ this.selectClick.emit(e);
115
+ });
116
+ this.selectElementService.selectDblClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.selectDblClick.emit(e));
117
+ this.selectElementService.selectContextMenuElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.contextMenuEvent.emit(e));
118
+ this.flatElementsService.flatElementsDto.pipe(takeUntil(this.$destroy)).subscribe((e) => {
119
+ this.flatElements = e;
120
+ this.getFilteredList();
121
+ });
122
+ this.$filter.pipe(takeUntil(this.$destroy), debounceTime(250)).subscribe((filter) => {
123
+ this.filter = filter;
124
+ this.getFilteredList();
125
+ });
126
+ }
127
+ ngAfterViewInit() {
128
+ this.initializeEventListeners();
129
+ }
130
+ ngOnChanges(changes) {
131
+ this.flatElementsService.listFilterFunc = this.listFilterFunc;
132
+ this.flatElementsService.functionView = this.functionView;
133
+ if (changes['project'] && this.project?.serviceSpecifications?.[0]) {
134
+ this.serviceSpecification = this.project.serviceSpecifications[0];
135
+ this.flatElementsService.setElementsDto(this.serviceSpecification);
136
+ if (this.isSelectionMode) {
137
+ this.selectingElementsTreeData = this.treeNodeSelectionService.loadSelectingElements(this.serviceSpecification.elements);
138
+ this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe(() => {
139
+ if (this.isEmiteSelectedElements) {
140
+ setTimeout(() => {
141
+ const selectingTree = this.treeNodeSelectionService.getTreeRoot(this.selectingElementsTreeData);
142
+ this.selectedElementsChanged.emit(selectingTree);
143
+ }, 0);
144
+ }
145
+ });
146
+ }
147
+ }
148
+ if ((changes['selectedNodeId'] && this.project) || changes['project']) {
149
+ this.flatElementsService.getOneElementById(this.selectedNodeId).subscribe((e) => {
150
+ if (e) {
151
+ this.selectElementService.setClickElement(e);
152
+ }
153
+ });
154
+ }
155
+ if (this.isSelectionMode && (changes['selectingElements'] || changes['project'])) {
156
+ this.formSelectingList();
157
+ }
158
+ }
159
+ ngOnDestroy() {
160
+ this.$destroy.next(true);
161
+ this.$destroy.complete();
162
+ }
163
+ mouseOver() {
164
+ if (!this.isListenKeyboard) {
165
+ this.isListenKeyboard = true;
166
+ this.avaTreeFilterInput?.nativeElement.focus();
167
+ }
168
+ }
169
+ mouseOut() {
170
+ this.isListenKeyboard = false;
171
+ }
172
+ handleGlobalKeyboardEvent(event) {
173
+ this.ngZone.run(() => {
174
+ const keyEvent = event;
175
+ if (!this.limitedControl || this.isListenKeyboard) {
176
+ const element = this.preselectedElement || this.selectedElement;
177
+ const { operation, nextElement } = this.keyboardOperationService.handleKeyboardEvent(keyEvent, element) || {};
178
+ switch (operation) {
179
+ case KeyboardOperationType.MoveSelectedPositionUp:
180
+ this.showElement(nextElement, '.select');
181
+ break;
182
+ case KeyboardOperationType.MoveSelectedPositionDown:
183
+ this.showElement(nextElement, '.select');
184
+ break;
185
+ case KeyboardOperationType.MoveChosenPositionDown:
186
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
187
+ break;
188
+ case KeyboardOperationType.MoveChosenPositionUp:
189
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
190
+ break;
191
+ default:
192
+ break;
193
+ }
194
+ }
195
+ });
196
+ }
197
+ showElement(element, nameQuery) {
198
+ if (element) {
199
+ if (this.modeView === ModeViewType.Tree) {
200
+ this.expandParentGroups(element);
201
+ }
202
+ setTimeout(() => this.scrollLine(nameQuery), 0);
203
+ }
204
+ }
205
+ scrollLine(nameQuery) {
206
+ const parentRect = this.avaTreeWrapper?.nativeElement.getBoundingClientRect();
207
+ const showedElement = this.avaTreeWrapper?.nativeElement.querySelector(nameQuery);
208
+ if (!showedElement) {
209
+ return;
210
+ }
211
+ const childRect = showedElement.getBoundingClientRect();
212
+ if (childRect.bottom > parentRect.bottom ||
213
+ childRect.top < parentRect.top ||
214
+ (this.modeView === ModeViewType.Table && childRect.top < parentRect.top + 24)) {
215
+ showedElement?.scrollIntoView();
216
+ this.avaTreeWrapper?.nativeElement.scrollTo({ left: 0 });
217
+ if (this.modeView === ModeViewType.Table) {
218
+ setTimeout(() => this.correctScrollTableLine(showedElement, parentRect), 0);
219
+ }
220
+ }
221
+ }
222
+ correctScrollTableLine(showedElement, parentRect) {
223
+ const childRect = showedElement.getBoundingClientRect();
224
+ if (childRect.top < parentRect.top + 24) {
225
+ this.avaTreeWrapper.nativeElement.scrollTop -= 24;
226
+ }
227
+ }
228
+ expandParentGroups(element) {
229
+ this.expandParentGroupService.expandParentGroups(element, this.flatElements, this.expansionState);
230
+ }
231
+ onFilter(value) {
232
+ this.$filter.next(value);
233
+ }
234
+ expandedAllElements(isExpand) {
235
+ if (!isExpand) {
236
+ Object.keys(this.expansionState).forEach((id) => delete this.expansionState[id]);
237
+ }
238
+ else {
239
+ this.flatElements?.forEach((item) => {
240
+ if (item.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
241
+ this.expansionState[item.id] = true;
242
+ }
243
+ });
244
+ }
245
+ }
246
+ formSelectingList() {
247
+ this.isEmiteSelectedElements = false;
248
+ if (!this.selectingElements) {
249
+ this.isEmiteSelectedElements = true;
250
+ return;
251
+ }
252
+ this.treeNodeSelectionService.getFlatSelectedListId(this.selectingElements);
253
+ this.treeNodeSelectionService.flatSelectedListId.forEach((id, index) => {
254
+ this.treeNodeSelectionService.changeSelecting(true, id);
255
+ if (index === this.treeNodeSelectionService.flatSelectedListId.length - 1) {
256
+ this.isEmiteSelectedElements = true;
257
+ }
258
+ });
259
+ }
260
+ selectOrDeselectAll(value) {
261
+ this.treeNodeSelectionService.changeAll(value);
262
+ }
263
+ getFilteredList() {
264
+ if (this.flatElements?.length) {
265
+ if (!this.filter) {
266
+ this.filteredElementList = this.flatElements;
267
+ }
268
+ else {
269
+ this.filteredElementList = this.flatElements.filter((item) => this.flatElementsService.checkFilterValue(item, this.filter));
270
+ }
271
+ }
272
+ }
273
+ initializeEventListeners() {
274
+ this.ngZone.runOutsideAngular(() => {
275
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseleave')
276
+ .pipe(takeUntil(this.$destroy))
277
+ .subscribe(() => {
278
+ this.mouseOut();
279
+ });
280
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseenter')
281
+ .pipe(takeUntil(this.$destroy))
282
+ .subscribe(() => {
283
+ this.mouseOver();
284
+ });
285
+ if (!this.isSelectionMode) {
286
+ fromEvent(document, 'keydown')
287
+ .pipe(takeUntil(this.$destroy), filter(() => !this.limitedControl || this.isListenKeyboard))
288
+ .subscribe((event) => {
289
+ this.handleGlobalKeyboardEvent(event);
290
+ });
291
+ }
292
+ });
293
+ }
294
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AvaTreeComponent, deps: [{ token: i1.FlatElementsService, self: true }, { token: i2.SelectElementService, self: true }, { token: i3.TreeNodeSelectionService, self: true }, { token: i4.ExpandParentGroupService, self: true }, { token: i5.KeyboardOperationService, self: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
295
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: AvaTreeComponent, selector: "ava-ava-tree", inputs: { project: "project", expansionState: "expansionState", selectedNodeId: "selectedNodeId", indent: "indent", selectedColor: "selectedColor", modeView: "modeView", customKeyboardOperationConfig: "customKeyboardOperationConfig", limitedControl: "limitedControl", isSelectionMode: "isSelectionMode", selectingElements: "selectingElements", listFilterFunc: "listFilterFunc", addTableColumns: "addTableColumns", functionView: "functionView", textWords: "textWords" }, outputs: { selectClick: "selectClick", selectDblClick: "selectDblClick", contextMenuEvent: "contextMenuEvent", selectedElementsChanged: "selectedElementsChanged" }, providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], viewQueries: [{ propertyName: "avaTreeWrapper", first: true, predicate: ["avaTreeWrapper"], descendants: true }, { propertyName: "avaMainWrapper", first: true, predicate: ["avaMainWrapper"], descendants: true }, { propertyName: "avaTreeFilterInput", first: true, predicate: ["avaTreeFilterInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"main-wrapper\"\r\n #avaMainWrapper\r\n>\r\n <div\r\n class=\"control\"\r\n #control\r\n >\r\n <mat-form-field class=\"control-filter\">\r\n <mat-label>{{ textWords?.textSearch }}</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"filterInput\"\r\n (ngModelChange)=\"onFilter($event)\"\r\n #avaTreeFilterInput\r\n />\r\n </mat-form-field>\r\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">add</mat-icon>\r\n </button>\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">remove</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSelectionMode\">\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>remove</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <div\r\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\r\n class=\"ava-tree-wrapper\"\r\n #avaTreeWrapper\r\n >\r\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\r\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\r\n <ava-tree-structure\r\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\r\n [serviceSpecification]=\"serviceSpecification\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-tree-structure>\r\n <ava-list-structure\r\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-list-structure>\r\n <ava-table-structure\r\n *ngIf=\"modeView === listModeViewType.Table\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [addTableColumns]=\"addTableColumns\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-table-structure>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ng-template #nothing>\r\n {{ textWords?.textNothing }}\r\n</ng-template>\r\n<ng-template #nothingFiltered>\r\n {{ textWords?.textNothingFiltered }}\r\n</ng-template>\r\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.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: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.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.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i13.TreeStructureComponent, selector: "ava-tree-structure", inputs: ["serviceSpecification", "indent", "expansionState", "isSelectionMode", "selectedColor"] }, { kind: "component", type: i14.ListStructureComponent, selector: "ava-list-structure", inputs: ["filteredElementList", "isSelectionMode", "selectedColor"] }, { kind: "component", type: i15.TableStructureComponent, selector: "ava-table-structure", inputs: ["functionView", "filteredElementList", "isSelectionMode", "addTableColumns", "selectedColor"] }] }); }
296
+ }
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AvaTreeComponent, decorators: [{
298
+ type: Component,
299
+ args: [{ selector: 'ava-ava-tree', providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], template: "<div\r\n class=\"main-wrapper\"\r\n #avaMainWrapper\r\n>\r\n <div\r\n class=\"control\"\r\n #control\r\n >\r\n <mat-form-field class=\"control-filter\">\r\n <mat-label>{{ textWords?.textSearch }}</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"filterInput\"\r\n (ngModelChange)=\"onFilter($event)\"\r\n #avaTreeFilterInput\r\n />\r\n </mat-form-field>\r\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">add</mat-icon>\r\n </button>\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">remove</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSelectionMode\">\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>remove</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <div\r\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\r\n class=\"ava-tree-wrapper\"\r\n #avaTreeWrapper\r\n >\r\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\r\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\r\n <ava-tree-structure\r\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\r\n [serviceSpecification]=\"serviceSpecification\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-tree-structure>\r\n <ava-list-structure\r\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-list-structure>\r\n <ava-table-structure\r\n *ngIf=\"modeView === listModeViewType.Table\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [addTableColumns]=\"addTableColumns\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-table-structure>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ng-template #nothing>\r\n {{ textWords?.textNothing }}\r\n</ng-template>\r\n<ng-template #nothingFiltered>\r\n {{ textWords?.textNothingFiltered }}\r\n</ng-template>\r\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"] }]
300
+ }], ctorParameters: function () { return [{ type: i1.FlatElementsService, decorators: [{
301
+ type: Self
302
+ }] }, { type: i2.SelectElementService, decorators: [{
303
+ type: Self
304
+ }] }, { type: i3.TreeNodeSelectionService, decorators: [{
305
+ type: Self
306
+ }] }, { type: i4.ExpandParentGroupService, decorators: [{
307
+ type: Self
308
+ }] }, { type: i5.KeyboardOperationService, decorators: [{
309
+ type: Self
310
+ }] }, { type: i0.NgZone }]; }, propDecorators: { project: [{
311
+ type: Input
312
+ }], expansionState: [{
313
+ type: Input
314
+ }], selectedNodeId: [{
315
+ type: Input
316
+ }], indent: [{
317
+ type: Input
318
+ }], selectedColor: [{
319
+ type: Input
320
+ }], modeView: [{
321
+ type: Input
322
+ }], customKeyboardOperationConfig: [{
323
+ type: Input
324
+ }], limitedControl: [{
325
+ type: Input
326
+ }], isSelectionMode: [{
327
+ type: Input
328
+ }], selectingElements: [{
329
+ type: Input
330
+ }], listFilterFunc: [{
331
+ type: Input
332
+ }], addTableColumns: [{
333
+ type: Input
334
+ }], functionView: [{
335
+ type: Input
336
+ }], textWords: [{
337
+ type: Input
338
+ }], selectClick: [{
339
+ type: Output
340
+ }], selectDblClick: [{
341
+ type: Output
342
+ }], contextMenuEvent: [{
343
+ type: Output
344
+ }], selectedElementsChanged: [{
345
+ type: Output
346
+ }], avaTreeWrapper: [{
347
+ type: ViewChild,
348
+ args: ['avaTreeWrapper']
349
+ }], avaMainWrapper: [{
350
+ type: ViewChild,
351
+ args: ['avaMainWrapper']
352
+ }], avaTreeFilterInput: [{
353
+ type: ViewChild,
354
+ args: ['avaTreeFilterInput']
355
+ }] } });
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUtMLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUlMLFlBQVksRUFLYixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUk3RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpRkFBaUYsQ0FBQztBQUMzSCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUN0QixNQUFNLGdGQUFnRixDQUFDO0FBQ3hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlGQUFpRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVEzSCxNQUFNLE9BQU8sZ0JBQWdCO0lBUTNCOzJEQUN1RDtJQUN2RCxJQUFhLDZC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O3NCQUF6QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFVRyxZQUFZO3NCQUFwQixLQUFLO2dCQWNPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUJJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNzQixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDRSxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDTSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNlbGYsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgREVGQVVMVF9GSUxURVJTLCBERUZBVUxUX1RFWFRfV09SRFMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRleHRNZW51RGF0YVR5cGUsXHJcbiAgSUVsZW1lbnREdG8sXHJcbiAgSUZ1bmN0aW9uVmlld0xpbmUsXHJcbiAgTW9kZVZpZXdUeXBlLFxyXG4gIFByb2plY3REdG8sXHJcbiAgU2VsZWN0ZWRFbGVtZW50LFxyXG4gIFNlcnZpY2VTcGVjaWZpY2F0aW9uRHRvLFxyXG4gIFRhYmxlQ29sdW1uVHlwZVxyXG59IGZyb20gJy4uLy4uL21vZGVsJztcclxuaW1wb3J0IHsgRmxhdEVsZW1lbnRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZsYXQtZWxlbWVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0LWVsZW1lbnQuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBJVGV4dFdvcmRzIH0gZnJvbSAncHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbnN0YW50cy9kZWZhdWx0VGV4dFdvcmRzJztcclxuaW1wb3J0IHsgU2VsZWN0aW5nRWxlbWVudHNUeXBlIH0gZnJvbSAncHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL21vZGVsL3NlbGVjdGluZy5tb2RlbCc7XHJcbmltcG9ydCB7IEV4cGFuZFBhcmVudEdyb3VwU2VydmljZSB9IGZyb20gJ3Byb2plY3RzL2FuZ3VsYXItYXZhL3NyYy9saWIvYXZhLXRyZWUvdHJlZS9zZXJ2aWNlcy9leHBhbmQtcGFyZW50LWdyb3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElLZXlib2FyZE9wZXJhdGlvbkNvbmZpZyxcclxuICBLZXlib2FyZE9wZXJhdGlvblNlcnZpY2UsXHJcbiAgS2V5Ym9hcmRPcGVyYXRpb25UeXBlXHJcbn0gZnJvbSAncHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL3NlcnZpY2VzL2tleWJvYXJkLW9wZXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAncHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL3NlcnZpY2VzL3RyZWUtbm9kZS1zZWxlY3Rpb24uc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F2YS1hdmEtdHJlZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F2YS10cmVlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdmEtdHJlZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW0ZsYXRFbGVtZW50c1NlcnZpY2UsIFNlbGVjdEVsZW1lbnRTZXJ2aWNlLCBUcmVlTm9kZVNlbGVjdGlvblNlcnZpY2UsIEV4cGFuZFBhcmVudEdyb3VwU2VydmljZSwgS2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXZhVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIHByb2plY3Q6IFByb2plY3REdG8gfCBudWxsID0gbnVsbDsgLy8gbWFpbiBkYXRhXHJcbiAgQElucHV0KCkgZXhwYW5zaW9uU3RhdGU6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTsgLy8gb2JqZWN0IHdpdGggZXhwYW5kZWQgZ3JvdXBzIGF0IHRoZSBiZWdpblxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkTm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gaWQgaWYgc2VsZWN0ZWQgZWxlbWVudCBhdCB0aGUgYmVnaW5cclxuICBASW5wdXQoKSBpbmRlbnQgPSAnMjBweCc7IC8vIG9wdGlvbmFsIC0gZm9yIGNoYW5naW5nIGluZGVudHMgZWFjaCBncm91cFxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBvcHRpb25hbCAtIGZvciBjaGFuZ2luZyBiYWNrZ3JvdW5kIG9mIHNlbGVjdGVkIGxpbmUgKGRlZmF1bHQ6IHByaW1hcnkgZm9ybSBNYXRlcmlhbFVJKVxyXG4gIEBJbnB1dCgpIG1vZGVWaWV3OiBNb2RlVmlld1R5cGUgPSBNb2RlVmlld1R5cGUuVHJlZTsgLy8gc3RydWN0dXJlIHZpZXc6IFRyZWUoZGVmYXVsdCkgLyBMaXN0IC8gVGFibGVcclxuXHJcbiAgLyoqV2l0aCB0aGlzIHBhcmFtZXRlciwgd2UgY2FuIGNvbmZpZ3VyZSB3aGljaCBrZXlzIHdpbGwgYmUgbGlzdGVuIHRvIHN3aXRjaCB0aGUgdHJlZSBlbGVtZW50cyxcclxuICAgKiBhbmQgYWxzbyB0byBkaXNhYmxlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBrZXlzICovXHJcbiAgQElucHV0KCkgc2V0IGN1c3RvbUtleWJvYXJkT3BlcmF0aW9uQ29uZmlnKGNvbmZpZzogSUtleWJvYXJkT3BlcmF0aW9uQ29uZmlnKSB7XHJcbiAgICB0aGlzLmtleWJvYXJkT3BlcmF0aW9uU2VydmljZS5tZXJnZUNvbmZpZ09wZXJhdGlvbihjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgbGltaXRlZENvbnRyb2wgPSB0cnVlOyAvLyB1c2Uga2V5Ym9hcmQgb25seSBpZiBjdXJzb3IgaXMgb3ZlciBvZiB0cmVlXHJcbiAgQElucHV0KCkgaXNTZWxlY3Rpb25Nb2RlID0gZmFsc2U7IC8vIG1vZGUgZm9yIHNlbGVjdGluZyBieSBjaGVja2JveFxyXG4gIEBJbnB1dCgpIHNlbGVjdGluZ0VsZW1lbnRzOiBTZWxlY3RlZEVsZW1lbnRbXSB8IG51bGwgPSBudWxsOyAvLyBvcHRpb25hbCAtIHNlbGVjdGVkIGVsZW1lbnRzIGF0IHRoZSBiZWdpblxyXG4gIEBJbnB1dCgpIGxpc3RGaWx0ZXJGdW5jID0gREVGQVVMVF9GSUxURVJTOyAvLyBhbGxvdyB0byBwcm9ncmFtIGZpbHRlcmluZyBieSBmaWx0ZXIgZnVuY3Rpb246IChlbGVtZW50OiBhbnksIGZpbHRlcjogc3RyaW5nKSA9PiBib29sZWFuXHJcbiAgQElucHV0KCkgYWRkVGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtblR5cGVbXSA9IFtdOyAvLyBvcHRpb25hbCAtIGFsbG93IHRvIGFkZCBkaXNwbGF5ZWQgY29sdW1ucyBmb3IgdGFibGVcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyBhZGRUYWJsZUNvbHVtbnM6IEFycmF5IG9mIG9iamVjdHNcclxuICAvLyB7XHJcbiAgLy8gICBuYW1lOiBzdHJpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgY29sdW1uXHJcbiAgLy8gICB0aXRsZTogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3dlZCB0aXRsZSBvZiBjb2x1bW5cclxuICAvLyAgIGFsaWduPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgYWxpZ2h0OiBsZWZ0KGRlZmF1bHQpIC8gY2VudGVyIC8gcmlnaHRcclxuICAvLyAgIG51bWJlckZvcm1hdD86IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgZm9ybWF0IG9mIG51bWJlciB2YWx1ZSwgZXhhbXBsZTogJzEuMi0yJ1xyXG4gIC8vIH1cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICBASW5wdXQoKSBmdW5jdGlvblZpZXc6IElGdW5jdGlvblZpZXdMaW5lW10gfCBudWxsID0gbnVsbDsgLy8gYWxsb3cgdG8gcHJvZ3JhbSB2aWV3IGZvciBlYWNoIGVsZW1lbnQgYnkgZmlsdGVyXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgLy8gZnVuY3Rpb25WaWV3OiBBcnJheSBvZiBvYmplY3RzXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIG5hbWU6IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgdmlldyBwYXJ0OiB5b3UgY2FuIGFkZC9yZW1vdmUgaXQgd2hlbiBpdCBuZWVkXHJcbiAgLy8gICAgIGZ1bmM6IChlbGVtZW50OiBhbnksIHJlc3VsdD86IGFueSkgPT4gYm9vbGVhbiwgIC8vIHRoaXMgZmlsdGVyIGZ1bmN0aW9uIGNhbGN1bGF0ZSBjb25kaXRpb24gdG8gY2hhbmdlIHZpZXdcclxuICAvLyAgICAgdmlldzoge1xyXG4gIC8vICAgICAgIGljb25OYW1lPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIG5hbWUgb2YgaWNvblxyXG4gIC8vICAgICAgIGljb25Db2xvcj86IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIGNvbG9yIG9mIGljb25cclxuICAvLyAgICAgICB0ZXh0Qm9sZD86IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCB3ZWlnaHQgb2YgdGV4dFxyXG4gIC8vICAgICAgIHRleHRDb2xvcj86IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIGNvbG9yIG9mIHRleHRcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICBASW5wdXQoKSBzZXQgdGV4dFdvcmRzKHdvcmRzOiBJVGV4dFdvcmRzIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi50aGlzLnRleHRXb3JkcywgLi4ud29yZHMgfTtcclxuICB9IC8vIGFsbG93IHRvIHRyYW5zbGF0ZSBhbGwgdGV4dHMgdG8gb3RoZXIgbGFuZ3VhZ2VcclxuICBnZXQgdGV4dFdvcmRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RleHRXb3JkcztcclxuICB9XHJcbiAgcHJpdmF0ZSBfdGV4dFdvcmRzOiBJVGV4dFdvcmRzIHwgbnVsbCA9IG51bGw7XHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vIHtcclxuICAvLyAgIHRleHRTZWFyY2g6IHN0cmluZyxcclxuICAvLyAgIHRleHROb3RoaW5nOiBzdHJpbmcsXHJcbiAgLy8gICB0ZXh0Tm90aGluZ0ZpbHRlcmVkOiBzdHJpbmcsXHJcbiAgLy8gICB0ZXh0QWxsOiBzdHJpbmcsXHJcbiAgLy8gICB0b29sdGlwQWxsT3Blbjogc3RyaW5nLFxyXG4gIC8vICAgdG9vbHRpcEFsbENsb3NlOiBzdHJpbmcsXHJcbiAgLy8gICB0b29sdGlwQWxsQWRkOnN0cmluZyxcclxuICAvLyAgIHRvb2x0aXBBbGxSZW1vdmU6IHN0cmluZyxcclxuICAvLyB9XHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICBAT3V0cHV0KCkgc2VsZWN0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElFbGVtZW50RHRvIHwgbnVsbD4oKTsgLy8gZXZlbnQgYWZ0ZXIgZWxlbWVudCBzZWxlY3RlZCBieSBjbGlja1xyXG4gIEBPdXRwdXQoKSBzZWxlY3REYmxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUVsZW1lbnREdG8+KCk7IC8vIGV2ZW50IGFmdGVyIGVsZW1lbnQgc2VsZWN0ZWQgYnkgZG91YmxlIGNsaWNrXHJcbiAgQE91dHB1dCgpIGNvbnRleHRNZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbnRleHRNZW51RGF0YVR5cGU+KCk7IC8vIGV2ZW50IGFmdGVyIGVsZW1lbnQgY2FsbCBjb250ZXh0IG1lbnUgYnkgcmlnaHQgYnV0dG9uIGNsaWNrXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RlZEVsZW1lbnRbXT4oKTsgLy8gZXZlbnQgYWZ0ZXIgY2hhbmdlZCBzZWxlY3RpbmcgaW4gc2VsZWN0aW5nIG1vZGVcclxuICBAVmlld0NoaWxkKCdhdmFUcmVlV3JhcHBlcicpIGF2YVRyZWVXcmFwcGVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnYXZhTWFpbldyYXBwZXInKSBhdmFNYWluV3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2F2YVRyZWVGaWx0ZXJJbnB1dCcpIGF2YVRyZWVGaWx0ZXJJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgc2VsZWN0ZWRFbGVtZW50OiBJRWxlbWVudER0byB8IG51bGwgPSBudWxsO1xyXG4gIHNlcnZpY2VTcGVjaWZpY2F0aW9uITogU2VydmljZVNwZWNpZmljYXRpb25EdG87XHJcbiAgaXNMaXN0ZW5LZXlib2FyZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMgPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGluZ0VsZW1lbnRzVHJlZURhdGE6IFNlbGVjdGluZ0VsZW1lbnRzVHlwZVtdID0gW107XHJcbiAgZmxhdEVsZW1lbnRzOiBJRWxlbWVudER0b1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJlc2VsZWN0ZWRFbGVtZW50OiBJRWxlbWVudER0byB8IG51bGwgPSBudWxsO1xyXG4gIGZpbHRlcklucHV0ID0gJyc7XHJcbiAgbGlzdE1vZGVWaWV3VHlwZSA9IE1vZGVWaWV3VHlwZTtcclxuICBwcml2YXRlIGZpbHRlciA9ICcnO1xyXG4gIHByaXZhdGUgJGZpbHRlciA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XHJcbiAgZmlsdGVyZWRFbGVtZW50TGlzdDogSUVsZW1lbnREdG9bXSA9IFtdO1xyXG4gIHByaXZhdGUgJGRlc3Ryb3kgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBTZWxmKCkgcHJpdmF0ZSBmbGF0RWxlbWVudHNTZXJ2aWNlOiBGbGF0RWxlbWVudHNTZXJ2aWNlLFxyXG4gICAgQFNlbGYoKSBwcml2YXRlIHNlbGVjdEVsZW1lbnRTZXJ2aWNlOiBTZWxlY3RFbGVtZW50U2VydmljZSxcclxuICAgIEBTZWxmKCkgcHJpdmF0ZSB0cmVlTm9kZVNlbGVjdGlvblNlcnZpY2U6IFRyZWVOb2RlU2VsZWN0aW9uU2VydmljZSxcclxuICAgIEBTZWxmKCkgcHJpdmF0ZSBleHBhbmRQYXJlbnRHcm91cFNlcnZpY2U6IEV4cGFuZFBhcmVudEdyb3VwU2VydmljZSxcclxuICAgIEBTZWxmKCkgcHJpdmF0ZSBrZXlib2FyZE9wZXJhdGlvblNlcnZpY2U6IEtleWJvYXJkT3BlcmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIHRoaXMuX3RleHRXb3JkcyA9IHsgLi4uREVGQVVMVF9URVhUX1dPUkRTIH07XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2UucHJlc2VsZWN0ZWRFbGVtZW50LnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+ICh0aGlzLnByZXNlbGVjdGVkRWxlbWVudCA9IGUpKTtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2Uuc2VsZWN0Q2xpY2tFbGVtZW50LnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBlO1xyXG4gICAgICB0aGlzLnNlbGVjdENsaWNrLmVtaXQoZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2Uuc2VsZWN0RGJsQ2xpY2tFbGVtZW50LnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+IHRoaXMuc2VsZWN0RGJsQ2xpY2suZW1pdChlKSk7XHJcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENvbnRleHRNZW51RWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmNvbnRleHRNZW51RXZlbnQuZW1pdChlKSk7XHJcbiAgICB0aGlzLmZsYXRFbGVtZW50c1NlcnZpY2UuZmxhdEVsZW1lbnRzRHRvLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgdGhpcy5mbGF0RWxlbWVudHMgPSBlO1xyXG4gICAgICB0aGlzLmdldEZpbHRlcmVkTGlzdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy4kZmlsdGVyLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoMjUwKSkuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcclxuICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XHJcbiAgICAgIHRoaXMuZ2V0RmlsdGVyZWRMaXN0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsYXRFbGVtZW50c1NlcnZpY2UubGlzdEZpbHRlckZ1bmMgPSB0aGlzLmxpc3RGaWx0ZXJGdW5jO1xyXG4gICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmZ1bmN0aW9uVmlldyA9IHRoaXMuZnVuY3Rpb25WaWV3O1xyXG5cclxuICAgIGlmIChjaGFuZ2VzWydwcm9qZWN0J10gJiYgdGhpcy5wcm9qZWN0Py5zZXJ2aWNlU3BlY2lmaWNhdGlvbnM/LlswXSkge1xyXG4gICAgICB0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uID0gdGhpcy5wcm9qZWN0LnNlcnZpY2VTcGVjaWZpY2F0aW9uc1swXTtcclxuICAgICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLnNldEVsZW1lbnRzRHRvKHRoaXMuc2VydmljZVNwZWNpZmljYXRpb24pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RpbmdFbGVtZW50c1RyZWVEYXRhID0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UubG9hZFNlbGVjdGluZ0VsZW1lbnRzKHRoaXMuc2VydmljZVNwZWNpZmljYXRpb24uZWxlbWVudHMpO1xyXG4gICAgICAgIHRoaXMudHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlLnRyZWVOb2RlU2VsZWN0aW5nLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW5nVHJlZSA9IHRoaXMudHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlLmdldFRyZWVSb290KHRoaXMuc2VsZWN0aW5nRWxlbWVudHNUcmVlRGF0YSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzQ2hhbmdlZC5lbWl0KHNlbGVjdGluZ1RyZWUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICgoY2hhbmdlc1snc2VsZWN0ZWROb2RlSWQnXSAmJiB0aGlzLnByb2plY3QpIHx8IGNoYW5nZXNbJ3Byb2plY3QnXSkge1xyXG4gICAgICB0aGlzLmZsYXRFbGVtZW50c1NlcnZpY2UuZ2V0T25lRWxlbWVudEJ5SWQodGhpcy5zZWxlY3RlZE5vZGVJZCkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2Uuc2V0Q2xpY2tFbGVtZW50KGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlICYmIChjaGFuZ2VzWydzZWxlY3RpbmdFbGVtZW50cyddIHx8IGNoYW5nZXNbJ3Byb2plY3QnXSkpIHtcclxuICAgICAgdGhpcy5mb3JtU2VsZWN0aW5nTGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLiRkZXN0cm95Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLiRkZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZU92ZXIoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNMaXN0ZW5LZXlib2FyZCkge1xyXG4gICAgICB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmF2YVRyZWVGaWx0ZXJJbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VPdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUdsb2JhbEtleWJvYXJkRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXlFdmVudCA9IGV2ZW50IGFzIEtleWJvYXJkRXZlbnQ7XHJcbiAgICAgIGlmICghdGhpcy5saW1pdGVkQ29udHJvbCB8fCB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wcmVzZWxlY3RlZEVsZW1lbnQgfHwgdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBuZXh0RWxlbWVudCB9ID0gdGhpcy5rZXlib2FyZE9wZXJhdGlvblNlcnZpY2UuaGFuZGxlS2V5Ym9hcmRFdmVudChrZXlFdmVudCwgZWxlbWVudCkgfHwge307XHJcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcclxuICAgICAgICAgIGNhc2UgS2V5Ym9hcmRPcGVyYXRpb25UeXBlLk1vdmVTZWxlY3RlZFBvc2l0aW9uVXA6XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnQobmV4dEVsZW1lbnQsICcuc2VsZWN0Jyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBLZXlib2FyZE9wZXJhdGlvblR5cGUuTW92ZVNlbGVjdGVkUG9zaXRpb25Eb3duOlxyXG4gICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50KG5leHRFbGVtZW50LCAnLnNlbGVjdCcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgS2V5Ym9hcmRPcGVyYXRpb25UeXBlLk1vdmVDaG9zZW5Qb3NpdGlvbkRvd246XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnQobmV4dEVsZW1lbnQsIG5leHRFbGVtZW50Py5pZCA9PT0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ/LmlkID8gJy5zZWxlY3QnIDogJy5jaG9vc2UnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEtleWJvYXJkT3BlcmF0aW9uVHlwZS5Nb3ZlQ2hvc2VuUG9zaXRpb25VcDpcclxuICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChuZXh0RWxlbWVudCwgbmV4dEVsZW1lbnQ/LmlkID09PSB0aGlzLnNlbGVjdGVkRWxlbWVudD8uaWQgPyAnLnNlbGVjdCcgOiAnLmNob29zZScpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzaG93RWxlbWVudChlbGVtZW50OiBJRWxlbWVudER0byB8IG51bGwsIG5hbWVRdWVyeTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICBpZiAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRyZWUpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZFBhcmVudEdyb3VwcyhlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsTGluZShuYW1lUXVlcnkpLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNjcm9sbExpbmUobmFtZVF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcmVudFJlY3QgPSB0aGlzLmF2YVRyZWVXcmFwcGVyPy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgc2hvd2VkRWxlbWVudCA9IHRoaXMuYXZhVHJlZVdyYXBwZXI/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihuYW1lUXVlcnkpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICghc2hvd2VkRWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hpbGRSZWN0ID0gc2hvd2VkRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGlmIChcclxuICAgICAgY2hpbGRSZWN0LmJvdHRvbSA+IHBhcmVudFJlY3QuYm90dG9tIHx8XHJcbiAgICAgIGNoaWxkUmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCB8fFxyXG4gICAgICAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRhYmxlICYmIGNoaWxkUmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCArIDI0KVxyXG4gICAgKSB7XHJcbiAgICAgIHNob3dlZEVsZW1lbnQ/LnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8oeyBsZWZ0OiAwIH0pO1xyXG4gICAgICBpZiAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRhYmxlKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvcnJlY3RTY3JvbGxUYWJsZUxpbmUoc2hvd2VkRWxlbWVudCwgcGFyZW50UmVjdCksIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3JyZWN0U2Nyb2xsVGFibGVMaW5lKHNob3dlZEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRSZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGlsZFJlY3QgPSBzaG93ZWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYgKGNoaWxkUmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCArIDI0KSB7XHJcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLT0gMjQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBhbmRQYXJlbnRHcm91cHMoZWxlbWVudDogSUVsZW1lbnREdG8pOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kUGFyZW50R3JvdXBTZXJ2aWNlLmV4cGFuZFBhcmVudEdyb3VwcyhlbGVtZW50LCB0aGlzLmZsYXRFbGVtZW50cywgdGhpcy5leHBhbnNpb25TdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLiRmaWx0ZXIubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBleHBhbmRlZEFsbEVsZW1lbnRzKGlzRXhwYW5kOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIWlzRXhwYW5kKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZXhwYW5zaW9uU3RhdGUpLmZvckVhY2goKGlkOiBzdHJpbmcpID0+IGRlbGV0ZSB0aGlzLmV4cGFuc2lvblN0YXRlW2lkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZsYXRFbGVtZW50cz8uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmVsZW1lbnRUeXBlRGlzY3JpbWluYXRvciA9PT0gJ1NlcnZpY2VTcGVjaWZpY2F0aW9uR3JvdXBEdG8nKSB7XHJcbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlW2l0ZW0uaWRdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybVNlbGVjdGluZ0xpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRW1pdGVTZWxlY3RlZEVsZW1lbnRzID0gZmFsc2U7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW5nRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5pc0VtaXRlU2VsZWN0ZWRFbGVtZW50cyA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRyZWVOb2RlU2VsZWN0aW9uU2VydmljZS5nZXRGbGF0U2VsZWN0ZWRMaXN0SWQodGhpcy5zZWxlY3RpbmdFbGVtZW50cyk7XHJcbiAgICB0aGlzLnRyZWVOb2RlU2VsZWN0aW9uU2VydmljZS5mbGF0U2VsZWN0ZWRMaXN0SWQuZm9yRWFjaCgoaWQsIGluZGV4KSA9PiB7XHJcbiAgICAgIHRoaXMudHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlLmNoYW5nZVNlbGVjdGluZyh0cnVlLCBpZCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZmxhdFNlbGVjdGVkTGlzdElkLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICB0aGlzLmlzRW1pdGVTZWxlY3RlZEVsZW1lbnRzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RPckRlc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyZWVOb2RlU2VsZWN0aW9uU2VydmljZS5jaGFuZ2VBbGwodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyZWRMaXN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmxhdEVsZW1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgaWYgKCF0aGlzLmZpbHRlcikge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRFbGVtZW50TGlzdCA9IHRoaXMuZmxhdEVsZW1lbnRzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRFbGVtZW50TGlzdCA9IHRoaXMuZmxhdEVsZW1lbnRzLmZpbHRlcigoaXRlbSkgPT4gdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmNoZWNrRmlsdGVyVmFsdWUoaXRlbSwgdGhpcy5maWx0ZXIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGZyb21FdmVudCh0aGlzLmF2YU1haW5XcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJylcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm1vdXNlT3V0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBmcm9tRXZlbnQodGhpcy5hdmFNYWluV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tb3VzZU92ZXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJylcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy4kZGVzdHJveSksXHJcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5saW1pdGVkQ29udHJvbCB8fCB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHbG9iYWxLZXlib2FyZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGNsYXNzPVwibWFpbi13cmFwcGVyXCJcclxuICAjYXZhTWFpbldyYXBwZXJcclxuPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiY29udHJvbFwiXHJcbiAgICAjY29udHJvbFxyXG4gID5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvbnRyb2wtZmlsdGVyXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgdGV4dFdvcmRzPy50ZXh0U2VhcmNoIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVySW5wdXRcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICNhdmFUcmVlRmlsdGVySW5wdXRcclxuICAgICAgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVHJlZVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWljb25cIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImV4cGFuZGVkQWxsRWxlbWVudHModHJ1ZSlcIlxyXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbE9wZW4gfHwgJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItYmFja2dyb3VuZFwiPmxheWVyczwvbWF0LWljb24+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItaWNvblwiPmFkZDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWljb25cIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImV4cGFuZGVkQWxsRWxlbWVudHMoZmFsc2UpXCJcclxuICAgICAgICBbbWF0VG9vbHRpcF09XCJ0ZXh0V29yZHM/LnRvb2x0aXBBbGxDbG9zZSB8fCAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsYXllci1iYWNrZ3JvdW5kXCI+bGF5ZXJzPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsYXllci1pY29uXCI+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9yRGVzZWxlY3RBbGwodHJ1ZSlcIlxyXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbEFkZCB8fCAnJ1wiXHJcbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWJ1dHRvblwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj57eyB0ZXh0V29yZHM/LnRleHRBbGwgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAoY2xpY2spPVwic2VsZWN0T3JEZXNlbGVjdEFsbChmYWxzZSlcIlxyXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbFJlbW92ZSB8fCAnJ1wiXHJcbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWJ1dHRvblwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj57eyB0ZXh0V29yZHM/LnRleHRBbGwgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCInY2FsYygxMDAlIC0gJyArIGNvbnRyb2wub2Zmc2V0SGVpZ2h0ICsgJ3B4KSdcIlxyXG4gICAgY2xhc3M9XCJhdmEtdHJlZS13cmFwcGVyXCJcclxuICAgICNhdmFUcmVlV3JhcHBlclxyXG4gID5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmbGF0RWxlbWVudHM/Lmxlbmd0aDsgZWxzZSBub3RoaW5nXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZEVsZW1lbnRMaXN0Py5sZW5ndGg7IGVsc2Ugbm90aGluZ0ZpbHRlcmVkXCI+XHJcbiAgICAgICAgPGF2YS10cmVlLXN0cnVjdHVyZVxyXG4gICAgICAgICAgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UcmVlICYmICFhdmFUcmVlRmlsdGVySW5wdXQudmFsdWVcIlxyXG4gICAgICAgICAgW3NlcnZpY2VTcGVjaWZpY2F0aW9uXT1cInNlcnZpY2VTcGVjaWZpY2F0aW9uXCJcclxuICAgICAgICAgIFtpbmRlbnRdPVwiaW5kZW50XCJcclxuICAgICAgICAgIFtleHBhbnNpb25TdGF0ZV09XCJleHBhbnNpb25TdGF0ZVwiXHJcbiAgICAgICAgICBbaXNTZWxlY3Rpb25Nb2RlXT1cImlzU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hdmEtdHJlZS1zdHJ1Y3R1cmU+XHJcbiAgICAgICAgPGF2YS1saXN0LXN0cnVjdHVyZVxyXG4gICAgICAgICAgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5MaXN0IHx8IChtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UcmVlICYmIGF2YVRyZWVGaWx0ZXJJbnB1dC52YWx1ZSlcIlxyXG4gICAgICAgICAgW2ZpbHRlcmVkRWxlbWVudExpc3RdPVwiZmlsdGVyZWRFbGVtZW50TGlzdFwiXHJcbiAgICAgICAgICBbaXNTZWxlY3Rpb25Nb2RlXT1cImlzU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hdmEtbGlzdC1zdHJ1Y3R1cmU+XHJcbiAgICAgICAgPGF2YS10YWJsZS1zdHJ1Y3R1cmVcclxuICAgICAgICAgICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVGFibGVcIlxyXG4gICAgICAgICAgW2ZpbHRlcmVkRWxlbWVudExpc3RdPVwiZmlsdGVyZWRFbGVtZW50TGlzdFwiXHJcbiAgICAgICAgICBbaXNTZWxlY3Rpb25Nb2RlXT1cImlzU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBbYWRkVGFibGVDb2x1bW5zXT1cImFkZFRhYmxlQ29sdW1uc1wiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hdmEtdGFibGUtc3RydWN0dXJlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICNub3RoaW5nPlxyXG4gIHt7IHRleHRXb3Jkcz8udGV4dE5vdGhpbmcgfX1cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNub3RoaW5nRmlsdGVyZWQ+XHJcbiAge3sgdGV4dFdvcmRzPy50ZXh0Tm90aGluZ0ZpbHRlcmVkIH19XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Subject, takeUntil } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/select-element.service";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "../tree-item/tree-item.component";
7
+ export class ListStructureComponent {
8
+ constructor(selectElementService) {
9
+ this.selectElementService = selectElementService;
10
+ this.filteredElementList = [];
11
+ this.isSelectionMode = false;
12
+ this.selectedColor = null;
13
+ this.selectedElement = null;
14
+ this.$destroy = new Subject();
15
+ }
16
+ ngOnInit() {
17
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((element) => {
18
+ this.selectedElement = element;
19
+ });
20
+ }
21
+ ngOnDestroy() {
22
+ this.$destroy.next(true);
23
+ this.$destroy.complete();
24
+ }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ListStructureComponent, deps: [{ token: i1.SelectElementService }], target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: ListStructureComponent, selector: "ava-list-structure", inputs: { filteredElementList: "filteredElementList", isSelectionMode: "isSelectionMode", selectedColor: "selectedColor" }, ngImport: i0, template: "<ng-container *ngFor=\"let element of filteredElementList\">\r\n <div\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n</ng-container>\r\n", styles: [".select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.TreeItemComponent, selector: "ava-tree-item", inputs: ["element", "expansionState", "isSelectionMode"] }] }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ListStructureComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 'ava-list-structure', template: "<ng-container *ngFor=\"let element of filteredElementList\">\r\n <div\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n</ng-container>\r\n", styles: [".select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"] }]
31
+ }], ctorParameters: function () { return [{ type: i1.SelectElementService }]; }, propDecorators: { filteredElementList: [{
32
+ type: Input
33
+ }], isSelectionMode: [{
34
+ type: Input
35
+ }], selectedColor: [{
36
+ type: Input
37
+ }] } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvbGlzdC1zdHJ1Y3R1cmUvbGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvbGlzdC1zdHJ1Y3R1cmUvbGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBVTFDLE1BQU0sT0FBTyxzQkFBc0I7SUFRakMsWUFBbUIsb0JBQTBDO1FBQTFDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFQcEQsd0JBQW1CLEdBQWtCLEVBQUUsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFN0Msb0JBQWUsR0FBdUIsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBRXNCLENBQUM7SUFFakUsUUFBUTtRQUNOLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hHLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OEdBbkJVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLHNMQ1puQyxnYkFXQTs7MkZEQ2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjsyR0FLckIsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgSUVsZW1lbnREdG8gfSBmcm9tICcuLi8uLi9tb2RlbCc7XHJcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0LWVsZW1lbnQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F2YS1saXN0LXN0cnVjdHVyZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Qtc3RydWN0dXJlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9saXN0LXN0cnVjdHVyZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaXN0U3RydWN0dXJlQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBmaWx0ZXJlZEVsZW1lbnRMaXN0OiBJRWxlbWVudER0b1tdID0gW107XHJcbiAgQElucHV0KCkgaXNTZWxlY3Rpb25Nb2RlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRDb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHNlbGVjdGVkRWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRkZXN0cm95ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNlbGVjdEVsZW1lbnRTZXJ2aWNlOiBTZWxlY3RFbGVtZW50U2VydmljZSkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENsaWNrRWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gZWxlbWVudDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLiRkZXN0cm95Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLiRkZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgZmlsdGVyZWRFbGVtZW50TGlzdFwiPlxyXG4gIDxkaXZcclxuICAgIFtjbGFzcy5zZWxlY3RdPVwiIWlzU2VsZWN0aW9uTW9kZSAmJiBlbGVtZW50LmlkID09PSBzZWxlY3RlZEVsZW1lbnQ/LmlkXCJcclxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIiFpc1NlbGVjdGlvbk1vZGUgJiYgZWxlbWVudC5pZCA9PT0gc2VsZWN0ZWRFbGVtZW50Py5pZCA/IHNlbGVjdGVkQ29sb3IgfHwgJycgOiAnJ1wiXHJcbiAgPlxyXG4gICAgPGF2YS10cmVlLWl0ZW1cclxuICAgICAgW2VsZW1lbnRdPVwiZWxlbWVudFwiXHJcbiAgICAgIFtpc1NlbGVjdGlvbk1vZGVdPVwiaXNTZWxlY3Rpb25Nb2RlXCJcclxuICAgID48L2F2YS10cmVlLWl0ZW0+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=