@acpaas-ui/ngx-forms 6.1.8 → 6.1.10

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 (178) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE.md +21 -0
  3. package/dist/README.md +23 -0
  4. package/dist/esm2020/lib/auto-complete/auto-complete.module.mjs +23 -0
  5. package/dist/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +265 -0
  6. package/dist/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +232 -0
  7. package/dist/esm2020/lib/datepicker/datepicker.module.mjs +54 -0
  8. package/dist/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +297 -0
  9. package/dist/esm2020/lib/range-slider/range-slider.module.mjs +19 -0
  10. package/dist/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +149 -0
  11. package/dist/esm2020/lib/search-filter/search-filter.module.mjs +21 -0
  12. package/{esm2020 → dist/esm2020}/lib/shared/services/search.service.mjs +6 -6
  13. package/dist/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +130 -0
  14. package/dist/esm2020/lib/timepicker/timepicker.module.mjs +21 -0
  15. package/dist/esm2020/lib/upload/components/upload/upload.component.mjs +69 -0
  16. package/dist/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +39 -0
  17. package/dist/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +42 -0
  18. package/dist/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +143 -0
  19. package/dist/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +33 -0
  20. package/dist/esm2020/lib/upload/services/validation-messages.service.mjs +29 -0
  21. package/dist/esm2020/lib/upload/upload.module.mjs +44 -0
  22. package/{fesm2015 → dist/fesm2015}/acpaas-ui-ngx-forms.mjs +141 -994
  23. package/dist/fesm2015/acpaas-ui-ngx-forms.mjs.map +1 -0
  24. package/dist/fesm2020/acpaas-ui-ngx-forms.mjs +1727 -0
  25. package/dist/fesm2020/acpaas-ui-ngx-forms.mjs.map +1 -0
  26. package/dist/package.json +44 -0
  27. package/karma.conf.js +38 -0
  28. package/ng-package.json +8 -0
  29. package/package.json +6 -30
  30. package/src/lib/auto-complete/README.md +148 -0
  31. package/src/lib/auto-complete/auto-complete.module.ts +15 -0
  32. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.html +51 -0
  33. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.scss +4 -0
  34. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.spec.ts +378 -0
  35. package/src/lib/auto-complete/components/auto-complete/auto-complete.component.ts +281 -0
  36. package/src/lib/auto-complete/public-api.ts +2 -0
  37. package/src/lib/datepicker/README.md +110 -0
  38. package/src/lib/datepicker/components/datepicker/datepicker.component.html +47 -0
  39. package/src/lib/datepicker/components/datepicker/datepicker.component.scss +13 -0
  40. package/src/lib/datepicker/components/datepicker/datepicker.component.spec.ts +204 -0
  41. package/src/lib/datepicker/components/datepicker/datepicker.component.ts +251 -0
  42. package/src/lib/datepicker/datepicker.conf.ts +11 -0
  43. package/src/lib/datepicker/datepicker.module.ts +50 -0
  44. package/src/lib/datepicker/public-api.ts +8 -0
  45. package/src/lib/datepicker/types/datepicker.types.ts +8 -0
  46. package/src/lib/range-slider/README.md +56 -0
  47. package/src/lib/range-slider/components/range-slider/range-slider.component.html +46 -0
  48. package/src/lib/range-slider/components/range-slider/range-slider.component.scss +12 -0
  49. package/src/lib/range-slider/components/range-slider/range-slider.component.spec.ts +216 -0
  50. package/src/lib/range-slider/components/range-slider/range-slider.component.ts +301 -0
  51. package/src/lib/range-slider/public-api.ts +3 -0
  52. package/src/lib/range-slider/range-slider.module.ts +11 -0
  53. package/src/lib/range-slider/types/range-slider.types.ts +4 -0
  54. package/src/lib/search-filter/README.md +86 -0
  55. package/src/lib/search-filter/components/search-filter/search-filter.component.html +66 -0
  56. package/src/lib/search-filter/components/search-filter/search-filter.component.scss +23 -0
  57. package/src/lib/search-filter/components/search-filter/search-filter.component.spec.ts +264 -0
  58. package/src/lib/search-filter/components/search-filter/search-filter.component.ts +140 -0
  59. package/src/lib/search-filter/public-api.ts +3 -0
  60. package/src/lib/search-filter/search-filter.module.ts +13 -0
  61. package/src/lib/search-filter/types/search-filter.types.ts +4 -0
  62. package/src/lib/shared/services/search.service.spec.ts +78 -0
  63. package/src/lib/shared/services/search.service.ts +32 -0
  64. package/src/lib/shared/types/search.types.ts +6 -0
  65. package/src/lib/timepicker/README.md +84 -0
  66. package/src/lib/timepicker/classes/timepicker.validators.spec.ts +54 -0
  67. package/src/lib/timepicker/classes/timepicker.validators.ts +61 -0
  68. package/src/lib/timepicker/components/timepicker/timepicker.component.html +37 -0
  69. package/src/lib/timepicker/components/timepicker/timepicker.component.scss +3 -0
  70. package/src/lib/timepicker/components/timepicker/timepicker.component.spec.ts +161 -0
  71. package/src/lib/timepicker/components/timepicker/timepicker.component.ts +128 -0
  72. package/src/lib/timepicker/public-api.ts +4 -0
  73. package/src/lib/timepicker/timepicker.module.ts +13 -0
  74. package/src/lib/timepicker/types/timepicker.types.ts +5 -0
  75. package/src/lib/upload/README.md +283 -0
  76. package/src/lib/upload/classes/uploader.class.spec.ts +100 -0
  77. package/src/lib/upload/classes/uploader.class.ts +144 -0
  78. package/src/lib/upload/components/upload/upload.component.html +28 -0
  79. package/src/lib/upload/components/upload/upload.component.scss +3 -0
  80. package/src/lib/upload/components/upload/upload.component.spec.ts +117 -0
  81. package/src/lib/upload/components/upload/upload.component.ts +50 -0
  82. package/src/lib/upload/components/upload-input/upload-input.component.html +11 -0
  83. package/src/lib/upload/components/upload-input/upload-input.component.spec.ts +55 -0
  84. package/src/lib/upload/components/upload-input/upload-input.component.ts +35 -0
  85. package/src/lib/upload/components/upload-queue/upload-queue.component.html +16 -0
  86. package/src/lib/upload/components/upload-queue/upload-queue.component.spec.ts +99 -0
  87. package/src/lib/upload/components/upload-queue/upload-queue.component.ts +36 -0
  88. package/src/lib/upload/components/upload-zone/upload-zone.component.html +55 -0
  89. package/src/lib/upload/components/upload-zone/upload-zone.component.scss +3 -0
  90. package/src/lib/upload/components/upload-zone/upload-zone.component.spec.ts +144 -0
  91. package/src/lib/upload/components/upload-zone/upload-zone.component.ts +142 -0
  92. package/src/lib/upload/components/validation-list/validation-list.component.html +15 -0
  93. package/src/lib/upload/components/validation-list/validation-list.component.spec.ts +57 -0
  94. package/src/lib/upload/components/validation-list/validation-list.component.ts +29 -0
  95. package/src/lib/upload/public-api.ts +10 -0
  96. package/src/lib/upload/services/validation-messages.service.spec.ts +66 -0
  97. package/src/lib/upload/services/validation-messages.service.ts +27 -0
  98. package/src/lib/upload/types/upload.types.ts +20 -0
  99. package/src/lib/upload/upload.conf.ts +15 -0
  100. package/src/lib/upload/upload.module.ts +34 -0
  101. package/src/public-api.ts +6 -0
  102. package/src/test.ts +9 -0
  103. package/tsconfig.lib.json +26 -0
  104. package/tsconfig.spec.json +17 -0
  105. package/esm2020/lib/auto-complete/auto-complete.module.mjs +0 -24
  106. package/esm2020/lib/auto-complete/components/auto-complete/auto-complete.component.mjs +0 -347
  107. package/esm2020/lib/datepicker/components/datepicker/datepicker.component.mjs +0 -308
  108. package/esm2020/lib/datepicker/datepicker.module.mjs +0 -55
  109. package/esm2020/lib/range-slider/components/range-slider/range-slider.component.mjs +0 -349
  110. package/esm2020/lib/range-slider/range-slider.module.mjs +0 -20
  111. package/esm2020/lib/search-filter/components/search-filter/search-filter.component.mjs +0 -266
  112. package/esm2020/lib/search-filter/search-filter.module.mjs +0 -22
  113. package/esm2020/lib/timepicker/components/timepicker/timepicker.component.mjs +0 -243
  114. package/esm2020/lib/timepicker/timepicker.module.mjs +0 -22
  115. package/esm2020/lib/upload/components/upload/upload.component.mjs +0 -97
  116. package/esm2020/lib/upload/components/upload-input/upload-input.component.mjs +0 -56
  117. package/esm2020/lib/upload/components/upload-queue/upload-queue.component.mjs +0 -78
  118. package/esm2020/lib/upload/components/upload-zone/upload-zone.component.mjs +0 -252
  119. package/esm2020/lib/upload/components/validation-list/validation-list.component.mjs +0 -64
  120. package/esm2020/lib/upload/services/validation-messages.service.mjs +0 -29
  121. package/esm2020/lib/upload/upload.module.mjs +0 -45
  122. package/fesm2015/acpaas-ui-ngx-forms.mjs.map +0 -1
  123. package/fesm2020/acpaas-ui-ngx-forms.mjs +0 -2394
  124. package/fesm2020/acpaas-ui-ngx-forms.mjs.map +0 -1
  125. /package/{esm2020 → dist/esm2020}/acpaas-ui-ngx-forms.mjs +0 -0
  126. /package/{esm2020 → dist/esm2020}/lib/auto-complete/public-api.mjs +0 -0
  127. /package/{esm2020 → dist/esm2020}/lib/datepicker/datepicker.conf.mjs +0 -0
  128. /package/{esm2020 → dist/esm2020}/lib/datepicker/public-api.mjs +0 -0
  129. /package/{esm2020 → dist/esm2020}/lib/datepicker/types/datepicker.types.mjs +0 -0
  130. /package/{esm2020 → dist/esm2020}/lib/range-slider/public-api.mjs +0 -0
  131. /package/{esm2020 → dist/esm2020}/lib/range-slider/types/range-slider.types.mjs +0 -0
  132. /package/{esm2020 → dist/esm2020}/lib/search-filter/public-api.mjs +0 -0
  133. /package/{esm2020 → dist/esm2020}/lib/search-filter/types/search-filter.types.mjs +0 -0
  134. /package/{esm2020 → dist/esm2020}/lib/shared/types/search.types.mjs +0 -0
  135. /package/{esm2020 → dist/esm2020}/lib/timepicker/classes/timepicker.validators.mjs +0 -0
  136. /package/{esm2020 → dist/esm2020}/lib/timepicker/public-api.mjs +0 -0
  137. /package/{esm2020 → dist/esm2020}/lib/timepicker/types/timepicker.types.mjs +0 -0
  138. /package/{esm2020 → dist/esm2020}/lib/upload/classes/uploader.class.mjs +0 -0
  139. /package/{esm2020 → dist/esm2020}/lib/upload/public-api.mjs +0 -0
  140. /package/{esm2020 → dist/esm2020}/lib/upload/types/upload.types.mjs +0 -0
  141. /package/{esm2020 → dist/esm2020}/lib/upload/upload.conf.mjs +0 -0
  142. /package/{esm2020 → dist/esm2020}/public-api.mjs +0 -0
  143. /package/{index.d.ts → dist/index.d.ts} +0 -0
  144. /package/{lib → dist/lib}/auto-complete/auto-complete.module.d.ts +0 -0
  145. /package/{lib → dist/lib}/auto-complete/components/auto-complete/auto-complete.component.d.ts +0 -0
  146. /package/{lib → dist/lib}/auto-complete/public-api.d.ts +0 -0
  147. /package/{lib → dist/lib}/datepicker/components/datepicker/datepicker.component.d.ts +0 -0
  148. /package/{lib → dist/lib}/datepicker/datepicker.conf.d.ts +0 -0
  149. /package/{lib → dist/lib}/datepicker/datepicker.module.d.ts +0 -0
  150. /package/{lib → dist/lib}/datepicker/public-api.d.ts +0 -0
  151. /package/{lib → dist/lib}/datepicker/types/datepicker.types.d.ts +0 -0
  152. /package/{lib → dist/lib}/range-slider/components/range-slider/range-slider.component.d.ts +0 -0
  153. /package/{lib → dist/lib}/range-slider/public-api.d.ts +0 -0
  154. /package/{lib → dist/lib}/range-slider/range-slider.module.d.ts +0 -0
  155. /package/{lib → dist/lib}/range-slider/types/range-slider.types.d.ts +0 -0
  156. /package/{lib → dist/lib}/search-filter/components/search-filter/search-filter.component.d.ts +0 -0
  157. /package/{lib → dist/lib}/search-filter/public-api.d.ts +0 -0
  158. /package/{lib → dist/lib}/search-filter/search-filter.module.d.ts +0 -0
  159. /package/{lib → dist/lib}/search-filter/types/search-filter.types.d.ts +0 -0
  160. /package/{lib → dist/lib}/shared/services/search.service.d.ts +0 -0
  161. /package/{lib → dist/lib}/shared/types/search.types.d.ts +0 -0
  162. /package/{lib → dist/lib}/timepicker/classes/timepicker.validators.d.ts +0 -0
  163. /package/{lib → dist/lib}/timepicker/components/timepicker/timepicker.component.d.ts +0 -0
  164. /package/{lib → dist/lib}/timepicker/public-api.d.ts +0 -0
  165. /package/{lib → dist/lib}/timepicker/timepicker.module.d.ts +0 -0
  166. /package/{lib → dist/lib}/timepicker/types/timepicker.types.d.ts +0 -0
  167. /package/{lib → dist/lib}/upload/classes/uploader.class.d.ts +0 -0
  168. /package/{lib → dist/lib}/upload/components/upload/upload.component.d.ts +0 -0
  169. /package/{lib → dist/lib}/upload/components/upload-input/upload-input.component.d.ts +0 -0
  170. /package/{lib → dist/lib}/upload/components/upload-queue/upload-queue.component.d.ts +0 -0
  171. /package/{lib → dist/lib}/upload/components/upload-zone/upload-zone.component.d.ts +0 -0
  172. /package/{lib → dist/lib}/upload/components/validation-list/validation-list.component.d.ts +0 -0
  173. /package/{lib → dist/lib}/upload/public-api.d.ts +0 -0
  174. /package/{lib → dist/lib}/upload/services/validation-messages.service.d.ts +0 -0
  175. /package/{lib → dist/lib}/upload/types/upload.types.d.ts +0 -0
  176. /package/{lib → dist/lib}/upload/upload.conf.d.ts +0 -0
  177. /package/{lib → dist/lib}/upload/upload.module.d.ts +0 -0
  178. /package/{public-api.d.ts → dist/public-api.d.ts} +0 -0
package/.eslintrc.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "extends": "../../.eslintrc.json",
3
+ "ignorePatterns": [
4
+ "!**/*"
5
+ ],
6
+ "overrides": [
7
+ {
8
+ "files": [
9
+ "*.ts"
10
+ ],
11
+ "parserOptions": {
12
+ "project": [
13
+ "packages/ngx-forms/tsconfig.(lib|spec).json"
14
+ ]
15
+ },
16
+ "rules": {
17
+ "@angular-eslint/directive-selector": [
18
+ "error",
19
+ {
20
+ "type": "attribute",
21
+ "prefix": "aui",
22
+ "style": "camelCase"
23
+ }
24
+ ],
25
+ "@angular-eslint/component-selector": [
26
+ "error",
27
+ {
28
+ "type": "element",
29
+ "prefix": "aui",
30
+ "style": "kebab-case"
31
+ }
32
+ ]
33
+ }
34
+ },
35
+ {
36
+ "files": [
37
+ "*.html"
38
+ ],
39
+ "rules": {}
40
+ }
41
+ ]
42
+ }
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016-present Digipolis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # @acpaas-ui/ngx-forms
2
+
3
+ The forms module is a collection of several forms-related modules, like an autocomplete, a datepicker, a range slider, a timepicker, etc.
4
+ You can find an overview in the [Modules](#modules) section below.
5
+
6
+ ## Documentation
7
+
8
+ Visit our [documentation site](https://antwerp-ui.digipolis.be/) for full how-to docs and guidelines
9
+
10
+ ## <a name="modules"></a>Modules
11
+
12
+ | Name | Description | Documentation |
13
+ | -------------------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
14
+ | `AutoCompleteModule` | This module creates an input field with autocomplete functionality. | [Documentation](src/lib/auto-complete/README.md) |
15
+ | `DatepickerModule` | This package allows the user to select a date either by input or by picking one in the calendar flyout. | [Documentation](src/lib/datepicker/README.md) |
16
+ | `RangeSliderModule` | This module provides a range slider. | [Documentation](src/lib/range-slider/README.md) |
17
+ | `SearchFilterModule` | This package allows the user to use a JIRA-like filter component with remote search capabilities. | [Documentation](src/lib/search-filter/README.md) |
18
+ | `TimepickerModule` | This package allows the user set the time either by choosing a slot in the dropdown or by typing in the autocomplete field. | [Documentation](src/lib/timepicker/README.md) |
19
+ | `UploadModule` | This module provides a couple of upload components and a specific `Uploader` class. | [Documentation](src/lib/upload/README.md) |
20
+
21
+ ## Contributing
22
+
23
+ Visit our [Contribution Guidelines](../../CONTRIBUTING.md) for more information on how to contribute.
@@ -0,0 +1,23 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { FlyoutModule } from '@acpaas-ui/ngx-flyout';
5
+ import { SelectableListModule } from '@acpaas-ui/ngx-selectable-list';
6
+ import { SearchService } from '../shared/services/search.service';
7
+ import { AutoCompleteComponent } from './components/auto-complete/auto-complete.component';
8
+ import * as i0 from "@angular/core";
9
+ export class AutoCompleteModule {
10
+ }
11
+ /** @nocollapse */ AutoCompleteModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ /** @nocollapse */ AutoCompleteModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, declarations: [AutoCompleteComponent], imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule], exports: [AutoCompleteComponent] });
13
+ /** @nocollapse */ AutoCompleteModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, providers: [SearchService], imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule] });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteModule, decorators: [{
15
+ type: NgModule,
16
+ args: [{
17
+ imports: [CommonModule, FormsModule, FlyoutModule, SelectableListModule],
18
+ declarations: [AutoCompleteComponent],
19
+ exports: [AutoCompleteComponent],
20
+ providers: [SearchService],
21
+ }]
22
+ }] });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBUTNGLE1BQU0sT0FBTyxrQkFBa0I7O2tJQUFsQixrQkFBa0I7bUlBQWxCLGtCQUFrQixpQkFKZCxxQkFBcUIsYUFEMUIsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLGFBRTdELHFCQUFxQjttSUFHcEIsa0JBQWtCLGFBRmxCLENBQUMsYUFBYSxDQUFDLFlBSGhCLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG9CQUFvQjsyRkFLNUQsa0JBQWtCO2tCQU45QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixDQUFDO29CQUN4RSxZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDckMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ2hDLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmx5b3V0TW9kdWxlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtZmx5b3V0JztcbmltcG9ydCB7IFNlbGVjdGFibGVMaXN0TW9kdWxlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtc2VsZWN0YWJsZS1saXN0JztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0b0NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRmx5b3V0TW9kdWxlLCBTZWxlY3RhYmxlTGlzdE1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0F1dG9Db21wbGV0ZUNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBdXRvQ29tcGxldGVDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtTZWFyY2hTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b0NvbXBsZXRlTW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,265 @@
1
+ import { Component, ContentChild, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { get, isEqual } from 'lodash-es';
4
+ import { FlyoutDirective, FlyoutZoneDirective } from '@acpaas-ui/ngx-flyout';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../shared/services/search.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/forms";
9
+ import * as i4 from "@acpaas-ui/ngx-flyout";
10
+ import * as i5 from "@acpaas-ui/ngx-selectable-list";
11
+ export class AutoCompleteComponent {
12
+ constructor(ref, searchService) {
13
+ this.ref = ref;
14
+ this.searchService = searchService;
15
+ this.results = []; // The values for the selectable list
16
+ this.data = []; // The values to search in when remote search is disabled
17
+ this.remote = false; // Disable or enamble remote search
18
+ this.minCharacters = 0;
19
+ this.clearInvalid = false;
20
+ this.showAllByDefault = false;
21
+ this.autoComplete = 'off';
22
+ // Eventemitter for searchvalue (parent object should update the results with this param)
23
+ this.search = new EventEmitter();
24
+ // eslint-disable-next-line @angular-eslint/no-output-native
25
+ this.select = new EventEmitter();
26
+ this.query = '';
27
+ this.index = -1; // index for active element in selectable list, by default -1 (so it starts in the input field)
28
+ this.selectedItem = null; // keep a backup of the selectedItem
29
+ this.searching = false; // track remote search state
30
+ this.focused = false;
31
+ this.isDisabled = false;
32
+ this.remoteValue = false;
33
+ this.updateModel = (_) => { };
34
+ }
35
+ // CONTROL_VALUE_ACCESSOR interface
36
+ writeValue(value = '') {
37
+ if (this.value) {
38
+ const selected = this.data.find((item) => item[this.value] === value);
39
+ if (selected) {
40
+ return (this.query = selected[this.label]);
41
+ }
42
+ if (this.remote && !!value) {
43
+ this.remoteValue = true;
44
+ }
45
+ }
46
+ this.query = value;
47
+ }
48
+ // CONTROL_VALUE_ACCESSOR interface
49
+ registerOnChange(fn) {
50
+ this.updateModel = fn;
51
+ }
52
+ // CONTROL_VALUE_ACCESSOR interface
53
+ registerOnTouched() { }
54
+ setDisabledState(isDisabled) {
55
+ this.isDisabled = isDisabled;
56
+ }
57
+ ngOnInit() {
58
+ if (Array.isArray(this.data) && this.data.length > 0 && !this.query && this.showAllByDefault) {
59
+ this.results = [...this.data];
60
+ }
61
+ }
62
+ // OnChanges interface
63
+ ngOnChanges(changes) {
64
+ if (!changes) {
65
+ return;
66
+ }
67
+ const newData = get(changes, 'data.currentValue', []);
68
+ if (!isEqual(newData, get(changes, 'data.previousValue', []))) {
69
+ if (this.remote) {
70
+ this.remoteSearch();
71
+ }
72
+ else {
73
+ this.localSearch();
74
+ }
75
+ }
76
+ if (changes.results && changes.results.currentValue) {
77
+ this.searching = false;
78
+ }
79
+ }
80
+ propagateChange(item) {
81
+ this.query = item !== null ? (this.label ? item[this.label] : item) : '';
82
+ this.select.emit(item);
83
+ if (!item) {
84
+ return;
85
+ }
86
+ const key = this.value ? this.value : this.label ? this.label : null;
87
+ this.updateModel(key ? item[key] || '' : item);
88
+ this.selectedItem = item;
89
+ }
90
+ /**
91
+ * triggers on input value change
92
+ */
93
+ doSearch() {
94
+ this.index = -1; // reset index
95
+ this.searching = true;
96
+ if (this.remote) {
97
+ this.search.emit(this.query); // ask for new remote data
98
+ }
99
+ else {
100
+ this.localSearch();
101
+ }
102
+ this.openFlyout(); // open the flyout when there is a change
103
+ }
104
+ /**
105
+ * triggers on selectable-list:select -> onClick event in selectable-list
106
+ */
107
+ onSelect(item) {
108
+ this.propagateChange(item);
109
+ this.closeFlyout(); // Close the flyout manually
110
+ }
111
+ onFlyoutClosed() {
112
+ // there is only 1 result, select it
113
+ if (this.index >= 0 && this.results.length === 1) {
114
+ return this.onSelect(this.results[0]);
115
+ }
116
+ // there is no query nor selected item, clear the selected item
117
+ if (!this.query && this.index < 0) {
118
+ return this.onSelect(null);
119
+ }
120
+ // reset the query for an invalid query if clearInvalid is true
121
+ if (this.clearInvalid && this.query && !this.results.length && this.index < 0) {
122
+ this.query = this.selectedItem ? (this.label ? this.selectedItem[this.label] : this.selectedItem) : '';
123
+ }
124
+ }
125
+ onKeyArrowDown() {
126
+ if (this.index < this.results.length - 1) {
127
+ this.scrollList(1);
128
+ }
129
+ this.openFlyout();
130
+ }
131
+ onKeyArrowUp() {
132
+ if (this.index >= 0) {
133
+ this.scrollList(-1);
134
+ }
135
+ }
136
+ onKeyEnter(event) {
137
+ event.preventDefault(); // Do not submit form when selecting an item.
138
+ const query = this.index >= 0 ? this.results[this.index] : this.query;
139
+ this.propagateChange(query);
140
+ this.closeFlyout();
141
+ }
142
+ onKeyEscape() {
143
+ this.closeFlyout();
144
+ }
145
+ onFocus() {
146
+ this.focused = true;
147
+ this.openFlyout();
148
+ }
149
+ openFlyout() {
150
+ if (this.flyout) {
151
+ this.flyout.open();
152
+ }
153
+ }
154
+ closeFlyout() {
155
+ if (this.flyout) {
156
+ this.flyout.close();
157
+ }
158
+ this.focused = false;
159
+ }
160
+ localSearch() {
161
+ this.results = this.searchService.search(this.data, {
162
+ minLength: this.minCharacters,
163
+ key: this.label,
164
+ query: this.query,
165
+ showAllByDefault: this.showAllByDefault,
166
+ });
167
+ if (this.results.length === 1 && this.query === this.results[0][this.label]) {
168
+ this.index = 0;
169
+ }
170
+ this.searching = false;
171
+ }
172
+ remoteSearch() {
173
+ if (!this.remoteValue || !this.data) {
174
+ return;
175
+ }
176
+ const selected = this.data.find((item) => {
177
+ if (this.value) {
178
+ return item[this.value] === this.query;
179
+ }
180
+ return item === this.query;
181
+ });
182
+ if (selected) {
183
+ this.query = this.label ? selected[this.label] : selected;
184
+ }
185
+ else {
186
+ this.query = '';
187
+ }
188
+ this.remoteValue = false;
189
+ }
190
+ scrollList(factor) {
191
+ this.index += factor;
192
+ if (!this.flyoutZone) {
193
+ return;
194
+ }
195
+ const liItems = this.flyoutZone.element.getElementsByTagName('li');
196
+ const liHeight = liItems[1] ? liItems[1].offsetHeight : liItems[0].offsetHeight;
197
+ const zoneHeight = this.flyoutZone.element.offsetHeight;
198
+ const offset = zoneHeight / liHeight / 2;
199
+ this.flyoutZone.element.scrollTop = this.index * liHeight - offset * liHeight;
200
+ }
201
+ }
202
+ /** @nocollapse */ AutoCompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: i0.ElementRef }, { token: i1.SearchService }], target: i0.ɵɵFactoryTarget.Component });
203
+ /** @nocollapse */ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: AutoCompleteComponent, selector: "aui-auto-complete", inputs: { id: "id", placeholder: "placeholder", description: "description", inputLabel: "inputLabel", results: "results", data: "data", remote: "remote", minCharacters: "minCharacters", clearInvalid: "clearInvalid", searchIncentiveText: "searchIncentiveText", loadingText: "loadingText", noResultsText: "noResultsText", showAllByDefault: "showAllByDefault", autoComplete: "autoComplete", label: "label", value: "value" }, outputs: { search: "search", select: "select" }, providers: [
204
+ {
205
+ provide: NG_VALUE_ACCESSOR,
206
+ useExisting: forwardRef((() => AutoCompleteComponent)),
207
+ multi: true,
208
+ },
209
+ ], queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true, static: true }], viewQueries: [{ propertyName: "flyout", first: true, predicate: FlyoutDirective, descendants: true, static: true }, { propertyName: "flyoutZone", first: true, predicate: FlyoutZoneDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div\n (closed)=\"onFlyoutClosed()\"\n [toggleClick]=\"false\"\n aria-haspopup=\"listbox\"\n auiFlyout\n class=\"m-flyout m-flyout--scrollable m-flyout--full o-auto-complete\"\n>\n <input\n (focus)=\"onFocus()\"\n (keyArrowDown)=\"onKeyArrowDown()\"\n (keyArrowUp)=\"onKeyArrowUp()\"\n (keyEnter)=\"onKeyEnter($event)\"\n (keyEscape)=\"onKeyEscape()\"\n [(ngModel)]=\"query\"\n (ngModelChange)=\"doSearch()\"\n [disabled]=\"isDisabled ? true : null\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n aria-autocomplete=\"list\"\n auiFlyoutAction\n auiSelectableActions\n [autocomplete]=\"autoComplete\"\n type=\"text\"\n class=\"a-input\"\n />\n <div *ngIf=\"!isDisabled\" auiFlyoutZone>\n <span *ngIf=\"focused && loadingText && searching\" class=\"a-spinner a-spinner--s u-margin-xs\" role=\"alert\">\n <span class=\"a-spinner__circle\"></span>\n <span class=\"a-spinner__text\">{{ loadingText }}</span>\n </span>\n <span\n *ngIf=\"focused && searchIncentiveText && !searching && !query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ searchIncentiveText }}</span\n >\n <span\n *ngIf=\"focused && noResultsText && !searching && query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ noResultsText }}</span\n >\n <aui-selectable-list\n (selected)=\"onSelect($event)\"\n *ngIf=\"results.length > 0 && !(focused && loadingText && searching)\"\n [index]=\"index\"\n [itemTemplate]=\"template\"\n [items]=\"results\"\n [label]=\"label\"\n [search]=\"query\"\n ></aui-selectable-list>\n </div>\n</div>\n", styles: [".o-auto-complete,.o-auto-complete__info{display:block}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.FlyoutActionDirective, selector: "[auiFlyoutAction]", inputs: ["openOnFocus", "disabled"], exportAs: ["auiFlyoutAction"] }, { kind: "directive", type: i4.FlyoutZoneDirective, selector: "[auiFlyoutZone]", inputs: ["auiFlyoutZone"], exportAs: ["auiFlyoutZone"] }, { kind: "directive", type: i4.FlyoutDirective, selector: "[auiFlyout]", inputs: ["size", "align", "toggleClick", "activateOnFocus"], outputs: ["opened", "closed"], exportAs: ["auiFlyout"] }, { kind: "component", type: i5.SelectableListComponent, selector: "aui-selectable-list", inputs: ["items", "index", "search", "label", "itemTemplate"], outputs: ["selected"] }, { kind: "directive", type: i5.SelectableActionsDirective, selector: "[auiSelectableActions]", outputs: ["keyArrowUp", "keyArrowDown", "keyEnter", "keyEscape"], exportAs: ["auiSelectableActions"] }] });
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: AutoCompleteComponent, decorators: [{
211
+ type: Component,
212
+ args: [{ selector: 'aui-auto-complete', providers: [
213
+ {
214
+ provide: NG_VALUE_ACCESSOR,
215
+ useExisting: forwardRef((() => AutoCompleteComponent)),
216
+ multi: true,
217
+ },
218
+ ], template: "<div\n (closed)=\"onFlyoutClosed()\"\n [toggleClick]=\"false\"\n aria-haspopup=\"listbox\"\n auiFlyout\n class=\"m-flyout m-flyout--scrollable m-flyout--full o-auto-complete\"\n>\n <input\n (focus)=\"onFocus()\"\n (keyArrowDown)=\"onKeyArrowDown()\"\n (keyArrowUp)=\"onKeyArrowUp()\"\n (keyEnter)=\"onKeyEnter($event)\"\n (keyEscape)=\"onKeyEscape()\"\n [(ngModel)]=\"query\"\n (ngModelChange)=\"doSearch()\"\n [disabled]=\"isDisabled ? true : null\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n aria-autocomplete=\"list\"\n auiFlyoutAction\n auiSelectableActions\n [autocomplete]=\"autoComplete\"\n type=\"text\"\n class=\"a-input\"\n />\n <div *ngIf=\"!isDisabled\" auiFlyoutZone>\n <span *ngIf=\"focused && loadingText && searching\" class=\"a-spinner a-spinner--s u-margin-xs\" role=\"alert\">\n <span class=\"a-spinner__circle\"></span>\n <span class=\"a-spinner__text\">{{ loadingText }}</span>\n </span>\n <span\n *ngIf=\"focused && searchIncentiveText && !searching && !query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ searchIncentiveText }}</span\n >\n <span\n *ngIf=\"focused && noResultsText && !searching && query && !results.length\"\n class=\"o-auto-complete__info u-text-light u-margin-xs\"\n >{{ noResultsText }}</span\n >\n <aui-selectable-list\n (selected)=\"onSelect($event)\"\n *ngIf=\"results.length > 0 && !(focused && loadingText && searching)\"\n [index]=\"index\"\n [itemTemplate]=\"template\"\n [items]=\"results\"\n [label]=\"label\"\n [search]=\"query\"\n ></aui-selectable-list>\n </div>\n</div>\n", styles: [".o-auto-complete,.o-auto-complete__info{display:block}\n"] }]
219
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SearchService }]; }, propDecorators: { id: [{
220
+ type: Input
221
+ }], placeholder: [{
222
+ type: Input
223
+ }], description: [{
224
+ type: Input
225
+ }], inputLabel: [{
226
+ type: Input
227
+ }], results: [{
228
+ type: Input
229
+ }], data: [{
230
+ type: Input
231
+ }], remote: [{
232
+ type: Input
233
+ }], minCharacters: [{
234
+ type: Input
235
+ }], clearInvalid: [{
236
+ type: Input
237
+ }], searchIncentiveText: [{
238
+ type: Input
239
+ }], loadingText: [{
240
+ type: Input
241
+ }], noResultsText: [{
242
+ type: Input
243
+ }], showAllByDefault: [{
244
+ type: Input
245
+ }], autoComplete: [{
246
+ type: Input
247
+ }], label: [{
248
+ type: Input
249
+ }], value: [{
250
+ type: Input
251
+ }], search: [{
252
+ type: Output
253
+ }], select: [{
254
+ type: Output
255
+ }], flyout: [{
256
+ type: ViewChild,
257
+ args: [FlyoutDirective, { static: true }]
258
+ }], flyoutZone: [{
259
+ type: ViewChild,
260
+ args: [FlyoutZoneDirective, { static: true }]
261
+ }], template: [{
262
+ type: ContentChild,
263
+ args: [TemplateRef, { static: true }]
264
+ }] } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F1dG8tY29tcGxldGUvY29tcG9uZW50cy9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hdXRvLWNvbXBsZXRlL2NvbXBvbmVudHMvYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFlN0UsTUFBTSxPQUFPLHFCQUFxQjtJQXVDaEMsWUFBb0IsR0FBZSxFQUFVLGFBQTRCO1FBQXJELFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWxDaEUsWUFBTyxHQUFVLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztRQUMxRCxTQUFJLEdBQVUsRUFBRSxDQUFDLENBQUMseURBQXlEO1FBQzNFLFdBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxtQ0FBbUM7UUFDbkQsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFJckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBTTlCLHlGQUF5RjtR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Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUdJLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRXVDLE1BQU07c0JBQW5ELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDTSxVQUFVO3NCQUEzRCxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFSSxRQUFRO3NCQUEzRCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBnZXQsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgRmx5b3V0RGlyZWN0aXZlLCBGbHlvdXRab25lRGlyZWN0aXZlIH0gZnJvbSAnQGFjcGFhcy11aS9uZ3gtZmx5b3V0JztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdWktYXV0by1jb21wbGV0ZScsXG4gIHN0eWxlVXJsczogWycuL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG8tY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEF1dG9Db21wbGV0ZUNvbXBvbmVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlucHV0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcmVzdWx0czogYW55W10gPSBbXTsgLy8gVGhlIHZhbHVlcyBmb3IgdGhlIHNlbGVjdGFibGUgbGlzdFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdOyAvLyBUaGUgdmFsdWVzIHRvIHNlYXJjaCBpbiB3aGVuIHJlbW90ZSBzZWFyY2ggaXMgZGlzYWJsZWRcbiAgQElucHV0KCkgcmVtb3RlID0gZmFsc2U7IC8vIERpc2FibGUgb3IgZW5hbWJsZSByZW1vdGUgc2VhcmNoXG4gIEBJbnB1dCgpIG1pbkNoYXJhY3RlcnMgPSAwO1xuICBASW5wdXQoKSBjbGVhckludmFsaWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VhcmNoSW5jZW50aXZlVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkaW5nVGV4dDogc3RyaW5nO1xuICBASW5wdXQoKSBub1Jlc3VsdHNUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dBbGxCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b0NvbXBsZXRlID0gJ29mZic7XG5cbiAgLy8gc3BlY2lmeSB3aGljaCBsYWJlbC92YWx1ZSBwcm9wcyB0byB1c2VcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcblxuICAvLyBFdmVudGVtaXR0ZXIgZm9yIHNlYXJjaHZhbHVlIChwYXJlbnQgb2JqZWN0IHNob3VsZCB1cGRhdGUgdGhlIHJlc3VsdHMgd2l0aCB0aGlzIHBhcmFtKVxuICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoRmx5b3V0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXQ6IEZseW91dERpcmVjdGl2ZTtcbiAgQFZpZXdDaGlsZChGbHlvdXRab25lRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBmbHlvdXRab25lOiBGbHlvdXRab25lRGlyZWN0aXZlO1xuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwdWJsaWMgcXVlcnkgPSAnJztcbiAgcHVibGljIGluZGV4ID0gLTE7IC8vIGluZGV4IGZvciBhY3RpdmUgZWxlbWVudCBpbiBzZWxlY3RhYmxlIGxpc3QsIGJ5IGRlZmF1bHQgLTEgKHNvIGl0IHN0YXJ0cyBpbiB0aGUgaW5wdXQgZmllbGQpXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW06IGFueSA9IG51bGw7IC8vIGtlZXAgYSBiYWNrdXAgb2YgdGhlIHNlbGVjdGVkSXRlbVxuICBwdWJsaWMgc2VhcmNoaW5nID0gZmFsc2U7IC8vIHRyYWNrIHJlbW90ZSBzZWFyY2ggc3RhdGVcbiAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgcHVibGljIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlbW90ZVZhbHVlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSkge31cblxuICBwdWJsaWMgdXBkYXRlTW9kZWwgPSAoXzogYW55KSA9PiB7fTtcblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSA9ICcnKSB7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kYXRhLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbVt0aGlzLnZhbHVlXSA9PT0gdmFsdWUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnF1ZXJ5ID0gc2VsZWN0ZWRbdGhpcy5sYWJlbF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZW1vdGUgJiYgISF2YWx1ZSkge1xuICAgICAgICB0aGlzLnJlbW90ZVZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnF1ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICAvLyBDT05UUk9MX1ZBTFVFX0FDQ0VTU09SIGludGVyZmFjZVxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgIHRoaXMudXBkYXRlTW9kZWwgPSBmbjtcbiAgfVxuXG4gIC8vIENPTlRST0xfVkFMVUVfQUNDRVNTT1IgaW50ZXJmYWNlXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCgpIHt9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhKSAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCAmJiAhdGhpcy5xdWVyeSAmJiB0aGlzLnNob3dBbGxCeURlZmF1bHQpIHtcbiAgICAgIHRoaXMucmVzdWx0cyA9IFsuLi50aGlzLmRhdGFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uQ2hhbmdlcyBpbnRlcmZhY2VcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdEYXRhID0gZ2V0KGNoYW5nZXMsICdkYXRhLmN1cnJlbnRWYWx1ZScsIFtdKTtcbiAgICBpZiAoIWlzRXF1YWwobmV3RGF0YSwgZ2V0KGNoYW5nZXMsICdkYXRhLnByZXZpb3VzVmFsdWUnLCBbXSkpKSB7XG4gICAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVTZWFyY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5yZXN1bHRzICYmIGNoYW5nZXMucmVzdWx0cy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3BhZ2F0ZUNoYW5nZShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gaXRlbSAhPT0gbnVsbCA/ICh0aGlzLmxhYmVsID8gaXRlbVt0aGlzLmxhYmVsXSA6IGl0ZW0pIDogJyc7XG4gICAgdGhpcy5zZWxlY3QuZW1pdChpdGVtKTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiBudWxsO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoa2V5ID8gaXRlbVtrZXldIHx8ICcnIDogaXRlbSk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIG9uIGlucHV0IHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIGRvU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXggPSAtMTsgLy8gcmVzZXQgaW5kZXhcbiAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5yZW1vdGUpIHtcbiAgICAgIHRoaXMuc2VhcmNoLmVtaXQodGhpcy5xdWVyeSk7IC8vIGFzayBmb3IgbmV3IHJlbW90ZSBkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9jYWxTZWFyY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5GbHlvdXQoKTsgLy8gb3BlbiB0aGUgZmx5b3V0IHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyBvbiBzZWxlY3RhYmxlLWxpc3Q6c2VsZWN0IC0+IG9uQ2xpY2sgZXZlbnQgaW4gc2VsZWN0YWJsZS1saXN0XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3QoaXRlbTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbSk7XG4gICAgdGhpcy5jbG9zZUZseW91dCgpOyAvLyBDbG9zZSB0aGUgZmx5b3V0IG1hbnVhbGx5XG4gIH1cblxuICBwdWJsaWMgb25GbHlvdXRDbG9zZWQoKTogdm9pZCB7XG4gICAgLy8gdGhlcmUgaXMgb25seSAxIHJlc3VsdCwgc2VsZWN0IGl0XG4gICAgaWYgKHRoaXMuaW5kZXggPj0gMCAmJiB0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5vblNlbGVjdCh0aGlzLnJlc3VsdHNbMF0pO1xuICAgIH1cblxuICAgIC8vIHRoZXJlIGlzIG5vIHF1ZXJ5IG5vciBzZWxlY3RlZCBpdGVtLCBjbGVhciB0aGUgc2VsZWN0ZWQgaXRlbVxuICAgIGlmICghdGhpcy5xdWVyeSAmJiB0aGlzLmluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIHRoaXMub25TZWxlY3QobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgdGhlIHF1ZXJ5IGZvciBhbiBpbnZhbGlkIHF1ZXJ5IGlmIGNsZWFySW52YWxpZCBpcyB0cnVlXG4gICAgaWYgKHRoaXMuY2xlYXJJbnZhbGlkICYmIHRoaXMucXVlcnkgJiYgIXRoaXMucmVzdWx0cy5sZW5ndGggJiYgdGhpcy5pbmRleCA8IDApIHtcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlbGVjdGVkSXRlbSA/ICh0aGlzLmxhYmVsID8gdGhpcy5zZWxlY3RlZEl0ZW1bdGhpcy5sYWJlbF0gOiB0aGlzLnNlbGVjdGVkSXRlbSkgOiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25LZXlBcnJvd0Rvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0KDEpO1xuICAgIH1cblxuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9uS2V5QXJyb3dVcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnNjcm9sbExpc3QoLTEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbktleUVudGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHNlbGVjdGluZyBhbiBpdGVtLlxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmluZGV4ID49IDAgPyB0aGlzLnJlc3VsdHNbdGhpcy5pbmRleF0gOiB0aGlzLnF1ZXJ5O1xuXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UocXVlcnkpO1xuICAgIHRoaXMuY2xvc2VGbHlvdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleUVzY2FwZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRmx5b3V0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMub3BlbkZseW91dCgpO1xuICB9XG5cbiAgcHVibGljIG9wZW5GbHlvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx5b3V0KSB7XG4gICAgICB0aGlzLmZseW91dC5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsb3NlRmx5b3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZseW91dCkge1xuICAgICAgdGhpcy5mbHlvdXQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NhbFNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdHMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHRoaXMuZGF0YSwge1xuICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbkNoYXJhY3RlcnMsXG4gICAgICBrZXk6IHRoaXMubGFiZWwsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgIHNob3dBbGxCeURlZmF1bHQ6IHRoaXMuc2hvd0FsbEJ5RGVmYXVsdCxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAxICYmIHRoaXMucXVlcnkgPT09IHRoaXMucmVzdWx0c1swXVt0aGlzLmxhYmVsXSkge1xuICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdGVTZWFyY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbW90ZVZhbHVlIHx8ICF0aGlzLmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZGF0YS5maW5kKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdGVtW3RoaXMudmFsdWVdID09PSB0aGlzLnF1ZXJ5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbSA9PT0gdGhpcy5xdWVyeTtcbiAgICB9KTtcblxuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMubGFiZWwgPyBzZWxlY3RlZFt0aGlzLmxhYmVsXSA6IHNlbGVjdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdGVWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNjcm9sbExpc3QoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4ICs9IGZhY3RvcjtcblxuICAgIGlmICghdGhpcy5mbHlvdXRab25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGlJdGVtcyA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaScpO1xuICAgIGNvbnN0IGxpSGVpZ2h0ID0gbGlJdGVtc1sxXSA/IGxpSXRlbXNbMV0ub2Zmc2V0SGVpZ2h0IDogbGlJdGVtc1swXS5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgem9uZUhlaWdodCA9IHRoaXMuZmx5b3V0Wm9uZS5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSB6b25lSGVpZ2h0IC8gbGlIZWlnaHQgLyAyO1xuXG4gICAgdGhpcy5mbHlvdXRab25lLmVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5pbmRleCAqIGxpSGVpZ2h0IC0gb2Zmc2V0ICogbGlIZWlnaHQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKGNsb3NlZCk9XCJvbkZseW91dENsb3NlZCgpXCJcbiAgW3RvZ2dsZUNsaWNrXT1cImZhbHNlXCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBhdWlGbHlvdXRcbiAgY2xhc3M9XCJtLWZseW91dCBtLWZseW91dC0tc2Nyb2xsYWJsZSBtLWZseW91dC0tZnVsbCBvLWF1dG8tY29tcGxldGVcIlxuPlxuICA8aW5wdXRcbiAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAoa2V5QXJyb3dEb3duKT1cIm9uS2V5QXJyb3dEb3duKClcIlxuICAgIChrZXlBcnJvd1VwKT1cIm9uS2V5QXJyb3dVcCgpXCJcbiAgICAoa2V5RW50ZXIpPVwib25LZXlFbnRlcigkZXZlbnQpXCJcbiAgICAoa2V5RXNjYXBlKT1cIm9uS2V5RXNjYXBlKClcIlxuICAgIFsobmdNb2RlbCldPVwicXVlcnlcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImRvU2VhcmNoKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgIGF1aUZseW91dEFjdGlvblxuICAgIGF1aVNlbGVjdGFibGVBY3Rpb25zXG4gICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvQ29tcGxldGVcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBjbGFzcz1cImEtaW5wdXRcIlxuICAvPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRGlzYWJsZWRcIiBhdWlGbHlvdXRab25lPlxuICAgIDxzcGFuICpuZ0lmPVwiZm9jdXNlZCAmJiBsb2FkaW5nVGV4dCAmJiBzZWFyY2hpbmdcIiBjbGFzcz1cImEtc3Bpbm5lciBhLXNwaW5uZXItLXMgdS1tYXJnaW4teHNcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYS1zcGlubmVyX19jaXJjbGVcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImEtc3Bpbm5lcl9fdGV4dFwiPnt7IGxvYWRpbmdUZXh0IH19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIHNlYXJjaEluY2VudGl2ZVRleHQgJiYgIXNlYXJjaGluZyAmJiAhcXVlcnkgJiYgIXJlc3VsdHMubGVuZ3RoXCJcbiAgICAgIGNsYXNzPVwiby1hdXRvLWNvbXBsZXRlX19pbmZvIHUtdGV4dC1saWdodCB1LW1hcmdpbi14c1wiXG4gICAgICA+e3sgc2VhcmNoSW5jZW50aXZlVGV4dCB9fTwvc3BhblxuICAgID5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJmb2N1c2VkICYmIG5vUmVzdWx0c1RleHQgJiYgIXNlYXJjaGluZyAmJiBxdWVyeSAmJiAhcmVzdWx0cy5sZW5ndGhcIlxuICAgICAgY2xhc3M9XCJvLWF1dG8tY29tcGxldGVfX2luZm8gdS10ZXh0LWxpZ2h0IHUtbWFyZ2luLXhzXCJcbiAgICAgID57eyBub1Jlc3VsdHNUZXh0IH19PC9zcGFuXG4gICAgPlxuICAgIDxhdWktc2VsZWN0YWJsZS1saXN0XG4gICAgICAoc2VsZWN0ZWQpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAqbmdJZj1cInJlc3VsdHMubGVuZ3RoID4gMCAmJiAhKGZvY3VzZWQgJiYgbG9hZGluZ1RleHQgJiYgc2VhcmNoaW5nKVwiXG4gICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiXG4gICAgICBbaXRlbXNdPVwicmVzdWx0c1wiXG4gICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgW3NlYXJjaF09XCJxdWVyeVwiXG4gICAgPjwvYXVpLXNlbGVjdGFibGUtbGlzdD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==