@messaia/cdk 13.3.10 → 13.4.0-legacy

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 (197) hide show
  1. package/esm2020/lib/base/base.module.mjs +10 -32
  2. package/esm2020/lib/base/components/base.component.mjs +9 -61
  3. package/esm2020/lib/base/components/generic-form-base.component.mjs +23 -27
  4. package/esm2020/lib/base/components/generic-form.component.mjs +3 -3
  5. package/esm2020/lib/base/components/generic-list.component.mjs +31 -152
  6. package/esm2020/lib/base/components/generic-reactive-form.component.mjs +3 -6
  7. package/esm2020/lib/base/interceptors/base.interceptor.mjs +3 -3
  8. package/esm2020/lib/base/interceptors/caching-interceptor.mjs +3 -3
  9. package/esm2020/lib/base/interceptors/loading.interceptor.mjs +3 -3
  10. package/esm2020/lib/base/services/file.service.mjs +3 -3
  11. package/esm2020/lib/base/services/loading-screen.service.mjs +3 -3
  12. package/esm2020/lib/base/services/print.service.mjs +3 -3
  13. package/esm2020/lib/chips/chips.module.mjs +8 -21
  14. package/esm2020/lib/chips/components/chips.component.mjs +179 -243
  15. package/esm2020/lib/common/common.module.mjs +5 -6
  16. package/esm2020/lib/common/constants/constants.mjs +2 -3
  17. package/esm2020/lib/common/directives/disable-control.directive.mjs +3 -3
  18. package/esm2020/lib/common/functions/decorators.mjs +3 -3
  19. package/esm2020/lib/common/functions/functions.mjs +2 -3
  20. package/esm2020/lib/common/functions/utils.mjs +3 -17
  21. package/esm2020/lib/common/helpers/app-storage.mjs +7 -31
  22. package/esm2020/lib/common/helpers/dynamic-builder.mjs +3 -3
  23. package/esm2020/lib/common/helpers/dynamic-component-compiler.mjs +3 -3
  24. package/esm2020/lib/common/models/action-menu-item.mjs +1 -1
  25. package/esm2020/lib/common/models/app-setting.mjs +3 -3
  26. package/esm2020/lib/common/pipes/data-source.pipe.mjs +3 -3
  27. package/esm2020/lib/common/pipes/enum.pipe.mjs +3 -3
  28. package/esm2020/lib/common/pipes/file-size.pipe.mjs +3 -3
  29. package/esm2020/lib/common/pipes/filter.pipe.mjs +3 -3
  30. package/esm2020/lib/common/pipes/first-letter.mjs +3 -3
  31. package/esm2020/lib/common/pipes/keys.mjs +3 -3
  32. package/esm2020/lib/common/pipes/month-name.pipe.mjs +3 -3
  33. package/esm2020/lib/common/pipes/only-number.mjs +3 -3
  34. package/esm2020/lib/common/pipes/order.pipe.mjs +3 -3
  35. package/esm2020/lib/common/pipes/placeholder.pipe.mjs +3 -3
  36. package/esm2020/lib/common/pipes/safe-html.pipe.mjs +3 -3
  37. package/esm2020/lib/common/pipes/time.pipe.mjs +3 -3
  38. package/esm2020/lib/common/pipes/titlecase.pipe.mjs +3 -3
  39. package/esm2020/lib/common/pipes/truncate.pipe.mjs +3 -3
  40. package/esm2020/lib/common/pipes/values.mjs +3 -3
  41. package/esm2020/lib/common/services/base.service.mjs +3 -3
  42. package/esm2020/lib/common/services/enum.service.mjs +3 -3
  43. package/esm2020/lib/dialogs/alert-dialog/alert-dialog.component.mjs +4 -4
  44. package/esm2020/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +4 -4
  45. package/esm2020/lib/dialogs/dialog.component.mjs +9 -9
  46. package/esm2020/lib/dialogs/dialogs.module.mjs +4 -4
  47. package/esm2020/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +4 -4
  48. package/esm2020/lib/dialogs/services/dialog.service.mjs +3 -3
  49. package/esm2020/lib/file/file-input.component.mjs +3 -3
  50. package/esm2020/lib/file/file.module.mjs +4 -4
  51. package/esm2020/lib/form-validators/directives/base-directive.mjs +3 -3
  52. package/esm2020/lib/form-validators/directives/control-host.directive.mjs +3 -3
  53. package/esm2020/lib/form-validators/directives/html-control-template.directive.mjs +3 -3
  54. package/esm2020/lib/form-validators/directives/rx-form.directive.mjs +3 -3
  55. package/esm2020/lib/form-validators/directives/template-validations/async-validation.directive.mjs +3 -3
  56. package/esm2020/lib/form-validators/directives/template-validations/base-validator.directive.mjs +3 -3
  57. package/esm2020/lib/form-validators/directives/template-validations/control-expression-process.mjs +3 -3
  58. package/esm2020/lib/form-validators/directives/template-validations/file-control.directive.mjs +3 -3
  59. package/esm2020/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +3 -3
  60. package/esm2020/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +3 -3
  61. package/esm2020/lib/form-validators/domain/element-processor/decimal.provider.mjs +3 -3
  62. package/esm2020/lib/form-validators/services/reactive-form.module.mjs +7 -7
  63. package/esm2020/lib/form-validators/services/rx-form-builder.mjs +3 -3
  64. package/esm2020/lib/form-validators/services/typed-form-builder.mjs +3 -3
  65. package/esm2020/lib/forms/components/generic-form/generic-form.component.mjs +13 -30
  66. package/esm2020/lib/forms/constants/constants.mjs +2 -3
  67. package/esm2020/lib/forms/directives/mat-form-field-editor.directive.mjs +3 -3
  68. package/esm2020/lib/forms/directives/mat-form-field-readonly.directive.mjs +3 -3
  69. package/esm2020/lib/forms/forms.module.mjs +7 -7
  70. package/esm2020/lib/forms/functions/decorators.mjs +116 -36
  71. package/esm2020/lib/forms/functions/functions.mjs +7 -17
  72. package/esm2020/lib/forms/helpers/abstract-mat-form-field.mjs +15 -41
  73. package/esm2020/lib/forms/helpers/value-accessor-base.mjs +3 -3
  74. package/esm2020/lib/forms/models/form-field-definition.mjs +6 -7
  75. package/esm2020/lib/forms/models/form-field-group.mjs +12 -0
  76. package/esm2020/lib/forms/validators/equal-validator.directive.mjs +3 -3
  77. package/esm2020/lib/forms/validators/native-element-injector.directive.mjs +3 -3
  78. package/esm2020/lib/forms/validators/unique-validator-directive.mjs +3 -3
  79. package/esm2020/lib/http/http.module.mjs +4 -4
  80. package/esm2020/lib/layout/form-toolbar/form-toolbar.component.mjs +3 -3
  81. package/esm2020/lib/layout/form-toolbar-menu/form-toolbar-menu.component.mjs +3 -3
  82. package/esm2020/lib/layout/layout-card-over/layout-card-over.component.mjs +4 -4
  83. package/esm2020/lib/layout/layout-footer/layout-footer.component.mjs +3 -3
  84. package/esm2020/lib/layout/layout-manage-list/layout-manage-list.component.mjs +4 -4
  85. package/esm2020/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +7 -7
  86. package/esm2020/lib/layout/layout-nav/layout-nav.component.mjs +3 -3
  87. package/esm2020/lib/layout/layout-nav-list/layout-nav-list.component.mjs +32 -21
  88. package/esm2020/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +26 -50
  89. package/esm2020/lib/layout/layout-toggle.class.mjs +3 -3
  90. package/esm2020/lib/layout/layout.component.mjs +3 -3
  91. package/esm2020/lib/layout/layout.directives.mjs +7 -7
  92. package/esm2020/lib/layout/layout.module.mjs +9 -9
  93. package/esm2020/lib/layout/list-toolbar/list-toolbar.component.mjs +9 -20
  94. package/esm2020/lib/layout/list-toolbar-menu/list-toolbar-menu.component.mjs +19 -0
  95. package/esm2020/lib/layout/navigation-drawer/navigation-drawer.component.mjs +8 -8
  96. package/esm2020/lib/media/directives/media-toggle.directive.mjs +3 -3
  97. package/esm2020/lib/media/media.module.mjs +4 -4
  98. package/esm2020/lib/media/services/media.service.mjs +3 -3
  99. package/esm2020/lib/menu/components/menu.component.mjs +3 -3
  100. package/esm2020/lib/menu/menu.module.mjs +4 -4
  101. package/esm2020/lib/menu/services/menu-items.service.mjs +3 -3
  102. package/esm2020/lib/menu/services/menu.resolve.mjs +5 -5
  103. package/esm2020/lib/menu/services/menu.service.mjs +3 -3
  104. package/esm2020/lib/search/search.module.mjs +4 -4
  105. package/esm2020/lib/search/vd-search-box/vd-search-box.component.mjs +3 -3
  106. package/esm2020/lib/search/vd-search-input/vd-search-input.component.mjs +3 -3
  107. package/esm2020/lib/select/components/select.component.mjs +11 -28
  108. package/esm2020/lib/select/directives/vd-select-option.directive.mjs +3 -3
  109. package/esm2020/lib/select/directives/vd-select-trigger.directive.mjs +3 -3
  110. package/esm2020/lib/select/public_api.mjs +2 -1
  111. package/esm2020/lib/select/select.module.mjs +4 -4
  112. package/esm2020/lib/table/components/dynamic-table/dynamic-table.component.mjs +43 -117
  113. package/esm2020/lib/table/components/filter-clear.component.mjs +4 -4
  114. package/esm2020/lib/table/components/filter-date.component.mjs +4 -4
  115. package/esm2020/lib/table/components/filter-input.component.mjs +4 -4
  116. package/esm2020/lib/table/components/filter-select.component.mjs +6 -6
  117. package/esm2020/lib/table/directives/data-source-filter.directive.mjs +3 -3
  118. package/esm2020/lib/table/enums/table-column-type.mjs +1 -2
  119. package/esm2020/lib/table/functions/decorators.mjs +45 -38
  120. package/esm2020/lib/table/functions/functions.mjs +5 -18
  121. package/esm2020/lib/table/models/table-column.mjs +1 -2
  122. package/esm2020/lib/table/models/table-definition.mjs +1 -1
  123. package/esm2020/lib/table/models/table-menu-item.mjs +1 -1
  124. package/esm2020/lib/table/paginator-intl.mjs +3 -3
  125. package/esm2020/lib/table/table.data-source.mjs +15 -49
  126. package/esm2020/lib/table/table.module.mjs +4 -11
  127. package/fesm2015/messaia-cdk.mjs +9541 -10197
  128. package/fesm2015/messaia-cdk.mjs.map +1 -1
  129. package/fesm2020/messaia-cdk.mjs +8052 -8695
  130. package/fesm2020/messaia-cdk.mjs.map +1 -1
  131. package/lib/base/base.module.d.ts +5 -18
  132. package/lib/base/components/base.component.d.ts +4 -31
  133. package/lib/base/components/generic-form-base.component.d.ts +7 -9
  134. package/lib/base/components/generic-list.component.d.ts +8 -55
  135. package/lib/chips/chips.module.d.ts +10 -18
  136. package/lib/chips/components/chips.component.d.ts +73 -131
  137. package/lib/common/common.module.d.ts +1 -2
  138. package/lib/common/constants/constants.d.ts +1 -2
  139. package/lib/common/functions/utils.d.ts +0 -7
  140. package/lib/common/helpers/app-storage.d.ts +1 -12
  141. package/lib/common/models/action-menu-item.d.ts +16 -7
  142. package/lib/common/styles/_common-theme.scss +5 -10
  143. package/lib/common/styles/_layout.scss +92 -149
  144. package/lib/common/styles/utilities/_general.scss +7 -428
  145. package/lib/forms/components/generic-form/generic-form.component.d.ts +3 -13
  146. package/lib/forms/constants/constants.d.ts +1 -2
  147. package/lib/forms/forms.module.d.ts +3 -3
  148. package/lib/forms/functions/decorators.d.ts +8 -3
  149. package/lib/forms/functions/functions.d.ts +3 -3
  150. package/lib/forms/helpers/abstract-mat-form-field.d.ts +14 -28
  151. package/lib/forms/models/form-field-definition.d.ts +34 -41
  152. package/lib/forms/models/form-field-group.d.ts +12 -0
  153. package/lib/layout/_layout-theme.scss +79 -114
  154. package/lib/layout/layout-nav-list/layout-nav-list.component.d.ts +9 -12
  155. package/lib/layout/layout-nav-list/layout-nav-list.directives.d.ts +0 -36
  156. package/lib/layout/layout.module.d.ts +4 -4
  157. package/lib/layout/list-toolbar/list-toolbar.component.d.ts +4 -13
  158. package/lib/layout/list-toolbar-menu/list-toolbar-menu.component.d.ts +14 -0
  159. package/lib/select/components/select.component.d.ts +8 -15
  160. package/lib/select/public_api.d.ts +1 -0
  161. package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +12 -58
  162. package/lib/table/components/filter-clear.component.d.ts +1 -1
  163. package/lib/table/components/filter-date.component.d.ts +1 -1
  164. package/lib/table/components/filter-input.component.d.ts +1 -1
  165. package/lib/table/components/filter-select.component.d.ts +1 -1
  166. package/lib/table/enums/table-column-type.d.ts +1 -2
  167. package/lib/table/functions/decorators.d.ts +5 -3
  168. package/lib/table/models/table-column.d.ts +34 -39
  169. package/lib/table/models/table-definition.d.ts +5 -8
  170. package/lib/table/models/table-menu-item.d.ts +2 -2
  171. package/lib/table/table.data-source.d.ts +4 -26
  172. package/lib/table/table.module.d.ts +19 -23
  173. package/package.json +1 -1
  174. package/esm2020/lib/base/components/dynamic-table-config-dialog.comnponent.mjs +0 -96
  175. package/esm2020/lib/base/interfaces/ibase-component.mjs +0 -2
  176. package/esm2020/lib/base/interfaces/igeneric-form-base.mjs +0 -2
  177. package/esm2020/lib/base/interfaces/igeneric-list-component.mjs +0 -2
  178. package/esm2020/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
  179. package/esm2020/lib/chips/directives/chip.directive.mjs +0 -18
  180. package/esm2020/lib/common/models/action-menu.mjs +0 -12
  181. package/esm2020/lib/forms/models/form-field-group-definition.mjs +0 -12
  182. package/esm2020/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -40
  183. package/esm2020/lib/table/constants/constants.mjs +0 -3
  184. package/esm2020/lib/table/models/table-column-config.mjs +0 -63
  185. package/esm2020/lib/table/models/table-menu.mjs +0 -12
  186. package/lib/base/components/dynamic-table-config-dialog.comnponent.d.ts +0 -39
  187. package/lib/base/interfaces/ibase-component.d.ts +0 -87
  188. package/lib/base/interfaces/igeneric-form-base.d.ts +0 -81
  189. package/lib/base/interfaces/igeneric-list-component.d.ts +0 -80
  190. package/lib/chips/directives/autocomplete-option.directive.d.ts +0 -11
  191. package/lib/chips/directives/chip.directive.d.ts +0 -11
  192. package/lib/common/models/action-menu.d.ts +0 -16
  193. package/lib/forms/models/form-field-group-definition.d.ts +0 -16
  194. package/lib/layout/dynamic-menu/dynamic-menu.component.d.ts +0 -29
  195. package/lib/table/constants/constants.d.ts +0 -2
  196. package/lib/table/models/table-column-config.d.ts +0 -30
  197. package/lib/table/models/table-menu.d.ts +0 -8
@@ -1,41 +1,60 @@
1
1
  import { FocusMonitor } from '@angular/cdk/a11y';
2
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
- import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Injector, Input, Optional, Output, Self, Type, ViewChild } from '@angular/core';
2
+ import { CdkPortal } from '@angular/cdk/portal';
3
+ import { HttpClient } from '@angular/common/http';
4
+ import { Component, ContentChild, Directive, ElementRef, EventEmitter, Injector, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
4
5
  import { FormControl, FormGroupDirective, NgControl, NgForm } from '@angular/forms';
5
- import { MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
6
6
  import { ErrorStateMatcher } from '@angular/material/core';
7
7
  import { MatFormFieldControl } from '@angular/material/form-field';
8
- import { MatPaginator } from '@angular/material/paginator';
9
- import { MatSort } from '@angular/material/sort';
8
+ import { MatInput } from '@angular/material/input';
9
+ import { BehaviorSubject } from 'rxjs';
10
10
  import { debounceTime, skip } from 'rxjs/operators';
11
- import { BaseService } from '../../common/common.module';
12
11
  import { Utils } from '../../common/functions/utils';
13
12
  import { AbstractMatFormField } from '../../forms/helpers/abstract-mat-form-field';
14
- import { VdMediaService } from '../../media/services/media.service';
15
- import { VdDynamicTableComponent } from '../../table/components/dynamic-table/dynamic-table.component';
16
- import { TableDataSource } from '../../table/table.data-source';
17
- import { VdAutocompleteOptionDirective } from '../directives/autocomplete-option.directive';
18
- import { VdChipDirective } from '../directives/chip.directive';
19
13
  import * as i0 from "@angular/core";
20
- import * as i1 from "../../media/services/media.service";
21
- import * as i2 from "@angular/forms";
22
- import * as i3 from "@angular/material/core";
23
- import * as i4 from "@angular/cdk/a11y";
24
- import * as i5 from "@angular/material/chips";
25
- import * as i6 from "@angular/material/button";
26
- import * as i7 from "@angular/material/icon";
27
- import * as i8 from "@angular/material/progress-spinner";
28
- import * as i9 from "@angular/material/autocomplete";
29
- import * as i10 from "../../table/components/dynamic-table/dynamic-table.component";
30
- import * as i11 from "@angular/material/paginator";
31
- import * as i12 from "@angular/common";
32
- import * as i13 from "@angular/material/input";
14
+ import * as i1 from "@angular/forms";
15
+ import * as i2 from "@angular/material/core";
16
+ import * as i3 from "@angular/cdk/a11y";
17
+ import * as i4 from "@angular/material/chips";
18
+ import * as i5 from "@angular/material/button";
19
+ import * as i6 from "@angular/material/icon";
20
+ import * as i7 from "@angular/material/progress-spinner";
21
+ import * as i8 from "@angular/material/autocomplete";
22
+ import * as i9 from "@angular/common";
23
+ import * as i10 from "@angular/material/input";
24
+ /**
25
+ * VdChipDirective class
26
+ */
27
+ export class VdChipDirective extends CdkPortal {
28
+ constructor(templateRef, viewContainerRef) {
29
+ super(templateRef, viewContainerRef);
30
+ }
31
+ }
32
+ /** @nocollapse */ /** @nocollapse */ VdChipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdChipDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
33
+ /** @nocollapse */ /** @nocollapse */ VdChipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: VdChipDirective, selector: "[vd-chip]ng-template", usesInheritance: true, ngImport: i0 });
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdChipDirective, decorators: [{
35
+ type: Directive,
36
+ args: [{ selector: '[vd-chip]ng-template' }]
37
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; } });
38
+ /**
39
+ * VdAutocompleteOptionDirective class
40
+ */
41
+ export class VdAutocompleteOptionDirective extends CdkPortal {
42
+ constructor(templateRef, viewContainerRef) {
43
+ super(templateRef, viewContainerRef);
44
+ }
45
+ }
46
+ /** @nocollapse */ /** @nocollapse */ VdAutocompleteOptionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdAutocompleteOptionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
47
+ /** @nocollapse */ /** @nocollapse */ VdAutocompleteOptionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: VdAutocompleteOptionDirective, selector: "[vd-autocomplete-option]ng-template", usesInheritance: true, ngImport: i0 });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdAutocompleteOptionDirective, decorators: [{
49
+ type: Directive,
50
+ args: [{ selector: '[vd-autocomplete-option]ng-template' }]
51
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; } });
52
+ /**
53
+ * VdChipsComponent class
54
+ */
33
55
  export class VdChipsComponent extends AbstractMatFormField {
34
56
  /**
35
57
  * Constructor
36
- * @param injector
37
- * @param media
38
- * @param changeDetectorRef
39
58
  * @param ngControl
40
59
  * @param parentForm
41
60
  * @param parentFormGroup
@@ -43,15 +62,18 @@ export class VdChipsComponent extends AbstractMatFormField {
43
62
  * @param focusMonitor
44
63
  * @param elementRef
45
64
  */
46
- constructor(injector, media, changeDetectorRef, ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef) {
47
- super("app-vd-chips", ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef, changeDetectorRef);
65
+ constructor(injector, ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef) {
66
+ super("app-vd-chips", ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef);
48
67
  this.injector = injector;
49
- this.media = media;
50
- this.changeDetectorRef = changeDetectorRef;
51
68
  /**
52
- * Page size options
69
+ * The http service from to get the data
53
70
  */
54
- this.pageSizeOptions = [5, 10, 15, 20, 30, 50, 100, 200];
71
+ this.http = null;
72
+ /**
73
+ * Represents a value that changes over time.
74
+ * Observers can subscribe to the subject to receive pdf file changes
75
+ */
76
+ this._endpointChange = new BehaviorSubject(null);
55
77
  /**
56
78
  * Set up reactive formcontrol
57
79
  */
@@ -65,13 +87,9 @@ export class VdChipsComponent extends AbstractMatFormField {
65
87
  */
66
88
  this.chips = [];
67
89
  /**
68
- * Readonly
90
+ * _path: any
69
91
  */
70
- this._paginated = true;
71
- /**
72
- * Readonly
73
- */
74
- this._customValue = false;
92
+ this._path = '';
75
93
  /**
76
94
  * key: string
77
95
  */
@@ -84,6 +102,14 @@ export class VdChipsComponent extends AbstractMatFormField {
84
102
  * searchFields: string
85
103
  */
86
104
  this.searchFields = [];
105
+ /**
106
+ * termMinlength: number
107
+ */
108
+ this.termMinlength = 2;
109
+ /**
110
+ * limit: number
111
+ */
112
+ this.limit = 30;
87
113
  /**
88
114
  * removable: boolean
89
115
  */
@@ -93,10 +119,6 @@ export class VdChipsComponent extends AbstractMatFormField {
93
119
  * Debounce timeout between keypresses. Defaults to 400.
94
120
  */
95
121
  this.debounce = 400;
96
- /**
97
- * autocompleteCssClass: string
98
- */
99
- this.autocompleteCssClass = '';
100
122
  /**
101
123
  * initSelect?: function
102
124
  */
@@ -123,34 +145,16 @@ export class VdChipsComponent extends AbstractMatFormField {
123
145
  * Sends chip value as event.
124
146
  */
125
147
  this.chipFocus = new EventEmitter();
126
- /**
127
- * service: BaseService
128
- */
129
- this.service = new BaseService();
130
- }
131
- /**
132
- * A reference to VdDynamicTableComponent element
133
- */
134
- get dynamicTable() { return this._dynamicTable; }
135
- set dynamicTable(dynamicTable) {
136
- this._dynamicTable = dynamicTable;
137
- if (this._dynamicTable) {
138
- this.dataSource.sort = this._dynamicTable.matSort;
139
- }
148
+ this.http = injector.get(HttpClient);
140
149
  }
141
- /**
142
- * A reference to MdPaginator element
143
- */
144
- set paginator(paginator) { this._paginator = paginator; }
145
- get paginator() { return this._paginator; }
146
150
  /**
147
151
  * Gets or sets endpoint
148
152
  */
149
153
  get endpoint() { return this._endpoint; }
150
154
  set endpoint(endpoint) {
151
155
  this._endpoint = endpoint;
152
- this.service.endpoint = typeof endpoint === 'function' ? endpoint(this) : endpoint;
153
156
  this.clear();
157
+ this._endpointChange.next([this.endpoint, this.path, this.params, this.projection]);
154
158
  }
155
159
  /**
156
160
  * params: any
@@ -158,9 +162,14 @@ export class VdChipsComponent extends AbstractMatFormField {
158
162
  get params() { return this._params; }
159
163
  set params(params) {
160
164
  /* Remove empty params */
161
- Utils.cleanObject(params);
162
- if (!Utils.equals(this._params, params)) {
165
+ Object.keys(params).forEach((key) => {
166
+ if ((params[key] == null || params[key] == '' || params[key] == 'undefined')) {
167
+ delete params[key];
168
+ }
169
+ });
170
+ if (JSON.stringify(this._params) !== JSON.stringify(params)) {
163
171
  this._params = params;
172
+ this._endpointChange.next([this.endpoint, this.path, this._params, this.projection]);
164
173
  }
165
174
  }
166
175
  /**
@@ -170,9 +179,20 @@ export class VdChipsComponent extends AbstractMatFormField {
170
179
  set projection(projection) {
171
180
  this._projection = projection;
172
181
  this.clear();
182
+ this._endpointChange.next([this.endpoint, this.path, this.params, this.projection]);
183
+ }
184
+ /**
185
+ * Gets or sets path
186
+ */
187
+ get path() { return this._path; }
188
+ set path(path) {
189
+ this._path = path;
190
+ this.clear();
191
+ this._endpointChange.next([this.endpoint, this.path, this.params, this.projection]);
173
192
  }
174
193
  /**
175
- * Gets the disabled.
194
+ * Sets the disabled.
195
+ * @param disabled
176
196
  */
177
197
  get disabled() {
178
198
  if (this._readonly) {
@@ -181,55 +201,30 @@ export class VdChipsComponent extends AbstractMatFormField {
181
201
  return super.disabled;
182
202
  }
183
203
  /**
184
- * Pagination
204
+ * Whether the select has a value.
185
205
  */
186
- get paginated() { return this._paginated; }
187
- set paginated(paginated) {
188
- this._paginated = coerceBooleanProperty(paginated);
189
- this.stateChanges.next();
190
- }
206
+ get empty() { return this.chips.length <= 0; }
191
207
  /**
192
- * Custom value
208
+ * Default chip
193
209
  */
194
- get customValue() { return this._customValue; }
195
- set customValue(customValue) {
196
- this._customValue = coerceBooleanProperty(customValue);
197
- this.key = customValue && this.key == 'id' ? 'name' : this.key;
198
- this.stateChanges.next();
210
+ get default() { return this.chips[0]; }
211
+ set default(_chip) {
212
+ if (_chip) {
213
+ /* Add chip for selected option */
214
+ this.chips = [_chip];
215
+ /* Set the value (ngModel) */
216
+ this.value = _chip[this.key];
217
+ /* Diabled the input, allow only one chip */
218
+ this.autoCompleteChipList.disable();
219
+ /* Reset the autocomplete input text value */
220
+ this.stateChanges.next();
221
+ }
199
222
  }
200
223
  /**
201
224
  * Whether the `MatFormField` label should try to float.
202
225
  */
203
- get shouldLabelFloat() { return super.shouldLabelFloat || this.autoCompleteChipList?.value; }
204
- /**
205
- * Lifecycle hook that is called after data-bound properties of a
206
- * directive are initialized.
207
- */
208
- ngOnInit() {
209
- /* Listen to value changes of the search input */
210
- this.autoCompleteChipList.valueChanges
211
- .pipe(debounceTime(this.debounce))
212
- .subscribe(v => {
213
- if (typeof v === 'string') {
214
- this.filterOptions(v);
215
- }
216
- });
217
- this.ngControl?.valueChanges?.pipe(skip(1)).subscribe((value) => {
218
- if (!value) {
219
- this.chips = [];
220
- this._value = "";
221
- this.autoCompleteChipList.setValue("");
222
- this.autoCompleteChipList.enable();
223
- }
224
- });
225
- }
226
- /**
227
- * Lifecycle hook that is called after a component's view has been fully initialized.
228
- */
229
- ngAfterViewInit() {
230
- this.media.broadcast();
231
- /* Initilialize the data source with the current service, paginator and sort */
232
- this.dataSource ?? (this.dataSource = new TableDataSource(this.service, this.paginator, this.sort));
226
+ get shouldLabelFloat() {
227
+ return super.shouldLabelFloat || !this.chipInput?.empty;
233
228
  }
234
229
  /**
235
230
  * From ControlValueAccessor interface
@@ -240,99 +235,76 @@ export class VdChipsComponent extends AbstractMatFormField {
240
235
  this._value = value;
241
236
  /* Clear the chips list */
242
237
  this.chips = [];
243
- if (!this.customValue && value && this.chips?.length <= 0) {
238
+ if (value && this.chips?.length <= 0) {
244
239
  this.loading = true;
245
240
  let _params = {};
246
- /* Add includes from params, if any */
241
+ /* Add includes, if any */
247
242
  if (this._params?.includes) {
248
243
  _params.includes = this._params.includes;
249
244
  }
250
- /* Add projection from params, if any */
251
- if (this._params?.projection) {
252
- _params.projection = this._params.projection;
253
- }
254
245
  /* Add projection, if any */
255
246
  if (this.projection) {
256
- _params.projection = Array.isArray(this.projection) ? this.projection.join(',') : this.projection;
247
+ _params.projection = this.projection;
257
248
  }
258
249
  /* Get base url */
259
- var urlParts = this.service?.endpoint?.split('?');
260
- this.service.http.get(`${urlParts[0]}/${value}${urlParts.length > 1 ? `?${urlParts[1]}` : ''}`, { params: Utils.cleanObject(_params) }).subscribe({
261
- next: (x) => {
262
- this.loading = false;
263
- /* Add chip for selected option */
264
- this.chips.push(x);
265
- /* Emit selected event */
266
- this.initSelect.emit(x);
267
- this.focused = true;
268
- this.changeDetectorRef.detectChanges();
269
- },
270
- error: () => this.loading = false
271
- });
272
- }
273
- else if (this.customValue) {
274
- this.chips = value ? [{ [this.key]: value }] : [];
250
+ var urlParts = this.endpoint.split('?');
251
+ this.http.get(`${urlParts[0]}/${value}${urlParts.length > 1 ? `?${urlParts[1]}` : ''}`, { params: Utils.cleanObject(_params) }).subscribe(x => {
252
+ this.loading = false;
253
+ /* Add chip for selected option */
254
+ this.chips.push(x);
255
+ /* Emit selected event */
256
+ this.initSelect.emit(x);
257
+ /* Diabled the input, allow only one chip */
258
+ this.autoCompleteChipList.disable();
259
+ }, _ => this.loading = false);
275
260
  }
276
261
  else {
277
262
  this.clear(false);
278
263
  }
279
264
  }
280
- /**
281
- * Connects the data source and subscribe to the data changes
282
- */
283
- connect() {
284
- /* Set focus */
285
- this.opened = true;
286
- /* Set some params */
287
- this.dataSource.fieldFilters = this.getQueryParams();
288
- /* Connect the data source manually for 'mat-option' triggers */
289
- if (!this.classType && !this.dataSource?.isConnected) {
290
- this.dataSourceSubscription?.unsubscribe();
291
- this.dataSourceSubscription = this.dataSource.connect().subscribe();
292
- }
293
- /* Check the change detector and its children */
294
- this.changeDetectorRef.detectChanges();
295
- }
296
265
  /**
297
266
  * Sets control focus
298
267
  */
299
268
  focus() {
300
- this.filterInput?.nativeElement?.focus();
269
+ this.chipInput?.focus();
301
270
  }
302
271
  /**
303
- * Handles blur event of the input box
304
- * @param event
272
+ * Lifecycle hook that is called after data-bound properties of a
273
+ * directive are initialized.
305
274
  */
306
- addOnBlur(event) {
307
- const target = event.relatedTarget;
308
- if (!target || target.tagName !== 'MAT-OPTION') {
309
- let value = this.filterInput?.nativeElement?.value;
310
- if (value) {
311
- this.addChip({ [this.key]: value }, this.filterInput);
275
+ ngOnInit() {
276
+ this.autoCompleteChipList.valueChanges
277
+ .pipe(debounceTime(this.debounce))
278
+ .subscribe(v => this.filterOptions(v));
279
+ this.ngControl?.valueChanges?.pipe(skip(1)).subscribe((value) => {
280
+ if (!value) {
281
+ this.chips = [];
282
+ this._value = "";
283
+ this.autoCompleteChipList.setValue("");
284
+ this.autoCompleteChipList.enable();
312
285
  }
313
- }
286
+ });
314
287
  }
315
288
  /**
316
289
  * Adds a chip
317
290
  * @param event
318
291
  * @param input
319
292
  */
320
- addChip(value, input) {
293
+ addChip(event, input) {
294
+ /* Define selection constant */
295
+ const selection = event.option.value;
321
296
  /* Add chip for selected option */
322
- this.chips = [value];
297
+ this.chips.push(selection);
323
298
  /* Emit selected event */
324
- this.selected.emit(value);
299
+ this.selected.emit(selection);
325
300
  /* Set the value (ngModel) */
326
- this.value = value[this.key];
301
+ this.value = selection[this.key];
327
302
  /* Diabled the input, allow only one chip */
328
- this.autoCompleteChipList.disable({ emitEvent: false });
329
- this.autoCompleteChipList.patchValue('', { emitEvent: false });
303
+ this.autoCompleteChipList.disable();
330
304
  /* Reset the autocomplete input text value */
331
305
  if (input) {
332
306
  input.value = '';
333
307
  }
334
- /* Close the autocomplete panel, if not already done (for table row click) */
335
- this.autocompleteTrigger.closePanel();
336
308
  }
337
309
  /**
338
310
  * Removes all chips
@@ -346,43 +318,49 @@ export class VdChipsComponent extends AbstractMatFormField {
346
318
  this.ngControl.control.markAsTouched();
347
319
  }
348
320
  /* Reset the value (ngModel) */
349
- this.autoCompleteChipList.patchValue('', { emitEvent: false });
321
+ this.autoCompleteChipList.setValue("");
350
322
  if (triggerStateChanges) {
351
323
  this.stateChanges.next();
352
324
  }
353
325
  /* Enable the input */
354
- this.autoCompleteChipList.enable({ emitEvent: false });
355
- /* Check the change detector and its children */
356
- this.changeDetectorRef.detectChanges();
326
+ this.autoCompleteChipList.enable();
357
327
  }
358
328
  /**
359
329
  * Filters options
360
330
  * @param text
361
331
  */
362
332
  filterOptions(text) {
363
- /* Filter the results */
364
- if (this.dataSource) {
333
+ this.filteredOptions = [];
334
+ if (this.endpoint && typeof text === 'string' && text.length >= this.termMinlength) {
365
335
  /* Init params if null */
366
- let _params = { ...this.getQueryParams() };
336
+ this._params = this._params || {};
367
337
  /* Add search word to the params */
368
338
  if (this.searchField && this.searchFields.length <= 0) {
369
339
  var result = new RegExp(`(\\${this.searchOperators.join('|\\')})?(.*)`).exec(this.searchField);
370
- _params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
340
+ this._params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
371
341
  }
372
342
  /* Add search word to the params */
373
343
  this.searchFields?.map(x => x.trim())?.forEach(x => {
374
344
  var result = new RegExp(`(\\${this.searchOperators.join('|\\')})?(.*)`).exec(x);
375
- _params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
345
+ this._params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
376
346
  });
377
- /* Nothing has changed? */
378
- if (Utils.equals(this._params, _params)) {
379
- return;
347
+ /* Add limit to the params */
348
+ this._params.limit = this.limit;
349
+ /* Add projection, if any */
350
+ if (this.projection) {
351
+ this._params.projection = this.projection;
380
352
  }
381
- /* Set params */
382
- this._params = _params;
383
353
  /* Get results from server */
384
354
  this.loading = true;
385
- this.dataSource.applyFilters(this._params);
355
+ this.http.get(`${this.endpoint}${this.path || ''}`, { params: Utils.cleanObject(this._params) })
356
+ .subscribe({
357
+ next: (x) => {
358
+ this.loading = false;
359
+ this.filteredOptions = x;
360
+ this.emptyResult = !x || !x.length;
361
+ },
362
+ error: () => this.loading = false
363
+ });
386
364
  }
387
365
  }
388
366
  /**
@@ -402,66 +380,27 @@ export class VdChipsComponent extends AbstractMatFormField {
402
380
  this.onLaunch.emit(this.chips[0]);
403
381
  }
404
382
  }
405
- /**
406
- * Gets query params
407
- * @returns
408
- */
409
- getQueryParams() {
410
- /* Init params if null */
411
- var params = this._params || {};
412
- /* Add projection, if any */
413
- if (this.projection) {
414
- params.projection = this.projection;
415
- }
416
- return params;
417
- }
418
- /**
419
- * A callback method that performs custom clean-up, invoked immediately
420
- * before a directive, pipe, or service instance is destroyed.
421
- */
422
- ngOnDestroy() {
423
- this.dataSourceSubscription?.unsubscribe();
424
- }
425
383
  }
426
- /** @nocollapse */ VdChipsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdChipsComponent, deps: [{ token: i0.Injector }, { token: i1.VdMediaService }, { token: i0.ChangeDetectorRef }, { token: i2.NgControl, optional: true, self: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i3.ErrorStateMatcher }, { token: i4.FocusMonitor }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
427
- /** @nocollapse */ VdChipsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: VdChipsComponent, selector: "vd-chips", inputs: { classType: "classType", chips: "chips", endpoint: "endpoint", params: "params", projection: "projection", paginated: "paginated", customValue: "customValue", context: "context", key: "key", searchField: "searchField", searchFields: "searchFields", removable: "removable", debounce: "debounce", autocompleteCssClass: "autocompleteCssClass", suffixButtons: "suffixButtons" }, outputs: { initSelect: "initSelect", selected: "selected", cleared: "cleared", onLaunch: "launch", chipFocus: "chipFocus" }, providers: [
428
- { provide: MatFormFieldControl, useExisting: VdChipsComponent },
429
- {
430
- provide: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,
431
- useValue: { overlayPanelClass: 'vd-chips-autocomplete' }
432
- }
433
- ], queries: [{ propertyName: "chipTemplate", first: true, predicate: VdChipDirective, descendants: true }, { propertyName: "autocompleteOptionTemplate", first: true, predicate: VdAutocompleteOptionDirective, descendants: true }], viewQueries: [{ propertyName: "dynamicTable", first: true, predicate: VdDynamicTableComponent, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-chip-list #chipList [required]=\"required\" [disabled]=\"readonly\" matAutocompleteOrigin #origin=\"matAutocompleteOrigin\">\r\n\t<!-- #region Chips -->\r\n\t<ng-template let-chip let-first=\"first\" let-index=\"index\" ngFor [ngForOf]=\"chips\">\r\n\t\t<mat-basic-chip [selectable]=\"!readonly\" [removable]=\"!readonly\" (removed)=\"handleRemovedEvent()\" disableRipple>\r\n\t\t\t<span class=\"vd-chip-content\">\r\n\t\t\t\t<span *ngIf=\"!chipTemplate?.templateRef\">\r\n\t\t\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ chip }}</span>\r\n\t\t\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: chip }\"></ng-template>\r\n\t\t\t\t</span>\r\n\t\t\t\t<ng-template *ngIf=\"chipTemplate?.templateRef\" [ngTemplateOutlet]=\"chipTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ chip: chip }\"></ng-template>\r\n\t\t\t</span>\r\n\t\t\t<ng-template let-button let-first=\"first\" ngFor [ngForOf]=\"suffixButtons\">\r\n\t\t\t\t<a mat-icon-button *ngIf=\"!button.hide || !button.hide(chips[0], context)\" (click)=\"$event.stopPropagation(); button.event && button.event(chips[0], context)\">\r\n\t\t\t\t\t<mat-icon>{{button.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-template>\r\n\t\t\t<a mat-icon-button *ngIf=\"onLaunch?.observers?.length > 0\" (click)=\"$event.stopPropagation(); handleLaunchClicked()\">\r\n\t\t\t\t<mat-icon>launch</mat-icon>\r\n\t\t\t</a>\r\n\t\t\t<a mat-icon-button *ngIf=\"!readonly\">\r\n\t\t\t\t<mat-icon matChipRemove>close</mat-icon>\r\n\t\t\t</a>\r\n\t\t</mat-basic-chip>\r\n\t</ng-template>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Search box -->\r\n\t<input matInput [hidden]=\"value && !empty\" placeholder=\"{{placeholder}}\" (focus)=\"connect()\" [readonly]=\"readonly\" [matChipInputFor]=\"chipList\" [matAutocomplete]=\"auto\" [matAutocompleteConnectedTo]=\"origin\" [formControl]=\"autoCompleteChipList\" #filterInput />\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Reset button -->\r\n\t<a mat-icon-button trailingIcon *ngIf=\"filterInput.value\" class=\"reset-input\" (click)=\"filterInput.value = ''\">\r\n\t\t<mat-icon>close</mat-icon>\r\n\t</a>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Progress -->\r\n\t<mat-spinner diameter=\"18\" *ngIf=\"dataSource?.isLoading\"></mat-spinner>\r\n\t<!-- #endregion -->\r\n</mat-chip-list>\r\n\r\n<!-- #region Autocomplete -->\r\n<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addChip($event.option.value, filterInput)\" class=\"{{autocompleteCssClass}}{{classType?' table-autocomplete':''}}\">\r\n\t<ng-template *ngIf=\"!classType && opened\" let-item let-first=\"first\" ngFor [ngForOf]=\"dataSource?.items\">\r\n\t\t<mat-option [value]=\"item\">\r\n\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{item}}</span>\r\n\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: item }\"></ng-template>\r\n\t\t</mat-option>\r\n\t</ng-template>\r\n\t<ng-container *ngIf=\"classType && opened\">\r\n\t\t<mat-option hide=\"true\"></mat-option>\r\n\t\t<vd-dynamic-table [dataSource]=\"dataSource\" [classType]=\"classType\" (rowClick)=\"addChip($event, filterInput)\" matSort [sortActive]=\"sortActive||'id'\" [sortDirection]=\"sortDirection\"></vd-dynamic-table>\r\n\t</ng-container>\r\n\t<mat-paginator [length]=\"dataSource?.total\" [pageIndex]=\"dataSource?.pageIndex\" [pageSize]=\"dataSource?.pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\" hidePageSize=\"true\"></mat-paginator>\r\n</mat-autocomplete>\r\n<!-- #endregion -->", styles: [":host ::ng-deep .mat-chip-list-wrapper{min-height:24px}:host ::ng-deep .mat-chip{display:flex;flex-direction:row;width:100%;padding:0 5px;justify-content:center}:host ::ng-deep .mat-chip.mat-chip-disabled{opacity:.6}:host ::ng-deep .mat-chip .vd-chip-content{flex-grow:1!important;font-weight:initial;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;justify-content:center}:host ::ng-deep .mat-chip .mat-icon{cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch{font-size:18px;position:absolute;right:4px;top:0;cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch.removable{right:34px}:host ::ng-deep .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;width:2em;height:2em;margin-top:-6px}:host ::ng-deep .mat-icon-button .mat-button-wrapper{line-height:20px}:host ::ng-deep .mat-icon-button .mat-button-wrapper .mat-icon{font-size:21px;line-height:21px}::ng-deep .mat-autocomplete-panel{margin-top:9px}::ng-deep .mat-autocomplete-panel .mat-paginator{position:sticky;bottom:0}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container{padding:0}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container .mat-paginator-range-actions{align-items:baseline}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container .mat-paginator-range-actions .mat-paginator-range-label{margin:0 16px 0 24px}::ng-deep .mat-autocomplete-panel.table-autocomplete{max-height:400px}mat-spinner{margin-top:-9px;margin-right:6px}::ng-deep mat-form-field.mat-form-field-type-app-vd-chips .mat-form-field-infix{padding:0;min-height:44px;display:flex;align-items:center;flex-direction:row}\n"], components: [{ type: i5.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i6.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i10.VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: ["dataSource", "data", "classType", "context", "dataSourceFilter", "static", "filterable", "paginable", "selectable", "sortActive", "sortDirection", "stickyHeader", "stickyFilter", "rowNgClass", "detailsTemplate", "readonly", "selectAllFilter", "columns", "rowMenuItems", "excludedColumns", "pageSize", "pageSizeOptions"], outputs: ["rowClick"] }, { type: i11.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i9.MatAutocompleteOrigin, selector: "[matAutocompleteOrigin]", exportAs: ["matAutocompleteOrigin"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.MatChipRemove, selector: "[matChipRemove]" }, { type: i13.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"] }, { type: i5.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
384
+ /** @nocollapse */ /** @nocollapse */ VdChipsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdChipsComponent, deps: [{ token: i0.Injector }, { token: i1.NgControl, optional: true, self: true }, { token: i1.NgForm, optional: true }, { token: i1.FormGroupDirective, optional: true }, { token: i2.ErrorStateMatcher }, { token: i3.FocusMonitor }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
385
+ /** @nocollapse */ /** @nocollapse */ VdChipsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: VdChipsComponent, selector: "vd-chips", inputs: { chips: "chips", endpoint: "endpoint", params: "params", projection: "projection", path: "path", context: "context", key: "key", searchField: "searchField", searchFields: "searchFields", termMinlength: "termMinlength", limit: "limit", removable: "removable", debounce: "debounce", suffixButtons: "suffixButtons", default: "default" }, outputs: { initSelect: "initSelect", selected: "selected", cleared: "cleared", onLaunch: "launch", chipFocus: "chipFocus" }, providers: [
386
+ { provide: MatFormFieldControl, useExisting: VdChipsComponent }
387
+ ], queries: [{ propertyName: "chipTemplate", first: true, predicate: VdChipDirective, descendants: true }, { propertyName: "autocompleteOptionTemplate", first: true, predicate: VdAutocompleteOptionDirective, descendants: true }], viewQueries: [{ propertyName: "chipInput", first: true, predicate: MatInput, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-chip-list #chipList [required]=\"required\" [disabled]=\"readonly\">\r\n\t<!-- #region Chips -->\r\n\t<ng-template let-chip let-first=\"first\" let-index=\"index\" ngFor [ngForOf]=\"chips\">\r\n\t\t<mat-basic-chip [selectable]=\"!readonly\" [removable]=\"!readonly\" (removed)=\"handleRemovedEvent()\" disableRipple>\r\n\t\t\t<span class=\"vd-chip-content\">\r\n\t\t\t\t<span *ngIf=\"!chipTemplate?.templateRef\">\r\n\t\t\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ chip }}</span>\r\n\t\t\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: chip }\"></ng-template>\r\n\t\t\t\t</span>\r\n\t\t\t\t<ng-template *ngIf=\"chipTemplate?.templateRef\" [ngTemplateOutlet]=\"chipTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ chip: chip }\"></ng-template>\r\n\t\t\t</span>\r\n\t\t\t<ng-template let-button let-first=\"first\" ngFor [ngForOf]=\"suffixButtons\">\r\n\t\t\t\t<a mat-icon-button *ngIf=\"!button.hide || !button.hide(chips[0], context)\" (click)=\"$event.stopPropagation(); button.event && button.event(chips[0], context)\">\r\n\t\t\t\t\t<mat-icon>{{button.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-template>\r\n\t\t\t<a mat-icon-button *ngIf=\"onLaunch?.observers?.length > 0\" (click)=\"$event.stopPropagation(); handleLaunchClicked()\">\r\n\t\t\t\t<mat-icon>launch</mat-icon>\r\n\t\t\t</a>\r\n\t\t\t<a mat-icon-button *ngIf=\"!readonly\">\r\n\t\t\t\t<mat-icon matChipRemove>close</mat-icon>\r\n\t\t\t</a>\r\n\t\t</mat-basic-chip>\r\n\t</ng-template>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Search box -->\r\n\t<input matInput [hidden]=\"value && !empty\" placeholder=\"{{placeholder}}\" [readonly]=\"readonly\" [matChipInputFor]=\"chipList\" [matAutocomplete]=\"auto\" [formControl]=\"autoCompleteChipList\" #chipInput />\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Progress -->\r\n\t<mat-spinner diameter=\"18\" *ngIf=\"loading\"></mat-spinner>\r\n\t<!-- #endregion -->\r\n</mat-chip-list>\r\n\r\n<!-- #region Autocomplete -->\r\n<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addChip($event, chipInput)\">\r\n\t<ng-template let-item let-first=\"first\" ngFor [ngForOf]=\"filteredOptions\">\r\n\t\t<mat-option [value]=\"item\">\r\n\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ item }}</span>\r\n\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: item }\"></ng-template>\r\n\t\t</mat-option>\r\n\t</ng-template>\r\n</mat-autocomplete>\r\n<!-- #endregion -->", styles: [":host ::ng-deep .mat-chip-list-wrapper{min-height:24px}:host ::ng-deep .mat-chip{display:flex;flex-direction:row;width:100%;padding:0 5px;justify-content:center}:host ::ng-deep .mat-chip.mat-chip-disabled{color:#000000a3}:host ::ng-deep .mat-chip .vd-chip-content{flex-grow:1!important;font-weight:initial;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;justify-content:center}:host ::ng-deep .mat-chip .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;width:2.5em;height:2.5em;margin-top:-10px}:host ::ng-deep .mat-chip .mat-icon-button .mat-icon{font-size:24px}:host ::ng-deep .mat-chip .mat-icon{cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch{font-size:18px;position:absolute;right:4px;top:0;cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch.removable{right:34px}mat-spinner{margin-top:-9px;margin-right:6px}\n"], components: [{ type: i4.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i5.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i8.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i2.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.MatChipRemove, selector: "[matChipRemove]" }, { type: i10.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"] }, { type: i4.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i8.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
434
388
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdChipsComponent, decorators: [{
435
389
  type: Component,
436
390
  args: [{ selector: 'vd-chips', providers: [
437
- { provide: MatFormFieldControl, useExisting: VdChipsComponent },
438
- {
439
- provide: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,
440
- useValue: { overlayPanelClass: 'vd-chips-autocomplete' }
441
- }
442
- ], template: "<mat-chip-list #chipList [required]=\"required\" [disabled]=\"readonly\" matAutocompleteOrigin #origin=\"matAutocompleteOrigin\">\r\n\t<!-- #region Chips -->\r\n\t<ng-template let-chip let-first=\"first\" let-index=\"index\" ngFor [ngForOf]=\"chips\">\r\n\t\t<mat-basic-chip [selectable]=\"!readonly\" [removable]=\"!readonly\" (removed)=\"handleRemovedEvent()\" disableRipple>\r\n\t\t\t<span class=\"vd-chip-content\">\r\n\t\t\t\t<span *ngIf=\"!chipTemplate?.templateRef\">\r\n\t\t\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ chip }}</span>\r\n\t\t\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: chip }\"></ng-template>\r\n\t\t\t\t</span>\r\n\t\t\t\t<ng-template *ngIf=\"chipTemplate?.templateRef\" [ngTemplateOutlet]=\"chipTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ chip: chip }\"></ng-template>\r\n\t\t\t</span>\r\n\t\t\t<ng-template let-button let-first=\"first\" ngFor [ngForOf]=\"suffixButtons\">\r\n\t\t\t\t<a mat-icon-button *ngIf=\"!button.hide || !button.hide(chips[0], context)\" (click)=\"$event.stopPropagation(); button.event && button.event(chips[0], context)\">\r\n\t\t\t\t\t<mat-icon>{{button.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-template>\r\n\t\t\t<a mat-icon-button *ngIf=\"onLaunch?.observers?.length > 0\" (click)=\"$event.stopPropagation(); handleLaunchClicked()\">\r\n\t\t\t\t<mat-icon>launch</mat-icon>\r\n\t\t\t</a>\r\n\t\t\t<a mat-icon-button *ngIf=\"!readonly\">\r\n\t\t\t\t<mat-icon matChipRemove>close</mat-icon>\r\n\t\t\t</a>\r\n\t\t</mat-basic-chip>\r\n\t</ng-template>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Search box -->\r\n\t<input matInput [hidden]=\"value && !empty\" placeholder=\"{{placeholder}}\" (focus)=\"connect()\" [readonly]=\"readonly\" [matChipInputFor]=\"chipList\" [matAutocomplete]=\"auto\" [matAutocompleteConnectedTo]=\"origin\" [formControl]=\"autoCompleteChipList\" #filterInput />\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Reset button -->\r\n\t<a mat-icon-button trailingIcon *ngIf=\"filterInput.value\" class=\"reset-input\" (click)=\"filterInput.value = ''\">\r\n\t\t<mat-icon>close</mat-icon>\r\n\t</a>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Progress -->\r\n\t<mat-spinner diameter=\"18\" *ngIf=\"dataSource?.isLoading\"></mat-spinner>\r\n\t<!-- #endregion -->\r\n</mat-chip-list>\r\n\r\n<!-- #region Autocomplete -->\r\n<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addChip($event.option.value, filterInput)\" class=\"{{autocompleteCssClass}}{{classType?' table-autocomplete':''}}\">\r\n\t<ng-template *ngIf=\"!classType && opened\" let-item let-first=\"first\" ngFor [ngForOf]=\"dataSource?.items\">\r\n\t\t<mat-option [value]=\"item\">\r\n\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{item}}</span>\r\n\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: item }\"></ng-template>\r\n\t\t</mat-option>\r\n\t</ng-template>\r\n\t<ng-container *ngIf=\"classType && opened\">\r\n\t\t<mat-option hide=\"true\"></mat-option>\r\n\t\t<vd-dynamic-table [dataSource]=\"dataSource\" [classType]=\"classType\" (rowClick)=\"addChip($event, filterInput)\" matSort [sortActive]=\"sortActive||'id'\" [sortDirection]=\"sortDirection\"></vd-dynamic-table>\r\n\t</ng-container>\r\n\t<mat-paginator [length]=\"dataSource?.total\" [pageIndex]=\"dataSource?.pageIndex\" [pageSize]=\"dataSource?.pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\" hidePageSize=\"true\"></mat-paginator>\r\n</mat-autocomplete>\r\n<!-- #endregion -->", styles: [":host ::ng-deep .mat-chip-list-wrapper{min-height:24px}:host ::ng-deep .mat-chip{display:flex;flex-direction:row;width:100%;padding:0 5px;justify-content:center}:host ::ng-deep .mat-chip.mat-chip-disabled{opacity:.6}:host ::ng-deep .mat-chip .vd-chip-content{flex-grow:1!important;font-weight:initial;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;justify-content:center}:host ::ng-deep .mat-chip .mat-icon{cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch{font-size:18px;position:absolute;right:4px;top:0;cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch.removable{right:34px}:host ::ng-deep .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;width:2em;height:2em;margin-top:-6px}:host ::ng-deep .mat-icon-button .mat-button-wrapper{line-height:20px}:host ::ng-deep .mat-icon-button .mat-button-wrapper .mat-icon{font-size:21px;line-height:21px}::ng-deep .mat-autocomplete-panel{margin-top:9px}::ng-deep .mat-autocomplete-panel .mat-paginator{position:sticky;bottom:0}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container{padding:0}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container .mat-paginator-range-actions{align-items:baseline}::ng-deep .mat-autocomplete-panel .mat-paginator .mat-paginator-container .mat-paginator-range-actions .mat-paginator-range-label{margin:0 16px 0 24px}::ng-deep .mat-autocomplete-panel.table-autocomplete{max-height:400px}mat-spinner{margin-top:-9px;margin-right:6px}::ng-deep mat-form-field.mat-form-field-type-app-vd-chips .mat-form-field-infix{padding:0;min-height:44px;display:flex;align-items:center;flex-direction:row}\n"] }]
443
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.VdMediaService }, { type: i0.ChangeDetectorRef }, { type: i2.NgControl, decorators: [{
391
+ { provide: MatFormFieldControl, useExisting: VdChipsComponent }
392
+ ], template: "<mat-chip-list #chipList [required]=\"required\" [disabled]=\"readonly\">\r\n\t<!-- #region Chips -->\r\n\t<ng-template let-chip let-first=\"first\" let-index=\"index\" ngFor [ngForOf]=\"chips\">\r\n\t\t<mat-basic-chip [selectable]=\"!readonly\" [removable]=\"!readonly\" (removed)=\"handleRemovedEvent()\" disableRipple>\r\n\t\t\t<span class=\"vd-chip-content\">\r\n\t\t\t\t<span *ngIf=\"!chipTemplate?.templateRef\">\r\n\t\t\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ chip }}</span>\r\n\t\t\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: chip }\"></ng-template>\r\n\t\t\t\t</span>\r\n\t\t\t\t<ng-template *ngIf=\"chipTemplate?.templateRef\" [ngTemplateOutlet]=\"chipTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ chip: chip }\"></ng-template>\r\n\t\t\t</span>\r\n\t\t\t<ng-template let-button let-first=\"first\" ngFor [ngForOf]=\"suffixButtons\">\r\n\t\t\t\t<a mat-icon-button *ngIf=\"!button.hide || !button.hide(chips[0], context)\" (click)=\"$event.stopPropagation(); button.event && button.event(chips[0], context)\">\r\n\t\t\t\t\t<mat-icon>{{button.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-template>\r\n\t\t\t<a mat-icon-button *ngIf=\"onLaunch?.observers?.length > 0\" (click)=\"$event.stopPropagation(); handleLaunchClicked()\">\r\n\t\t\t\t<mat-icon>launch</mat-icon>\r\n\t\t\t</a>\r\n\t\t\t<a mat-icon-button *ngIf=\"!readonly\">\r\n\t\t\t\t<mat-icon matChipRemove>close</mat-icon>\r\n\t\t\t</a>\r\n\t\t</mat-basic-chip>\r\n\t</ng-template>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Search box -->\r\n\t<input matInput [hidden]=\"value && !empty\" placeholder=\"{{placeholder}}\" [readonly]=\"readonly\" [matChipInputFor]=\"chipList\" [matAutocomplete]=\"auto\" [formControl]=\"autoCompleteChipList\" #chipInput />\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Progress -->\r\n\t<mat-spinner diameter=\"18\" *ngIf=\"loading\"></mat-spinner>\r\n\t<!-- #endregion -->\r\n</mat-chip-list>\r\n\r\n<!-- #region Autocomplete -->\r\n<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addChip($event, chipInput)\">\r\n\t<ng-template let-item let-first=\"first\" ngFor [ngForOf]=\"filteredOptions\">\r\n\t\t<mat-option [value]=\"item\">\r\n\t\t\t<span *ngIf=\"!autocompleteOptionTemplate?.templateRef\">{{ item }}</span>\r\n\t\t\t<ng-template *ngIf=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutlet]=\"autocompleteOptionTemplate?.templateRef\" [ngTemplateOutletContext]=\"{ option: item }\"></ng-template>\r\n\t\t</mat-option>\r\n\t</ng-template>\r\n</mat-autocomplete>\r\n<!-- #endregion -->", styles: [":host ::ng-deep .mat-chip-list-wrapper{min-height:24px}:host ::ng-deep .mat-chip{display:flex;flex-direction:row;width:100%;padding:0 5px;justify-content:center}:host ::ng-deep .mat-chip.mat-chip-disabled{color:#000000a3}:host ::ng-deep .mat-chip .vd-chip-content{flex-grow:1!important;font-weight:initial;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;justify-content:center}:host ::ng-deep .mat-chip .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;width:2.5em;height:2.5em;margin-top:-10px}:host ::ng-deep .mat-chip .mat-icon-button .mat-icon{font-size:24px}:host ::ng-deep .mat-chip .mat-icon{cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch{font-size:18px;position:absolute;right:4px;top:0;cursor:pointer}:host ::ng-deep .mat-chip .vd-chip-launch.removable{right:34px}mat-spinner{margin-top:-9px;margin-right:6px}\n"] }]
393
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NgControl, decorators: [{
444
394
  type: Optional
445
395
  }, {
446
396
  type: Self
447
- }] }, { type: i2.NgForm, decorators: [{
397
+ }] }, { type: i1.NgForm, decorators: [{
448
398
  type: Optional
449
- }] }, { type: i2.FormGroupDirective, decorators: [{
399
+ }] }, { type: i1.FormGroupDirective, decorators: [{
450
400
  type: Optional
451
- }] }, { type: i3.ErrorStateMatcher }, { type: i4.FocusMonitor }, { type: i0.ElementRef }]; }, propDecorators: { dynamicTable: [{
401
+ }] }, { type: i2.ErrorStateMatcher }, { type: i3.FocusMonitor }, { type: i0.ElementRef }]; }, propDecorators: { chipInput: [{
452
402
  type: ViewChild,
453
- args: [VdDynamicTableComponent, { static: false }]
454
- }], classType: [{
455
- type: Input
456
- }], paginator: [{
457
- type: ViewChild,
458
- args: [MatPaginator, { static: true }]
459
- }], sort: [{
460
- type: ViewChild,
461
- args: [MatSort, { static: false }]
462
- }], filterInput: [{
463
- type: ViewChild,
464
- args: ['filterInput', { static: false }]
403
+ args: [MatInput, { static: true }]
465
404
  }], chips: [{
466
405
  type: Input
467
406
  }], chipTemplate: [{
@@ -470,21 +409,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImpor
470
409
  }], autocompleteOptionTemplate: [{
471
410
  type: ContentChild,
472
411
  args: [VdAutocompleteOptionDirective]
473
- }], autocomplete: [{
474
- type: ViewChild,
475
- args: [MatAutocomplete, { static: false }]
476
- }], autocompleteTrigger: [{
477
- type: ViewChild,
478
- args: [MatAutocompleteTrigger]
479
412
  }], endpoint: [{
480
413
  type: Input
481
414
  }], params: [{
482
415
  type: Input
483
416
  }], projection: [{
484
417
  type: Input
485
- }], paginated: [{
486
- type: Input
487
- }], customValue: [{
418
+ }], path: [{
488
419
  type: Input
489
420
  }], context: [{
490
421
  type: Input
@@ -494,12 +425,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImpor
494
425
  type: Input
495
426
  }], searchFields: [{
496
427
  type: Input
497
- }], removable: [{
428
+ }], termMinlength: [{
498
429
  type: Input
499
- }], debounce: [{
430
+ }], limit: [{
500
431
  type: Input
501
- }], autocompleteCssClass: [{
432
+ }], removable: [{
502
433
  type: Input
434
+ }], debounce: [{
435
+ type: Input,
436
+ args: ['debounce']
503
437
  }], initSelect: [{
504
438
  type: Output
505
439
  }], selected: [{
@@ -513,5 +447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImpor
513
447
  type: Input
514
448
  }], chipFocus: [{
515
449
  type: Output
450
+ }], default: [{
451
+ type: Input
516
452
  }] } });
517
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvY2hpcHMvY29tcG9uZW50cy9jaGlwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9jaGlwcy9jb21wb25lbnRzL2NoaXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pNLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQWdCLE1BQU0sNEJBQTRC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LFVBQVU7c0JBRGIsS0FBSztnQkEyQkYsU0FBUztzQkFEWixLQUFLO2dCQWdCRixXQUFXO3NCQURkLEtBQUs7Z0JBYUMsT0FBTztzQkFEYixLQUFLO2dCQU9DLEdBQUc7c0JBRFQsS0FBSztnQkFPQyxXQUFXO3NCQURqQixLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0MsU0FBUztzQkFEZixLQUFLO2dCQVFDLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxvQkFBb0I7c0JBRDFCLEtBQUs7Z0JBWUMsVUFBVTtzQkFEaEIsTUFBTTtnQkFPQSxRQUFRO3NCQURkLE1BQU07Z0JBT0EsT0FBTztzQkFEYixNQUFNO2dCQU9BLFFBQVE7c0JBRGQsTUFBTTt1QkFBQyxRQUFRO2dCQU9ULGFBQWE7c0JBRG5CLEtBQUs7Z0JBU0MsU0FBUztzQkFEZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2VsZiwgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNQVRfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OUywgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlLCBTdWZmaXhCdXR0b24gfSBmcm9tICcuLi8uLi9jb21tb24vY29tbW9uLm1vZHVsZSc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IEFic3RyYWN0TWF0Rm9ybUZpZWxkIH0gZnJvbSAnLi4vLi4vZm9ybXMvaGVscGVycy9hYnN0cmFjdC1tYXQtZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IFZkTWVkaWFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWVkaWEvc2VydmljZXMvbWVkaWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdGFibGUvY29tcG9uZW50cy9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUuZGF0YS1zb3VyY2UnO1xyXG5pbXBvcnQgeyBWZEF1dG9jb21wbGV0ZU9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYXV0b2NvbXBsZXRlLW9wdGlvbi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBWZENoaXBEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NoaXAuZGlyZWN0aXZlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtY2hpcHMnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9jaGlwcy5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY2hpcHMuY29tcG9uZW50LnNjc3MnXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdHsgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IFZkQ2hpcHNDb21wb25lbnQgfSxcclxuXHRcdHtcclxuXHRcdFx0cHJvdmlkZTogTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMsXHJcblx0XHRcdHVzZVZhbHVlOiB7IG92ZXJsYXlQYW5lbENsYXNzOiAndmQtY2hpcHMtYXV0b2NvbXBsZXRlJyB9XHJcblx0XHR9XHJcblx0XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmRDaGlwc0NvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0TWF0Rm9ybUZpZWxkPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9keW5hbWljVGFibGU6IE1hdFBhZ2luYXRvclxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2R5bmFtaWNUYWJsZTogVmREeW5hbWljVGFibGVDb21wb25lbnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVmZXJlbmNlIHRvIFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IGVsZW1lbnRcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKFZkRHluYW1pY1RhYmxlQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcclxuXHRwdWJsaWMgZ2V0IGR5bmFtaWNUYWJsZSgpOiBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCB7IHJldHVybiB0aGlzLl9keW5hbWljVGFibGU7IH1cclxuXHRwdWJsaWMgc2V0IGR5bmFtaWNUYWJsZShkeW5hbWljVGFibGU6IFZkRHluYW1pY1RhYmxlQ29tcG9uZW50KSB7XHJcblx0XHR0aGlzLl9keW5hbWljVGFibGUgPSBkeW5hbWljVGFibGU7XHJcblx0XHRpZiAodGhpcy5fZHluYW1pY1RhYmxlKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5fZHluYW1pY1RhYmxlLm1hdFNvcnQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBkeXluYW1pYyB0YWJsZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNsYXNzVHlwZTogVHlwZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBfcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3JcclxuXHQgKi9cclxuXHRwcml2YXRlIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRQYWdpbmF0b3IgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHB1YmxpYyBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7IHRoaXMuX3BhZ2luYXRvciA9IHBhZ2luYXRvcjsgfVxyXG5cdHB1YmxpYyBnZXQgcGFnaW5hdG9yKCk6IE1hdFBhZ2luYXRvciB7IHJldHVybiB0aGlzLl9wYWdpbmF0b3I7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRTb3J0IGF0dHJpYnV0ZVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIHNvcnQ6IE1hdFNvcnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhZ2Ugc2l6ZSBvcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIHBhZ2VTaXplT3B0aW9uczogQXJyYXk8bnVtYmVyPiA9IFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGNvbHVtblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzb3J0QWN0aXZlOiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEN1cnJlbnQgc29ydCBkaXJlY3Rpb25cclxuXHQgKi9cclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YS10YWJsZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0cHVibGljIGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxhbnksIGFueT4gfCBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiBkYXRhU291cmNlT2JzZXJ2YWJsZTogU3Vic2NyaXB0aW9uXHJcblx0ICovXHJcblx0cHVibGljIGRhdGFTb3VyY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHVwIHJlYWN0aXZlIGZvcm1jb250cm9sXHJcblx0ICovXHJcblx0cHVibGljIGF1dG9Db21wbGV0ZUNoaXBMaXN0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cdC8qKiBcclxuXHQgKiBUaGUgc2VsZWN0IGVsZW1lbnQuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnZmlsdGVySW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuXHRwdWJsaWMgZmlsdGVySW5wdXQ6IEVsZW1lbnRSZWY7XHJcblx0LyoqXHJcblx0ICogc2VhcmNoT3BlcmF0b3JzOiBzdHJpbmdbXVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWFyY2hPcGVyYXRvcnM6IHN0cmluZ1tdID0gW1wiIT1cIiwgXCIhXCIsIFwiPD5cIiwgXCI+PVwiLCBcIj5cIiwgXCI8PVwiLCBcIjxcIiwgXCJeXCIsIFwiJFwiLCBcIn5cIl07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBsaXN0IG9mIGNoaXBzXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY2hpcHMgPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVmRDaGlwIHRlbXBsYXRlXHJcblx0ICovXHJcblx0QENvbnRlbnRDaGlsZChWZENoaXBEaXJlY3RpdmUpXHJcblx0cHVibGljIGNoaXBUZW1wbGF0ZTogVmRDaGlwRGlyZWN0aXZlO1xyXG5cclxuXHQvKipcclxuXHQgKiBBdXRvY29tcGxldGVPcHRpb24gdGVtcGxhdGVcclxuXHQgKi9cclxuXHRAQ29udGVudENoaWxkKFZkQXV0b2NvbXBsZXRlT3B0aW9uRGlyZWN0aXZlKVxyXG5cdHB1YmxpYyBhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZTogVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGUsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHB1YmxpYyBhdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcclxuXHJcblx0LyoqXHJcblx0ICogYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlclxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcilcclxuXHRwdWJsaWMgYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcblx0LyoqXHJcblx0ICogX2VuZHBvaW50OiBzdHJpbmdcclxuXHQgKi9cclxuXHRwdWJsaWMgX2VuZHBvaW50OiBzdHJpbmcgfCBGdW5jdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIGVuZHBvaW50XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgZW5kcG9pbnQoKTogc3RyaW5nIHwgRnVuY3Rpb24geyByZXR1cm4gdGhpcy5fZW5kcG9pbnQ7IH1cclxuXHRzZXQgZW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyB8IEZ1bmN0aW9uKSB7XHJcblx0XHR0aGlzLl9lbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdFx0dGhpcy5zZXJ2aWNlLmVuZHBvaW50ID0gdHlwZW9mIGVuZHBvaW50ID09PSAnZnVuY3Rpb24nID8gZW5kcG9pbnQodGhpcykgOiAoPHN0cmluZz5lbmRwb2ludCk7XHJcblx0XHR0aGlzLmNsZWFyKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBfcGFyYW1zOiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgX3BhcmFtczogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBwYXJhbXM6IGFueVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHBhcmFtcygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtczsgfVxyXG5cdHNldCBwYXJhbXMocGFyYW1zOiBhbnkpIHtcclxuXHRcdC8qIFJlbW92ZSBlbXB0eSBwYXJhbXMgKi9cclxuXHRcdFV0aWxzLmNsZWFuT2JqZWN0KHBhcmFtcyk7XHJcblxyXG5cdFx0aWYgKCFVdGlscy5lcXVhbHModGhpcy5fcGFyYW1zLCBwYXJhbXMpKSB7XHJcblx0XHRcdHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9wcm9qZWN0aW9uOiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgX3Byb2plY3Rpb246IHN0cmluZyB8IHN0cmluZ1tdO1xyXG5cclxuXHQvKipcclxuXHQgKiBwcm9qZWN0aW9uOiBhbnlcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBwcm9qZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcHJvamVjdGlvbjsgfVxyXG5cdHNldCBwcm9qZWN0aW9uKHByb2plY3Rpb246IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcblx0XHR0aGlzLl9wcm9qZWN0aW9uID0gcHJvamVjdGlvbjtcclxuXHRcdHRoaXMuY2xlYXIoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGRpc2FibGVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAodGhpcy5fcmVhZG9ubHkpIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmRpc2FibGVkO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVhZG9ubHlcclxuXHQgKi9cclxuXHRwdWJsaWMgX3BhZ2luYXRlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhZ2luYXRpb25cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBwYWdpbmF0ZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wYWdpbmF0ZWQ7IH1cclxuXHRzZXQgcGFnaW5hdGVkKHBhZ2luYXRlZDogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fcGFnaW5hdGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHBhZ2luYXRlZCk7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFkb25seVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfY3VzdG9tVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VzdG9tIHZhbHVlXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgY3VzdG9tVmFsdWUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9jdXN0b21WYWx1ZTsgfVxyXG5cdHNldCBjdXN0b21WYWx1ZShjdXN0b21WYWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fY3VzdG9tVmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoY3VzdG9tVmFsdWUpO1xyXG5cdFx0dGhpcy5rZXkgPSBjdXN0b21WYWx1ZSAmJiB0aGlzLmtleSA9PSAnaWQnID8gJ25hbWUnIDogdGhpcy5rZXk7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBjb250ZXh0OiBhbnlcclxuXHQgKiBUaGUgY3VycmVudCBjb250ZXh0XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY29udGV4dDogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBrZXk6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGtleTogc3RyaW5nID0gJ2lkJztcclxuXHJcblx0LyoqXHJcblx0ICogc2VhcmNoRmllbGQ6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlYXJjaEZpZWxkOiBzdHJpbmcgPSAnc2VhcmNoJztcclxuXHJcblx0LyoqXHJcblx0ICogc2VhcmNoRmllbGRzOiBzdHJpbmdcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZWFyY2hGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJlbW92YWJsZTogYm9vbGVhblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJlbW92YWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGRlYm91bmNlPzogbnVtYmVyXHJcblx0ICogRGVib3VuY2UgdGltZW91dCBiZXR3ZWVuIGtleXByZXNzZXMuIERlZmF1bHRzIHRvIDQwMC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJvdW5jZTogbnVtYmVyID0gNDAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBhdXRvY29tcGxldGVDc3NDbGFzczogc3RyaW5nXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgYXV0b2NvbXBsZXRlQ3NzQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKipcclxuXHQgKiBvcGVuZWQ6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgb3BlbmVkOiBib29sZWFuO1xyXG5cclxuXHQvKipcclxuXHQgKiBpbml0U2VsZWN0PzogZnVuY3Rpb25cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgaW5pdFNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogc2VsZWN0ZWQ/OiBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBzZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogY2xlYXJlZD86IGZ1bmN0aW9uXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGNsZWFyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxhdW5jaD86IGZ1bmN0aW9uXHJcblx0ICovXHJcblx0QE91dHB1dCgnbGF1bmNoJylcclxuXHRwdWJsaWMgb25MYXVuY2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHN1ZmZpeEJ1dHRvbnM6IFN1ZmZpeEJ1dHRvbjxhbnk+W11cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdWZmaXhCdXR0b25zOiBTdWZmaXhCdXR0b25bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBjaGlwRm9jdXM/OiBmdW5jdGlvblxyXG5cdCAqIE1ldGhvZCB0byBiZSBleGVjdXRlZCB3aGVuIGEgY2hpcCBpcyBmb2N1c2VkLlxyXG5cdCAqIFNlbmRzIGNoaXAgdmFsdWUgYXMgZXZlbnQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGNoaXBGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgYE1hdEZvcm1GaWVsZGAgbGFiZWwgc2hvdWxkIHRyeSB0byBmbG9hdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7IHJldHVybiBzdXBlci5zaG91bGRMYWJlbEZsb2F0IHx8IHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3Q/LnZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxvYWRpbmc6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogZW1wdHlSZXN1bHQ6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgZW1wdHlSZXN1bHQ6IGJvb2xlYW47XHJcblxyXG5cdC8qKlxyXG5cdCAqIHNlcnZpY2U6IEJhc2VTZXJ2aWNlXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNlcnZpY2U6IEJhc2VTZXJ2aWNlID0gbmV3IEJhc2VTZXJ2aWNlKCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIGluamVjdG9yIFxyXG5cdCAqIEBwYXJhbSBtZWRpYSBcclxuXHQgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgXHJcblx0ICogQHBhcmFtIG5nQ29udHJvbCBcclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybSBcclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybUdyb3VwIFxyXG5cdCAqIEBwYXJhbSBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIgXHJcblx0ICogQHBhcmFtIGZvY3VzTW9uaXRvciBcclxuXHQgKiBAcGFyYW0gZWxlbWVudFJlZiBcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXHJcblx0XHRwdWJsaWMgbWVkaWE6IFZkTWVkaWFTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRcdEBPcHRpb25hbCgpIEBTZWxmKCkgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcblx0XHRAT3B0aW9uYWwoKSBwYXJlbnRGb3JtOiBOZ0Zvcm0sXHJcblx0XHRAT3B0aW9uYWwoKSBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuXHRcdGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXHJcblx0XHRmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcclxuXHRcdGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuXHQpIHtcclxuXHRcdHN1cGVyKFwiYXBwLXZkLWNoaXBzXCIsIG5nQ29udHJvbCwgcGFyZW50Rm9ybSwgcGFyZW50Rm9ybUdyb3VwLCBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIGZvY3VzTW9uaXRvciwgZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgXHJcblx0ICogZGlyZWN0aXZlIGFyZSBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkluaXQoKSB7XHJcblx0XHQvKiBMaXN0ZW4gdG8gdmFsdWUgY2hhbmdlcyBvZiB0aGUgc2VhcmNoIGlucHV0ICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnZhbHVlQ2hhbmdlc1xyXG5cdFx0XHQucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZSkpXHJcblx0XHRcdC5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRcdFx0dGhpcy5maWx0ZXJPcHRpb25zKHYpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5uZ0NvbnRyb2w/LnZhbHVlQ2hhbmdlcz8ucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYgKCF2YWx1ZSkge1xyXG5cdFx0XHRcdHRoaXMuY2hpcHMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLl92YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmVuYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGEgY29tcG9uZW50J3MgdmlldyBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5tZWRpYS5icm9hZGNhc3QoKTtcclxuXHJcblx0XHQvKiBJbml0aWxpYWxpemUgdGhlIGRhdGEgc291cmNlIHdpdGggdGhlIGN1cnJlbnQgc2VydmljZSwgcGFnaW5hdG9yIGFuZCBzb3J0ICovXHJcblx0XHR0aGlzLmRhdGFTb3VyY2UgPz89IG5ldyBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+KHRoaXMuc2VydmljZSEsIHRoaXMucGFnaW5hdG9yLCB0aGlzLnNvcnQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcclxuXHQgKiBAcGFyYW0gdmFsdWUgXHJcblx0ICovXHJcblx0cHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0LyogU2V0IHRoZSB2YWx1ZSAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKiBDbGVhciB0aGUgY2hpcHMgbGlzdCAqL1xyXG5cdFx0dGhpcy5jaGlwcyA9IFtdO1xyXG5cclxuXHRcdGlmICghdGhpcy5jdXN0b21WYWx1ZSAmJiB2YWx1ZSAmJiB0aGlzLmNoaXBzPy5sZW5ndGggPD0gMCkge1xyXG5cdFx0XHR0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRsZXQgX3BhcmFtczogYW55ID0ge307XHJcblxyXG5cdFx0XHQvKiBBZGQgaW5jbHVkZXMgZnJvbSBwYXJhbXMsIGlmIGFueSAqL1xyXG5cdFx0XHRpZiAodGhpcy5fcGFyYW1zPy5pbmNsdWRlcykge1xyXG5cdFx0XHRcdF9wYXJhbXMuaW5jbHVkZXMgPSB0aGlzLl9wYXJhbXMuaW5jbHVkZXM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEFkZCBwcm9qZWN0aW9uIGZyb20gcGFyYW1zLCBpZiBhbnkgKi9cclxuXHRcdFx0aWYgKHRoaXMuX3BhcmFtcz8ucHJvamVjdGlvbikge1xyXG5cdFx0XHRcdF9wYXJhbXMucHJvamVjdGlvbiA9IHRoaXMuX3BhcmFtcy5wcm9qZWN0aW9uO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBZGQgcHJvamVjdGlvbiwgaWYgYW55ICovXHJcblx0XHRcdGlmICh0aGlzLnByb2plY3Rpb24pIHtcclxuXHRcdFx0XHRfcGFyYW1zLnByb2plY3Rpb24gPSBBcnJheS5pc0FycmF5KHRoaXMucHJvamVjdGlvbikgPyB0aGlzLnByb2plY3Rpb24uam9pbignLCcpIDogdGhpcy5wcm9qZWN0aW9uO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBHZXQgYmFzZSB1cmwgKi9cclxuXHRcdFx0dmFyIHVybFBhcnRzID0gdGhpcy5zZXJ2aWNlPy5lbmRwb2ludD8uc3BsaXQoJz8nKTtcclxuXHRcdFx0dGhpcy5zZXJ2aWNlLmh0dHAuZ2V0KGAke3VybFBhcnRzWzBdfS8ke3ZhbHVlfSR7dXJsUGFydHMubGVuZ3RoID4gMSA/IGA/JHt1cmxQYXJ0c1sxXX1gIDogJyd9YCwgeyBwYXJhbXM6IFV0aWxzLmNsZWFuT2JqZWN0KF9wYXJhbXMpIH0pLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHg6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0LyogQWRkIGNoaXAgZm9yIHNlbGVjdGVkIG9wdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlwcy5wdXNoKHgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEVtaXQgc2VsZWN0ZWQgZXZlbnQgKi9cclxuXHRcdFx0XHRcdHRoaXMuaW5pdFNlbGVjdC5lbWl0KHgpO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5jdXN0b21WYWx1ZSkge1xyXG5cdFx0XHR0aGlzLmNoaXBzID0gdmFsdWUgPyBbeyBbdGhpcy5rZXldOiB2YWx1ZSB9XSA6IFtdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jbGVhcihmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25uZWN0cyB0aGUgZGF0YSBzb3VyY2UgYW5kIHN1YnNjcmliZSB0byB0aGUgZGF0YSBjaGFuZ2VzXHJcblx0ICovXHJcblx0cHVibGljIGNvbm5lY3QoKTogdm9pZCB7XHJcblx0XHQvKiBTZXQgZm9jdXMgKi9cclxuXHRcdHRoaXMub3BlbmVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKiBTZXQgc29tZSBwYXJhbXMgKi9cclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5maWVsZEZpbHRlcnMgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zKCk7XHJcblxyXG5cdFx0LyogQ29ubmVjdCB0aGUgZGF0YSBzb3VyY2UgbWFudWFsbHkgZm9yICdtYXQtb3B0aW9uJyB0cmlnZ2VycyAqL1xyXG5cdFx0aWYgKCF0aGlzLmNsYXNzVHlwZSAmJiAhdGhpcy5kYXRhU291cmNlPy5pc0Nvbm5lY3RlZCkge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KCkuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ2hlY2sgdGhlIGNoYW5nZSBkZXRlY3RvciBhbmQgaXRzIGNoaWxkcmVuICovXHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgY29udHJvbCBmb2N1c1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcclxuXHRcdHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGJsdXIgZXZlbnQgb2YgdGhlIGlucHV0IGJveFxyXG5cdCAqIEBwYXJhbSBldmVudCBcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkT25CbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcblx0XHRjb25zdCB0YXJnZXQ6IEhUTUxFbGVtZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGlmICghdGFyZ2V0IHx8IHRhcmdldC50YWdOYW1lICE9PSAnTUFULU9QVElPTicpIHtcclxuXHRcdFx0bGV0IHZhbHVlOiBzdHJpbmcgPSB0aGlzLmZpbHRlcklucHV0Py5uYXRpdmVFbGVtZW50Py52YWx1ZTtcclxuXHRcdFx0aWYgKHZhbHVlKSB7XHJcblx0XHRcdFx0dGhpcy5hZGRDaGlwKHsgW3RoaXMua2V5XTogdmFsdWUgfSwgdGhpcy5maWx0ZXJJbnB1dCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBjaGlwXHJcblx0ICogQHBhcmFtIGV2ZW50IFxyXG5cdCAqIEBwYXJhbSBpbnB1dCBcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkQ2hpcCh2YWx1ZTogYW55LCBpbnB1dDogYW55KTogdm9pZCB7XHJcblx0XHQvKiBBZGQgY2hpcCBmb3Igc2VsZWN0ZWQgb3B0aW9uICovXHJcblx0XHR0aGlzLmNoaXBzID0gW3ZhbHVlXTtcclxuXHJcblx0XHQvKiBFbWl0IHNlbGVjdGVkIGV2ZW50ICovXHJcblx0XHR0aGlzLnNlbGVjdGVkLmVtaXQodmFsdWUpO1xyXG5cclxuXHRcdC8qIFx0U2V0IHRoZSB2YWx1ZSAobmdNb2RlbCkgKi9cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZVt0aGlzLmtleV07XHJcblxyXG5cdFx0LyogRGlhYmxlZCB0aGUgaW5wdXQsIGFsbG93IG9ubHkgb25lIGNoaXAgKi9cclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnBhdGNoVmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcblx0XHQvKiBSZXNldCB0aGUgYXV0b2NvbXBsZXRlIGlucHV0IHRleHQgdmFsdWUgKi9cclxuXHRcdGlmIChpbnB1dCkge1xyXG5cdFx0XHRpbnB1dC52YWx1ZSA9ICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIENsb3NlIHRoZSBhdXRvY29tcGxldGUgcGFuZWwsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKGZvciB0YWJsZSByb3cgY2xpY2spICovXHJcblx0XHR0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbGwgY2hpcHNcclxuXHQgKi9cclxuXHRwdWJsaWMgY2xlYXIodHJpZ2dlclN0YXRlQ2hhbmdlczogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuXHRcdC8qIFJlbW92ZSBrZXkgZnJvbSBjaGlwcyBhcnJheSAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLmNoaXBzID0gW107XHJcblxyXG5cdFx0LyogTWFyayB0aGUgY29udHJvbCBhcyB0b3VjaGVkICovXHJcblx0XHRpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbCkge1xyXG5cdFx0XHR0aGlzLm5nQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBSZXNldCB0aGUgdmFsdWUgKG5nTW9kZWwpICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnBhdGNoVmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcblx0XHRpZiAodHJpZ2dlclN0YXRlQ2hhbmdlcykge1xyXG5cdFx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRW5hYmxlIHRoZSBpbnB1dCAqL1xyXG5cdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuXHRcdC8qIENoZWNrIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGl0cyBjaGlsZHJlbiAqL1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGaWx0ZXJzIG9wdGlvbnNcclxuXHQgKiBAcGFyYW0gdGV4dCBcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnModGV4dDogc3RyaW5nKSB7XHJcblx0XHQvKiBGaWx0ZXIgdGhlIHJlc3VsdHMgKi9cclxuXHRcdGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuXHRcdFx0LyogSW5pdCBwYXJhbXMgaWYgbnVsbCAqL1xyXG5cdFx0XHRsZXQgX3BhcmFtcyA9IHsgLi4udGhpcy5nZXRRdWVyeVBhcmFtcygpIH07XHJcblxyXG5cdFx0XHQvKiBBZGQgc2VhcmNoIHdvcmQgdG8gdGhlIHBhcmFtcyAqL1xyXG5cdFx0XHRpZiAodGhpcy5zZWFyY2hGaWVsZCAmJiB0aGlzLnNlYXJjaEZpZWxkcy5sZW5ndGggPD0gMCkge1xyXG5cdFx0XHRcdHZhciByZXN1bHQgPSBuZXcgUmVnRXhwKGAoXFxcXCR7dGhpcy5zZWFyY2hPcGVyYXRvcnMuam9pbignfFxcXFwnKX0pPyguKilgKS5leGVjKHRoaXMuc2VhcmNoRmllbGQpO1xyXG5cdFx0XHRcdF9wYXJhbXNbcmVzdWx0WzJdXSA9IGAke3Jlc3VsdFsxXSA/IHJlc3VsdFsxXSA6ICcnfSR7dGV4dH1gO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBZGQgc2VhcmNoIHdvcmQgdG8gdGhlIHBhcmFtcyAqL1xyXG5cdFx0XHR0aGlzLnNlYXJjaEZpZWxkcz8ubWFwKHggPT4geC50cmltKCkpPy5mb3JFYWNoKHggPT4ge1xyXG5cdFx0XHRcdHZhciByZXN1bHQgPSBuZXcgUmVnRXhwKGAoXFxcXCR7dGhpcy5zZWFyY2hPcGVyYXRvcnMuam9pbignfFxcXFwnKX0pPyguKilgKS5leGVjKHgpO1xyXG5cdFx0XHRcdF9wYXJhbXNbcmVzdWx0WzJdXSA9IGAke3Jlc3VsdFsxXSA/IHJlc3VsdFsxXSA6ICcnfSR7dGV4dH1gO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIE5vdGhpbmcgaGFzIGNoYW5nZWQ/ICovXHJcblx0XHRcdGlmIChVdGlscy5lcXVhbHModGhpcy5fcGFyYW1zLCBfcGFyYW1zKSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogU2V0IHBhcmFtcyAqL1xyXG5cdFx0XHR0aGlzLl9wYXJhbXMgPSBfcGFyYW1zO1xyXG5cclxuXHRcdFx0LyogR2V0IHJlc3VsdHMgZnJvbSBzZXJ2ZXIgKi9cclxuXHRcdFx0dGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5kYXRhU291cmNlLmFwcGx5RmlsdGVycyh0aGlzLl9wYXJhbXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyByZW1vdmVkIGV2ZW50XHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJlbW92ZWRFdmVudCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY2xlYXJlZD8uZW1pdCh0aGlzLnZhbHVlKTtcclxuXHRcdGlmICh0aGlzLnJlbW92YWJsZSkge1xyXG5cdFx0XHR0aGlzLmNsZWFyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGxhdW5jaCBidXR0b24gY2xpY2tcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTGF1bmNoQ2xpY2tlZCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNoaXBzPy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRoaXMub25MYXVuY2guZW1pdCh0aGlzLmNoaXBzWzBdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgcXVlcnkgcGFyYW1zXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldFF1ZXJ5UGFyYW1zKCk6IGFueSB7XHJcblx0XHQvKiBJbml0IHBhcmFtcyBpZiBudWxsICovXHJcblx0XHR2YXIgcGFyYW1zID0gdGhpcy5fcGFyYW1zIHx8IHt9O1xyXG5cclxuXHRcdC8qIEFkZCBwcm9qZWN0aW9uLCBpZiBhbnkgKi9cclxuXHRcdGlmICh0aGlzLnByb2plY3Rpb24pIHtcclxuXHRcdFx0cGFyYW1zLnByb2plY3Rpb24gPSB0aGlzLnByb2plY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtcztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgcGVyZm9ybXMgY3VzdG9tIGNsZWFuLXVwLCBpbnZva2VkIGltbWVkaWF0ZWx5XHJcblx0ICogYmVmb3JlIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0fVxyXG59IiwiPG1hdC1jaGlwLWxpc3QgI2NoaXBMaXN0IFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtkaXNhYmxlZF09XCJyZWFkb25seVwiIG1hdEF1dG9jb21wbGV0ZU9yaWdpbiAjb3JpZ2luPVwibWF0QXV0b2NvbXBsZXRlT3JpZ2luXCI+XHJcblx0PCEtLSAjcmVnaW9uIENoaXBzIC0tPlxyXG5cdDxuZy10ZW1wbGF0ZSBsZXQtY2hpcCBsZXQtZmlyc3Q9XCJmaXJzdFwiIGxldC1pbmRleD1cImluZGV4XCIgbmdGb3IgW25nRm9yT2ZdPVwiY2hpcHNcIj5cclxuXHRcdDxtYXQtYmFzaWMtY2hpcCBbc2VsZWN0YWJsZV09XCIhcmVhZG9ubHlcIiBbcmVtb3ZhYmxlXT1cIiFyZWFkb25seVwiIChyZW1vdmVkKT1cImhhbmRsZVJlbW92ZWRFdmVudCgpXCIgZGlzYWJsZVJpcHBsZT5cclxuXHRcdFx0PHNwYW4gY2xhc3M9XCJ2ZC1jaGlwLWNvbnRlbnRcIj5cclxuXHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFjaGlwVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj57eyBjaGlwIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBjaGlwIH1cIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJjaGlwVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpcFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNoaXA6IGNoaXAgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIGxldC1idXR0b24gbGV0LWZpcnN0PVwiZmlyc3RcIiBuZ0ZvciBbbmdGb3JPZl09XCJzdWZmaXhCdXR0b25zXCI+XHJcblx0XHRcdFx0PGEgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIWJ1dHRvbi5oaWRlIHx8ICFidXR0b24uaGlkZShjaGlwc1swXSwgY29udGV4dClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBidXR0b24uZXZlbnQgJiYgYnV0dG9uLmV2ZW50KGNoaXBzWzBdLCBjb250ZXh0KVwiPlxyXG5cdFx0XHRcdFx0PG1hdC1pY29uPnt7YnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcblx0XHRcdFx0PC9hPlxyXG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJvbkxhdW5jaD8ub2JzZXJ2ZXJzPy5sZW5ndGggPiAwXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaGFuZGxlTGF1bmNoQ2xpY2tlZCgpXCI+XHJcblx0XHRcdFx0PG1hdC1pY29uPmxhdW5jaDwvbWF0LWljb24+XHJcblx0XHRcdDwvYT5cclxuXHRcdFx0PGEgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIXJlYWRvbmx5XCI+XHJcblx0XHRcdFx0PG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2xvc2U8L21hdC1pY29uPlxyXG5cdFx0XHQ8L2E+XHJcblx0XHQ8L21hdC1iYXNpYy1jaGlwPlxyXG5cdDwvbmctdGVtcGxhdGU+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gU2VhcmNoIGJveCAtLT5cclxuXHQ8aW5wdXQgbWF0SW5wdXQgW2hpZGRlbl09XCJ2YWx1ZSAmJiAhZW1wdHlcIiBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiIChmb2N1cyk9XCJjb25uZWN0KClcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCIgW21hdEF1dG9jb21wbGV0ZUNvbm5lY3RlZFRvXT1cIm9yaWdpblwiIFtmb3JtQ29udHJvbF09XCJhdXRvQ29tcGxldGVDaGlwTGlzdFwiICNmaWx0ZXJJbnB1dCAvPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIFJlc2V0IGJ1dHRvbiAtLT5cclxuXHQ8YSBtYXQtaWNvbi1idXR0b24gdHJhaWxpbmdJY29uICpuZ0lmPVwiZmlsdGVySW5wdXQudmFsdWVcIiBjbGFzcz1cInJlc2V0LWlucHV0XCIgKGNsaWNrKT1cImZpbHRlcklucHV0LnZhbHVlID0gJydcIj5cclxuXHRcdDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcblx0PC9hPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIFByb2dyZXNzIC0tPlxyXG5cdDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE4XCIgKm5nSWY9XCJkYXRhU291cmNlPy5pc0xvYWRpbmdcIj48L21hdC1zcGlubmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuPC9tYXQtY2hpcC1saXN0PlxyXG5cclxuPCEtLSAjcmVnaW9uIEF1dG9jb21wbGV0ZSAtLT5cclxuPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYWRkQ2hpcCgkZXZlbnQub3B0aW9uLnZhbHVlLCBmaWx0ZXJJbnB1dClcIiBjbGFzcz1cInt7YXV0b2NvbXBsZXRlQ3NzQ2xhc3N9fXt7Y2xhc3NUeXBlPycgdGFibGUtYXV0b2NvbXBsZXRlJzonJ319XCI+XHJcblx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiIWNsYXNzVHlwZSAmJiBvcGVuZWRcIiBsZXQtaXRlbSBsZXQtZmlyc3Q9XCJmaXJzdFwiIG5nRm9yIFtuZ0Zvck9mXT1cImRhdGFTb3VyY2U/Lml0ZW1zXCI+XHJcblx0XHQ8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj57e2l0ZW19fTwvc3Bhbj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBpdGVtIH1cIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9tYXQtb3B0aW9uPlxyXG5cdDwvbmctdGVtcGxhdGU+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNsYXNzVHlwZSAmJiBvcGVuZWRcIj5cclxuXHRcdDxtYXQtb3B0aW9uIGhpZGU9XCJ0cnVlXCI+PC9tYXQtb3B0aW9uPlxyXG5cdFx0PHZkLWR5bmFtaWMtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFtjbGFzc1R5cGVdPVwiY2xhc3NUeXBlXCIgKHJvd0NsaWNrKT1cImFkZENoaXAoJGV2ZW50LCBmaWx0ZXJJbnB1dClcIiBtYXRTb3J0IFtzb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbc29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCI+PC92ZC1keW5hbWljLXRhYmxlPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiZGF0YVNvdXJjZT8udG90YWxcIiBbcGFnZUluZGV4XT1cImRhdGFTb3VyY2U/LnBhZ2VJbmRleFwiIFtwYWdlU2l6ZV09XCJkYXRhU291cmNlPy5wYWdlU2l6ZVwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9XCJ0cnVlXCIgaGlkZVBhZ2VTaXplPVwidHJ1ZVwiPjwvbWF0LXBhZ2luYXRvcj5cclxuPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG48IS0tICNlbmRyZWdpb24gLS0+Il19
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvY2hpcHMvY29tcG9uZW50cy9jaGlwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9jaGlwcy9jb21wb25lbnRzL2NoaXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoTCxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUs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RSxJQUFJLEVBQUU7Z0JBNEI5QixLQUFLO3NCQURYLEtBQUs7Z0JBT0MsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxlQUFlO2dCQU90QiwwQkFBMEI7c0JBRGhDLFlBQVk7dUJBQUMsNkJBQTZCO2dCQVl2QyxRQUFRO3NCQURYLEtBQUs7Z0JBaUJGLE1BQU07c0JBRFQsS0FBSztnQkF5QkYsVUFBVTtzQkFEYixLQUFLO2dCQWlCRixJQUFJO3NCQURQLEtBQUs7Z0JBeUJDLE9BQU87c0JBRGIsS0FBSztnQkFPQyxHQUFHO3NCQURULEtBQUs7Z0JBT0MsV0FBVztzQkFEakIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBT0MsS0FBSztzQkFEWCxLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFRQyxRQUFRO3NCQURkLEtBQUs7dUJBQUMsVUFBVTtnQkFPVixVQUFVO3NCQURoQixNQUFNO2dCQU9BLFFBQVE7c0JBRGQsTUFBTTtnQkFPQSxPQUFPO3NCQURiLE1BQU07Z0JBT0EsUUFBUTtzQkFEZCxNQUFNO3VCQUFDLFFBQVE7Z0JBT1QsYUFBYTtzQkFEbkIsS0FBSztnQkFTQyxTQUFTO3NCQURmLE1BQU07Z0JBWUgsT0FBTztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBDZGtQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9wdGlvbmFsLCBPdXRwdXQsIFNlbGYsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTmdDb250cm9sLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBFcnJvclN0YXRlTWF0Y2hlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTdWZmaXhCdXR0b24gfSBmcm9tICcuLi8uLi9jb21tb24vY29tbW9uLm1vZHVsZSc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IEFic3RyYWN0TWF0Rm9ybUZpZWxkIH0gZnJvbSAnLi4vLi4vZm9ybXMvaGVscGVycy9hYnN0cmFjdC1tYXQtZm9ybS1maWVsZCc7XHJcblxyXG4vKipcclxuICogVmRDaGlwRGlyZWN0aXZlIGNsYXNzXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbdmQtY2hpcF1uZy10ZW1wbGF0ZScgfSlcclxuZXhwb3J0IGNsYXNzIFZkQ2hpcERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcblx0Y29uc3RydWN0b3IodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuXHRcdHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWZEF1dG9jb21wbGV0ZU9wdGlvbkRpcmVjdGl2ZSBjbGFzc1xyXG4gKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3ZkLWF1dG9jb21wbGV0ZS1vcHRpb25dbmctdGVtcGxhdGUnIH0pXHJcbmV4cG9ydCBjbGFzcyBWZEF1dG9jb21wbGV0ZU9wdGlvbkRpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcblx0Y29uc3RydWN0b3IodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuXHRcdHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWZENoaXBzQ29tcG9uZW50IGNsYXNzXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3ZkLWNoaXBzJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vY2hpcHMuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2NoaXBzLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0cHJvdmlkZXJzOiBbXHJcblx0XHR7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBWZENoaXBzQ29tcG9uZW50IH1cclxuXHRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWZENoaXBzQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RNYXRGb3JtRmllbGQ8YW55PiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBodHRwIHNlcnZpY2UgZnJvbSB0byBnZXQgdGhlIGRhdGFcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCA9IG51bGw7XHJcblxyXG5cdC8qKiBcclxuXHQgKiBUaGUgc2VsZWN0IGVsZW1lbnQuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRJbnB1dCwgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgY2hpcElucHV0OiBNYXRJbnB1dDtcclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyBhIHZhbHVlIHRoYXQgY2hhbmdlcyBvdmVyIHRpbWUuIFxyXG5cdCAqIE9ic2VydmVycyBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzdWJqZWN0IHRvIHJlY2VpdmUgcGRmIGZpbGUgY2hhbmdlc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2VuZHBvaW50Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHVwIHJlYWN0aXZlIGZvcm1jb250cm9sXHJcblx0ICovXHJcblx0cHVibGljIGF1dG9Db21wbGV0ZUNoaXBMaXN0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBvcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uczogYW55W107XHJcblxyXG5cdC8qKlxyXG5cdCAqIHNlYXJjaE9wZXJhdG9yczogc3RyaW5nW11cclxuXHQgKi9cclxuXHRwdWJsaWMgc2VhcmNoT3BlcmF0b3JzOiBzdHJpbmdbXSA9IFtcIiE9XCIsIFwiIVwiLCBcIjw+XCIsIFwiPj1cIiwgXCI+XCIsIFwiPD1cIiwgXCI8XCIsIFwiXlwiLCBcIiRcIiwgXCJ+XCJdO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbGlzdCBvZiBjaGlwc1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNoaXBzID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZkQ2hpcCB0ZW1wbGF0ZVxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVmRDaGlwRGlyZWN0aXZlKVxyXG5cdHB1YmxpYyBjaGlwVGVtcGxhdGU6IFZkQ2hpcERpcmVjdGl2ZTtcclxuXHJcblx0LyoqXHJcblx0ICogQXV0b2NvbXBsZXRlT3B0aW9uIHRlbXBsYXRlXHJcblx0ICovXHJcblx0QENvbnRlbnRDaGlsZChWZEF1dG9jb21wbGV0ZU9wdGlvbkRpcmVjdGl2ZSlcclxuXHRwdWJsaWMgYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU6IFZkQXV0b2NvbXBsZXRlT3B0aW9uRGlyZWN0aXZlO1xyXG5cclxuXHQvKipcclxuXHQgKiBfZW5kcG9pbnQ6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBfZW5kcG9pbnQ6IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIGVuZHBvaW50XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgZW5kcG9pbnQoKTogYW55IHsgcmV0dXJuIHRoaXMuX2VuZHBvaW50OyB9XHJcblx0c2V0IGVuZHBvaW50KGVuZHBvaW50OiBhbnkpIHtcclxuXHRcdHRoaXMuX2VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0XHR0aGlzLmNsZWFyKCk7XHJcblx0XHR0aGlzLl9lbmRwb2ludENoYW5nZS5uZXh0KFt0aGlzLmVuZHBvaW50LCB0aGlzLnBhdGgsIHRoaXMucGFyYW1zLCB0aGlzLnByb2plY3Rpb25dKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9wYXJhbXM6IGFueVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcGFyYW1zOiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHBhcmFtczogYW55XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcGFyYW1zKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1zOyB9XHJcblx0c2V0IHBhcmFtcyhwYXJhbXM6IGFueSkge1xyXG5cdFx0LyogUmVtb3ZlIGVtcHR5IHBhcmFtcyAqL1xyXG5cdFx0T2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuXHRcdFx0aWYgKChwYXJhbXNba2V5XSA9PSBudWxsIHx8IHBhcmFtc1trZXldID09ICcnIHx8IHBhcmFtc1trZXldID09ICd1bmRlZmluZWQnKSkge1xyXG5cdFx0XHRcdGRlbGV0ZSBwYXJhbXNba2V5XTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKEpTT04uc3RyaW5naWZ5KHRoaXMuX3BhcmFtcykgIT09IEpTT04uc3RyaW5naWZ5KHBhcmFtcykpIHtcclxuXHRcdFx0dGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG5cdFx0XHR0aGlzLl9lbmRwb2ludENoYW5nZS5uZXh0KFt0aGlzLmVuZHBvaW50LCB0aGlzLnBhdGgsIHRoaXMuX3BhcmFtcywgdGhpcy5wcm9qZWN0aW9uXSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBfcHJvamVjdGlvbjogYW55XHJcblx0ICovXHJcblx0cHVibGljIF9wcm9qZWN0aW9uOiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHByb2plY3Rpb246IGFueVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHByb2plY3Rpb24oKSB7IHJldHVybiB0aGlzLl9wcm9qZWN0aW9uOyB9XHJcblx0c2V0IHByb2plY3Rpb24ocHJvamVjdGlvbjogc3RyaW5nKSB7XHJcblx0XHR0aGlzLl9wcm9qZWN0aW9uID0gcHJvamVjdGlvbjtcclxuXHRcdHRoaXMuY2xlYXIoKTtcclxuXHRcdHRoaXMuX2VuZHBvaW50Q2hhbmdlLm5leHQoW3RoaXMuZW5kcG9pbnQsIHRoaXMucGF0aCwgdGhpcy5wYXJhbXMsIHRoaXMucHJvamVjdGlvbl0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogX3BhdGg6IGFueVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcGF0aDogYW55ID0gJyc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgb3Igc2V0cyBwYXRoXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcGF0aCgpIHsgcmV0dXJuIHRoaXMuX3BhdGg7IH1cclxuXHRzZXQgcGF0aChwYXRoKSB7XHJcblx0XHR0aGlzLl9wYXRoID0gcGF0aDtcclxuXHRcdHRoaXMuY2xlYXIoKTtcclxuXHRcdHRoaXMuX2VuZHBvaW50Q2hhbmdlLm5leHQoW3RoaXMuZW5kcG9pbnQsIHRoaXMucGF0aCwgdGhpcy5wYXJhbXMsIHRoaXMucHJvamVjdGlvbl0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZGlzYWJsZWQuXHJcblx0ICogQHBhcmFtIGRpc2FibGVkXHJcblx0ICovXHJcblx0cHVibGljIGdldCBkaXNhYmxlZCgpIHtcclxuXHRcdGlmICh0aGlzLl9yZWFkb25seSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZGlzYWJsZWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBjb250ZXh0OiBhbnlcclxuXHQgKiBUaGUgY3VycmVudCBjb250ZXh0XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY29udGV4dDogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBrZXk6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGtleTogc3RyaW5nID0gJ2lkJztcclxuXHJcblx0LyoqXHJcblx0ICogc2VhcmNoRmllbGQ6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlYXJjaEZpZWxkOiBzdHJpbmcgPSAnc2VhcmNoJztcclxuXHJcblx0LyoqXHJcblx0ICogc2VhcmNoRmllbGRzOiBzdHJpbmdcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZWFyY2hGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIHRlcm1NaW5sZW5ndGg6IG51bWJlclxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHRlcm1NaW5sZW5ndGg6IG51bWJlciA9IDI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxpbWl0OiBudW1iZXJcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBsaW1pdDogbnVtYmVyID0gMzA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJlbW92YWJsZTogYm9vbGVhblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJlbW92YWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGRlYm91bmNlPzogbnVtYmVyXHJcblx0ICogRGVib3VuY2UgdGltZW91dCBiZXR3ZWVuIGtleXByZXNzZXMuIERlZmF1bHRzIHRvIDQwMC5cclxuXHQgKi9cclxuXHRASW5wdXQoJ2RlYm91bmNlJylcclxuXHRwdWJsaWMgZGVib3VuY2U6IG51bWJlciA9IDQwMDtcclxuXHJcblx0LyoqXHJcblx0ICogaW5pdFNlbGVjdD86IGZ1bmN0aW9uXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGluaXRTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHNlbGVjdGVkPzogZnVuY3Rpb25cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNsZWFyZWQ/OiBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBjbGVhcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBsYXVuY2g/OiBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoJ2xhdW5jaCcpXHJcblx0cHVibGljIG9uTGF1bmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBzdWZmaXhCdXR0b25zOiBTdWZmaXhCdXR0b248YW55PltdXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3VmZml4QnV0dG9uczogU3VmZml4QnV0dG9uW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogY2hpcEZvY3VzPzogZnVuY3Rpb25cclxuXHQgKiBNZXRob2QgdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIGNoaXAgaXMgZm9jdXNlZC5cclxuXHQgKiBTZW5kcyBjaGlwIHZhbHVlIGFzIGV2ZW50LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBjaGlwRm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKiBcclxuXHQgKiBXaGV0aGVyIHRoZSBzZWxlY3QgaGFzIGEgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0IGVtcHR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jaGlwcy5sZW5ndGggPD0gMDsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZhdWx0IGNoaXBcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBkZWZhdWx0KCkgeyByZXR1cm4gdGhpcy5jaGlwc1swXTsgfVxyXG5cdHNldCBkZWZhdWx0KF9jaGlwKSB7XHJcblx0XHRpZiAoX2NoaXApIHtcclxuXHRcdFx0LyogQWRkIGNoaXAgZm9yIHNlbGVjdGVkIG9wdGlvbiAqL1xyXG5cdFx0XHR0aGlzLmNoaXBzID0gW19jaGlwXTtcclxuXHJcblx0XHRcdC8qIFx0U2V0IHRoZSB2YWx1ZSAobmdNb2RlbCkgKi9cclxuXHRcdFx0dGhpcy52YWx1ZSA9IF9jaGlwW3RoaXMua2V5XTtcclxuXHJcblx0XHRcdC8qIERpYWJsZWQgdGhlIGlucHV0LCBhbGxvdyBvbmx5IG9uZSBjaGlwICovXHJcblx0XHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QuZGlzYWJsZSgpO1xyXG5cclxuXHRcdFx0LyogUmVzZXQgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dCB0ZXh0IHZhbHVlICovXHJcblx0XHRcdHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGBNYXRGb3JtRmllbGRgIGxhYmVsIHNob3VsZCB0cnkgdG8gZmxvYXQuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHN1cGVyLnNob3VsZExhYmVsRmxvYXQgfHwgIXRoaXMuY2hpcElucHV0Py5lbXB0eTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxvYWRpbmc6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogZW1wdHlSZXN1bHQ6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgZW1wdHlSZXN1bHQ6IGJvb2xlYW47XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIG5nQ29udHJvbCBcclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybSBcclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybUdyb3VwIFxyXG5cdCAqIEBwYXJhbSBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIgXHJcblx0ICogQHBhcmFtIGZvY3VzTW9uaXRvciBcclxuXHQgKiBAcGFyYW0gZWxlbWVudFJlZiBcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLCBAT3B0aW9uYWwoKSBAU2VsZigpIG5nQ29udHJvbDogTmdDb250cm9sLCBAT3B0aW9uYWwoKSBwYXJlbnRGb3JtOiBOZ0Zvcm0sIEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLCBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLCBmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG5cdFx0c3VwZXIoXCJhcHAtdmQtY2hpcHNcIiwgbmdDb250cm9sLCBwYXJlbnRGb3JtLCBwYXJlbnRGb3JtR3JvdXAsIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgZm9jdXNNb25pdG9yLCBlbGVtZW50UmVmKTtcclxuXHRcdHRoaXMuaHR0cCA9IGluamVjdG9yLmdldChIdHRwQ2xpZW50KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXHJcblx0ICogQHBhcmFtIHZhbHVlIFxyXG5cdCAqL1xyXG5cdHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0LyogU2V0IHRoZSB2YWx1ZSAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKiBDbGVhciB0aGUgY2hpcHMgbGlzdCAqL1xyXG5cdFx0dGhpcy5jaGlwcyA9IFtdO1xyXG5cclxuXHRcdGlmICh2YWx1ZSAmJiB0aGlzLmNoaXBzPy5sZW5ndGggPD0gMCkge1xyXG5cdFx0XHR0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRsZXQgX3BhcmFtczogYW55ID0ge307XHJcblxyXG5cdFx0XHQvKiBBZGQgaW5jbHVkZXMsIGlmIGFueSAqL1xyXG5cdFx0XHRpZiAodGhpcy5fcGFyYW1zPy5pbmNsdWRlcykge1xyXG5cdFx0XHRcdF9wYXJhbXMuaW5jbHVkZXMgPSB0aGlzLl9wYXJhbXMuaW5jbHVkZXM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEFkZCBwcm9qZWN0aW9uLCBpZiBhbnkgKi9cclxuXHRcdFx0aWYgKHRoaXMucHJvamVjdGlvbikge1xyXG5cdFx0XHRcdF9wYXJhbXMucHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogR2V0IGJhc2UgdXJsICovXHJcblx0XHRcdHZhciB1cmxQYXJ0cyA9IHRoaXMuZW5kcG9pbnQuc3BsaXQoJz8nKTtcclxuXHRcdFx0dGhpcy5odHRwLmdldChgJHt1cmxQYXJ0c1swXX0vJHt2YWx1ZX0ke3VybFBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7dXJsUGFydHNbMV19YCA6ICcnfWAsIHsgcGFyYW1zOiBVdGlscy5jbGVhbk9iamVjdChfcGFyYW1zKSB9KS5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdC8qIEFkZCBjaGlwIGZvciBzZWxlY3RlZCBvcHRpb24gKi9cclxuXHRcdFx0XHR0aGlzLmNoaXBzLnB1c2goeCk7XHJcblxyXG5cdFx0XHRcdC8qIEVtaXQgc2VsZWN0ZWQgZXZlbnQgKi9cclxuXHRcdFx0XHR0aGlzLmluaXRTZWxlY3QuZW1pdCh4KTtcclxuXHJcblx0XHRcdFx0LyogRGlhYmxlZCB0aGUgaW5wdXQsIGFsbG93IG9ubHkgb25lIGNoaXAgKi9cclxuXHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmRpc2FibGUoKTtcclxuXHRcdFx0fSwgXyA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNsZWFyKGZhbHNlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgY29udHJvbCBmb2N1c1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcclxuXHRcdHRoaXMuY2hpcElucHV0Py5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgXHJcblx0ICogZGlyZWN0aXZlIGFyZSBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QudmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlKSlcclxuXHRcdFx0LnN1YnNjcmliZSh2ID0+IHRoaXMuZmlsdGVyT3B0aW9ucyh2KSk7XHJcblxyXG5cdFx0dGhpcy5uZ0NvbnRyb2w/LnZhbHVlQ2hhbmdlcz8ucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYgKCF2YWx1ZSkge1xyXG5cdFx0XHRcdHRoaXMuY2hpcHMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLl92YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmVuYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBjaGlwXHJcblx0ICogQHBhcmFtIGV2ZW50IFxyXG5cdCAqIEBwYXJhbSBpbnB1dCBcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkQ2hpcChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgaW5wdXQ6IGFueSk6IHZvaWQge1xyXG5cdFx0LyogRGVmaW5lIHNlbGVjdGlvbiBjb25zdGFudCAqL1xyXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gZXZlbnQub3B0aW9uLnZhbHVlO1xyXG5cclxuXHRcdC8qIEFkZCBjaGlwIGZvciBzZWxlY3RlZCBvcHRpb24gKi9cclxuXHRcdHRoaXMuY2hpcHMucHVzaChzZWxlY3Rpb24pO1xyXG5cclxuXHRcdC8qIEVtaXQgc2VsZWN0ZWQgZXZlbnQgKi9cclxuXHRcdHRoaXMuc2VsZWN0ZWQuZW1pdChzZWxlY3Rpb24pO1xyXG5cclxuXHRcdC8qIFx0U2V0IHRoZSB2YWx1ZSAobmdNb2RlbCkgKi9cclxuXHRcdHRoaXMudmFsdWUgPSBzZWxlY3Rpb25bdGhpcy5rZXldO1xyXG5cclxuXHRcdC8qIERpYWJsZWQgdGhlIGlucHV0LCBhbGxvdyBvbmx5IG9uZSBjaGlwICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmRpc2FibGUoKTtcclxuXHJcblx0XHQvKiBSZXNldCB0aGUgYXV0b2NvbXBsZXRlIGlucHV0IHRleHQgdmFsdWUgKi9cclxuXHRcdGlmIChpbnB1dCkge1xyXG5cdFx0XHRpbnB1dC52YWx1ZSA9ICcnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbGwgY2hpcHNcclxuXHQgKi9cclxuXHRwdWJsaWMgY2xlYXIodHJpZ2dlclN0YXRlQ2hhbmdlczogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuXHRcdC8qIFJlbW92ZSBrZXkgZnJvbSBjaGlwcyBhcnJheSAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLmNoaXBzID0gW107XHJcblxyXG5cdFx0LyogTWFyayB0aGUgY29udHJvbCBhcyB0b3VjaGVkICovXHJcblx0XHRpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbCkge1xyXG5cdFx0XHR0aGlzLm5nQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBSZXNldCB0aGUgdmFsdWUgKG5nTW9kZWwpICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnNldFZhbHVlKFwiXCIpO1xyXG5cclxuXHRcdGlmICh0cmlnZ2VyU3RhdGVDaGFuZ2VzKSB7XHJcblx0XHRcdHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBFbmFibGUgdGhlIGlucHV0ICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmVuYWJsZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmlsdGVycyBvcHRpb25zXHJcblx0ICogQHBhcmFtIHRleHQgXHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaWx0ZXJPcHRpb25zKHRleHQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbXTtcclxuXHRcdGlmICh0aGlzLmVuZHBvaW50ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyAmJiB0ZXh0Lmxlbmd0aCA+PSB0aGlzLnRlcm1NaW5sZW5ndGgpIHtcclxuXHRcdFx0LyogSW5pdCBwYXJhbXMgaWYgbnVsbCAqL1xyXG5cdFx0XHR0aGlzLl9wYXJhbXMgPSB0aGlzLl9wYXJhbXMgfHwge307XHJcblxyXG5cdFx0XHQvKiBBZGQgc2VhcmNoIHdvcmQgdG8gdGhlIHBhcmFtcyAqL1xyXG5cdFx0XHRpZiAodGhpcy5zZWFyY2hGaWVsZCAmJiB0aGlzLnNlYXJjaEZpZWxkcy5sZW5ndGggPD0gMCkge1xyXG5cdFx0XHRcdHZhciByZXN1bHQgPSBuZXcgUmVnRXhwKGAoXFxcXCR7dGhpcy5zZWFyY2hPcGVyYXRvcnMuam9pbignfFxcXFwnKX0pPyguKilgKS5leGVjKHRoaXMuc2VhcmNoRmllbGQpO1xyXG5cdFx0XHRcdHRoaXMuX3BhcmFtc1tyZXN1bHRbMl1dID0gYCR7cmVzdWx0WzFdID8gcmVzdWx0WzFdIDogJyd9JHt0ZXh0fWA7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEFkZCBzZWFyY2ggd29yZCB0byB0aGUgcGFyYW1zICovXHJcblx0XHRcdHRoaXMuc2VhcmNoRmllbGRzPy5tYXAoeCA9PiB4LnRyaW0oKSk/LmZvckVhY2goeCA9PiB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5ldyBSZWdFeHAoYChcXFxcJHt0aGlzLnNlYXJjaE9wZXJhdG9ycy5qb2luKCd8XFxcXCcpfSk/KC4qKWApLmV4ZWMoeCk7XHJcblx0XHRcdFx0dGhpcy5fcGFyYW1zW3Jlc3VsdFsyXV0gPSBgJHtyZXN1bHRbMV0gPyByZXN1bHRbMV0gOiAnJ30ke3RleHR9YDtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvKiBBZGQgbGltaXQgdG8gdGhlIHBhcmFtcyAqL1xyXG5cdFx0XHR0aGlzLl9wYXJhbXMubGltaXQgPSB0aGlzLmxpbWl0O1xyXG5cclxuXHRcdFx0LyogQWRkIHByb2plY3Rpb24sIGlmIGFueSAqL1xyXG5cdFx0XHRpZiAodGhpcy5wcm9qZWN0aW9uKSB7XHJcblx0XHRcdFx0dGhpcy5fcGFyYW1zLnByb2plY3Rpb24gPSB0aGlzLnByb2plY3Rpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEdldCByZXN1bHRzIGZyb20gc2VydmVyICovXHJcblx0XHRcdHRoaXMubG9hZGluZyA9IHRydWU7XHJcblx0XHRcdHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5lbmRwb2ludH0ke3RoaXMucGF0aCB8fCAnJ31gLCB7IHBhcmFtczogVXRpbHMuY2xlYW5PYmplY3QodGhpcy5fcGFyYW1zKSB9KVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdFx0bmV4dDogKHg6IGFueVtdKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHg7XHJcblx0XHRcdFx0XHRcdHRoaXMuZW1wdHlSZXN1bHQgPSAheCB8fCAheC5sZW5ndGg7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0ZXJyb3I6ICgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlXHJcblx0XHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIHJlbW92ZWQgZXZlbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUmVtb3ZlZEV2ZW50KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jbGVhcmVkPy5lbWl0KHRoaXMudmFsdWUpO1xyXG5cdFx0aWYgKHRoaXMucmVtb3ZhYmxlKSB7XHJcblx0XHRcdHRoaXMuY2xlYXIoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgbGF1bmNoIGJ1dHRvbiBjbGlja1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVMYXVuY2hDbGlja2VkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY2hpcHM/Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dGhpcy5vbkxhdW5jaC5lbWl0KHRoaXMuY2hpcHNbMF0pO1xyXG5cdFx0fVxyXG5cdH1cclxufSIsIjxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdCBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIj5cclxuXHQ8IS0tICNyZWdpb24gQ2hpcHMgLS0+XHJcblx0PG5nLXRlbXBsYXRlIGxldC1jaGlwIGxldC1maXJzdD1cImZpcnN0XCIgbGV0LWluZGV4PVwiaW5kZXhcIiBuZ0ZvciBbbmdGb3JPZl09XCJjaGlwc1wiPlxyXG5cdFx0PG1hdC1iYXNpYy1jaGlwIFtzZWxlY3RhYmxlXT1cIiFyZWFkb25seVwiIFtyZW1vdmFibGVdPVwiIXJlYWRvbmx5XCIgKHJlbW92ZWQpPVwiaGFuZGxlUmVtb3ZlZEV2ZW50KClcIiBkaXNhYmxlUmlwcGxlPlxyXG5cdFx0XHQ8c3BhbiBjbGFzcz1cInZkLWNoaXAtY29udGVudFwiPlxyXG5cdFx0XHRcdDxzcGFuICpuZ0lmPVwiIWNoaXBUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiIWF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPnt7IGNoaXAgfX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb246IGNoaXAgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNoaXBUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlwVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY2hpcDogY2hpcCB9XCI+PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0PC9zcGFuPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgbGV0LWJ1dHRvbiBsZXQtZmlyc3Q9XCJmaXJzdFwiIG5nRm9yIFtuZ0Zvck9mXT1cInN1ZmZpeEJ1dHRvbnNcIj5cclxuXHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhYnV0dG9uLmhpZGUgfHwgIWJ1dHRvbi5oaWRlKGNoaXBzWzBdLCBjb250ZXh0KVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGJ1dHRvbi5ldmVudCAmJiBidXR0b24uZXZlbnQoY2hpcHNbMF0sIGNvbnRleHQpXCI+XHJcblx0XHRcdFx0XHQ8bWF0LWljb24+e3tidXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuXHRcdFx0XHQ8L2E+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDxhIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIm9uTGF1bmNoPy5vYnNlcnZlcnM/Lmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBoYW5kbGVMYXVuY2hDbGlja2VkKClcIj5cclxuXHRcdFx0XHQ8bWF0LWljb24+bGF1bmNoPC9tYXQtaWNvbj5cclxuXHRcdFx0PC9hPlxyXG5cdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhcmVhZG9ubHlcIj5cclxuXHRcdFx0XHQ8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jbG9zZTwvbWF0LWljb24+XHJcblx0XHRcdDwvYT5cclxuXHRcdDwvbWF0LWJhc2ljLWNoaXA+XHJcblx0PC9uZy10ZW1wbGF0ZT5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBTZWFyY2ggYm94IC0tPlxyXG5cdDxpbnB1dCBtYXRJbnB1dCBbaGlkZGVuXT1cInZhbHVlICYmICFlbXB0eVwiIHBsYWNlaG9sZGVyPVwie3twbGFjZWhvbGRlcn19XCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiIFtmb3JtQ29udHJvbF09XCJhdXRvQ29tcGxldGVDaGlwTGlzdFwiICNjaGlwSW5wdXQgLz5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBQcm9ncmVzcyAtLT5cclxuXHQ8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxOFwiICpuZ0lmPVwibG9hZGluZ1wiPjwvbWF0LXNwaW5uZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG48L21hdC1jaGlwLWxpc3Q+XHJcblxyXG48IS0tICNyZWdpb24gQXV0b2NvbXBsZXRlIC0tPlxyXG48bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJhZGRDaGlwKCRldmVudCwgY2hpcElucHV0KVwiPlxyXG5cdDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBsZXQtZmlyc3Q9XCJmaXJzdFwiIG5nRm9yIFtuZ0Zvck9mXT1cImZpbHRlcmVkT3B0aW9uc1wiPlxyXG5cdFx0PG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cclxuXHRcdFx0PHNwYW4gKm5nSWY9XCIhYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+e3sgaXRlbSB9fTwvc3Bhbj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBpdGVtIH1cIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9tYXQtb3B0aW9uPlxyXG5cdDwvbmctdGVtcGxhdGU+XHJcbjwvbWF0LWF1dG9jb21wbGV0ZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPiJdfQ==