@marcura/marcura-combobox 4.6.2 → 6.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 (69) hide show
  1. package/esm2020/lib/combobox.module.mjs +103 -0
  2. package/esm2020/lib/components/abstract-combobox/abstract-combobox.component.mjs +241 -0
  3. package/esm2020/lib/components/abstract-dropdown/abstract-dropdown.component.mjs +227 -0
  4. package/esm2020/lib/components/combobox/combobox.component.mjs +359 -0
  5. package/esm2020/lib/components/combobox-popup-footer/combobox-popup-footer.component.mjs +38 -0
  6. package/esm2020/lib/components/dropdown/dropdown.component.mjs +232 -0
  7. package/esm2020/lib/components/multiselect/multiselect.component.mjs +244 -0
  8. package/esm2020/lib/directives/combobox-item-template.directive.mjs +13 -0
  9. package/esm2020/lib/directives/dropdown-item-template.directive.mjs +13 -0
  10. package/esm2020/lib/directives/dropdown-value-template.directive.mjs +13 -0
  11. package/esm2020/lib/directives/multiselect-item-template.directive.mjs +13 -0
  12. package/esm2020/lib/directives/multiselect-tag-template.directive.mjs +13 -0
  13. package/esm2020/lib/directives/multiselect-tag-wrapper.directive.mjs +60 -0
  14. package/{esm2015/lib/model/combobox-kendo-component.interface.js → esm2020/lib/model/combobox-kendo-component.interface.mjs} +1 -0
  15. package/{esm2015/lib/model/combobox-localization.interface.js → esm2020/lib/model/combobox-localization.interface.mjs} +1 -0
  16. package/esm2020/lib/model/combobox-search-fn.type.mjs +2 -0
  17. package/{esm2015/lib/model/combobox-search-settings.interface.js → esm2020/lib/model/combobox-search-settings.interface.mjs} +1 -0
  18. package/{esm2015/lib/model/dropdown-kendo-component.interface.js → esm2020/lib/model/dropdown-kendo-component.interface.mjs} +1 -0
  19. package/{esm2015/lib/model/dropdown-localization.interface.js → esm2020/lib/model/dropdown-localization.interface.mjs} +1 -0
  20. package/{esm2015/lib/model/dropdown-localizer.interface.js → esm2020/lib/model/dropdown-localizer.interface.mjs} +1 -0
  21. package/{esm2015/lib/model/multiselect-localization.interface.js → esm2020/lib/model/multiselect-localization.interface.mjs} +1 -0
  22. package/fesm2015/marcura-marcura-combobox.mjs +1522 -0
  23. package/fesm2015/marcura-marcura-combobox.mjs.map +1 -0
  24. package/fesm2020/marcura-marcura-combobox.mjs +1517 -0
  25. package/fesm2020/marcura-marcura-combobox.mjs.map +1 -0
  26. package/{marcura-marcura-combobox.d.ts → index.d.ts} +1 -0
  27. package/lib/combobox.module.d.ts +21 -0
  28. package/lib/components/abstract-combobox/abstract-combobox.component.d.ts +19 -12
  29. package/lib/components/abstract-dropdown/abstract-dropdown.component.d.ts +16 -10
  30. package/lib/components/combobox/combobox.component.d.ts +8 -6
  31. package/lib/components/combobox-popup-footer/combobox-popup-footer.component.d.ts +3 -0
  32. package/lib/components/dropdown/dropdown.component.d.ts +8 -6
  33. package/lib/components/multiselect/multiselect.component.d.ts +11 -9
  34. package/lib/directives/combobox-item-template.directive.d.ts +3 -0
  35. package/lib/directives/dropdown-item-template.directive.d.ts +3 -0
  36. package/lib/directives/dropdown-value-template.directive.d.ts +3 -0
  37. package/lib/directives/multiselect-item-template.directive.d.ts +3 -0
  38. package/lib/directives/multiselect-tag-template.directive.d.ts +3 -0
  39. package/lib/directives/multiselect-tag-wrapper.directive.d.ts +3 -0
  40. package/lib/model/combobox-search-fn.type.d.ts +2 -1
  41. package/package.json +29 -17
  42. package/bundles/marcura-marcura-combobox.umd.js +0 -1850
  43. package/bundles/marcura-marcura-combobox.umd.js.map +0 -1
  44. package/bundles/marcura-marcura-combobox.umd.min.js +0 -2
  45. package/bundles/marcura-marcura-combobox.umd.min.js.map +0 -1
  46. package/esm2015/lib/combobox.module.js +0 -61
  47. package/esm2015/lib/components/abstract-combobox/abstract-combobox.component.js +0 -226
  48. package/esm2015/lib/components/abstract-dropdown/abstract-dropdown.component.js +0 -205
  49. package/esm2015/lib/components/combobox/combobox.component.js +0 -289
  50. package/esm2015/lib/components/combobox-popup-footer/combobox-popup-footer.component.js +0 -27
  51. package/esm2015/lib/components/dropdown/dropdown.component.js +0 -166
  52. package/esm2015/lib/components/multiselect/multiselect.component.js +0 -180
  53. package/esm2015/lib/directives/combobox-item-template.directive.js +0 -9
  54. package/esm2015/lib/directives/dropdown-item-template.directive.js +0 -9
  55. package/esm2015/lib/directives/dropdown-value-template.directive.js +0 -9
  56. package/esm2015/lib/directives/multiselect-item-template.directive.js +0 -9
  57. package/esm2015/lib/directives/multiselect-tag-template.directive.js +0 -9
  58. package/esm2015/lib/directives/multiselect-tag-wrapper.directive.js +0 -59
  59. package/esm2015/lib/model/combobox-search-fn.type.js +0 -1
  60. package/fesm2015/marcura-marcura-combobox.js +0 -1229
  61. package/fesm2015/marcura-marcura-combobox.js.map +0 -1
  62. package/marcura-marcura-combobox.metadata.json +0 -1
  63. /package/{esm2015/lib/combobox.injectables.js → esm2020/lib/combobox.injectables.mjs} +0 -0
  64. /package/{esm2015/lib/model/combobox-changed.event.js → esm2020/lib/model/combobox-changed.event.mjs} +0 -0
  65. /package/{esm2015/lib/model/combobox-search-settings-operator.enum.js → esm2020/lib/model/combobox-search-settings-operator.enum.mjs} +0 -0
  66. /package/{esm2015/lib/model/dropdown-changed.event.js → esm2020/lib/model/dropdown-changed.event.mjs} +0 -0
  67. /package/{esm2015/lib/model/multiselect-changed.event.js → esm2020/lib/model/multiselect-changed.event.mjs} +0 -0
  68. /package/{esm2015/marcura-marcura-combobox.js → esm2020/marcura-marcura-combobox.mjs} +0 -0
  69. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
@@ -0,0 +1,103 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { TagModule } from '@marcura/marcura-tag';
5
+ import { ComboBoxModule, DropDownListModule, MultiSelectModule } from '@progress/kendo-angular-dropdowns';
6
+ import { PopupModule, POPUP_CONTAINER } from '@progress/kendo-angular-popup';
7
+ import { ComboboxItemTemplateDirective } from '../lib/directives/combobox-item-template.directive';
8
+ import { DropdownItemTemplateDirective } from '../lib/directives/dropdown-item-template.directive';
9
+ import { DropdownValueTemplateDirective } from '../lib/directives/dropdown-value-template.directive';
10
+ import { MultiselectItemTemplateDirective } from '../lib/directives/multiselect-item-template.directive';
11
+ import { MultiselectTagTemplateDirective } from '../lib/directives/multiselect-tag-template.directive';
12
+ import { MultiselectTagWrapperDirective } from '../lib/directives/multiselect-tag-wrapper.directive';
13
+ import { AbstractComboboxComponent } from './components/abstract-combobox/abstract-combobox.component';
14
+ import { AbstractDropdownComponent } from './components/abstract-dropdown/abstract-dropdown.component';
15
+ import { ComboboxPopupFooterComponent } from './components/combobox-popup-footer/combobox-popup-footer.component';
16
+ import { ComboboxComponent } from './components/combobox/combobox.component';
17
+ import { DropdownComponent } from './components/dropdown/dropdown.component';
18
+ import { MultiselectComponent } from './components/multiselect/multiselect.component';
19
+ import * as i0 from "@angular/core";
20
+ const components = [
21
+ AbstractComboboxComponent,
22
+ AbstractDropdownComponent,
23
+ ComboboxComponent,
24
+ ComboboxPopupFooterComponent,
25
+ MultiselectComponent,
26
+ DropdownComponent,
27
+ ];
28
+ const directives = [
29
+ ComboboxItemTemplateDirective,
30
+ MultiselectItemTemplateDirective,
31
+ MultiselectTagTemplateDirective,
32
+ MultiselectTagWrapperDirective,
33
+ DropdownItemTemplateDirective,
34
+ DropdownValueTemplateDirective,
35
+ ];
36
+ export function getPopupContainer() {
37
+ return { nativeElement: document.body };
38
+ }
39
+ export class ComboboxModule {
40
+ }
41
+ ComboboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
42
+ ComboboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, declarations: [AbstractComboboxComponent,
43
+ AbstractDropdownComponent,
44
+ ComboboxComponent,
45
+ ComboboxPopupFooterComponent,
46
+ MultiselectComponent,
47
+ DropdownComponent, ComboboxItemTemplateDirective,
48
+ MultiselectItemTemplateDirective,
49
+ MultiselectTagTemplateDirective,
50
+ MultiselectTagWrapperDirective,
51
+ DropdownItemTemplateDirective,
52
+ DropdownValueTemplateDirective], imports: [CommonModule,
53
+ ReactiveFormsModule,
54
+ ComboBoxModule,
55
+ MultiSelectModule,
56
+ PopupModule,
57
+ TagModule,
58
+ DropDownListModule], exports: [AbstractComboboxComponent,
59
+ AbstractDropdownComponent,
60
+ ComboboxComponent,
61
+ ComboboxPopupFooterComponent,
62
+ MultiselectComponent,
63
+ DropdownComponent, ComboboxItemTemplateDirective,
64
+ MultiselectItemTemplateDirective,
65
+ MultiselectTagTemplateDirective,
66
+ MultiselectTagWrapperDirective,
67
+ DropdownItemTemplateDirective,
68
+ DropdownValueTemplateDirective] });
69
+ ComboboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, providers: [
70
+ {
71
+ provide: POPUP_CONTAINER,
72
+ useFactory: getPopupContainer,
73
+ },
74
+ ], imports: [CommonModule,
75
+ ReactiveFormsModule,
76
+ ComboBoxModule,
77
+ MultiSelectModule,
78
+ PopupModule,
79
+ TagModule,
80
+ DropDownListModule] });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: ComboboxModule, decorators: [{
82
+ type: NgModule,
83
+ args: [{
84
+ declarations: [...components, ...directives],
85
+ imports: [
86
+ CommonModule,
87
+ ReactiveFormsModule,
88
+ ComboBoxModule,
89
+ MultiSelectModule,
90
+ PopupModule,
91
+ TagModule,
92
+ DropDownListModule,
93
+ ],
94
+ exports: [...components, ...directives],
95
+ providers: [
96
+ {
97
+ provide: POPUP_CONTAINER,
98
+ useFactory: getPopupContainer,
99
+ },
100
+ ],
101
+ }]
102
+ }] });
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3gubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21ib2JveC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNFLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ25HLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ25HLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDREQUE0RCxDQUFDO0FBQ3JHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9FQUFvRSxDQUFDO0FBQ2hILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDOztBQUVwRixNQUFNLFVBQVUsR0FBVTtJQUN4Qix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtDQUNsQixDQUFDO0FBQ0YsTUFBTSxVQUFVLEdBQVU7SUFDeEIsNkJBQTZCO0lBQzdCLGdDQUFnQztJQUNoQywrQkFBK0I7SUFDL0IsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qiw4QkFBOEI7Q0FDL0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsT0FBTyxFQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFlLENBQUM7QUFDdEQsQ0FBQztBQXFCRCxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQXZDekIseUJBQXlCO1FBQ3pCLHlCQUF5QjtRQUN6QixpQkFBaUI7UUFDakIsNEJBQTRCO1FBQzVCLG9CQUFvQjtRQUNwQixpQkFBaUIsRUFHakIsNkJBQTZCO1FBQzdCLGdDQUFnQztRQUNoQywrQkFBK0I7UUFDL0IsOEJBQThCO1FBQzlCLDZCQUE2QjtRQUM3Qiw4QkFBOEIsYUFVNUIsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixjQUFjO1FBQ2QsaUJBQWlCO1FBQ2pCLFdBQVc7UUFDWCxTQUFTO1FBQ1Qsa0JBQWtCLGFBN0JwQix5QkFBeUI7UUFDekIseUJBQXlCO1FBQ3pCLGlCQUFpQjtRQUNqQiw0QkFBNEI7UUFDNUIsb0JBQW9CO1FBQ3BCLGlCQUFpQixFQUdqQiw2QkFBNkI7UUFDN0IsZ0NBQWdDO1FBQ2hDLCtCQUErQjtRQUMvQiw4QkFBOEI7UUFDOUIsNkJBQTZCO1FBQzdCLDhCQUE4Qjs0R0EwQm5CLGNBQWMsYUFQZDtRQUNUO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLGlCQUFpQjtTQUM5QjtLQUNGLFlBZEMsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixjQUFjO1FBQ2QsaUJBQWlCO1FBQ2pCLFdBQVc7UUFDWCxTQUFTO1FBQ1Qsa0JBQWtCOzJGQVVULGNBQWM7a0JBbkIxQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDO29CQUM1QyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixXQUFXO3dCQUNYLFNBQVM7d0JBQ1Qsa0JBQWtCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQztvQkFDdkMsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxlQUFlOzRCQUN4QixVQUFVLEVBQUUsaUJBQWlCO3lCQUM5QjtxQkFDRjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtFbGVtZW50UmVmLCBOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VGFnTW9kdWxlfSBmcm9tICdAbWFyY3VyYS9tYXJjdXJhLXRhZyc7XG5pbXBvcnQge0NvbWJvQm94TW9kdWxlLCBEcm9wRG93bkxpc3RNb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kcm9wZG93bnMnO1xuaW1wb3J0IHtQb3B1cE1vZHVsZSwgUE9QVVBfQ09OVEFJTkVSfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1wb3B1cCc7XG5pbXBvcnQge0NvbWJvYm94SXRlbVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi9saWIvZGlyZWN0aXZlcy9jb21ib2JveC1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0Ryb3Bkb3duSXRlbVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi9saWIvZGlyZWN0aXZlcy9kcm9wZG93bi1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0Ryb3Bkb3duVmFsdWVUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvZHJvcGRvd24tdmFsdWUtdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7TXVsdGlzZWxlY3RJdGVtVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uL2xpYi9kaXJlY3RpdmVzL211bHRpc2VsZWN0LWl0ZW0tdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7TXVsdGlzZWxlY3RUYWdUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge011bHRpc2VsZWN0VGFnV3JhcHBlckRpcmVjdGl2ZX0gZnJvbSAnLi4vbGliL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXdyYXBwZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7QWJzdHJhY3RDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudCc7XG5pbXBvcnQge0Fic3RyYWN0RHJvcGRvd25Db21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9hYnN0cmFjdC1kcm9wZG93bi9hYnN0cmFjdC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21ib2JveFBvcHVwRm9vdGVyQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvY29tYm9ib3gtcG9wdXAtZm9vdGVyL2NvbWJvYm94LXBvcHVwLWZvb3Rlci5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudCc7XG5pbXBvcnQge0Ryb3Bkb3duQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7TXVsdGlzZWxlY3RDb21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9tdWx0aXNlbGVjdC9tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xuXG5jb25zdCBjb21wb25lbnRzOiBhbnlbXSA9IFtcbiAgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudCxcbiAgQWJzdHJhY3REcm9wZG93bkNvbXBvbmVudCxcbiAgQ29tYm9ib3hDb21wb25lbnQsXG4gIENvbWJvYm94UG9wdXBGb290ZXJDb21wb25lbnQsXG4gIE11bHRpc2VsZWN0Q29tcG9uZW50LFxuICBEcm9wZG93bkNvbXBvbmVudCxcbl07XG5jb25zdCBkaXJlY3RpdmVzOiBhbnlbXSA9IFtcbiAgQ29tYm9ib3hJdGVtVGVtcGxhdGVEaXJlY3RpdmUsXG4gIE11bHRpc2VsZWN0SXRlbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBNdWx0aXNlbGVjdFRhZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICBNdWx0aXNlbGVjdFRhZ1dyYXBwZXJEaXJlY3RpdmUsXG4gIERyb3Bkb3duSXRlbVRlbXBsYXRlRGlyZWN0aXZlLFxuICBEcm9wZG93blZhbHVlVGVtcGxhdGVEaXJlY3RpdmUsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdXBDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gIHJldHVybiB7bmF0aXZlRWxlbWVudDogZG9jdW1lbnQuYm9keX0gYXMgRWxlbWVudFJlZjtcbn1cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbLi4uY29tcG9uZW50cywgLi4uZGlyZWN0aXZlc10sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBDb21ib0JveE1vZHVsZSxcbiAgICBNdWx0aVNlbGVjdE1vZHVsZSxcbiAgICBQb3B1cE1vZHVsZSxcbiAgICBUYWdNb2R1bGUsXG4gICAgRHJvcERvd25MaXN0TW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbLi4uY29tcG9uZW50cywgLi4uZGlyZWN0aXZlc10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBPUFVQX0NPTlRBSU5FUixcbiAgICAgIHVzZUZhY3Rvcnk6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94TW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,241 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, Renderer2, } from '@angular/core';
2
+ import { isFalse, Is, Observer, Worker, flatten } from '@marcura/marcura-common';
3
+ import { combineLatest, BehaviorSubject } from 'rxjs';
4
+ import { debounceTime, distinctUntilChanged, filter, map, skip, tap } from 'rxjs/operators';
5
+ import { AbstractDropdownComponent } from '../../components/abstract-dropdown/abstract-dropdown.component';
6
+ import { ComboboxSearchSettingsOperator } from '../../model/combobox-search-settings-operator.enum';
7
+ import * as i0 from "@angular/core";
8
+ export class AbstractComboboxComponent extends AbstractDropdownComponent {
9
+ get debounceTime() {
10
+ return this._debounceTime;
11
+ }
12
+ set debounceTime(value) {
13
+ this._debounceTime = value;
14
+ this._listenToSearched();
15
+ }
16
+ get items() {
17
+ return this._items;
18
+ }
19
+ set items(items) {
20
+ this._isSync = true;
21
+ this._items = items || [];
22
+ this._listenToSearched();
23
+ this._loadedItems.next(this._items);
24
+ }
25
+ get additionalItems() {
26
+ return this._additionalItems.value;
27
+ }
28
+ set additionalItems(additionalItems) {
29
+ this._additionalItems.next(additionalItems || []);
30
+ }
31
+ _disableChromeAutocomplete() {
32
+ if (this._component.searchbar && this._component.searchbar.input) {
33
+ this._renderer.setAttribute(this._component.searchbar.input.nativeElement, 'autocomplete', 'disabled');
34
+ }
35
+ }
36
+ _listenToSearched() {
37
+ this._debounceObserver.clear();
38
+ this._debounceObserver.listen(this._searchText.pipe(distinctUntilChanged(), skip(1), tap((searchText) => {
39
+ this.searched.emit(searchText);
40
+ this._isSearching.next(this.canLoadItems(searchText) && this._isOpen.value.isOpen);
41
+ }), debounceTime(this._isSync ? 0 : this.debounceTime), filter(() => this._isOpen.value.isOpen)), this.loadItems);
42
+ }
43
+ _filterItems(items, searchText) {
44
+ if (!items || !items.length) {
45
+ return [];
46
+ }
47
+ // TODO: technical-debt - fix group result case to avoid any
48
+ return items.filter((item) => {
49
+ let itemText = (item[this.textField] || '').toString().trim() ?? '';
50
+ itemText = this.searchSettings.isCaseSensitive ? itemText : itemText.toLowerCase();
51
+ return this.searchSettings.operator === ComboboxSearchSettingsOperator.Contains
52
+ ? itemText.indexOf(searchText) !== -1
53
+ : itemText.substring(0, searchText.length) === searchText;
54
+ });
55
+ }
56
+ _setComponent(component) {
57
+ this._component = component;
58
+ this._disableChromeAutocomplete();
59
+ }
60
+ searchItems(searchText) {
61
+ if (!this.searchSettings || !searchText || !this._items.length) {
62
+ return this._items;
63
+ }
64
+ searchText = this.searchSettings.isCaseSensitive ? searchText : searchText.toLowerCase();
65
+ if (this.isGroupable) {
66
+ const groups = this._items;
67
+ const filteredGroups = groups
68
+ .map((group) => ({
69
+ ...group,
70
+ items: this._filterItems(group.items, searchText),
71
+ }))
72
+ .filter((group) => group.items.length > 0);
73
+ return filteredGroups;
74
+ }
75
+ return this._filterItems(this._items, searchText);
76
+ }
77
+ canLoadItems(searchText) {
78
+ return searchText.length >= this.minSearchCharacters && !this._isSync;
79
+ }
80
+ getItem(items, text) {
81
+ text = text.toLowerCase();
82
+ return this._unwrapGroups(items).find((item) => `${item[this.textField]}`.toLowerCase() === text) ?? null;
83
+ }
84
+ _unwrapGroups(items) {
85
+ return flatten(items.map(item => this._isGroupResult(item) ? item.items : [item]));
86
+ }
87
+ _isGroupResult(item) {
88
+ const object = item;
89
+ return object.items !== undefined && object.aggregates !== undefined && object.field !== undefined && object.value !== undefined;
90
+ }
91
+ isItemEqual(item1, item2) {
92
+ const isItem1Empty = item1 === null || item1 === undefined;
93
+ const isItem2Empty = item2 === null || item2 === undefined;
94
+ if (isItem1Empty && isItem2Empty) {
95
+ return true;
96
+ }
97
+ if (isItem1Empty || isItem2Empty) {
98
+ return false;
99
+ }
100
+ return this.isPrimitiveValue ? item1 === item2 : item1[this.valueField] === item2[this.valueField];
101
+ }
102
+ constructor(changeDetectorRef, _renderer) {
103
+ super(changeDetectorRef);
104
+ this._renderer = _renderer;
105
+ this._debounceTime = 500;
106
+ this._debounceObserver = new Observer();
107
+ this._worker = new Worker();
108
+ this._additionalItems = new BehaviorSubject([]);
109
+ this._valueNormalizerItems = [];
110
+ this._isSync = false;
111
+ this._loadedItems = new BehaviorSubject([]);
112
+ this._hasSearched = new BehaviorSubject(false);
113
+ this._isSearching = new BehaviorSubject(false);
114
+ this._searchText = new BehaviorSubject('');
115
+ this.combinedItems = combineLatest([this._loadedItems, this._additionalItems]).pipe(map(([items, additionalItems]) => [...items, ...additionalItems].filter(Is.truthy)));
116
+ this.isSearchable = true;
117
+ this.minSearchCharacters = 1;
118
+ this.search = null;
119
+ this.areItemsCached = false;
120
+ this.searchSettings = {
121
+ isCaseSensitive: false,
122
+ operator: ComboboxSearchSettingsOperator.Contains,
123
+ };
124
+ this.isGroupable = false;
125
+ this.searched = new EventEmitter();
126
+ this.isNoItemsTextVisible = combineLatest([
127
+ this._isSearching,
128
+ this._hasSearched,
129
+ this._isFocused,
130
+ this.combinedItems,
131
+ ]).pipe(map(([isSearching, hasSearched, isFocused, combinedItems]) => {
132
+ return !isSearching && hasSearched && isFocused && combinedItems.length === 0;
133
+ }));
134
+ this.isMinSearchTextVisible = combineLatest([
135
+ this._isSearching,
136
+ this._hasSearched,
137
+ this._isFocused,
138
+ ]).pipe(map(([isSearching, hasSearched, isFocused]) => {
139
+ return !this._isSync && !isSearching && !hasSearched && isFocused;
140
+ }));
141
+ this.isLoadingSpinnerVisible = combineLatest([
142
+ this._isLoading,
143
+ this._isSearching,
144
+ ]).pipe(map(([isLoading, isSearching]) => isLoading || isSearching));
145
+ // To show loading properly we are to use loadedItems as they don't include additionalItems.
146
+ this.isLoadingTextVisible = combineLatest([
147
+ this.isLoadingSpinnerVisible,
148
+ this._loadedItems,
149
+ ]).pipe(map(([isLoadingSpinnerVisible, loadedItems]) => isLoadingSpinnerVisible && loadedItems.length === 0));
150
+ this.loadItems = (searchText) => {
151
+ searchText = (searchText || '').trim();
152
+ if (this._isSync) {
153
+ this._hasSearched.next(!!searchText);
154
+ this._loadedItems.next(this.searchItems(searchText));
155
+ }
156
+ else {
157
+ if (this.canLoadItems(searchText)) {
158
+ this._isSearching.next(true);
159
+ this._worker.handle(this.search ? this.search(searchText) : new BehaviorSubject([]), (items) => {
160
+ this._hasSearched.next(true);
161
+ this._loadedItems.next(items);
162
+ this._valueNormalizerItems = [...items, ...this._additionalItems.value];
163
+ this._isSearching.next(false);
164
+ });
165
+ }
166
+ else {
167
+ this._hasSearched.next(false);
168
+ this._loadedItems.next([]);
169
+ this._valueNormalizerItems = [];
170
+ this._isSearching.next(false);
171
+ }
172
+ }
173
+ };
174
+ }
175
+ ngOnDestroy() {
176
+ this._debounceObserver.destroy();
177
+ this._worker.destroy();
178
+ super.ngOnDestroy();
179
+ }
180
+ init() {
181
+ super.init();
182
+ this._listenToSearched();
183
+ if (this._isSync) {
184
+ this._loadedItems.next(this._items);
185
+ }
186
+ // Closed.
187
+ this._observer.listen(this._isOpen.pipe(filter((event) => !event.isOpen), skip(1)), (event) => {
188
+ if (!this.areItemsCached && !this._isSync) {
189
+ this._loadedItems.next([]);
190
+ }
191
+ this._worker.cancel();
192
+ this._isSearching.next(false);
193
+ if (event.shouldEmit) {
194
+ this.closed.emit();
195
+ }
196
+ });
197
+ // Blurred.
198
+ this._observer.listen(this._isFocused.pipe(filter(isFalse)), () => {
199
+ // Restore original unfiltered items when the component is blurred
200
+ // after some search text entered. Consider a case:
201
+ // 1. Search with text that gives 0 items.
202
+ // 2. Blur and focus.
203
+ // 3. Search text is cleared, but items remain empty, so the list won't show up.
204
+ this._loadedItems.next(this._items);
205
+ this._hasSearched.next(false);
206
+ });
207
+ }
208
+ onSearched(searchText) {
209
+ this._searchText.next(searchText);
210
+ }
211
+ }
212
+ AbstractComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
213
+ AbstractComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: AbstractComboboxComponent, selector: "ng-component", inputs: { isSearchable: "isSearchable", minSearchCharacters: "minSearchCharacters", search: "search", areItemsCached: "areItemsCached", debounceTime: "debounceTime", items: "items", additionalItems: "additionalItems", searchSettings: "searchSettings", isGroupable: "isGroupable" }, outputs: { searched: "searched" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractComboboxComponent, decorators: [{
215
+ type: Component,
216
+ args: [{
217
+ template: '',
218
+ changeDetection: ChangeDetectionStrategy.OnPush,
219
+ }]
220
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { isSearchable: [{
221
+ type: Input
222
+ }], minSearchCharacters: [{
223
+ type: Input
224
+ }], search: [{
225
+ type: Input
226
+ }], areItemsCached: [{
227
+ type: Input
228
+ }], debounceTime: [{
229
+ type: Input
230
+ }], items: [{
231
+ type: Input
232
+ }], additionalItems: [{
233
+ type: Input
234
+ }], searchSettings: [{
235
+ type: Input
236
+ }], isGroupable: [{
237
+ type: Input
238
+ }], searched: [{
239
+ type: Output
240
+ }] } });
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Fic3RyYWN0LWNvbWJvYm94L2Fic3RyYWN0LWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQXVCLE9BQU8sRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBHLE9BQU8sRUFBQyxhQUFhLEVBQUUsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFHekcsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sb0RBQW9ELENBQUM7O0FBT2xHLE1BQU0sT0FBTyx5QkFDWCxTQUFRLHlCQUFnRjtJQXVCeEYsSUFDVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBVyxZQUFZLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFDb0IsS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQW9CLEtBQUssQ0FBQyxLQUE4QjtR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QkFDaEQ7Z0lBa0JRLFlBQVk7c0JBRGxCLEtBQUs7Z0JBR0MsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUdDLE1BQU07c0JBRFosS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBU2MsS0FBSztzQkFEeEIsS0FBSztnQkFXSyxlQUFlO3NCQUR6QixLQUFLO2dCQVFDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBTUMsV0FBVztzQkFEakIsS0FBSztnQkFHQyxRQUFRO3NCQURkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lzRmFsc2UsIElzLCBPYnNlcnZlciwgV29ya2VyLCBDb250cm9sQ2hhbmdlZEV2ZW50LCBmbGF0dGVufSBmcm9tICdAbWFyY3VyYS9tYXJjdXJhLWNvbW1vbic7XG5pbXBvcnQge0dyb3VwUmVzdWx0fSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQge2NvbWJpbmVMYXRlc3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QWJzdHJhY3REcm9wZG93bkNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hYnN0cmFjdC1kcm9wZG93bi9hYnN0cmFjdC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHtJQ29tYm9ib3hLZW5kb0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gta2VuZG8tY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQge0NvbWJvYm94U2VhcmNoRm59IGZyb20gJy4uLy4uL21vZGVsL2NvbWJvYm94LXNlYXJjaC1mbi50eXBlJztcbmltcG9ydCB7Q29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yfSBmcm9tICcuLi8uLi9tb2RlbC9jb21ib2JveC1zZWFyY2gtc2V0dGluZ3Mtb3BlcmF0b3IuZW51bSc7XG5pbXBvcnQge0lDb21ib2JveFNlYXJjaFNldHRpbmdzfSBmcm9tICcuLi8uLi9tb2RlbC9jb21ib2JveC1zZWFyY2gtc2V0dGluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiAnJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFic3RyYWN0Q29tYm9ib3hDb21wb25lbnQ8VEl0ZW0sIFRWYWx1ZSwgVENoYW5nZWRFdmVudCBleHRlbmRzIENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPiA9IENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPj5cbiAgZXh0ZW5kcyBBYnN0cmFjdERyb3Bkb3duQ29tcG9uZW50PFRJdGVtLCBUVmFsdWUsIElDb21ib2JveEtlbmRvQ29tcG9uZW50LCBUQ2hhbmdlZEV2ZW50PlxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kZWJvdW5jZVRpbWU6IG51bWJlciA9IDUwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVib3VuY2VPYnNlcnZlcjogT2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2VyOiBXb3JrZXIgPSBuZXcgV29ya2VyKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkZGl0aW9uYWxJdGVtczogQmVoYXZpb3JTdWJqZWN0PFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10+KFtdKTtcbiAgcHJvdGVjdGVkIF92YWx1ZU5vcm1hbGl6ZXJJdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pc1N5bmM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9sb2FkZWRJdGVtczogQmVoYXZpb3JTdWJqZWN0PFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9oYXNTZWFyY2hlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBfaXNTZWFyY2hpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3NlYXJjaFRleHQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjb21iaW5lZEl0ZW1zOiBPYnNlcnZhYmxlPFRJdGVtW10gfCBHcm91cFJlc3VsdFtdPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2xvYWRlZEl0ZW1zLCB0aGlzLl9hZGRpdGlvbmFsSXRlbXNdKS5waXBlKFxuICAgIG1hcCgoW2l0ZW1zLCBhZGRpdGlvbmFsSXRlbXNdKTogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10gPT4gWy4uLml0ZW1zLCAuLi5hZGRpdGlvbmFsSXRlbXNdLmZpbHRlcihJcy50cnV0aHkpIGFzIFRJdGVtW10gfCBHcm91cFJlc3VsdFtdKVxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNTZWFyY2hhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIG1pblNlYXJjaENoYXJhY3RlcnM6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2g6IENvbWJvYm94U2VhcmNoRm48VEl0ZW0+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmVJdGVtc0NhY2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGRlYm91bmNlVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZVRpbWU7XG4gIH1cbiAgcHVibGljIHNldCBkZWJvdW5jZVRpbWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2RlYm91bmNlVGltZSA9IHZhbHVlO1xuICAgIHRoaXMuX2xpc3RlblRvU2VhcmNoZWQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGl0ZW1zKCk6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIHNldCBpdGVtcyhpdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10pIHtcbiAgICB0aGlzLl9pc1N5bmMgPSB0cnVlO1xuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMgfHwgW107XG4gICAgdGhpcy5fbGlzdGVuVG9TZWFyY2hlZCgpO1xuICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQodGhpcy5faXRlbXMpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgYWRkaXRpb25hbEl0ZW1zKCk6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEl0ZW1zLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgYWRkaXRpb25hbEl0ZW1zKGFkZGl0aW9uYWxJdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10pIHtcbiAgICB0aGlzLl9hZGRpdGlvbmFsSXRlbXMubmV4dChhZGRpdGlvbmFsSXRlbXMgfHwgW10pO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2hTZXR0aW5nczogSUNvbWJvYm94U2VhcmNoU2V0dGluZ3MgPSB7XG4gICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICBvcGVyYXRvcjogQ29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yLkNvbnRhaW5zLFxuICB9O1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNHcm91cGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWFyY2hlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyByZWFkb25seSBpc05vSXRlbXNUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzU2VhcmNoaW5nLFxuICAgIHRoaXMuX2hhc1NlYXJjaGVkLFxuICAgIHRoaXMuX2lzRm9jdXNlZCxcbiAgICB0aGlzLmNvbWJpbmVkSXRlbXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaXNTZWFyY2hpbmcsIGhhc1NlYXJjaGVkLCBpc0ZvY3VzZWQsIGNvbWJpbmVkSXRlbXNdKSA9PiB7XG4gICAgICByZXR1cm4gIWlzU2VhcmNoaW5nICYmIGhhc1NlYXJjaGVkICYmIGlzRm9jdXNlZCAmJiBjb21iaW5lZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICB9KVxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNaW5TZWFyY2hUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzU2VhcmNoaW5nLFxuICAgIHRoaXMuX2hhc1NlYXJjaGVkLFxuICAgIHRoaXMuX2lzRm9jdXNlZCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpc1NlYXJjaGluZywgaGFzU2VhcmNoZWQsIGlzRm9jdXNlZF0pID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5faXNTeW5jICYmICFpc1NlYXJjaGluZyAmJiAhaGFzU2VhcmNoZWQgJiYgaXNGb2N1c2VkO1xuICAgIH0pXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmdTcGlubmVyVmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX2lzTG9hZGluZyxcbiAgICB0aGlzLl9pc1NlYXJjaGluZyxcbiAgXSkucGlwZShtYXAoKFtpc0xvYWRpbmcsIGlzU2VhcmNoaW5nXSkgPT4gaXNMb2FkaW5nIHx8IGlzU2VhcmNoaW5nKSk7XG4gIC8vIFRvIHNob3cgbG9hZGluZyBwcm9wZXJseSB3ZSBhcmUgdG8gdXNlIGxvYWRlZEl0ZW1zIGFzIHRoZXkgZG9uJ3QgaW5jbHVkZSBhZGRpdGlvbmFsSXRlbXMuXG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmdUZXh0VmlzaWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaXNMb2FkaW5nU3Bpbm5lclZpc2libGUsXG4gICAgdGhpcy5fbG9hZGVkSXRlbXMsXG4gIF0pLnBpcGUobWFwKChbaXNMb2FkaW5nU3Bpbm5lclZpc2libGUsIGxvYWRlZEl0ZW1zXSkgPT4gaXNMb2FkaW5nU3Bpbm5lclZpc2libGUgJiYgbG9hZGVkSXRlbXMubGVuZ3RoID09PSAwKSk7XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZUNocm9tZUF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50LnNlYXJjaGJhciAmJiB0aGlzLl9jb21wb25lbnQuc2VhcmNoYmFyLmlucHV0KSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fY29tcG9uZW50LnNlYXJjaGJhci5pbnB1dC5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuVG9TZWFyY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWJvdW5jZU9ic2VydmVyLmNsZWFyKCk7XG4gICAgdGhpcy5fZGVib3VuY2VPYnNlcnZlci5saXN0ZW4oXG4gICAgICB0aGlzLl9zZWFyY2hUZXh0LnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHNraXAoMSksXG4gICAgICAgIHRhcCgoc2VhcmNoVGV4dCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoZWQuZW1pdChzZWFyY2hUZXh0KTtcbiAgICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5uZXh0KHRoaXMuY2FuTG9hZEl0ZW1zKHNlYXJjaFRleHQpICYmIHRoaXMuX2lzT3Blbi52YWx1ZS5pc09wZW4pO1xuICAgICAgICB9KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuX2lzU3luYyA/IDAgOiB0aGlzLmRlYm91bmNlVGltZSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc09wZW4udmFsdWUuaXNPcGVuKVxuICAgICAgKSxcbiAgICAgIHRoaXMubG9hZEl0ZW1zXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlckl0ZW1zKGl0ZW1zOiBUSXRlbVtdIHwgR3JvdXBSZXN1bHRbXSwgc2VhcmNoVGV4dDogc3RyaW5nKTogVEl0ZW1bXSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGVjaG5pY2FsLWRlYnQgLSBmaXggZ3JvdXAgcmVzdWx0IGNhc2UgdG8gYXZvaWQgYW55XG4gICAgcmV0dXJuIChpdGVtcyBhcyBhbnlbXSkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBsZXQgaXRlbVRleHQ6IHN0cmluZyA9IChpdGVtW3RoaXMudGV4dEZpZWxkXSB8fCAnJykudG9TdHJpbmcoKS50cmltKCkgPz8gJyc7XG4gICAgICBpdGVtVGV4dCA9IHRoaXMuc2VhcmNoU2V0dGluZ3MuaXNDYXNlU2Vuc2l0aXZlID8gaXRlbVRleHQgOiBpdGVtVGV4dC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXR0aW5ncy5vcGVyYXRvciA9PT0gQ29tYm9ib3hTZWFyY2hTZXR0aW5nc09wZXJhdG9yLkNvbnRhaW5zXG4gICAgICAgID8gaXRlbVRleHQuaW5kZXhPZihzZWFyY2hUZXh0KSAhPT0gLTFcbiAgICAgICAgOiBpdGVtVGV4dC5zdWJzdHJpbmcoMCwgc2VhcmNoVGV4dC5sZW5ndGgpID09PSBzZWFyY2hUZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9zZXRDb21wb25lbnQoY29tcG9uZW50OiBJQ29tYm9ib3hLZW5kb0NvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLl9kaXNhYmxlQ2hyb21lQXV0b2NvbXBsZXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VhcmNoSXRlbXMoc2VhcmNoVGV4dDogc3RyaW5nKTogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10ge1xuICAgIGlmICghdGhpcy5zZWFyY2hTZXR0aW5ncyB8fCAhc2VhcmNoVGV4dCB8fCAhdGhpcy5faXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuXG4gICAgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoU2V0dGluZ3MuaXNDYXNlU2Vuc2l0aXZlID8gc2VhcmNoVGV4dCA6IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLmlzR3JvdXBhYmxlKSB7XG4gICAgICBjb25zdCBncm91cHM6IEdyb3VwUmVzdWx0W10gPSA8YW55PnRoaXMuX2l0ZW1zO1xuICAgICAgY29uc3QgZmlsdGVyZWRHcm91cHM6IEdyb3VwUmVzdWx0W10gPSBncm91cHNcbiAgICAgICAgLm1hcCgoZ3JvdXApOiBHcm91cFJlc3VsdCA9PiAoe1xuICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgIGl0ZW1zOiB0aGlzLl9maWx0ZXJJdGVtcyg8VEl0ZW1bXT5ncm91cC5pdGVtcywgc2VhcmNoVGV4dCkgYXMgYW55LFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLml0ZW1zLmxlbmd0aCA+IDApO1xuXG4gICAgICByZXR1cm4gPGFueT5maWx0ZXJlZEdyb3VwcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXModGhpcy5faXRlbXMsIHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbkxvYWRJdGVtcyhzZWFyY2hUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2VhcmNoVGV4dC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2hDaGFyYWN0ZXJzICYmICF0aGlzLl9pc1N5bmM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SXRlbShpdGVtczogVEl0ZW1bXSB8IEdyb3VwUmVzdWx0W10sIHRleHQ6IHN0cmluZyk6IFRJdGVtIHwgbnVsbCB7XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5fdW53cmFwR3JvdXBzKGl0ZW1zKS5maW5kKChpdGVtKSA9PiBgJHtpdGVtW3RoaXMudGV4dEZpZWxkXX1gLnRvTG93ZXJDYXNlKCkgPT09IHRleHQpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBHcm91cHMoaXRlbXM6IFRJdGVtW10gfCBHcm91cFJlc3VsdFtdKTogVEl0ZW1bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oXG4gICAgICBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLl9pc0dyb3VwUmVzdWx0KGl0ZW0pID8gaXRlbS5pdGVtcyBhcyBUSXRlbVtdIDogW2l0ZW1dKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9pc0dyb3VwUmVzdWx0KGl0ZW06IFRJdGVtIHwgR3JvdXBSZXN1bHQpOiBpdGVtIGlzIEdyb3VwUmVzdWx0IHtcbiAgICBjb25zdCBvYmplY3Q6IGFueSA9IGl0ZW07XG4gICAgcmV0dXJuIG9iamVjdC5pdGVtcyAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5hZ2dyZWdhdGVzICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmZpZWxkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJdGVtRXF1YWwoaXRlbTE6IFRJdGVtLCBpdGVtMjogVEl0ZW0pOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0l0ZW0xRW1wdHk6IGJvb2xlYW4gPSBpdGVtMSA9PT0gbnVsbCB8fCBpdGVtMSA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzSXRlbTJFbXB0eTogYm9vbGVhbiA9IGl0ZW0yID09PSBudWxsIHx8IGl0ZW0yID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNJdGVtMUVtcHR5ICYmIGlzSXRlbTJFbXB0eSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzSXRlbTFFbXB0eSB8fCBpc0l0ZW0yRW1wdHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ByaW1pdGl2ZVZhbHVlID8gaXRlbTEgPT09IGl0ZW0yIDogaXRlbTFbdGhpcy52YWx1ZUZpZWxkXSA9PT0gaXRlbTJbdGhpcy52YWx1ZUZpZWxkXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsb2FkSXRlbXMgPSAoc2VhcmNoVGV4dD86IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIHNlYXJjaFRleHQgPSAoc2VhcmNoVGV4dCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYgKHRoaXMuX2lzU3luYykge1xuICAgICAgdGhpcy5faGFzU2VhcmNoZWQubmV4dCghIXNlYXJjaFRleHQpO1xuICAgICAgdGhpcy5fbG9hZGVkSXRlbXMubmV4dCh0aGlzLnNlYXJjaEl0ZW1zKHNlYXJjaFRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2FuTG9hZEl0ZW1zKHNlYXJjaFRleHQpKSB7XG4gICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX3dvcmtlci5oYW5kbGUodGhpcy5zZWFyY2ggPyB0aGlzLnNlYXJjaChzZWFyY2hUZXh0KSA6IG5ldyBCZWhhdmlvclN1YmplY3QoW10pLCAoaXRlbXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9oYXNTZWFyY2hlZC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQoaXRlbXMpO1xuICAgICAgICAgIHRoaXMuX3ZhbHVlTm9ybWFsaXplckl0ZW1zID0gWy4uLml0ZW1zLCAuLi50aGlzLl9hZGRpdGlvbmFsSXRlbXMudmFsdWVdIGFzIFRJdGVtW10gfCBHcm91cFJlc3VsdFtdO1xuICAgICAgICAgIHRoaXMuX2lzU2VhcmNoaW5nLm5leHQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hhc1NlYXJjaGVkLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLl9sb2FkZWRJdGVtcy5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5fdmFsdWVOb3JtYWxpemVySXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5faXNTZWFyY2hpbmcubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKGNoYW5nZURldGVjdG9yUmVmKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWJvdW5jZU9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl93b3JrZXIuZGVzdHJveSgpO1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0KCk7XG4gICAgdGhpcy5fbGlzdGVuVG9TZWFyY2hlZCgpO1xuXG4gICAgaWYgKHRoaXMuX2lzU3luYykge1xuICAgICAgdGhpcy5fbG9hZGVkSXRlbXMubmV4dCh0aGlzLl9pdGVtcyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2VkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3RlbihcbiAgICAgIHRoaXMuX2lzT3Blbi5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuaXNPcGVuKSxcbiAgICAgICAgc2tpcCgxKVxuICAgICAgKSxcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXJlSXRlbXNDYWNoZWQgJiYgIXRoaXMuX2lzU3luYykge1xuICAgICAgICAgIHRoaXMuX2xvYWRlZEl0ZW1zLm5leHQoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd29ya2VyLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLl9pc1NlYXJjaGluZy5uZXh0KGZhbHNlKTtcblxuICAgICAgICBpZiAoZXZlbnQuc2hvdWxkRW1pdCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBCbHVycmVkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9pc0ZvY3VzZWQucGlwZShmaWx0ZXIoaXNGYWxzZSkpLCAoKSA9PiB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHVuZmlsdGVyZWQgaXRlbXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJsdXJyZWRcbiAgICAgIC8vIGFmdGVyIHNvbWUgc2VhcmNoIHRleHQgZW50ZXJlZC4gQ29uc2lkZXIgYSBjYXNlOlxuICAgICAgLy8gMS4gU2VhcmNoIHdpdGggdGV4dCB0aGF0IGdpdmVzIDAgaXRlbXMuXG4gICAgICAvLyAyLiBCbHVyIGFuZCBmb2N1cy5cbiAgICAgIC8vIDMuIFNlYXJjaCB0ZXh0IGlzIGNsZWFyZWQsIGJ1dCBpdGVtcyByZW1haW4gZW1wdHksIHNvIHRoZSBsaXN0IHdvbid0IHNob3cgdXAuXG4gICAgICB0aGlzLl9sb2FkZWRJdGVtcy5uZXh0KHRoaXMuX2l0ZW1zKTtcbiAgICAgIHRoaXMuX2hhc1NlYXJjaGVkLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uU2VhcmNoZWQoc2VhcmNoVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2VhcmNoVGV4dC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG59XG4iXX0=