design-angular-kit 1.0.0-16 → 1.0.0-18

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 (218) hide show
  1. package/README.md +31 -6
  2. package/assets/i18n/en.json +4 -1
  3. package/assets/i18n/it.json +4 -1
  4. package/esm2022/lib/abstracts/abstract-form.component.mjs +186 -0
  5. package/esm2022/lib/abstracts/abstract.component.mjs +45 -0
  6. package/esm2022/lib/components/components.module.mjs +188 -0
  7. package/esm2022/lib/components/core/accordion/accordion.component.mjs +38 -0
  8. package/esm2022/lib/components/core/alert/alert.component.mjs +74 -0
  9. package/esm2022/lib/components/core/badge/badge.directive.mjs +38 -0
  10. package/esm2022/lib/components/core/button/button.directive.mjs +85 -0
  11. package/esm2022/lib/components/core/callout/callout.component.mjs +57 -0
  12. package/esm2022/lib/components/core/card/card.component.mjs +64 -0
  13. package/esm2022/lib/components/core/carousel/carousel/carousel.component.mjs +89 -0
  14. package/esm2022/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +19 -0
  15. package/esm2022/lib/components/core/carousel/carousel.module.mjs +23 -0
  16. package/esm2022/lib/components/core/chip/chip.component.mjs +96 -0
  17. package/esm2022/lib/components/core/collapse/collapse.component.mjs +101 -0
  18. package/esm2022/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  19. package/esm2022/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  20. package/esm2022/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  21. package/esm2022/lib/components/core/dimmer/dimmer.module.mjs +27 -0
  22. package/esm2022/lib/components/core/dropdown/dropdown/dropdown.component.mjs +143 -0
  23. package/esm2022/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +68 -0
  24. package/esm2022/lib/components/core/dropdown/dropdown.module.mjs +18 -0
  25. package/esm2022/lib/components/core/forward/forward.directive.mjs +53 -0
  26. package/esm2022/lib/components/core/link/link.component.mjs +46 -0
  27. package/esm2022/lib/components/core/list/list/list.component.mjs +17 -0
  28. package/esm2022/lib/components/core/list/list-item/list-item.component.mjs +40 -0
  29. package/esm2022/lib/components/core/list/list.module.mjs +23 -0
  30. package/esm2022/lib/components/core/modal/modal.component.mjs +164 -0
  31. package/esm2022/lib/components/core/notifications/notifications.component.mjs +111 -0
  32. package/esm2022/lib/components/core/pagination/pagination.component.mjs +133 -0
  33. package/esm2022/lib/components/core/popover/popover.directive.mjs +175 -0
  34. package/esm2022/lib/components/core/progress-bar/progress-bar.component.mjs +35 -0
  35. package/esm2022/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  36. package/esm2022/lib/components/core/spinner/spinner.component.mjs +36 -0
  37. package/esm2022/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +138 -0
  38. package/esm2022/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +19 -0
  39. package/esm2022/lib/components/core/steppers/steppers.module.mjs +23 -0
  40. package/esm2022/lib/components/core/tab/tab-container/tab-container.component.mjs +60 -0
  41. package/esm2022/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  42. package/esm2022/lib/components/core/tab/tab.module.mjs +23 -0
  43. package/esm2022/lib/components/core/table/table.component.mjs +57 -0
  44. package/esm2022/lib/components/core/tooltip/tooltip.directive.mjs +142 -0
  45. package/esm2022/lib/components/form/checkbox/checkbox.component.mjs +49 -0
  46. package/esm2022/lib/components/form/form.module.mjs +55 -0
  47. package/esm2022/lib/components/form/input/input.component.mjs +239 -0
  48. package/esm2022/lib/components/form/password-input/password-input.component.mjs +155 -0
  49. package/esm2022/lib/components/form/radio-button/radio-button.component.mjs +69 -0
  50. package/esm2022/lib/components/form/range/range.component.mjs +64 -0
  51. package/esm2022/lib/components/form/rating/rating.component.mjs +51 -0
  52. package/esm2022/lib/components/form/select/select.component.mjs +70 -0
  53. package/esm2022/lib/components/form/textarea/textarea.component.mjs +47 -0
  54. package/esm2022/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +140 -0
  55. package/esm2022/lib/components/form/upload-file-list/upload-file-list.component.mjs +112 -0
  56. package/esm2022/lib/components/navigation/back-button/back-button.component.mjs +71 -0
  57. package/esm2022/lib/components/navigation/back-to-top/back-to-top.component.mjs +64 -0
  58. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +57 -0
  59. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  60. package/esm2022/lib/components/navigation/breadcrumbs/breadcrumbs.module.mjs +18 -0
  61. package/esm2022/lib/components/navigation/header/header.component.mjs +58 -0
  62. package/esm2022/lib/components/utils/error-page/error-page.component.mjs +81 -0
  63. package/esm2022/lib/components/utils/icon/icon.component.mjs +55 -0
  64. package/esm2022/lib/components/utils/language-switcher/language-switcher.component.mjs +41 -0
  65. package/esm2022/lib/design-angular-kit.module.mjs +68 -0
  66. package/{esm2020 → esm2022}/lib/interfaces/form.mjs +1 -1
  67. package/esm2022/lib/interfaces/icon.mjs +165 -0
  68. package/esm2022/lib/pipes/mark-matching-text.pipe.mjs +37 -0
  69. package/esm2022/lib/services/notification/notification.service.mjs +120 -0
  70. package/esm2022/lib/utils/file-utils.mjs +73 -0
  71. package/esm2022/lib/utils/regex.mjs +31 -0
  72. package/esm2022/lib/validators/it-validators.mjs +153 -0
  73. package/esm2022/public_api.mjs +85 -0
  74. package/fesm2022/design-angular-kit.mjs +4615 -0
  75. package/fesm2022/design-angular-kit.mjs.map +1 -0
  76. package/lib/abstracts/abstract-form.component.d.ts +4 -4
  77. package/lib/abstracts/abstract.component.d.ts +3 -3
  78. package/lib/components/components.module.d.ts +32 -52
  79. package/lib/components/core/accordion/accordion.component.d.ts +6 -5
  80. package/lib/components/core/alert/alert.component.d.ts +5 -5
  81. package/lib/components/core/badge/badge.directive.d.ts +5 -5
  82. package/lib/components/core/button/button.directive.d.ts +11 -11
  83. package/lib/components/core/callout/callout.component.d.ts +7 -7
  84. package/lib/components/core/card/card.component.d.ts +8 -8
  85. package/lib/components/core/carousel/carousel/carousel.component.d.ts +10 -10
  86. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +4 -4
  87. package/lib/components/core/carousel/carousel.module.d.ts +8 -0
  88. package/lib/components/core/chip/chip.component.d.ts +6 -3
  89. package/lib/components/core/collapse/collapse.component.d.ts +8 -8
  90. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +3 -3
  91. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +3 -3
  92. package/lib/components/core/dimmer/dimmer.component.d.ts +4 -4
  93. package/lib/components/core/dimmer/dimmer.module.d.ts +9 -0
  94. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +14 -9
  95. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +8 -8
  96. package/lib/components/core/dropdown/dropdown.module.d.ts +8 -0
  97. package/lib/components/core/forward/forward.directive.d.ts +3 -3
  98. package/lib/components/core/link/link.component.d.ts +9 -8
  99. package/lib/components/core/list/list/list.component.d.ts +4 -4
  100. package/lib/components/core/list/list-item/list-item.component.d.ts +9 -9
  101. package/lib/components/core/list/list.module.d.ts +8 -0
  102. package/lib/components/core/modal/modal.component.d.ts +11 -11
  103. package/lib/components/core/notifications/notifications.component.d.ts +6 -6
  104. package/lib/components/core/pagination/pagination.component.d.ts +8 -8
  105. package/lib/components/core/popover/popover.directive.d.ts +3 -3
  106. package/lib/components/core/progress-bar/progress-bar.component.d.ts +6 -6
  107. package/lib/components/core/progress-button/progress-button.component.d.ts +5 -5
  108. package/lib/components/core/spinner/spinner.component.d.ts +5 -5
  109. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +37 -13
  110. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +5 -5
  111. package/lib/components/core/steppers/steppers.module.d.ts +8 -0
  112. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +9 -9
  113. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +8 -8
  114. package/lib/components/core/tab/tab.module.d.ts +8 -0
  115. package/lib/components/core/table/table.component.d.ts +12 -12
  116. package/lib/components/core/tooltip/tooltip.directive.d.ts +3 -3
  117. package/lib/components/form/checkbox/checkbox.component.d.ts +12 -10
  118. package/lib/components/form/form.module.d.ts +16 -0
  119. package/lib/components/form/input/input.component.d.ts +18 -13
  120. package/lib/components/form/password-input/password-input.component.d.ts +11 -6
  121. package/lib/components/form/radio-button/radio-button.component.d.ts +6 -6
  122. package/lib/components/form/range/range.component.d.ts +42 -0
  123. package/lib/components/form/rating/rating.component.d.ts +24 -0
  124. package/lib/components/form/select/select.component.d.ts +11 -6
  125. package/lib/components/form/textarea/textarea.component.d.ts +5 -5
  126. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +4 -4
  127. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +6 -6
  128. package/lib/components/navigation/back-button/back-button.component.d.ts +3 -3
  129. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +7 -7
  130. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +6 -6
  131. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +6 -6
  132. package/lib/components/navigation/breadcrumbs/breadcrumbs.module.d.ts +8 -0
  133. package/lib/components/navigation/header/header.component.d.ts +6 -6
  134. package/lib/components/utils/error-page/error-page.component.d.ts +6 -6
  135. package/lib/components/utils/icon/icon.component.d.ts +7 -7
  136. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +4 -4
  137. package/lib/design-angular-kit.module.d.ts +3 -4
  138. package/lib/interfaces/core.d.ts +16 -16
  139. package/lib/interfaces/form.d.ts +3 -3
  140. package/lib/interfaces/icon.d.ts +4 -4
  141. package/lib/pipes/mark-matching-text.pipe.d.ts +4 -4
  142. package/lib/services/{notifications/notifications.service.d.ts → notification/notification.service.d.ts} +3 -3
  143. package/lib/utils/boolean-input.d.ts +1 -1
  144. package/lib/utils/regex.d.ts +5 -0
  145. package/lib/validators/it-validators.d.ts +4 -0
  146. package/package.json +13 -19
  147. package/public_api.d.ts +13 -4
  148. package/esm2020/lib/abstracts/abstract-form.component.mjs +0 -188
  149. package/esm2020/lib/abstracts/abstract.component.mjs +0 -45
  150. package/esm2020/lib/components/components.module.mjs +0 -256
  151. package/esm2020/lib/components/core/accordion/accordion.component.mjs +0 -35
  152. package/esm2020/lib/components/core/alert/alert.component.mjs +0 -73
  153. package/esm2020/lib/components/core/badge/badge.directive.mjs +0 -37
  154. package/esm2020/lib/components/core/button/button.directive.mjs +0 -84
  155. package/esm2020/lib/components/core/callout/callout.component.mjs +0 -57
  156. package/esm2020/lib/components/core/card/card.component.mjs +0 -64
  157. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +0 -89
  158. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +0 -19
  159. package/esm2020/lib/components/core/chip/chip.component.mjs +0 -89
  160. package/esm2020/lib/components/core/collapse/collapse.component.mjs +0 -101
  161. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +0 -24
  162. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +0 -11
  163. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +0 -59
  164. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +0 -130
  165. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +0 -68
  166. package/esm2020/lib/components/core/forward/forward.directive.mjs +0 -52
  167. package/esm2020/lib/components/core/link/link.component.mjs +0 -40
  168. package/esm2020/lib/components/core/list/list/list.component.mjs +0 -17
  169. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +0 -41
  170. package/esm2020/lib/components/core/modal/modal.component.mjs +0 -163
  171. package/esm2020/lib/components/core/notifications/notifications.component.mjs +0 -110
  172. package/esm2020/lib/components/core/pagination/pagination.component.mjs +0 -131
  173. package/esm2020/lib/components/core/popover/popover.directive.mjs +0 -174
  174. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +0 -34
  175. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +0 -27
  176. package/esm2020/lib/components/core/rating/rating.component.mjs +0 -49
  177. package/esm2020/lib/components/core/spinner/spinner.component.mjs +0 -35
  178. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +0 -127
  179. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +0 -19
  180. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +0 -59
  181. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +0 -36
  182. package/esm2020/lib/components/core/table/table.component.mjs +0 -57
  183. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +0 -141
  184. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +0 -40
  185. package/esm2020/lib/components/form/input/input.component.mjs +0 -232
  186. package/esm2020/lib/components/form/password-input/password-input.component.mjs +0 -152
  187. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +0 -68
  188. package/esm2020/lib/components/form/select/select.component.mjs +0 -62
  189. package/esm2020/lib/components/form/textarea/textarea.component.mjs +0 -46
  190. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +0 -139
  191. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +0 -104
  192. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +0 -69
  193. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +0 -64
  194. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +0 -56
  195. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +0 -23
  196. package/esm2020/lib/components/navigation/header/header.component.mjs +0 -57
  197. package/esm2020/lib/components/utils/error-page/error-page.component.mjs +0 -79
  198. package/esm2020/lib/components/utils/icon/icon.component.mjs +0 -55
  199. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +0 -39
  200. package/esm2020/lib/design-angular-kit.module.mjs +0 -68
  201. package/esm2020/lib/interfaces/icon.mjs +0 -162
  202. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +0 -36
  203. package/esm2020/lib/services/notifications/notifications.service.mjs +0 -120
  204. package/esm2020/lib/utils/file-utils.mjs +0 -73
  205. package/esm2020/lib/utils/regex.mjs +0 -26
  206. package/esm2020/lib/validators/it-validators.mjs +0 -147
  207. package/esm2020/public_api.mjs +0 -74
  208. package/fesm2015/design-angular-kit.mjs +0 -4422
  209. package/fesm2015/design-angular-kit.mjs.map +0 -1
  210. package/fesm2020/design-angular-kit.mjs +0 -4354
  211. package/fesm2020/design-angular-kit.mjs.map +0 -1
  212. package/lib/components/core/rating/rating.component.d.ts +0 -24
  213. /package/{esm2020 → esm2022}/design-angular-kit.mjs +0 -0
  214. /package/{esm2020 → esm2022}/lib/design-angular-kit-config.mjs +0 -0
  215. /package/{esm2020 → esm2022}/lib/interfaces/core.mjs +0 -0
  216. /package/{esm2020 → esm2022}/lib/interfaces/design-angular-kit-init.mjs +0 -0
  217. /package/{esm2020 → esm2022}/lib/interfaces/utils.mjs +0 -0
  218. /package/{esm2020 → esm2022}/lib/utils/boolean-input.mjs +0 -0
@@ -1,232 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { AbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
- import { Validators } from '@angular/forms';
4
- import { ItValidators } from '../../../validators/it-validators';
5
- import { isTrueBooleanInput } from '../../../utils/boolean-input';
6
- import { debounceTime, distinctUntilChanged, map, Observable, of, switchMap } from 'rxjs';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@angular/forms";
10
- import * as i3 from "../../utils/icon/icon.component";
11
- import * as i4 from "../../../pipes/mark-matching-text.pipe";
12
- export class InputComponent extends AbstractFormComponent {
13
- constructor() {
14
- super(...arguments);
15
- /**
16
- * The input type
17
- * @default text
18
- */
19
- this.type = 'text';
20
- /**
21
- * The input placeholder
22
- */
23
- this.placeholder = '';
24
- /**
25
- * The max date value [Used only in type = 'date']
26
- * @default '9999-12-31'
27
- * @example 'yyyy-mm-dd'
28
- */
29
- this.maxDate = '9999-12-31';
30
- /**
31
- * Time span [ms] has passed without another source emission, to delay data filtering.
32
- * Useful when the user is typing multiple letters
33
- * @default 300 [ms]
34
- */
35
- this.autocompleteDebounceTime = 300;
36
- /**
37
- * Fired when the Autocomplete Item has been selected
38
- */
39
- this.autocompleteSelectedEvent = new EventEmitter();
40
- this.showAutocompletion = false;
41
- /** Observable da cui vengono emessi i risultati dell'auto completamento */
42
- this.autocompleteResults$ = new Observable();
43
- }
44
- get isActiveLabel() {
45
- const value = this.control.value;
46
- if ((!!value && value !== 0) || value === 0 || !!this.placeholder) {
47
- return true;
48
- }
49
- if (this.type === 'number' && (isTrueBooleanInput(this.currency) || isTrueBooleanInput(this.percentage))) {
50
- return true;
51
- }
52
- return this.type === 'date' || this.type === 'time' || this.type === 'color';
53
- }
54
- /**
55
- * Check is readonly field
56
- */
57
- get isReadonly() {
58
- return this.readonly === 'plaintext' || isTrueBooleanInput(this.readonly);
59
- }
60
- /**
61
- * Return the invalid message string from TranslateService
62
- */
63
- get invalidMessage() {
64
- if (this.hasError('min') && this.min) {
65
- return this._translateService.get('it.errors.min-invalid', {
66
- min: this.min
67
- });
68
- }
69
- if (this.hasError('max') && this.max) {
70
- return this._translateService.get('it.errors.max-invalid', {
71
- max: this.max
72
- });
73
- }
74
- if (this.hasError('minlength')) {
75
- const error = this.getError('minlength');
76
- return this._translateService.get('it.errors.min-length-invalid', { min: error.requiredLength });
77
- }
78
- if (this.hasError('maxlength')) {
79
- const error = this.getError('maxlength');
80
- return this._translateService.get('it.errors.max-length-invalid', { max: error.requiredLength });
81
- }
82
- if (this.hasError('email') || this.hasError('invalidEmail')) {
83
- return this._translateService.get('it.errors.email-invalid');
84
- }
85
- if (this.hasError('invalidTel')) {
86
- return this._translateService.get('it.errors.tel-invalid');
87
- }
88
- if (this.hasError('invalidUrl')) {
89
- return this._translateService.get('it.errors.url-invalid');
90
- }
91
- if (this.hasError('invalidTaxCode')) {
92
- return this._translateService.get('it.errors.tax-code-invalid');
93
- }
94
- if (this.hasError('invalidVatNumber')) {
95
- return this._translateService.get('it.errors.vat-number-invalid');
96
- }
97
- if (this.hasError('invalidCap')) {
98
- return this._translateService.get('it.errors.cap-invalid');
99
- }
100
- if (this.hasError('invalidRegex')) {
101
- return this._translateService.get('it.errors.regex-invalid');
102
- }
103
- if (this.hasError('pattern')) {
104
- const error = this.getError('pattern');
105
- return this._translateService.get('it.errors.pattern-invalid', { pattern: error.requiredPattern });
106
- }
107
- return super.invalidMessage;
108
- }
109
- ngOnInit() {
110
- super.ngOnInit();
111
- const validators = [];
112
- switch (this.type) {
113
- case 'number':
114
- if (isTrueBooleanInput(this.percentage)) {
115
- this.min = this.min || 0;
116
- this.max = this.max || 100;
117
- }
118
- // Dynamic min/max validators
119
- validators.push((control) => this.min ? Validators.min(this.min)(control) : null);
120
- validators.push((control) => this.max ? Validators.max(this.max)(control) : null);
121
- break;
122
- case 'email':
123
- validators.push(ItValidators.email);
124
- break;
125
- case 'tel':
126
- validators.push(ItValidators.tel);
127
- break;
128
- case 'url':
129
- validators.push(ItValidators.url);
130
- break;
131
- }
132
- this.addValidators(validators);
133
- this.autocompleteResults$ = this.getAutocompleteResults$();
134
- }
135
- /**
136
- * Increment or decrease the input number value of step
137
- * @param decrease true to decrease value
138
- */
139
- incrementNumber(decrease = false) {
140
- if (this.type !== 'number') {
141
- return;
142
- }
143
- const step = (this.step === 'any' ? 1 : (this.step ?? 1));
144
- let value = Number(this.control.value);
145
- value = (isNaN(value) ? 0 : value) + (decrease ? -step : step);
146
- value = Math.round(value * 1e12) / 1e12; // prevent js decimal error
147
- if (this.min !== undefined && value < this.min) {
148
- value = this.min;
149
- }
150
- else if (this.max !== undefined && value > this.max) {
151
- value = this.max;
152
- }
153
- this.control.setValue(value);
154
- }
155
- /**
156
- * Create the autocomplete list
157
- */
158
- getAutocompleteResults$() {
159
- if (this.type !== 'search') {
160
- return of({ searchedValue: '', relatedEntries: [] });
161
- }
162
- return this.control.valueChanges.pipe(debounceTime(this.autocompleteDebounceTime), // Delay filter data after time span has passed without another source emission, useful when the user is typing multiple letters
163
- distinctUntilChanged(), // Only if searchValue is distinct in comparison to the last value
164
- switchMap(searchedValue => {
165
- if (!this.autocompleteData) {
166
- return of({ searchedValue, relatedEntries: [] });
167
- }
168
- const autoCompleteData$ = Array.isArray(this.autocompleteData) ? of(this.autocompleteData) : this.autocompleteData(searchedValue);
169
- return autoCompleteData$.pipe(map(autocompleteData => {
170
- if (!searchedValue) {
171
- return { searchedValue, relatedEntries: [] };
172
- }
173
- const lowercaseValue = searchedValue.toLowerCase();
174
- const relatedEntries = autocompleteData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
175
- return { searchedValue, relatedEntries };
176
- }));
177
- }));
178
- }
179
- onEntryClick(entry, event) {
180
- // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
181
- // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
182
- if (!entry.link) {
183
- event.preventDefault();
184
- }
185
- this.autocompleteSelectedEvent.next(entry);
186
- this.control.setValue(entry.value);
187
- this.showAutocompletion = false;
188
- }
189
- autocompleteItemTrackByValueFn(index, item) {
190
- return item.value;
191
- }
192
- onKeyDown() {
193
- this.showAutocompletion = this.type === 'search';
194
- }
195
- }
196
- InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: InputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
197
- InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: InputComponent, selector: "it-input", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", maxDate: "maxDate", minDate: "minDate", max: "max", min: "min", step: "step", currency: "currency", percentage: "percentage", adaptive: "adaptive", autocompleteData: "autocompleteData", autocompleteDebounceTime: "autocompleteDebounceTime" }, outputs: { autocompleteSelectedEvent: "autocompleteSelectedEvent" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+ input:-webkit-autofill){transform:translateY(-75%)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", 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]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "svgClass"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.MarkMatchingTextPipe, name: "markMatchingText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: InputComponent, decorators: [{
199
- type: Component,
200
- args: [{ selector: 'it-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+ input:-webkit-autofill){transform:translateY(-75%)}\n"] }]
201
- }], propDecorators: { type: [{
202
- type: Input
203
- }], placeholder: [{
204
- type: Input
205
- }], description: [{
206
- type: Input
207
- }], readonly: [{
208
- type: Input
209
- }], maxDate: [{
210
- type: Input
211
- }], minDate: [{
212
- type: Input
213
- }], max: [{
214
- type: Input
215
- }], min: [{
216
- type: Input
217
- }], step: [{
218
- type: Input
219
- }], currency: [{
220
- type: Input
221
- }], percentage: [{
222
- type: Input
223
- }], adaptive: [{
224
- type: Input
225
- }], autocompleteData: [{
226
- type: Input
227
- }], autocompleteDebounceTime: [{
228
- type: Input
229
- }], autocompleteSelectedEvent: [{
230
- type: Output
231
- }] } });
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRW5GLE9BQU8sRUFBZ0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUTFGLE1BQU0sT0FBTyxjQUFlLFNBQVEscUJBQXNDO0lBTjFFOztRQVFFOzs7V0FHRztRQUNNLFNBQUksR0FBcUIsTUFBTSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFhbEM7Ozs7V0FJRztRQUNNLFlBQU8sR0FBWSxZQUFZLENBQUM7UUE2Q3pDOzs7O1dBSUc7UUFDTSw2QkFBd0IsR0FBVyxHQUFHLENBQUM7UUFFaEQ7O1dBRUc7UUFDTyw4QkFBeUIsR0FBbUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztR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UjtRQUNELE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUVwRSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyRCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFHRDs7T0FFRztJQUNLLHVCQUF1QjtRQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFCLE9BQU8sRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNuQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsZ0lBQWdJO1FBQzdLLG9CQUFvQixFQUFFLEVBQUUsa0VBQWtFO1FBQzFGLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMxQixPQUFPLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNsRDtZQUVELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEksT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQzNCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFO29CQUNsQixPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQztpQkFDOUM7Z0JBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxLQUF1QixFQUFFLEtBQVk7UUFDaEQsd0dBQXdHO1FBQ3hHLHdHQUF3RztRQUN4RyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNmLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELDhCQUE4QixDQUFDLEtBQWEsRUFBRSxJQUFzQjtRQUNsRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7SUFDbkQsQ0FBQzs7MkdBOVFVLGNBQWM7K0ZBQWQsY0FBYyxvZUNkM0IsaTZJQTBHQTsyRkQ1RmEsY0FBYztrQkFOMUIsU0FBUzsrQkFDRSxVQUFVLG1CQUdILHVCQUF1QixDQUFDLE1BQU07OEJBUXRDLElBQUk7c0JBQVosS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTUcsT0FBTztzQkFBZixLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxHQUFHO3NCQUFYLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFPRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBS0kseUJBQXlCO3NCQUFsQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVJdGVtLCBJbnB1dENvbnRyb2xUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9mb3JtJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJdFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi8uLi92YWxpZGF0b3JzL2l0LXZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBpc1RydWVCb29sZWFuSW5wdXQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ib29sZWFuLWlucHV0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50PHN0cmluZyB8IG51bWJlcj4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdHlwZVxuICAgKiBAZGVmYXVsdCB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSB0eXBlOiBJbnB1dENvbnRyb2xUeXBlID0gJ3RleHQnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2Vob2xkZXJcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhlIGlucHV0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZS5cbiAgICogLSA8Yj5wbGFpbnRleHQ8L2I+OiBSZWFkb25seSBmaWVsZCBpbiB0aGUgZm9ybSBzdHlsaXplZCBhcyBwbGFpbiB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seT86IEJvb2xlYW5JbnB1dCB8ICdwbGFpbnRleHQnO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4IGRhdGUgdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ2RhdGUnXVxuICAgKiBAZGVmYXVsdCAnOTk5OS0xMi0zMSdcbiAgICogQGV4YW1wbGUgJ3l5eXktbW0tZGQnXG4gICAqL1xuICBASW5wdXQoKSBtYXhEYXRlPzogc3RyaW5nID0gJzk5OTktMTItMzEnO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluIGRhdGUgdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ2RhdGUnXVxuICAgKiBAZXhhbXBsZSAneXl5eS1tbS1kZCdcbiAgICovXG4gIEBJbnB1dCgpIG1pbkRhdGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtYXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW4gdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtaW4/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIHZhbHVlIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgc3RlcD86IG51bWJlciB8ICdhbnknO1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIGN1cnJlbmN5IG51bWJlciBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIGN1cnJlbmN5PzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIHBlcmNlbnRhZ2UgbnVtYmVyIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgcGVyY2VudGFnZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogVG8gbWFrZSB0aGUgbnVtZXJpYyBmaWVsZCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBpdC4gW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBhZGFwdGl2ZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBsaXN0IG9mIHNlYXJjaGFibGUgZWxlbWVudHMgb24gd2hpY2ggdG8gYmFzZSB0aGUgaW5wdXQgYXV0b2NvbXBsZXRlIHN5c3RlbSBbT3B0aW9uYWwuIFVzZWQgb25seSBpbiB0eXBlID0gJ3NlYXJjaCddXG4gICAqIElmIHlvdSBuZWVkIHRvIHJldHJpZXZlIGl0ZW1zIHZpYSBBUEksIGNhbiBwYXNzIGEgZnVuY3Rpb24gb2YgT2JzZXJ2YWJsZVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZURhdGE/OiBBcnJheTxBdXRvY29tcGxldGVJdGVtPiB8ICgoc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PEF1dG9jb21wbGV0ZUl0ZW0+Pik7XG5cbiAgLyoqXG4gICAqIFRpbWUgc3BhbiBbbXNdIGhhcyBwYXNzZWQgd2l0aG91dCBhbm90aGVyIHNvdXJjZSBlbWlzc2lvbiwgdG8gZGVsYXkgZGF0YSBmaWx0ZXJpbmcuXG4gICAqIFVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBtdWx0aXBsZSBsZXR0ZXJzXG4gICAqIEBkZWZhdWx0IDMwMCBbbXNdXG4gICAqL1xuICBASW5wdXQoKSBhdXRvY29tcGxldGVEZWJvdW5jZVRpbWU6IG51bWJlciA9IDMwMDtcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgQXV0b2NvbXBsZXRlIEl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBhdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50OiBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlSXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIHNob3dBdXRvY29tcGxldGlvbiA9IGZhbHNlO1xuXG5cbiAgZ2V0IGlzQWN0aXZlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCghIXZhbHVlICYmIHZhbHVlICE9PSAwKSB8fCB2YWx1ZSA9PT0gMCB8fCAhIXRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdudW1iZXInICYmIChpc1RydWVCb29sZWFuSW5wdXQodGhpcy5jdXJyZW5jeSkgfHwgaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnZGF0ZScgfHwgdGhpcy50eXBlID09PSAndGltZScgfHwgdGhpcy50eXBlID09PSAnY29sb3InO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlzIHJlYWRvbmx5IGZpZWxkXG4gICAqL1xuICBnZXQgaXNSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSA9PT0gJ3BsYWludGV4dCcgfHwgaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucmVhZG9ubHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgaW52YWxpZCBtZXNzYWdlIHN0cmluZyBmcm9tIFRyYW5zbGF0ZVNlcnZpY2VcbiAgICovXG4gIG92ZXJyaWRlIGdldCBpbnZhbGlkTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtaW4nKSAmJiB0aGlzLm1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWluLWludmFsaWQnLCB7XG4gICAgICAgIG1pbjogdGhpcy5taW5cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWF4JykgJiYgdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1heC1pbnZhbGlkJywge1xuICAgICAgICBtYXg6IHRoaXMubWF4XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21pbmxlbmd0aCcpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0RXJyb3IoJ21pbmxlbmd0aCcpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWluLWxlbmd0aC1pbnZhbGlkJywgeyBtaW46IGVycm9yLnJlcXVpcmVkTGVuZ3RoIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcignbWF4bGVuZ3RoJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5tYXgtbGVuZ3RoLWludmFsaWQnLCB7IG1heDogZXJyb3IucmVxdWlyZWRMZW5ndGggfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdlbWFpbCcpIHx8IHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRFbWFpbCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5lbWFpbC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVGVsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnRlbC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVXJsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnVybC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVGF4Q29kZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy50YXgtY29kZS1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVmF0TnVtYmVyJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnZhdC1udW1iZXItaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZENhcCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5jYXAtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFJlZ2V4JykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnJlZ2V4LWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmdldEVycm9yKCdwYXR0ZXJuJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXR0ZXJuLWludmFsaWQnLCB7IHBhdHRlcm46IGVycm9yLnJlcXVpcmVkUGF0dGVybiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuaW52YWxpZE1lc3NhZ2U7XG4gIH1cblxuICAvKiogT2JzZXJ2YWJsZSBkYSBjdWkgdmVuZ29ubyBlbWVzc2kgaSByaXN1bHRhdGkgZGVsbCdhdXRvIGNvbXBsZXRhbWVudG8gKi9cbiAgYXV0b2NvbXBsZXRlUmVzdWx0cyQ6IE9ic2VydmFibGU8e1xuICAgIHNlYXJjaGVkVmFsdWU6IHN0cmluZyxcbiAgICByZWxhdGVkRW50cmllczogQXJyYXk8QXV0b2NvbXBsZXRlSXRlbT5cbiAgfT4gPSBuZXcgT2JzZXJ2YWJsZSgpO1xuXG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpIHtcbiAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDA7XG4gICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG1pbi9tYXggdmFsaWRhdG9yc1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdGhpcy5taW4gPyBWYWxpZGF0b3JzLm1pbih0aGlzLm1pbikoY29udHJvbCkgOiBudWxsKTtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHRoaXMubWF4ID8gVmFsaWRhdG9ycy5tYXgodGhpcy5tYXgpKGNvbnRyb2wpIDogbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLnRlbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy51cmwpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmFkZFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVSZXN1bHRzJCA9IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUmVzdWx0cyQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVhc2UgdGhlIGlucHV0IG51bWJlciB2YWx1ZSBvZiBzdGVwXG4gICAqIEBwYXJhbSBkZWNyZWFzZSB0cnVlIHRvIGRlY3JlYXNlIHZhbHVlXG4gICAqL1xuICBpbmNyZW1lbnROdW1iZXIoZGVjcmVhc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0ZXAgPSAodGhpcy5zdGVwID09PSAnYW55JyA/IDEgOiAodGhpcy5zdGVwID8/IDEpKTtcbiAgICBsZXQgdmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICB2YWx1ZSA9IChpc05hTih2YWx1ZSkgPyAwIDogdmFsdWUpICsgKGRlY3JlYXNlID8gLXN0ZXAgOiBzdGVwKTtcbiAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxZTEyKSAvIDFlMTI7IC8vIHByZXZlbnQganMgZGVjaW1hbCBlcnJvclxuXG4gICAgaWYgKHRoaXMubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiB0aGlzLm1heCkge1xuICAgICAgdmFsdWUgPSB0aGlzLm1heDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBhdXRvY29tcGxldGUgbGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVSZXN1bHRzJCgpOiBPYnNlcnZhYmxlPHsgc2VhcmNoZWRWYWx1ZTogc3RyaW5nLCByZWxhdGVkRW50cmllczogQXJyYXk8QXV0b2NvbXBsZXRlSXRlbT4gfT4ge1xuICAgIGlmICh0aGlzLnR5cGUgIT09ICdzZWFyY2gnKSB7XG4gICAgICByZXR1cm4gb2YoeyBzZWFyY2hlZFZhbHVlOiAnJywgcmVsYXRlZEVudHJpZXM6IFtdIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuYXV0b2NvbXBsZXRlRGVib3VuY2VUaW1lKSwgLy8gRGVsYXkgZmlsdGVyIGRhdGEgYWZ0ZXIgdGltZSBzcGFuIGhhcyBwYXNzZWQgd2l0aG91dCBhbm90aGVyIHNvdXJjZSBlbWlzc2lvbiwgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nIG11bHRpcGxlIGxldHRlcnNcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIC8vIE9ubHkgaWYgc2VhcmNoVmFsdWUgaXMgZGlzdGluY3QgaW4gY29tcGFyaXNvbiB0byB0aGUgbGFzdCB2YWx1ZVxuICAgICAgc3dpdGNoTWFwKHNlYXJjaGVkVmFsdWUgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlRGF0YSkge1xuICAgICAgICAgIHJldHVybiBvZih7IHNlYXJjaGVkVmFsdWUsIHJlbGF0ZWRFbnRyaWVzOiBbXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF1dG9Db21wbGV0ZURhdGEkID0gQXJyYXkuaXNBcnJheSh0aGlzLmF1dG9jb21wbGV0ZURhdGEpID8gb2YodGhpcy5hdXRvY29tcGxldGVEYXRhKSA6IHRoaXMuYXV0b2NvbXBsZXRlRGF0YShzZWFyY2hlZFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGF1dG9Db21wbGV0ZURhdGEkLnBpcGUoXG4gICAgICAgICAgbWFwKGF1dG9jb21wbGV0ZURhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZWFyY2hlZFZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHNlYXJjaGVkVmFsdWUsIHJlbGF0ZWRFbnRyaWVzOiBbXSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb3dlcmNhc2VWYWx1ZSA9IHNlYXJjaGVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRyaWVzID0gYXV0b2NvbXBsZXRlRGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLnZhbHVlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyY2FzZVZhbHVlKSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHNlYXJjaGVkVmFsdWUsIHJlbGF0ZWRFbnRyaWVzIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9uRW50cnlDbGljayhlbnRyeTogQXV0b2NvbXBsZXRlSXRlbSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gU2Ugbm9uIMOoIHN0YXRvIGRlZmluaXRvIHVuIGxpbmsgYXNzb2NpYXRvIGFsbCdlbGVtZW50byBkZWxsJ2F1dG9jb21wbGV0ZSwgcHJvYmFiaWxtZW50ZSBpbCBkZXNpZGVyYXRhXG4gICAgLy8gbm9uIMOoIGVmZmV0dHVhcmUgbGEgbmF2aWdhemlvbmUgYWwgZGVmYXVsdCAnIycsIHBlcnRhbnRvIGluIHRhbCBjYXNvIG1lZ2xpbyBhbm51bGxhcmUgbGEgbmF2aWdhemlvbmUuXG4gICAgaWYgKCFlbnRyeS5saW5rKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudC5uZXh0KGVudHJ5KTtcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZW50cnkudmFsdWUpO1xuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gZmFsc2U7XG4gIH1cblxuICBhdXRvY29tcGxldGVJdGVtVHJhY2tCeVZhbHVlRm4oaW5kZXg6IG51bWJlciwgaXRlbTogQXV0b2NvbXBsZXRlSXRlbSkge1xuICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICB9XG5cbiAgb25LZXlEb3duKCkge1xuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gdGhpcy50eXBlID09PSAnc2VhcmNoJztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiBbY2xhc3MuZC1ub25lXT1cIiFwcmVwZW5kVGV4dC5oYXNDaGlsZE5vZGVzKCkgJiYgIXByZXBlbmQuaGFzQ2hpbGROb2RlcygpXCI+XG4gICAgICA8ZGl2ICNwcmVwZW5kPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlcGVuZF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgI3ByZXBlbmRUZXh0PlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlcGVuZFRleHRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIiBbY2xhc3MuYWN0aXZlXT1cImlzQWN0aXZlTGFiZWxcIlxuICAgICAgICAgICBbY2xhc3MuZW1wdHktcHJlcGVuZC1sYWJlbF09XCIhcHJlcGVuZFRleHQuaGFzQ2hpbGROb2RlcygpICYmICFwcmVwZW5kLmhhc0NoaWxkTm9kZXMoKVwiPlxuICAgICAge3tsYWJlbH19XG4gICAgPC9sYWJlbD5cblxuICAgIDxzcGFuICpuZ0lmPVwidHlwZSA9PT0gJ251bWJlcidcIlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLXBlcmNlbnRhZ2VdPVwicGVyY2VudGFnZVwiXG4gICAgICAgICAgW2NsYXNzLmlucHV0LW51bWJlci1hZGFwdGl2ZV09XCJhZGFwdGl2ZVwiPlxuXG4gICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICBbc3RlcF09XCJzdGVwID8/IG51bGxcIlxuICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICAgICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cImlzVmFsaWRcIlxuICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1kZXNjcmlwdGlvbidcIlxuICAgICAgICAgICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiIC8+XG5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtbnVtYmVyLWFkZFwiIChjbGljayk9XCJpbmNyZW1lbnROdW1iZXIoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J2l0LmZvcm0uaW5jcmVhc2UtdmFsdWUnfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtbnVtYmVyLXN1YlwiIChjbGljayk9XCJpbmNyZW1lbnROdW1iZXIodHJ1ZSlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eydpdC5mb3JtLmRlY3JlYXNlLXZhbHVlJ319PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9zcGFuPlxuXG4gICAgPGlucHV0ICpuZ0lmPVwidHlwZSAhPT0gJ251bWJlcidcIlxuICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgW21heF09XCJ0eXBlID09PSAnZGF0ZScgPyBtYXhEYXRlIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgW21pbl09XCJ0eXBlID09PSAnZGF0ZScgPyBtaW5EYXRlIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgW2NsYXNzLmZvcm0tY29udHJvbF09XCJyZWFkb25seSAhPT0gJ3BsYWludGV4dCdcIlxuICAgICAgICAgICBbY2xhc3MuZm9ybS1jb250cm9sLXBsYWludGV4dF09XCJyZWFkb25seSA9PT0gJ3BsYWludGV4dCdcIlxuICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc0ludmFsaWRcIlxuICAgICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oKVwiXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FwcGVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBlbmRUZXh0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8c21hbGwgKm5nSWY9XCJkZXNjcmlwdGlvblwiIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L3NtYWxsPlxuXG4gIDwhLS0gSU5JWklPIGdlc3Rpb25lIEFVVE9DT01QTEVUQU1FTlRPIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidHlwZSA9PT0gJ3NlYXJjaCdcIj5cbiAgICA8IS0tIEljb25hIGxlbnRlIHBlciBhdXRvY29tcGxldGFtZW50byAtLT5cbiAgICA8c3BhbiBjbGFzcz1cImF1dG9jb21wbGV0ZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8aXQtaWNvbiBuYW1lPVwic2VhcmNoXCIgc2l6ZT1cInNtXCI+PC9pdC1pY29uPlxuICAgIDwvc3Bhbj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdXRvY29tcGxldGVSZXN1bHRzJCB8IGFzeW5jIGFzIGF1dG9jb21wbGV0ZVwiPlxuICAgICAgPCEtLSBMaXN0YSBkaSBhdXRvY29tcGxldGFtZW50byAtLT5cbiAgICAgIDx1bCBjbGFzcz1cImF1dG9jb21wbGV0ZS1saXN0XCIgW2NsYXNzLmF1dG9jb21wbGV0ZS1saXN0LXNob3ddPVwiYXV0b2NvbXBsZXRlLnJlbGF0ZWRFbnRyaWVzPy5sZW5ndGggJiYgc2hvd0F1dG9jb21wbGV0aW9uXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZW50cnkgb2YgYXV0b2NvbXBsZXRlLnJlbGF0ZWRFbnRyaWVzOyB0cmFja0J5OiBhdXRvY29tcGxldGVJdGVtVHJhY2tCeVZhbHVlRm5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRW50cnlDbGljayhlbnRyeSwgJGV2ZW50KVwiPlxuICAgICAgICAgIDxhIFtocmVmXT1cImVudHJ5LmxpbmtcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdXRvY29tcGxldGVJdGVtVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhdXRvY29tcGxldGVJdGVtVGVtcGxhdGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIHNpemUtc21cIiAqbmdJZj1cImVudHJ5LmF2YXRhclNyY1BhdGhcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImVudHJ5LmF2YXRhclNyY1BhdGhcIiBbYWx0XT1cImVudHJ5LmF2YXRhckFsdFRleHRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGl0LWljb24gKm5nSWY9XCJlbnRyeS5pY29uXCIgW25hbWVdPVwiZW50cnkuaWNvblwiIHNpemU9XCJzbVwiPjwvaXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWxpc3QtdGV4dFwiPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJlbnRyeS52YWx1ZSB8IG1hcmtNYXRjaGluZ1RleHQ6IGF1dG9jb21wbGV0ZS5zZWFyY2hlZFZhbHVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPGVtICpuZ0lmPVwiZW50cnkubGFiZWxcIj57e2VudHJ5LmxhYmVsfX08L2VtPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDwhLS0gRklORSBnZXN0aW9uZSBBVVRPQ09NUExFVEFNRU5UTyAtLT5cblxuICA8ZGl2ICpuZ0lmPVwiaXNJbnZhbGlkXCIgY2xhc3M9XCJmb3JtLWZlZWRiYWNrIGp1c3QtdmFsaWRhdGUtZXJyb3ItbGFiZWxcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiPlxuICAgIDxkaXYgI2N1c3RvbUVycm9yPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUVycm9yLmhhc0NoaWxkTm9kZXMoKVwiPnt7aW52YWxpZE1lc3NhZ2UgfCBhc3luY319PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,152 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
2
- import { AbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
- import { ItValidators } from '../../../validators/it-validators';
4
- import { map } from 'rxjs';
5
- import { isTrueBooleanInput } from '../../../utils/boolean-input';
6
- import { InputPassword } from 'bootstrap-italia';
7
- import { Validators } from '@angular/forms';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common";
10
- import * as i2 from "@angular/forms";
11
- import * as i3 from "../../utils/icon/icon.component";
12
- import * as i4 from "@ngx-translate/core";
13
- export class PasswordInputComponent extends AbstractFormComponent {
14
- constructor() {
15
- super(...arguments);
16
- /**
17
- * The field is required
18
- * @default true
19
- */
20
- this.required = true;
21
- /**
22
- * The password minimum length
23
- * @default 10
24
- */
25
- this.minLength = 10;
26
- /**
27
- * The password must contain at least one number
28
- * @default true
29
- */
30
- this.useNumber = true;
31
- /**
32
- * The password must contain at least one uppercase character
33
- * @default true
34
- */
35
- this.useCapitalCase = true;
36
- /**
37
- * The password must contain at least one lowercase character
38
- * @default true
39
- */
40
- this.useSmallCase = true;
41
- /**
42
- * The password must contain at least one special character
43
- * @default true
44
- */
45
- this.useSpecialCharacters = true;
46
- /**
47
- * The input placeholder
48
- */
49
- this.placeholder = '';
50
- /**
51
- * Is the confirmation password field
52
- * @default false
53
- */
54
- this.confirmPasswordField = false;
55
- }
56
- ngOnInit() {
57
- super.ngOnInit();
58
- if (!this.isConfirmPasswordField) {
59
- this.addValidators(ItValidators.password(this.minLength, this.useNumber, this.useCapitalCase, this.useSmallCase, this.useSpecialCharacters, this.required));
60
- }
61
- else if (this.required) {
62
- this.addValidators(Validators.required);
63
- }
64
- }
65
- ngAfterViewInit() {
66
- super.ngAfterViewInit();
67
- if (this.inputElement) {
68
- this.inputPasswordBs = InputPassword.getOrCreateInstance(this.inputElement.nativeElement, {
69
- showText: this.isStrengthMeter,
70
- minimumLength: this.minLength
71
- });
72
- }
73
- }
74
- get isStrengthMeter() {
75
- return !this.isConfirmPasswordField && isTrueBooleanInput(this.showStrengthMeter);
76
- }
77
- get isConfirmPasswordField() {
78
- return isTrueBooleanInput(this.confirmPasswordField);
79
- }
80
- /**
81
- * Return the invalid message string from TranslateService
82
- */
83
- get invalidMessage() {
84
- if (this.hasError('noPasswordMatch')) {
85
- return this._translateService.get('it.errors.password-no-match');
86
- }
87
- if (this.hasError('minlength')) {
88
- return this._translateService.get('it.errors.password-min-length', {
89
- minLength: this.minLength
90
- });
91
- }
92
- if (this.hasError('hasNumber')) {
93
- return this._translateService.get('it.errors.password-number');
94
- }
95
- if (this.hasError('hasCapitalCase')) {
96
- return this._translateService.get('it.errors.password-capital-case');
97
- }
98
- if (this.hasError('hasSmallCase')) {
99
- return this._translateService.get('it.errors.password-capital-case');
100
- }
101
- if (this.hasError('hasSpecialCharacters')) {
102
- return this._translateService.get('it.errors.password-special-character');
103
- }
104
- return super.invalidMessage;
105
- }
106
- /**
107
- * Retrieve the default StrengthMeter description message from TranslateService
108
- */
109
- get strengthMeterDescription() {
110
- const keys = ['it.form.password-strength-meter.description.default'];
111
- if (this.useNumber) {
112
- keys.push('it.form.password-strength-meter.description.number');
113
- }
114
- if (this.useCapitalCase) {
115
- keys.push('it.form.password-strength-meter.description.capital-case');
116
- }
117
- if (this.useSpecialCharacters) {
118
- keys.push('it.form.password-strength-meter.description.special-character');
119
- }
120
- return this._translateService.get(keys, { minLength: this.minLength }).pipe(map(labels => Object.values(labels).join(', ')));
121
- }
122
- }
123
- PasswordInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: PasswordInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
124
- PasswordInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: PasswordInputComponent, selector: "it-password-input", inputs: { required: "required", minLength: "minLength", useNumber: "useNumber", useCapitalCase: "useCapitalCase", useSmallCase: "useSmallCase", useSpecialCharacters: "useSpecialCharacters", placeholder: "placeholder", description: "description", showStrengthMeter: "showStrengthMeter", confirmPasswordField: "confirmPasswordField" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n <input [id]=\"id\" #input\n type=\"password\"\n class=\"form-control input-password\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [attr.aria-describedby]=\"id + '-description'\"\n [autocomplete]=\"isConfirmPasswordField ? 'off' : undefined\">\n\n <span class=\"password-icon\" aria-hidden=\"true\">\n <it-icon name=\"password-visible\" size=\"sm\" class=\"password-icon-visible\"></it-icon>\n <it-icon name=\"password-invisible\" size=\"sm\" class=\"password-icon-invisible d-none\"></it-icon>\n </span>\n\n <div *ngIf=\"isInvalid\" [id]=\"id + '-error'\" class=\"form-feedback just-validate-error-label\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n <small *ngIf=\"description !== undefined && !isStrengthMeter\" [id]=\"id + '-description'\" class=\"form-text\">\n {{description !== true ? description : (strengthMeterDescription | async)}}\n </small>\n\n <small class=\"password-caps form-text text-warning position-absolute bg-white w-100\">\n {{'it.form.caps-inserted' | translate}}\n </small>\n\n <div *ngIf=\"isStrengthMeter\" class=\"password-strength-meter\">\n <small [id]=\"id + '-description'\" class=\"form-text text-muted\"\n [attr.data-bs-short-pass]=\"'it.form.password-strength-meter.password-short' | translate\"\n [attr.data-bs-bad-pas]=\"'it.form.password-strength-meter.password-bad' | translate\"\n [attr.data-bs-good-pass]=\"'it.form.password-strength-meter.password-good' | translate\"\n [attr.data-bs-strong-pass]=\"'it.form.password-strength-meter.password-strong' | translate\">\n {{description !== undefined && description !== true ? description : (strengthMeterDescription | async)}}\n </small>\n\n <div class=\"password-meter progress rounded-0 position-absolute\">\n <div class=\"row position-absolute w-100 m-0\">\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n </div>\n <div class=\"progress-bar bg-muted\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\"\n aria-valuemax=\"100\"></div>\n </div>\n </div>\n</div>\n", styles: [".form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group label:not(.active):has(+ input:-webkit-autofill){transform:translateY(-75%)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", 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]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "svgClass"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: PasswordInputComponent, decorators: [{
126
- type: Component,
127
- args: [{ selector: 'it-password-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"!!control.value || !!placeholder\">{{label}}</label>\n <input [id]=\"id\" #input\n type=\"password\"\n class=\"form-control input-password\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [attr.aria-describedby]=\"id + '-description'\"\n [autocomplete]=\"isConfirmPasswordField ? 'off' : undefined\">\n\n <span class=\"password-icon\" aria-hidden=\"true\">\n <it-icon name=\"password-visible\" size=\"sm\" class=\"password-icon-visible\"></it-icon>\n <it-icon name=\"password-invisible\" size=\"sm\" class=\"password-icon-invisible d-none\"></it-icon>\n </span>\n\n <div *ngIf=\"isInvalid\" [id]=\"id + '-error'\" class=\"form-feedback just-validate-error-label\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n <small *ngIf=\"description !== undefined && !isStrengthMeter\" [id]=\"id + '-description'\" class=\"form-text\">\n {{description !== true ? description : (strengthMeterDescription | async)}}\n </small>\n\n <small class=\"password-caps form-text text-warning position-absolute bg-white w-100\">\n {{'it.form.caps-inserted' | translate}}\n </small>\n\n <div *ngIf=\"isStrengthMeter\" class=\"password-strength-meter\">\n <small [id]=\"id + '-description'\" class=\"form-text text-muted\"\n [attr.data-bs-short-pass]=\"'it.form.password-strength-meter.password-short' | translate\"\n [attr.data-bs-bad-pas]=\"'it.form.password-strength-meter.password-bad' | translate\"\n [attr.data-bs-good-pass]=\"'it.form.password-strength-meter.password-good' | translate\"\n [attr.data-bs-strong-pass]=\"'it.form.password-strength-meter.password-strong' | translate\">\n {{description !== undefined && description !== true ? description : (strengthMeterDescription | async)}}\n </small>\n\n <div class=\"password-meter progress rounded-0 position-absolute\">\n <div class=\"row position-absolute w-100 m-0\">\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n </div>\n <div class=\"progress-bar bg-muted\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\"\n aria-valuemax=\"100\"></div>\n </div>\n </div>\n</div>\n", styles: [".form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group label:not(.active):has(+ input:-webkit-autofill){transform:translateY(-75%)}\n"] }]
128
- }], propDecorators: { required: [{
129
- type: Input
130
- }], minLength: [{
131
- type: Input
132
- }], useNumber: [{
133
- type: Input
134
- }], useCapitalCase: [{
135
- type: Input
136
- }], useSmallCase: [{
137
- type: Input
138
- }], useSpecialCharacters: [{
139
- type: Input
140
- }], placeholder: [{
141
- type: Input
142
- }], description: [{
143
- type: Input
144
- }], showStrengthMeter: [{
145
- type: Input
146
- }], confirmPasswordField: [{
147
- type: Input
148
- }], inputElement: [{
149
- type: ViewChild,
150
- args: ['input']
151
- }] } });
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3Bhc3N3b3JkLWlucHV0L3Bhc3N3b3JkLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9wYXNzd29yZC1pbnB1dC9wYXNzd29yZC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFRNUMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLHFCQUE2QjtJQU56RTs7UUFRRTs7O1dBR0c7UUFDTSxhQUFRLEdBQVksSUFBSSxDQUFDO1FBRWxDOzs7V0FHRztRQUNNLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFFaEM7OztXQUdHO1FBQ00sY0FBUyxHQUFZLElBQUksQ0FBQztRQUVuQzs7O1dBR0c7UUFDTSxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUV4Qzs7O1dBR0c7UUFDTSxpQkFBWSxHQUFZ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LFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDakU7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQzVFO1FBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3pFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ2hELENBQUM7SUFDSixDQUFDOzttSEFySlUsc0JBQXNCO3VHQUF0QixzQkFBc0IscWdCQ2RuQyxzc0ZBcURBOzJGRHZDYSxzQkFBc0I7a0JBTmxDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU07OEJBUXRDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsU0FBUztzQkFBakIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQU1HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBTUcsWUFBWTtzQkFBcEIsS0FBSztnQkFNRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFRRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBSXNCLFlBQVk7c0JBQXZDLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEl0VmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uLy4uL3ZhbGlkYXRvcnMvaXQtdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5pbXBvcnQgeyBJbnB1dFBhc3N3b3JkIH0gZnJvbSAnYm9vdHN0cmFwLWl0YWxpYSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1wYXNzd29yZC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYXNzd29yZC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Bhc3N3b3JkLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQ8c3RyaW5nPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBpcyByZXF1aXJlZFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBtaW5pbXVtIGxlbmd0aFxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgbnVtYmVyXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHVzZU51bWJlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHVwcGVyY2FzZSBjaGFyYWN0ZXJcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgdXNlQ2FwaXRhbENhc2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBsb3dlcmNhc2UgY2hhcmFjdGVyXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHVzZVNtYWxsQ2FzZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNwZWNpYWwgY2hhcmFjdGVyXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHVzZVNwZWNpYWxDaGFyYWN0ZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlaG9sZGVyXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBkZXNjcmlwdGlvblxuICAgKiAtIDxiPnRydWU8L2I+OiBzaG93IHRoZSBTdHJlbmd0aE1ldGVyIGRlc2NyaXB0aW9uIG1lc3NhZ2VcbiAgICogLSA8Yj5zdHJpbmc8L2I+OiBzaG93IGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAZGVmYXVsdCB0cnVlIGZvciBTdHJlbmd0aE1ldGVyIG1vZGUgZWxzZSBpcyB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgdHJ1ZTtcblxuICAvKipcbiAgICogRW5hYmxlIHRvIHNob3cgdGhlIHN0cmVuZ3RoIG1ldGVyXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzaG93U3RyZW5ndGhNZXRlcj86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSXMgdGhlIGNvbmZpcm1hdGlvbiBwYXNzd29yZCBmaWVsZFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgY29uZmlybVBhc3N3b3JkRmllbGQ6IEJvb2xlYW5JbnB1dCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgaW5wdXRQYXNzd29yZEJzPzogSW5wdXRQYXNzd29yZDtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29uZmlybVBhc3N3b3JkRmllbGQpIHtcbiAgICAgIHRoaXMuYWRkVmFsaWRhdG9ycyhJdFZhbGlkYXRvcnMucGFzc3dvcmQoXG4gICAgICAgIHRoaXMubWluTGVuZ3RoLFxuICAgICAgICB0aGlzLnVzZU51bWJlcixcbiAgICAgICAgdGhpcy51c2VDYXBpdGFsQ2FzZSxcbiAgICAgICAgdGhpcy51c2VTbWFsbENhc2UsXG4gICAgICAgIHRoaXMudXNlU3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICAgIHRoaXMucmVxdWlyZWRcbiAgICAgICkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcblxuICAgIGlmICh0aGlzLmlucHV0RWxlbWVudCkge1xuICAgICAgdGhpcy5pbnB1dFBhc3N3b3JkQnMgPSBJbnB1dFBhc3N3b3JkLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBzaG93VGV4dDogdGhpcy5pc1N0cmVuZ3RoTWV0ZXIsXG4gICAgICAgIG1pbmltdW1MZW5ndGg6IHRoaXMubWluTGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlzU3RyZW5ndGhNZXRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNDb25maXJtUGFzc3dvcmRGaWVsZCAmJiBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5zaG93U3RyZW5ndGhNZXRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlzQ29uZmlybVBhc3N3b3JkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmNvbmZpcm1QYXNzd29yZEZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGludmFsaWQgbWVzc2FnZSBzdHJpbmcgZnJvbSBUcmFuc2xhdGVTZXJ2aWNlXG4gICAqL1xuICBvdmVycmlkZSBnZXQgaW52YWxpZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5oYXNFcnJvcignbm9QYXNzd29yZE1hdGNoJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhc3N3b3JkLW5vLW1hdGNoJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtaW5sZW5ndGgnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGFzc3dvcmQtbWluLWxlbmd0aCcsIHtcbiAgICAgICAgbWluTGVuZ3RoOiB0aGlzLm1pbkxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdoYXNOdW1iZXInKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGFzc3dvcmQtbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdoYXNDYXBpdGFsQ2FzZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXNzd29yZC1jYXBpdGFsLWNhc2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2hhc1NtYWxsQ2FzZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXNzd29yZC1jYXBpdGFsLWNhc2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2hhc1NwZWNpYWxDaGFyYWN0ZXJzJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhc3N3b3JkLXNwZWNpYWwtY2hhcmFjdGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmludmFsaWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBkZWZhdWx0IFN0cmVuZ3RoTWV0ZXIgZGVzY3JpcHRpb24gbWVzc2FnZSBmcm9tIFRyYW5zbGF0ZVNlcnZpY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc3RyZW5ndGhNZXRlckRlc2NyaXB0aW9uKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qga2V5cyA9IFsnaXQuZm9ybS5wYXNzd29yZC1zdHJlbmd0aC1tZXRlci5kZXNjcmlwdGlvbi5kZWZhdWx0J107XG4gICAgaWYgKHRoaXMudXNlTnVtYmVyKSB7XG4gICAgICBrZXlzLnB1c2goJ2l0LmZvcm0ucGFzc3dvcmQtc3RyZW5ndGgtbWV0ZXIuZGVzY3JpcHRpb24ubnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVzZUNhcGl0YWxDYXNlKSB7XG4gICAgICBrZXlzLnB1c2goJ2l0LmZvcm0ucGFzc3dvcmQtc3RyZW5ndGgtbWV0ZXIuZGVzY3JpcHRpb24uY2FwaXRhbC1jYXNlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVzZVNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBrZXlzLnB1c2goJ2l0LmZvcm0ucGFzc3dvcmQtc3RyZW5ndGgtbWV0ZXIuZGVzY3JpcHRpb24uc3BlY2lhbC1jaGFyYWN0ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoa2V5cywgeyBtaW5MZW5ndGg6IHRoaXMubWluTGVuZ3RoIH0pLnBpcGUoXG4gICAgICBtYXAobGFiZWxzID0+IE9iamVjdC52YWx1ZXMobGFiZWxzKS5qb2luKCcsICcpKVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiIFtjbGFzcy5hY3RpdmVdPVwiISFjb250cm9sLnZhbHVlIHx8ICEhcGxhY2Vob2xkZXJcIj57e2xhYmVsfX08L2xhYmVsPlxuICA8aW5wdXQgW2lkXT1cImlkXCIgI2lucHV0XG4gICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtcGFzc3dvcmRcIlxuICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1kZXNjcmlwdGlvbidcIlxuICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJpc0NvbmZpcm1QYXNzd29yZEZpZWxkID8gJ29mZicgOiB1bmRlZmluZWRcIj5cblxuICA8c3BhbiBjbGFzcz1cInBhc3N3b3JkLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8aXQtaWNvbiBuYW1lPVwicGFzc3dvcmQtdmlzaWJsZVwiIHNpemU9XCJzbVwiIGNsYXNzPVwicGFzc3dvcmQtaWNvbi12aXNpYmxlXCI+PC9pdC1pY29uPlxuICAgIDxpdC1pY29uIG5hbWU9XCJwYXNzd29yZC1pbnZpc2libGVcIiBzaXplPVwic21cIiBjbGFzcz1cInBhc3N3b3JkLWljb24taW52aXNpYmxlIGQtbm9uZVwiPjwvaXQtaWNvbj5cbiAgPC9zcGFuPlxuXG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWRcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCI+XG4gICAgPGRpdiAjY3VzdG9tRXJyb3I+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXJyb3JdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tRXJyb3IuaGFzQ2hpbGROb2RlcygpXCI+e3tpbnZhbGlkTWVzc2FnZSB8IGFzeW5jfX08L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNtYWxsICpuZ0lmPVwiZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCAmJiAhaXNTdHJlbmd0aE1ldGVyXCIgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIiBjbGFzcz1cImZvcm0tdGV4dFwiPlxuICAgIHt7ZGVzY3JpcHRpb24gIT09IHRydWUgPyBkZXNjcmlwdGlvbiA6IChzdHJlbmd0aE1ldGVyRGVzY3JpcHRpb24gfCBhc3luYyl9fVxuICA8L3NtYWxsPlxuXG4gIDxzbWFsbCBjbGFzcz1cInBhc3N3b3JkLWNhcHMgZm9ybS10ZXh0IHRleHQtd2FybmluZyBwb3NpdGlvbi1hYnNvbHV0ZSBiZy13aGl0ZSB3LTEwMFwiPlxuICAgIHt7J2l0LmZvcm0uY2Fwcy1pbnNlcnRlZCcgfCB0cmFuc2xhdGV9fVxuICA8L3NtYWxsPlxuXG4gIDxkaXYgKm5nSWY9XCJpc1N0cmVuZ3RoTWV0ZXJcIiBjbGFzcz1cInBhc3N3b3JkLXN0cmVuZ3RoLW1ldGVyXCI+XG4gICAgPHNtYWxsIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1tdXRlZFwiXG4gICAgICAgICAgIFthdHRyLmRhdGEtYnMtc2hvcnQtcGFzc109XCInaXQuZm9ybS5wYXNzd29yZC1zdHJlbmd0aC1tZXRlci5wYXNzd29yZC1zaG9ydCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICBbYXR0ci5kYXRhLWJzLWJhZC1wYXNdPVwiJ2l0LmZvcm0ucGFzc3dvcmQtc3RyZW5ndGgtbWV0ZXIucGFzc3dvcmQtYmFkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgIFthdHRyLmRhdGEtYnMtZ29vZC1wYXNzXT1cIidpdC5mb3JtLnBhc3N3b3JkLXN0cmVuZ3RoLW1ldGVyLnBhc3N3b3JkLWdvb2QnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgW2F0dHIuZGF0YS1icy1zdHJvbmctcGFzc109XCInaXQuZm9ybS5wYXNzd29yZC1zdHJlbmd0aC1tZXRlci5wYXNzd29yZC1zdHJvbmcnIHwgdHJhbnNsYXRlXCI+XG4gICAgICB7e2Rlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgZGVzY3JpcHRpb24gIT09IHRydWUgPyBkZXNjcmlwdGlvbiA6IChzdHJlbmd0aE1ldGVyRGVzY3JpcHRpb24gfCBhc3luYyl9fVxuICAgIDwvc21hbGw+XG5cbiAgICA8ZGl2IGNsYXNzPVwicGFzc3dvcmQtbWV0ZXIgcHJvZ3Jlc3Mgcm91bmRlZC0wIHBvc2l0aW9uLWFic29sdXRlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHBvc2l0aW9uLWFic29sdXRlIHctMTAwIG0tMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgYm9yZGVyLXN0YXJ0IGJvcmRlci1lbmQgYm9yZGVyLXdoaXRlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBib3JkZXItc3RhcnQgYm9yZGVyLWVuZCBib3JkZXItd2hpdGVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGJvcmRlci1zdGFydCBib3JkZXItZW5kIGJvcmRlci13aGl0ZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgYm9yZGVyLXN0YXJ0IGJvcmRlci1lbmQgYm9yZGVyLXdoaXRlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgYmctbXV0ZWRcIiByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbm93PVwiMFwiIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgICAgICAgYXJpYS12YWx1ZW1heD1cIjEwMFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,68 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
- import { AbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
- import { isFalseBooleanInput, isTrueBooleanInput } from '../../../utils/boolean-input';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- export class RadioButtonComponent extends AbstractFormComponent {
8
- constructor() {
9
- super(...arguments);
10
- /**
11
- * If show radio inline
12
- * @default false
13
- */
14
- this.inline = false;
15
- /**
16
- * If is radio group
17
- * @default false
18
- */
19
- this.group = false;
20
- }
21
- get isInline() {
22
- return isTrueBooleanInput(this.inline);
23
- }
24
- get isGroup() {
25
- return isTrueBooleanInput(this.group);
26
- }
27
- get name() {
28
- let name = '';
29
- if (this._ngControl) {
30
- name = this._ngControl.name?.toString() || '';
31
- // Retrieve parent name, prevent duplicate name inside FormArray or nested FormGroup
32
- let control = this._ngControl.control?.parent;
33
- while (control?.parent) {
34
- const controls = control?.parent?.controls || {};
35
- const parentName = Object.keys(controls).find(name => control === controls[name]) || null;
36
- if (!parentName) {
37
- break;
38
- }
39
- name = `${parentName}.${name}`; // parent.0.radioName
40
- control = control.parent;
41
- }
42
- }
43
- return name;
44
- }
45
- ngOnInit() {
46
- super.ngOnInit();
47
- if (this.control.value || !this.value || isFalseBooleanInput(this.checked)) {
48
- return;
49
- }
50
- this.writeValue(this.value);
51
- return this.onChange(this.value);
52
- }
53
- }
54
- RadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: RadioButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
55
- RadioButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: RadioButtonComponent, selector: "it-radio-button[value]", inputs: { value: "value", inline: "inline", group: "group", checked: "checked" }, usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"isInline\">\n\n <input\n [id]=\"id\"\n type=\"radio\"\n [value]=\"value\"\n class=\"form-check-input\"\n [name]=\"name\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n\n <label class=\"form-check-label\" [for]=\"id\">\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n </label>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", 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]" }, { kind: "directive", type: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: RadioButtonComponent, decorators: [{
57
- type: Component,
58
- args: [{ selector: 'it-radio-button[value]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"isInline\">\n\n <input\n [id]=\"id\"\n type=\"radio\"\n [value]=\"value\"\n class=\"form-check-input\"\n [name]=\"name\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n\n <label class=\"form-check-label\" [for]=\"id\">\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n </label>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</ng-container>\n" }]
59
- }], propDecorators: { value: [{
60
- type: Input
61
- }], inline: [{
62
- type: Input
63
- }], group: [{
64
- type: Input
65
- }], checked: [{
66
- type: Input
67
- }] } });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9yYWRpby1idXR0b24vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBZ0IsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQVFyRyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEscUJBQWtEO0lBTjVGOztRQWFFOzs7V0FHRztRQUNNLFdBQU0sR0FBaUIsS0FBSyxDQUFDO1FBRXRDOzs7V0FHRztRQUNNLFVBQUssR0FBaUIsS0FBSyxDQUFDO0tBOEN0QztJQXZDQyxJQUFJLFFBQVE7UUFDVixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTlDLG9GQUFvRjtZQUNwRixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDOUMsT0FBTyxPQUFPLEVBQUUsTUFBTSxFQUFFO2dCQUN0QixNQUFNLFFBQVEsR0FBMkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUN6RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQzFGLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2YsTUFBTTtpQkFDUDtnQkFDRCxJQUFJLEdBQUcsR0FBRyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7Z0JBQ3JELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQzFCO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUSxRQUFRO1FBQ2YsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxRSxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7O2lIQTlEVSxvQkFBb0I7cUdBQXBCLG9CQUFvQix1S0NWakMsaThDQTJDQTsyRkRqQ2Esb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNFLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTTs4QkFPdEMsS0FBSztzQkFBYixLQUFLO2dCQU1HLE1BQU07c0JBQWQsS0FBSztnQkFNRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNGYWxzZUJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LXJhZGlvLWJ1dHRvblt2YWx1ZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmFkaW8tYnV0dG9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvQnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50PHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZD4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBUaGUgcmFkaW8gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBzaG93IHJhZGlvIGlubGluZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgaW5saW5lOiBCb29sZWFuSW5wdXQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgaXMgcmFkaW8gZ3JvdXBcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwOiBCb29sZWFuSW5wdXQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgaXMgcmFkaW8gaXMgY2hlY2tlZFxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tlZD86IEJvb2xlYW5JbnB1dDtcblxuICBnZXQgaXNJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmlubGluZSk7XG4gIH1cblxuICBnZXQgaXNHcm91cCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNUcnVlQm9vbGVhbklucHV0KHRoaXMuZ3JvdXApO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICBsZXQgbmFtZSA9ICcnO1xuICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgIG5hbWUgPSB0aGlzLl9uZ0NvbnRyb2wubmFtZT8udG9TdHJpbmcoKSB8fCAnJztcblxuICAgICAgLy8gUmV0cmlldmUgcGFyZW50IG5hbWUsIHByZXZlbnQgZHVwbGljYXRlIG5hbWUgaW5zaWRlIEZvcm1BcnJheSBvciBuZXN0ZWQgRm9ybUdyb3VwXG4gICAgICBsZXQgY29udHJvbCA9IHRoaXMuX25nQ29udHJvbC5jb250cm9sPy5wYXJlbnQ7XG4gICAgICB3aGlsZSAoY29udHJvbD8ucGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0gY29udHJvbD8ucGFyZW50Py5jb250cm9scyB8fCB7fTtcbiAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKS5maW5kKG5hbWUgPT4gY29udHJvbCA9PT0gY29udHJvbHNbbmFtZV0pIHx8IG51bGw7XG4gICAgICAgIGlmICghcGFyZW50TmFtZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgPSBgJHtwYXJlbnROYW1lfS4ke25hbWV9YDsgLy8gcGFyZW50LjAucmFkaW9OYW1lXG4gICAgICAgIGNvbnRyb2wgPSBjb250cm9sLnBhcmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlIHx8ICF0aGlzLnZhbHVlIHx8IGlzRmFsc2VCb29sZWFuSW5wdXQodGhpcy5jaGVja2VkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIlxuICAgICAgIFtjbGFzcy5mb3JtLWNoZWNrLWdyb3VwXT1cImlzR3JvdXBcIlxuICAgICAgIFtjbGFzcy5mb3JtLWNoZWNrLWlubGluZV09XCJpc0lubGluZVwiPlxuXG4gICAgPGlucHV0XG4gICAgICBbaWRdPVwiaWRcIlxuICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc0ludmFsaWRcIlxuICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cImlzVmFsaWRcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZCArICctaGVscCdcIj5cblxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImlkXCI+XG4gICAgICA8ZGl2ICNjdXN0b21MYWJlbD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2xhYmVsXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21MYWJlbC5oYXNDaGlsZE5vZGVzKClcIj57e2xhYmVsfX08L25nLWNvbnRhaW5lcj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPHNtYWxsICpuZ0lmPVwiaXNHcm91cFwiIFtpZF09XCJpZCArICctaGVscCdcIiBjbGFzcz1cImZvcm0tdGV4dFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvc21hbGw+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNJbnZhbGlkICYmIGlzR3JvdXBcIiBjbGFzcz1cImZvcm0tZmVlZGJhY2sganVzdC12YWxpZGF0ZS1lcnJvci1sYWJlbFwiIFtpZF09XCJpZCArICctZXJyb3InXCI+XG4gICAgICA8ZGl2ICNjdXN0b21FcnJvcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21FcnJvci5oYXNDaGlsZE5vZGVzKClcIj57e2ludmFsaWRNZXNzYWdlIHwgYXN5bmN9fTwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWQgJiYgIWlzR3JvdXBcIiBjbGFzcz1cImZvcm0tZmVlZGJhY2sganVzdC12YWxpZGF0ZS1lcnJvci1sYWJlbFwiIFtpZF09XCJpZCArICctZXJyb3InXCI+XG4gICAgPGRpdiAjY3VzdG9tRXJyb3I+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXJyb3JdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tRXJyb3IuaGFzQ2hpbGROb2RlcygpXCI+e3tpbnZhbGlkTWVzc2FnZSB8IGFzeW5jfX08L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==