@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -0,0 +1,330 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, forwardRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { ImageCropperService } from '../image-cropper/services/image-cropper.service';
6
+ import { ModalComponent } from '../modal/modal.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@ngx-translate/core";
9
+ export class ProfilePicturePickerComponent {
10
+ static nextId = 0;
11
+ static allocateComponentId() {
12
+ const nextId = ProfilePicturePickerComponent.nextId;
13
+ ProfilePicturePickerComponent.nextId += 1;
14
+ return `profile-picture-picker-${nextId}`;
15
+ }
16
+ fileInput;
17
+ componentId = ProfilePicturePickerComponent.allocateComponentId();
18
+ subtitle;
19
+ simpleTitle;
20
+ actionTitle;
21
+ removeButtonLabel;
22
+ changeButtonLabel;
23
+ aspectRatio = 1;
24
+ maxFileSize;
25
+ accept;
26
+ supportedExtensions = [];
27
+ confirmBeforeApply = false;
28
+ confirmTitle = 'platform.datacore.profile_picture_picker.confirm_title';
29
+ confirmMessage = 'platform.datacore.profile_picture_picker.confirm_message';
30
+ confirmAcceptLabel = 'platform.datacore.profile_picture_picker.confirm_accept';
31
+ confirmRejectLabel = 'platform.datacore.profile_picture_picker.confirm_reject';
32
+ set image(value) {
33
+ this._image = value;
34
+ this.cdr.markForCheck();
35
+ }
36
+ get image() {
37
+ return this._image;
38
+ }
39
+ imageChange = new EventEmitter();
40
+ removedImage = new EventEmitter();
41
+ invalidFile = new EventEmitter();
42
+ confirmVisible = false;
43
+ dragActive = false;
44
+ _image = null;
45
+ pendingImageData = null;
46
+ cdr = inject(ChangeDetectorRef);
47
+ imageCropperService = inject(ImageCropperService);
48
+ onChange = () => { };
49
+ onTouched = () => { };
50
+ get imageBase64() {
51
+ if (!this._image) {
52
+ return null;
53
+ }
54
+ if (typeof this._image === 'string') {
55
+ return this._image;
56
+ }
57
+ return this._image.base64;
58
+ }
59
+ get hasImage() {
60
+ return !!this.imageBase64;
61
+ }
62
+ get confirmPreview() {
63
+ return this.pendingImageData?.base64 ?? null;
64
+ }
65
+ get resolvedRemoveLabel() {
66
+ return this.removeButtonLabel ?? 'platform.datacore.profile_picture_picker.remove';
67
+ }
68
+ get resolvedChangeLabel() {
69
+ return this.changeButtonLabel ?? 'platform.datacore.profile_picture_picker.change';
70
+ }
71
+ get resolvedSimpleTitle() {
72
+ return this.simpleTitle ?? 'platform.datacore.profile_picture_picker.drag_or';
73
+ }
74
+ get resolvedActionTitle() {
75
+ return this.actionTitle ?? 'platform.datacore.profile_picture_picker.select_file';
76
+ }
77
+ get usesRoundedCrop() {
78
+ return Math.abs(this.aspectRatio - 1) < 0.001;
79
+ }
80
+ get confirmPreviewAspectRatio() {
81
+ return this.usesRoundedCrop ? '1 / 1' : `${this.aspectRatio}`;
82
+ }
83
+ get confirmFooterButtons() {
84
+ return [
85
+ {
86
+ id: 'profile-picture-confirm-reject',
87
+ label: this.confirmRejectLabel,
88
+ severity: 'secondary',
89
+ action: () => this.rejectPendingImage()
90
+ },
91
+ {
92
+ id: 'profile-picture-confirm-accept',
93
+ label: this.confirmAcceptLabel,
94
+ severity: 'primary',
95
+ action: () => this.acceptPendingImage()
96
+ }
97
+ ];
98
+ }
99
+ onAvatarClick() {
100
+ if (this.hasImage) {
101
+ return;
102
+ }
103
+ this.openFileSelector();
104
+ }
105
+ onActionClick() {
106
+ this.onChangeClick();
107
+ }
108
+ onChangeClick() {
109
+ this.openFileSelector();
110
+ }
111
+ onRemoveClick() {
112
+ this._image = null;
113
+ this.onChange(null);
114
+ this.onTouched();
115
+ this.removedImage.emit();
116
+ this.cdr.markForCheck();
117
+ }
118
+ onFileSelected(event) {
119
+ const input = event.target;
120
+ const file = input.files?.[0];
121
+ if (!input.files || !file) {
122
+ return;
123
+ }
124
+ // Reset value so same file can be selected again
125
+ input.value = '';
126
+ this.processFile(file);
127
+ }
128
+ onDragEnter(event) {
129
+ event.preventDefault();
130
+ if (!this.hasDraggedFile(event)) {
131
+ return;
132
+ }
133
+ this.dragActive = true;
134
+ this.cdr.markForCheck();
135
+ }
136
+ onDragOver(event) {
137
+ this.onDragEnter(event);
138
+ }
139
+ onDragLeave(event) {
140
+ const relatedTarget = event.relatedTarget;
141
+ if (relatedTarget && event.currentTarget?.contains(relatedTarget)) {
142
+ return;
143
+ }
144
+ this.dragActive = false;
145
+ this.cdr.markForCheck();
146
+ }
147
+ onDrop(event) {
148
+ event.preventDefault();
149
+ this.dragActive = false;
150
+ const file = event.dataTransfer?.files?.[0];
151
+ if (!file) {
152
+ this.cdr.markForCheck();
153
+ return;
154
+ }
155
+ this.processFile(file);
156
+ }
157
+ onConfirmVisibleChange(visible) {
158
+ this.confirmVisible = visible;
159
+ if (!visible) {
160
+ this.pendingImageData = null;
161
+ }
162
+ this.cdr.markForCheck();
163
+ }
164
+ writeValue(value) {
165
+ this._image = value;
166
+ this.cdr.markForCheck();
167
+ }
168
+ registerOnChange(fn) {
169
+ this.onChange = fn;
170
+ }
171
+ registerOnTouched(fn) {
172
+ this.onTouched = fn;
173
+ }
174
+ setDisabledState(_isDisabled) {
175
+ // Disabled state handling can be extended in phase 2
176
+ this.cdr.markForCheck();
177
+ }
178
+ openFileSelector() {
179
+ this.fileInput?.nativeElement.click();
180
+ }
181
+ processFile(file) {
182
+ const validationError = this.validateFile(file);
183
+ if (validationError) {
184
+ this.invalidFile.emit({ file, validation: validationError });
185
+ this.cdr.markForCheck();
186
+ return;
187
+ }
188
+ const reader = new FileReader();
189
+ reader.onload = (e) => {
190
+ const base64 = e.target?.result;
191
+ this.openCropperWithFile(file, base64);
192
+ };
193
+ reader.readAsDataURL(file);
194
+ }
195
+ validateFile(file) {
196
+ if (!file.type.startsWith('image/')) {
197
+ return 'typeInvalid';
198
+ }
199
+ if (this.supportedExtensions.length > 0) {
200
+ const ext = this.getExtension(file.name);
201
+ const supportedExtensions = this.supportedExtensions.map((entry) => this.normalizeExtension(entry));
202
+ if (!supportedExtensions.includes(ext)) {
203
+ return 'unsupportedExtension';
204
+ }
205
+ }
206
+ if (this.maxFileSize !== undefined && file.size > this.maxFileSize) {
207
+ return 'maxFileSize';
208
+ }
209
+ return null;
210
+ }
211
+ getExtension(filename) {
212
+ const parts = filename.split('.');
213
+ return parts.length > 1 ? this.normalizeExtension(parts[parts.length - 1]) : '';
214
+ }
215
+ normalizeExtension(extension) {
216
+ const normalized = extension.trim().toLowerCase();
217
+ if (!normalized) {
218
+ return '';
219
+ }
220
+ return normalized.startsWith('.') ? normalized : `.${normalized}`;
221
+ }
222
+ openCropperWithFile(file, base64) {
223
+ this.imageCropperService.show({
224
+ imageSource: base64,
225
+ aspectRatio: this.aspectRatio,
226
+ rounded: this.usesRoundedCrop,
227
+ allowRemove: false,
228
+ allowSelectAnother: true,
229
+ changeImage: () => this.openFileSelector(),
230
+ croppedImage: (croppedBase64) => {
231
+ const data = {
232
+ source: file,
233
+ base64: croppedBase64
234
+ };
235
+ this.handleCroppedImageData(data);
236
+ }
237
+ });
238
+ }
239
+ handleCroppedImageData(data) {
240
+ if (!this.confirmBeforeApply) {
241
+ this.applyImageData(data);
242
+ return;
243
+ }
244
+ this.pendingImageData = data;
245
+ this.confirmVisible = true;
246
+ this.cdr.markForCheck();
247
+ }
248
+ applyImageData(data) {
249
+ this._image = data;
250
+ this.onChange(data);
251
+ this.onTouched();
252
+ this.imageChange.emit(data);
253
+ this.cdr.markForCheck();
254
+ }
255
+ acceptPendingImage() {
256
+ if (this.pendingImageData) {
257
+ this.applyImageData(this.pendingImageData);
258
+ }
259
+ this.pendingImageData = null;
260
+ this.confirmVisible = false;
261
+ this.cdr.markForCheck();
262
+ }
263
+ rejectPendingImage() {
264
+ this.pendingImageData = null;
265
+ this.confirmVisible = false;
266
+ this.cdr.markForCheck();
267
+ }
268
+ hasDraggedFile(event) {
269
+ const types = event.dataTransfer?.types;
270
+ return !!types && Array.from(types).includes('Files');
271
+ }
272
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfilePicturePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProfilePicturePickerComponent, isStandalone: true, selector: "sdc-profile-picture-picker", inputs: { subtitle: "subtitle", simpleTitle: "simpleTitle", actionTitle: "actionTitle", removeButtonLabel: "removeButtonLabel", changeButtonLabel: "changeButtonLabel", aspectRatio: "aspectRatio", maxFileSize: "maxFileSize", accept: "accept", supportedExtensions: "supportedExtensions", confirmBeforeApply: "confirmBeforeApply", confirmTitle: "confirmTitle", confirmMessage: "confirmMessage", confirmAcceptLabel: "confirmAcceptLabel", confirmRejectLabel: "confirmRejectLabel", image: "image" }, outputs: { imageChange: "imageChange", removedImage: "removedImage", invalidFile: "invalidFile" }, providers: [
274
+ {
275
+ provide: NG_VALUE_ACCESSOR,
276
+ useExisting: forwardRef(() => ProfilePicturePickerComponent),
277
+ multi: true
278
+ }
279
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"sdc-profile-picture-picker\"\n [class.sdc-profile-picture-picker--dragover]=\"dragActive\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__avatar\"\n [class.sdc-profile-picture-picker__avatar--clickable]=\"!hasImage\"\n (click)=\"onAvatarClick()\"\n [disabled]=\"hasImage\"\n [attr.aria-label]=\"resolvedActionTitle | translate\"\n >\n @if (hasImage) {\n <img\n class=\"sdc-profile-picture-picker__avatar-img\"\n [src]=\"imageBase64\"\n width=\"128\"\n height=\"128\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n } @else {\n <i class=\"far fa-user sdc-profile-picture-picker__avatar-icon\" aria-hidden=\"true\"></i>\n }\n </button>\n\n <div class=\"sdc-profile-picture-picker__info\">\n @if (hasImage) {\n <div class=\"sdc-profile-picture-picker__buttons\">\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__btn sdc-profile-picture-picker__btn--change\"\n (click)=\"onChangeClick()\"\n >\n {{ resolvedChangeLabel | translate }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__btn sdc-profile-picture-picker__btn--remove\"\n (click)=\"onRemoveClick()\"\n >\n {{ resolvedRemoveLabel | translate }}\n </button>\n </div>\n } @else {\n <div class=\"sdc-profile-picture-picker__title\">\n <span class=\"sdc-profile-picture-picker__simple-title\">{{ resolvedSimpleTitle | translate }}</span>\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__action action\"\n (click)=\"onActionClick()\"\n >\n {{ resolvedActionTitle | translate }}\n </button>\n </div>\n }\n\n @if (subtitle) {\n <div class=\"sdc-profile-picture-picker__subtitle\">\n {{ subtitle | translate }}\n </div>\n }\n </div>\n\n <input\n #fileInput\n [id]=\"'profile-picture-input-' + componentId\"\n type=\"file\"\n class=\"sdc-profile-picture-picker__file-input\"\n [accept]=\"accept\"\n [attr.aria-label]=\"resolvedActionTitle | translate\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n (change)=\"onFileSelected($event)\"\n />\n\n <sdc-modal\n [visible]=\"confirmVisible\"\n (visibleChange)=\"onConfirmVisibleChange($event)\"\n [header]=\"confirmTitle\"\n [width]=\"'33.75rem'\"\n [closable]=\"true\"\n [maximizable]=\"false\"\n [responsive]=\"true\"\n [appendToBody]=\"true\"\n [footerButtons]=\"confirmFooterButtons\"\n styleClass=\"sdc-profile-picture-picker__confirm-modal\"\n >\n <div class=\"sdc-profile-picture-picker__confirm-content\">\n <p class=\"sdc-profile-picture-picker__confirm-message\">\n {{ confirmMessage | translate }}\n </p>\n\n @if (confirmPreview) {\n <div\n class=\"sdc-profile-picture-picker__confirm-preview\"\n [class.sdc-profile-picture-picker__confirm-preview--rounded]=\"usesRoundedCrop\"\n >\n <img\n class=\"sdc-profile-picture-picker__confirm-preview-image\"\n [class.sdc-profile-picture-picker__confirm-preview-image--rounded]=\"usesRoundedCrop\"\n [style.aspect-ratio]=\"confirmPreviewAspectRatio\"\n [src]=\"confirmPreview\"\n alt=\"preview\"\n width=\"280\"\n height=\"280\"\n />\n </div>\n }\n </div>\n </sdc-modal>\n</div>\n", styles: [":host{display:block}.sdc-profile-picture-picker{--sdc-ppp-avatar-size: 5rem;--sdc-ppp-avatar-bg: #e5eaea;--sdc-ppp-avatar-color: #697882;--sdc-ppp-action-color: #428bca;--sdc-ppp-subtitle-color: #697882;--sdc-ppp-subtitle-size: .75rem;--sdc-ppp-btn-gap: .5rem;--sdc-ppp-btn-color-change: #428bca;--sdc-ppp-btn-color-remove: #d9534f;display:flex;align-items:center;gap:1.25rem;padding:.5rem;border:1px dashed transparent;border-radius:.75rem;transition:border-color .18s ease,background-color .18s ease,box-shadow .18s ease}.sdc-profile-picture-picker--dragover{border-color:var(--sdc-ppp-action-color);background:#428bca0f;box-shadow:0 0 0 3px #428bca1f}.sdc-profile-picture-picker__avatar{flex-shrink:0;width:var(--sdc-ppp-avatar-size);height:var(--sdc-ppp-avatar-size);border-radius:50%;background-color:var(--sdc-ppp-avatar-bg);color:var(--sdc-ppp-avatar-color);overflow:hidden;display:flex;align-items:center;justify-content:center;font-size:calc(var(--sdc-ppp-avatar-size) * .45)}.sdc-profile-picture-picker__avatar--clickable{cursor:pointer}.sdc-profile-picture-picker__avatar--clickable:hover{opacity:.85}.sdc-profile-picture-picker__avatar--clickable:focus-visible{outline:2px solid var(--sdc-ppp-action-color);outline-offset:2px}.sdc-profile-picture-picker__avatar-img{width:100%;height:100%;object-fit:cover;display:block}.sdc-profile-picture-picker__avatar-icon{pointer-events:none}.sdc-profile-picture-picker__info{display:flex;flex-direction:column;gap:.5rem;min-width:0}.sdc-profile-picture-picker__title{display:flex;flex-wrap:wrap;align-items:baseline;gap:.25rem}.sdc-profile-picture-picker__simple-title{color:inherit}.sdc-profile-picture-picker__action{cursor:pointer;color:var(--sdc-ppp-action-color);text-decoration:underline;background:none;border:none;padding:0;font:inherit}.sdc-profile-picture-picker__action:hover{opacity:.8}.sdc-profile-picture-picker__action:focus-visible{outline:2px solid var(--sdc-ppp-action-color);outline-offset:2px;border-radius:2px}.sdc-profile-picture-picker__subtitle{font-size:var(--sdc-ppp-subtitle-size);color:var(--sdc-ppp-subtitle-color)}.sdc-profile-picture-picker__buttons{display:flex;gap:var(--sdc-ppp-btn-gap);flex-wrap:wrap}.sdc-profile-picture-picker__btn{background:none;border:none;padding:0;font:inherit;cursor:pointer;text-decoration:underline}.sdc-profile-picture-picker__btn--change{color:var(--sdc-ppp-btn-color-change)}.sdc-profile-picture-picker__btn--remove{color:var(--sdc-ppp-btn-color-remove)}.sdc-profile-picture-picker__btn:hover{opacity:.8}.sdc-profile-picture-picker__btn:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}.sdc-profile-picture-picker__file-input{display:none;position:absolute;width:0;height:0;opacity:0;pointer-events:none}.sdc-profile-picture-picker__confirm-content{display:flex;flex-direction:column;gap:1rem}.sdc-profile-picture-picker__confirm-message{margin:0;color:#45535e;font-size:.9375rem;line-height:1.5}.sdc-profile-picture-picker__confirm-preview{display:flex;justify-content:center;padding:1rem;border:1px solid #d7e1e8;border-radius:1rem;background:linear-gradient(180deg,#fcfdff,#f4f8fb)}.sdc-profile-picture-picker__confirm-preview--rounded{border-radius:999px}.sdc-profile-picture-picker__confirm-preview-image{display:block;width:min(100%,15rem);aspect-ratio:1/1;border-radius:1rem;object-fit:cover;box-shadow:0 10px 24px #0f172a24}.sdc-profile-picture-picker__confirm-preview-image--rounded{border-radius:50%}@media (max-width: 640px){.sdc-profile-picture-picker{align-items:flex-start;flex-direction:column}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ModalComponent, selector: "sdc-modal", inputs: ["footerButtons", "header", "height", "maximizable", "maximize", "resizable", "responsive", "width", "zIndex", "closable", "styleClass", "appendToBody", "visible"], outputs: ["hidden", "visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
280
+ }
281
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProfilePicturePickerComponent, decorators: [{
282
+ type: Component,
283
+ args: [{ selector: 'sdc-profile-picture-picker', standalone: true, imports: [CommonModule, TranslateModule, ModalComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
284
+ {
285
+ provide: NG_VALUE_ACCESSOR,
286
+ useExisting: forwardRef(() => ProfilePicturePickerComponent),
287
+ multi: true
288
+ }
289
+ ], template: "<div\n class=\"sdc-profile-picture-picker\"\n [class.sdc-profile-picture-picker--dragover]=\"dragActive\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__avatar\"\n [class.sdc-profile-picture-picker__avatar--clickable]=\"!hasImage\"\n (click)=\"onAvatarClick()\"\n [disabled]=\"hasImage\"\n [attr.aria-label]=\"resolvedActionTitle | translate\"\n >\n @if (hasImage) {\n <img\n class=\"sdc-profile-picture-picker__avatar-img\"\n [src]=\"imageBase64\"\n width=\"128\"\n height=\"128\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n } @else {\n <i class=\"far fa-user sdc-profile-picture-picker__avatar-icon\" aria-hidden=\"true\"></i>\n }\n </button>\n\n <div class=\"sdc-profile-picture-picker__info\">\n @if (hasImage) {\n <div class=\"sdc-profile-picture-picker__buttons\">\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__btn sdc-profile-picture-picker__btn--change\"\n (click)=\"onChangeClick()\"\n >\n {{ resolvedChangeLabel | translate }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__btn sdc-profile-picture-picker__btn--remove\"\n (click)=\"onRemoveClick()\"\n >\n {{ resolvedRemoveLabel | translate }}\n </button>\n </div>\n } @else {\n <div class=\"sdc-profile-picture-picker__title\">\n <span class=\"sdc-profile-picture-picker__simple-title\">{{ resolvedSimpleTitle | translate }}</span>\n <button\n type=\"button\"\n class=\"sdc-profile-picture-picker__action action\"\n (click)=\"onActionClick()\"\n >\n {{ resolvedActionTitle | translate }}\n </button>\n </div>\n }\n\n @if (subtitle) {\n <div class=\"sdc-profile-picture-picker__subtitle\">\n {{ subtitle | translate }}\n </div>\n }\n </div>\n\n <input\n #fileInput\n [id]=\"'profile-picture-input-' + componentId\"\n type=\"file\"\n class=\"sdc-profile-picture-picker__file-input\"\n [accept]=\"accept\"\n [attr.aria-label]=\"resolvedActionTitle | translate\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n (change)=\"onFileSelected($event)\"\n />\n\n <sdc-modal\n [visible]=\"confirmVisible\"\n (visibleChange)=\"onConfirmVisibleChange($event)\"\n [header]=\"confirmTitle\"\n [width]=\"'33.75rem'\"\n [closable]=\"true\"\n [maximizable]=\"false\"\n [responsive]=\"true\"\n [appendToBody]=\"true\"\n [footerButtons]=\"confirmFooterButtons\"\n styleClass=\"sdc-profile-picture-picker__confirm-modal\"\n >\n <div class=\"sdc-profile-picture-picker__confirm-content\">\n <p class=\"sdc-profile-picture-picker__confirm-message\">\n {{ confirmMessage | translate }}\n </p>\n\n @if (confirmPreview) {\n <div\n class=\"sdc-profile-picture-picker__confirm-preview\"\n [class.sdc-profile-picture-picker__confirm-preview--rounded]=\"usesRoundedCrop\"\n >\n <img\n class=\"sdc-profile-picture-picker__confirm-preview-image\"\n [class.sdc-profile-picture-picker__confirm-preview-image--rounded]=\"usesRoundedCrop\"\n [style.aspect-ratio]=\"confirmPreviewAspectRatio\"\n [src]=\"confirmPreview\"\n alt=\"preview\"\n width=\"280\"\n height=\"280\"\n />\n </div>\n }\n </div>\n </sdc-modal>\n</div>\n", styles: [":host{display:block}.sdc-profile-picture-picker{--sdc-ppp-avatar-size: 5rem;--sdc-ppp-avatar-bg: #e5eaea;--sdc-ppp-avatar-color: #697882;--sdc-ppp-action-color: #428bca;--sdc-ppp-subtitle-color: #697882;--sdc-ppp-subtitle-size: .75rem;--sdc-ppp-btn-gap: .5rem;--sdc-ppp-btn-color-change: #428bca;--sdc-ppp-btn-color-remove: #d9534f;display:flex;align-items:center;gap:1.25rem;padding:.5rem;border:1px dashed transparent;border-radius:.75rem;transition:border-color .18s ease,background-color .18s ease,box-shadow .18s ease}.sdc-profile-picture-picker--dragover{border-color:var(--sdc-ppp-action-color);background:#428bca0f;box-shadow:0 0 0 3px #428bca1f}.sdc-profile-picture-picker__avatar{flex-shrink:0;width:var(--sdc-ppp-avatar-size);height:var(--sdc-ppp-avatar-size);border-radius:50%;background-color:var(--sdc-ppp-avatar-bg);color:var(--sdc-ppp-avatar-color);overflow:hidden;display:flex;align-items:center;justify-content:center;font-size:calc(var(--sdc-ppp-avatar-size) * .45)}.sdc-profile-picture-picker__avatar--clickable{cursor:pointer}.sdc-profile-picture-picker__avatar--clickable:hover{opacity:.85}.sdc-profile-picture-picker__avatar--clickable:focus-visible{outline:2px solid var(--sdc-ppp-action-color);outline-offset:2px}.sdc-profile-picture-picker__avatar-img{width:100%;height:100%;object-fit:cover;display:block}.sdc-profile-picture-picker__avatar-icon{pointer-events:none}.sdc-profile-picture-picker__info{display:flex;flex-direction:column;gap:.5rem;min-width:0}.sdc-profile-picture-picker__title{display:flex;flex-wrap:wrap;align-items:baseline;gap:.25rem}.sdc-profile-picture-picker__simple-title{color:inherit}.sdc-profile-picture-picker__action{cursor:pointer;color:var(--sdc-ppp-action-color);text-decoration:underline;background:none;border:none;padding:0;font:inherit}.sdc-profile-picture-picker__action:hover{opacity:.8}.sdc-profile-picture-picker__action:focus-visible{outline:2px solid var(--sdc-ppp-action-color);outline-offset:2px;border-radius:2px}.sdc-profile-picture-picker__subtitle{font-size:var(--sdc-ppp-subtitle-size);color:var(--sdc-ppp-subtitle-color)}.sdc-profile-picture-picker__buttons{display:flex;gap:var(--sdc-ppp-btn-gap);flex-wrap:wrap}.sdc-profile-picture-picker__btn{background:none;border:none;padding:0;font:inherit;cursor:pointer;text-decoration:underline}.sdc-profile-picture-picker__btn--change{color:var(--sdc-ppp-btn-color-change)}.sdc-profile-picture-picker__btn--remove{color:var(--sdc-ppp-btn-color-remove)}.sdc-profile-picture-picker__btn:hover{opacity:.8}.sdc-profile-picture-picker__btn:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}.sdc-profile-picture-picker__file-input{display:none;position:absolute;width:0;height:0;opacity:0;pointer-events:none}.sdc-profile-picture-picker__confirm-content{display:flex;flex-direction:column;gap:1rem}.sdc-profile-picture-picker__confirm-message{margin:0;color:#45535e;font-size:.9375rem;line-height:1.5}.sdc-profile-picture-picker__confirm-preview{display:flex;justify-content:center;padding:1rem;border:1px solid #d7e1e8;border-radius:1rem;background:linear-gradient(180deg,#fcfdff,#f4f8fb)}.sdc-profile-picture-picker__confirm-preview--rounded{border-radius:999px}.sdc-profile-picture-picker__confirm-preview-image{display:block;width:min(100%,15rem);aspect-ratio:1/1;border-radius:1rem;object-fit:cover;box-shadow:0 10px 24px #0f172a24}.sdc-profile-picture-picker__confirm-preview-image--rounded{border-radius:50%}@media (max-width: 640px){.sdc-profile-picture-picker{align-items:flex-start;flex-direction:column}}\n"] }]
290
+ }], propDecorators: { fileInput: [{
291
+ type: ViewChild,
292
+ args: ['fileInput']
293
+ }], subtitle: [{
294
+ type: Input
295
+ }], simpleTitle: [{
296
+ type: Input
297
+ }], actionTitle: [{
298
+ type: Input
299
+ }], removeButtonLabel: [{
300
+ type: Input
301
+ }], changeButtonLabel: [{
302
+ type: Input
303
+ }], aspectRatio: [{
304
+ type: Input
305
+ }], maxFileSize: [{
306
+ type: Input
307
+ }], accept: [{
308
+ type: Input
309
+ }], supportedExtensions: [{
310
+ type: Input
311
+ }], confirmBeforeApply: [{
312
+ type: Input
313
+ }], confirmTitle: [{
314
+ type: Input
315
+ }], confirmMessage: [{
316
+ type: Input
317
+ }], confirmAcceptLabel: [{
318
+ type: Input
319
+ }], confirmRejectLabel: [{
320
+ type: Input
321
+ }], image: [{
322
+ type: Input
323
+ }], imageChange: [{
324
+ type: Output
325
+ }], removedImage: [{
326
+ type: Output
327
+ }], invalidFile: [{
328
+ type: Output
329
+ }] } });
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS1waWN0dXJlLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Byb2ZpbGUtcGljdHVyZS1waWNrZXIvcHJvZmlsZS1waWN0dXJlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Byb2ZpbGUtcGljdHVyZS1waWNrZXIvcHJvZmlsZS1waWN0dXJlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBT3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBb0IxRCxNQUFNLE9BQU8sNkJBQTZCO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWxCLE1BQU0sQ0FBQyxtQkFBbUI7UUFDaEMsTUFBTSxNQUFNLEdBQUcsNkJBQTZCLENBQUMsTUFBTSxDQUFDO1FBQ3BELDZCQUE2QixDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDMUMsT0FBTywwQkFBMEIsTUFBTSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUV1QixTQUFTLENBQWdDO0lBRTlDLFdBQVcsR0FBRyw2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QXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBU0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRmlsZVZhbGlkYXRpb25FcnJvcnMsXG4gIFByb2ZpbGVQaWN0dXJlUGlja2VyRGF0YVxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3Byb2ZpbGUtcGljdHVyZS1waWNrZXIudHlwZSc7XG5pbXBvcnQgdHlwZSB7IE1vZGFsQnV0dG9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9tb2RhbC50eXBlJztcbmltcG9ydCB7IEltYWdlQ3JvcHBlclNlcnZpY2UgfSBmcm9tICcuLi9pbWFnZS1jcm9wcGVyL3NlcnZpY2VzL2ltYWdlLWNyb3BwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5cbnR5cGUgUHJvZmlsZVBpY3R1cmVWYWx1ZSA9IHN0cmluZyB8IFByb2ZpbGVQaWN0dXJlUGlja2VyRGF0YSB8IG51bGw7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBNb2RhbENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9maWxlLXBpY3R1cmUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2ZpbGUtcGljdHVyZS1waWNrZXIuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHJvZmlsZVBpY3R1cmVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUHJvZmlsZVBpY3R1cmVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVDb21wb25lbnRJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRJZCA9IFByb2ZpbGVQaWN0dXJlUGlja2VyQ29tcG9uZW50Lm5leHRJZDtcbiAgICBQcm9maWxlUGljdHVyZVBpY2tlckNvbXBvbmVudC5uZXh0SWQgKz0gMTtcbiAgICByZXR1cm4gYHByb2ZpbGUtcGljdHVyZS1waWNrZXItJHtuZXh0SWR9YDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbXBvbmVudElkID0gUHJvZmlsZVBpY3R1cmVQaWNrZXJDb21wb25lbnQuYWxsb2NhdGVDb21wb25lbnRJZCgpO1xuXG4gIEBJbnB1dCgpIHN1YnRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaW1wbGVUaXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgYWN0aW9uVGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJlbW92ZUJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBjaGFuZ2VCdXR0b25MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgYXNwZWN0UmF0aW8gPSAxO1xuICBASW5wdXQoKSBtYXhGaWxlU2l6ZT86IG51bWJlcjtcbiAgQElucHV0KCkgYWNjZXB0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBzdXBwb3J0ZWRFeHRlbnNpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlQXBwbHkgPSBmYWxzZTtcbiAgQElucHV0KCkgY29uZmlybVRpdGxlID0gJ3BsYXRmb3JtLmRhdGFjb3JlLnByb2ZpbGVfcGljdHVyZV9waWNrZXIuY29uZmlybV90aXRsZSc7XG4gIEBJbnB1dCgpIGNvbmZpcm1NZXNzYWdlID0gJ3BsYXRmb3JtLmRhdGFjb3JlLnByb2ZpbGVfcGljdHVyZV9waWNrZXIuY29uZmlybV9tZXNzYWdlJztcbiAgQElucHV0KCkgY29uZmlybUFjY2VwdExhYmVsID0gJ3BsYXRmb3JtLmRhdGFjb3JlLnByb2ZpbGVfcGljdHVyZV9waWNrZXIuY29uZmlybV9hY2NlcHQnO1xuICBASW5wdXQoKSBjb25maXJtUmVqZWN0TGFiZWwgPSAncGxhdGZvcm0uZGF0YWNvcmUucHJvZmlsZV9waWN0dXJlX3BpY2tlci5jb25maXJtX3JlamVjdCc7XG5cbiAgQElucHV0KCkgc2V0IGltYWdlKHZhbHVlOiBQcm9maWxlUGljdHVyZVZhbHVlKSB7XG4gICAgdGhpcy5faW1hZ2UgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBpbWFnZSgpOiBQcm9maWxlUGljdHVyZVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2U7XG4gIH1cblxuICBAT3V0cHV0KCkgaW1hZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IFByb2ZpbGVQaWN0dXJlUGlja2VyRGF0YT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZWRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGludmFsaWRGaWxlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlVmFsaWRhdGlvbkVycm9ycz4oKTtcblxuICBwcm90ZWN0ZWQgY29uZmlybVZpc2libGUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGRyYWdBY3RpdmUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9pbWFnZTogUHJvZmlsZVBpY3R1cmVWYWx1ZSA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ltYWdlRGF0YTogUHJvZmlsZVBpY3R1cmVQaWNrZXJEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZUNyb3BwZXJTZXJ2aWNlID0gaW5qZWN0KEltYWdlQ3JvcHBlclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nIHwgUHJvZmlsZVBpY3R1cmVQaWNrZXJEYXRhIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgZ2V0IGltYWdlQmFzZTY0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5faW1hZ2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5faW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW1hZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ltYWdlLmJhc2U2NDtcbiAgfVxuXG4gIGdldCBoYXNJbWFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmltYWdlQmFzZTY0O1xuICB9XG5cbiAgZ2V0IGNvbmZpcm1QcmV2aWV3KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdJbWFnZURhdGE/LmJhc2U2NCA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IHJlc29sdmVkUmVtb3ZlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVCdXR0b25MYWJlbCA/PyAncGxhdGZvcm0uZGF0YWNvcmUucHJvZmlsZV9waWN0dXJlX3BpY2tlci5yZW1vdmUnO1xuICB9XG5cbiAgZ2V0IHJlc29sdmVkQ2hhbmdlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VCdXR0b25MYWJlbCA/PyAncGxhdGZvcm0uZGF0YWNvcmUucHJvZmlsZV9waWN0dXJlX3BpY2tlci5jaGFuZ2UnO1xuICB9XG5cbiAgZ2V0IHJlc29sdmVkU2ltcGxlVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zaW1wbGVUaXRsZSA/PyAncGxhdGZvcm0uZGF0YWNvcmUucHJvZmlsZV9waWN0dXJlX3BpY2tlci5kcmFnX29yJztcbiAgfVxuXG4gIGdldCByZXNvbHZlZEFjdGlvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uVGl0bGUgPz8gJ3BsYXRmb3JtLmRhdGFjb3JlLnByb2ZpbGVfcGljdHVyZV9waWNrZXIuc2VsZWN0X2ZpbGUnO1xuICB9XG5cbiAgZ2V0IHVzZXNSb3VuZGVkQ3JvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTWF0aC5hYnModGhpcy5hc3BlY3RSYXRpbyAtIDEpIDwgMC4wMDE7XG4gIH1cblxuICBnZXQgY29uZmlybVByZXZpZXdBc3BlY3RSYXRpbygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVzZXNSb3VuZGVkQ3JvcCA/ICcxIC8gMScgOiBgJHt0aGlzLmFzcGVjdFJhdGlvfWA7XG4gIH1cblxuICBnZXQgY29uZmlybUZvb3RlckJ1dHRvbnMoKTogTW9kYWxCdXR0b25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdwcm9maWxlLXBpY3R1cmUtY29uZmlybS1yZWplY3QnLFxuICAgICAgICBsYWJlbDogdGhpcy5jb25maXJtUmVqZWN0TGFiZWwsXG4gICAgICAgIHNldmVyaXR5OiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLnJlamVjdFBlbmRpbmdJbWFnZSgpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ3Byb2ZpbGUtcGljdHVyZS1jb25maXJtLWFjY2VwdCcsXG4gICAgICAgIGxhYmVsOiB0aGlzLmNvbmZpcm1BY2NlcHRMYWJlbCxcbiAgICAgICAgc2V2ZXJpdHk6ICdwcmltYXJ5JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmFjY2VwdFBlbmRpbmdJbWFnZSgpXG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIG9uQXZhdGFyQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzSW1hZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5GaWxlU2VsZWN0b3IoKTtcbiAgfVxuXG4gIG9uQWN0aW9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUNsaWNrKCk7XG4gIH1cblxuICBvbkNoYW5nZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbkZpbGVTZWxlY3RvcigpO1xuICB9XG5cbiAgb25SZW1vdmVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLl9pbWFnZSA9IG51bGw7XG4gICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMucmVtb3ZlZEltYWdlLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG5cbiAgICBpZiAoIWlucHV0LmZpbGVzIHx8ICFmaWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdmFsdWUgc28gc2FtZSBmaWxlIGNhbiBiZSBzZWxlY3RlZCBhZ2FpblxuICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTtcbiAgfVxuXG4gIG9uRHJhZ0VudGVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5oYXNEcmFnZ2VkRmlsZShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkRyYWdFbnRlcihldmVudCk7XG4gIH1cblxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSB8IG51bGw7XG5cbiAgICBpZiAocmVsYXRlZFRhcmdldCAmJiAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGwpPy5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTtcblxuICAgIGlmICghZmlsZSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTtcbiAgfVxuXG4gIG9uQ29uZmlybVZpc2libGVDaGFuZ2UodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybVZpc2libGUgPSB2aXNpYmxlO1xuXG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICB0aGlzLnBlbmRpbmdJbWFnZURhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogUHJvZmlsZVBpY3R1cmVWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuX2ltYWdlID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IFByb2ZpbGVQaWN0dXJlVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKF9pc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gRGlzYWJsZWQgc3RhdGUgaGFuZGxpbmcgY2FuIGJlIGV4dGVuZGVkIGluIHBoYXNlIDJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkZpbGVTZWxlY3RvcigpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdGhpcy52YWxpZGF0ZUZpbGUoZmlsZSk7XG5cbiAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICB0aGlzLmludmFsaWRGaWxlLmVtaXQoeyBmaWxlLCB2YWxpZGF0aW9uOiB2YWxpZGF0aW9uRXJyb3IgfSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZTY0ID0gZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICB0aGlzLm9wZW5Dcm9wcGVyV2l0aEZpbGUoZmlsZSwgYmFzZTY0KTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGUoZmlsZTogRmlsZSk6IGltcG9ydCgnLi4vLi4vY29yZS90eXBlcy9wcm9maWxlLXBpY3R1cmUtcGlja2VyLnR5cGUnKS5GaWxlVmFsaWRhdGlvbiB8IG51bGwge1xuICAgIGlmICghZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICByZXR1cm4gJ3R5cGVJbnZhbGlkJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRFeHRlbnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0RXh0ZW5zaW9uKGZpbGUubmFtZSk7XG4gICAgICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gdGhpcy5zdXBwb3J0ZWRFeHRlbnNpb25zLm1hcCgoZW50cnkpID0+IHRoaXMubm9ybWFsaXplRXh0ZW5zaW9uKGVudHJ5KSk7XG4gICAgICBpZiAoIXN1cHBvcnRlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkRXh0ZW5zaW9uJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAhPT0gdW5kZWZpbmVkICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgIHJldHVybiAnbWF4RmlsZVNpemUnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHRlbnNpb24oZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBmaWxlbmFtZS5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPiAxID8gdGhpcy5ub3JtYWxpemVFeHRlbnNpb24ocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pIDogJyc7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUV4dGVuc2lvbihleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGV4dGVuc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZC5zdGFydHNXaXRoKCcuJykgPyBub3JtYWxpemVkIDogYC4ke25vcm1hbGl6ZWR9YDtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkNyb3BwZXJXaXRoRmlsZShmaWxlOiBGaWxlLCBiYXNlNjQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VDcm9wcGVyU2VydmljZS5zaG93KHtcbiAgICAgIGltYWdlU291cmNlOiBiYXNlNjQsXG4gICAgICBhc3BlY3RSYXRpbzogdGhpcy5hc3BlY3RSYXRpbyxcbiAgICAgIHJvdW5kZWQ6IHRoaXMudXNlc1JvdW5kZWRDcm9wLFxuICAgICAgYWxsb3dSZW1vdmU6IGZhbHNlLFxuICAgICAgYWxsb3dTZWxlY3RBbm90aGVyOiB0cnVlLFxuICAgICAgY2hhbmdlSW1hZ2U6ICgpID0+IHRoaXMub3BlbkZpbGVTZWxlY3RvcigpLFxuICAgICAgY3JvcHBlZEltYWdlOiAoY3JvcHBlZEJhc2U2NDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGE6IFByb2ZpbGVQaWN0dXJlUGlja2VyRGF0YSA9IHtcbiAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgYmFzZTY0OiBjcm9wcGVkQmFzZTY0XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlQ3JvcHBlZEltYWdlRGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ3JvcHBlZEltYWdlRGF0YShkYXRhOiBQcm9maWxlUGljdHVyZVBpY2tlckRhdGEpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybUJlZm9yZUFwcGx5KSB7XG4gICAgICB0aGlzLmFwcGx5SW1hZ2VEYXRhKGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ltYWdlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5jb25maXJtVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW1hZ2VEYXRhKGRhdGE6IFByb2ZpbGVQaWN0dXJlUGlja2VyRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuX2ltYWdlID0gZGF0YTtcbiAgICB0aGlzLm9uQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pbWFnZUNoYW5nZS5lbWl0KGRhdGEpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhY2NlcHRQZW5kaW5nSW1hZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0ltYWdlRGF0YSkge1xuICAgICAgdGhpcy5hcHBseUltYWdlRGF0YSh0aGlzLnBlbmRpbmdJbWFnZURhdGEpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5jb25maXJtVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RQZW5kaW5nSW1hZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nSW1hZ2VEYXRhID0gbnVsbDtcbiAgICB0aGlzLmNvbmZpcm1WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0RyYWdnZWRGaWxlKGV2ZW50OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8udHlwZXM7XG4gICAgcmV0dXJuICEhdHlwZXMgJiYgQXJyYXkuZnJvbSh0eXBlcykuaW5jbHVkZXMoJ0ZpbGVzJyk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlclwiXG4gIFtjbGFzcy5zZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlci0tZHJhZ292ZXJdPVwiZHJhZ0FjdGl2ZVwiXG4gIChkcmFnZW50ZXIpPVwib25EcmFnRW50ZXIoJGV2ZW50KVwiXG4gIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxuICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIlxuICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiXG4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19hdmF0YXJcIlxuICAgIFtjbGFzcy5zZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fYXZhdGFyLS1jbGlja2FibGVdPVwiIWhhc0ltYWdlXCJcbiAgICAoY2xpY2spPVwib25BdmF0YXJDbGljaygpXCJcbiAgICBbZGlzYWJsZWRdPVwiaGFzSW1hZ2VcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb2x2ZWRBY3Rpb25UaXRsZSB8IHRyYW5zbGF0ZVwiXG4gID5cbiAgICBAaWYgKGhhc0ltYWdlKSB7XG4gICAgICA8aW1nXG4gICAgICAgIGNsYXNzPVwic2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2F2YXRhci1pbWdcIlxuICAgICAgICBbc3JjXT1cImltYWdlQmFzZTY0XCJcbiAgICAgICAgd2lkdGg9XCIxMjhcIlxuICAgICAgICBoZWlnaHQ9XCIxMjhcIlxuICAgICAgICBhbHQ9XCJcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXVzZXIgc2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2F2YXRhci1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIH1cbiAgPC9idXR0b24+XG5cbiAgPGRpdiBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19pbmZvXCI+XG4gICAgQGlmIChoYXNJbWFnZSkge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19idXR0b25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19idG4gc2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2J0bi0tY2hhbmdlXCJcbiAgICAgICAgICAoY2xpY2spPVwib25DaGFuZ2VDbGljaygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHJlc29sdmVkQ2hhbmdlTGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2J0biBzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fYnRuLS1yZW1vdmVcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUNsaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcmVzb2x2ZWRSZW1vdmVMYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX190aXRsZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19zaW1wbGUtdGl0bGVcIj57eyByZXNvbHZlZFNpbXBsZVRpdGxlIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fYWN0aW9uIGFjdGlvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uQ2xpY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyByZXNvbHZlZEFjdGlvblRpdGxlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChzdWJ0aXRsZSkge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19zdWJ0aXRsZVwiPlxuICAgICAgICB7eyBzdWJ0aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8aW5wdXRcbiAgICAjZmlsZUlucHV0XG4gICAgW2lkXT1cIidwcm9maWxlLXBpY3R1cmUtaW5wdXQtJyArIGNvbXBvbmVudElkXCJcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgY2xhc3M9XCJzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fZmlsZS1pbnB1dFwiXG4gICAgW2FjY2VwdF09XCJhY2NlcHRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb2x2ZWRBY3Rpb25UaXRsZSB8IHRyYW5zbGF0ZVwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxuICAvPlxuXG4gIDxzZGMtbW9kYWxcbiAgICBbdmlzaWJsZV09XCJjb25maXJtVmlzaWJsZVwiXG4gICAgKHZpc2libGVDaGFuZ2UpPVwib25Db25maXJtVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICBbaGVhZGVyXT1cImNvbmZpcm1UaXRsZVwiXG4gICAgW3dpZHRoXT1cIiczMy43NXJlbSdcIlxuICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgIFtyZXNwb25zaXZlXT1cInRydWVcIlxuICAgIFthcHBlbmRUb0JvZHldPVwidHJ1ZVwiXG4gICAgW2Zvb3RlckJ1dHRvbnNdPVwiY29uZmlybUZvb3RlckJ1dHRvbnNcIlxuICAgIHN0eWxlQ2xhc3M9XCJzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fY29uZmlybS1tb2RhbFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2NvbmZpcm0tY29udGVudFwiPlxuICAgICAgPHAgY2xhc3M9XCJzZGMtcHJvZmlsZS1waWN0dXJlLXBpY2tlcl9fY29uZmlybS1tZXNzYWdlXCI+XG4gICAgICAgIHt7IGNvbmZpcm1NZXNzYWdlIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3A+XG5cbiAgICAgIEBpZiAoY29uZmlybVByZXZpZXcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2NvbmZpcm0tcHJldmlld1wiXG4gICAgICAgICAgW2NsYXNzLnNkYy1wcm9maWxlLXBpY3R1cmUtcGlja2VyX19jb25maXJtLXByZXZpZXctLXJvdW5kZWRdPVwidXNlc1JvdW5kZWRDcm9wXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2NvbmZpcm0tcHJldmlldy1pbWFnZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2RjLXByb2ZpbGUtcGljdHVyZS1waWNrZXJfX2NvbmZpcm0tcHJldmlldy1pbWFnZS0tcm91bmRlZF09XCJ1c2VzUm91bmRlZENyb3BcIlxuICAgICAgICAgICAgW3N0eWxlLmFzcGVjdC1yYXRpb109XCJjb25maXJtUHJldmlld0FzcGVjdFJhdGlvXCJcbiAgICAgICAgICAgIFtzcmNdPVwiY29uZmlybVByZXZpZXdcIlxuICAgICAgICAgICAgYWx0PVwicHJldmlld1wiXG4gICAgICAgICAgICB3aWR0aD1cIjI4MFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyODBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1tb2RhbD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,86 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewEncapsulation, forwardRef, inject } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
5
+ import { RATING_SCALE_ARIA_LABEL_KEY } from '../../core/constants/rating-scale.const';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngx-translate/core";
8
+ export class RatingScaleComponent {
9
+ cdr = inject(ChangeDetectorRef);
10
+ translate = inject(TranslateService);
11
+ nodes = [];
12
+ startLabel;
13
+ endLabel;
14
+ disabled = false;
15
+ value = null;
16
+ onChangeFn = () => { };
17
+ onTouchedFn = () => { };
18
+ get groupAriaLabel() {
19
+ if (this.startLabel && this.endLabel) {
20
+ return `${this.translate.instant(this.startLabel)} - ${this.translate.instant(this.endLabel)}`;
21
+ }
22
+ if (this.startLabel) {
23
+ return this.translate.instant(this.startLabel);
24
+ }
25
+ if (this.endLabel) {
26
+ return this.translate.instant(this.endLabel);
27
+ }
28
+ return this.translate.instant(RATING_SCALE_ARIA_LABEL_KEY);
29
+ }
30
+ isSelected(node) {
31
+ return this.value?.id === node.id;
32
+ }
33
+ getNodeAriaLabel(node) {
34
+ return node.title ? this.translate.instant(node.title) : node.id;
35
+ }
36
+ selectNode(node) {
37
+ if (this.disabled) {
38
+ return;
39
+ }
40
+ this.value = node;
41
+ this.onChangeFn(node);
42
+ this.onTouchedFn();
43
+ this.cdr.markForCheck();
44
+ }
45
+ writeValue(value) {
46
+ this.value = value ?? null;
47
+ this.cdr.markForCheck();
48
+ }
49
+ registerOnChange(fn) {
50
+ this.onChangeFn = fn;
51
+ }
52
+ registerOnTouched(fn) {
53
+ this.onTouchedFn = fn;
54
+ }
55
+ setDisabledState(isDisabled) {
56
+ this.disabled = isDisabled;
57
+ this.cdr.markForCheck();
58
+ }
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RatingScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RatingScaleComponent, isStandalone: true, selector: "sdc-rating-scale", inputs: { nodes: "nodes", startLabel: "startLabel", endLabel: "endLabel", disabled: "disabled" }, providers: [
61
+ {
62
+ provide: NG_VALUE_ACCESSOR,
63
+ useExisting: forwardRef(() => RatingScaleComponent),
64
+ multi: true
65
+ }
66
+ ], ngImport: i0, template: "<div\n class=\"sdc-rating-scale\"\n [class.sdc-rating-scale--disabled]=\"disabled\"\n>\n <div class=\"sdc-rating-scale__track\">\n @if (startLabel) {\n <span class=\"sdc-rating-scale__extreme-label sdc-rating-scale__extreme-label--start\">\n {{ startLabel | translate }}\n </span>\n }\n\n <div\n class=\"sdc-rating-scale__nodes\"\n role=\"radiogroup\"\n [attr.aria-label]=\"groupAriaLabel\"\n [attr.aria-disabled]=\"disabled\"\n >\n @for (node of nodes; track node.id) {\n <button\n type=\"button\"\n class=\"sdc-rating-scale__node\"\n [class.sdc-rating-scale__node--selected]=\"isSelected(node)\"\n [attr.aria-label]=\"getNodeAriaLabel(node)\"\n [disabled]=\"disabled\"\n (click)=\"selectNode(node)\"\n >\n @if (node.icon) {\n <i class=\"sdc-rating-scale__node-icon fa {{ node.icon }}\" aria-hidden=\"true\"></i>\n }\n\n @if (node.title) {\n <span class=\"sdc-rating-scale__node-title\">{{ node.title | translate }}</span>\n }\n </button>\n }\n </div>\n\n @if (endLabel) {\n <span class=\"sdc-rating-scale__extreme-label sdc-rating-scale__extreme-label--end\">\n {{ endLabel | translate }}\n </span>\n }\n </div>\n</div>\n", styles: [":host{display:block}.sdc-rating-scale{--sdc-rating-scale-node-bg: #fff;--sdc-rating-scale-node-border: #7892a1;--sdc-rating-scale-node-radius: 6px;--sdc-rating-scale-node-selected-bg: #d5e8ec;--sdc-rating-scale-node-selected-border: #428bca;--sdc-rating-scale-node-selected-color: #428bca;--sdc-rating-scale-node-hover-bg: #dedce5;--sdc-rating-scale-icon-color: #6e7280;--sdc-rating-scale-label-color: #212533;--sdc-rating-scale-extreme-label-color: #080808;font-family:var(--sdc-font-family, \"Open Sans\", sans-serif)}.sdc-rating-scale--disabled{cursor:not-allowed;opacity:.65}.sdc-rating-scale__track{align-items:center;display:flex;gap:.75rem}.sdc-rating-scale__nodes{align-items:center;display:flex;flex:1;gap:.5rem;justify-content:center}.sdc-rating-scale__node{align-items:center;background:var(--sdc-rating-scale-node-bg);border:1px solid var(--sdc-rating-scale-node-border);border-radius:var(--sdc-rating-scale-node-radius);box-sizing:border-box;color:var(--sdc-rating-scale-label-color);cursor:pointer;display:inline-flex;flex:1 1 0%;flex-direction:column;font-family:inherit;font-size:.875rem;gap:.25rem;justify-content:center;max-width:5.5rem;min-height:2.5rem;min-width:2.5rem;padding:.375rem .5rem;transition:background var(--sdc-transition-fast, .18s ease),border-color var(--sdc-transition-fast, .18s ease),color var(--sdc-transition-fast, .18s ease)}.sdc-rating-scale__node:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-rating-scale__node:disabled{cursor:not-allowed;pointer-events:none}.sdc-rating-scale__node:hover:not(:disabled){background:var(--sdc-rating-scale-node-hover-bg)}.sdc-rating-scale__node--selected{background:var(--sdc-rating-scale-node-selected-bg);border-color:var(--sdc-rating-scale-node-selected-border);color:var(--sdc-rating-scale-node-selected-color)}.sdc-rating-scale__node-icon{color:var(--sdc-rating-scale-icon-color);font-size:1.125rem}.sdc-rating-scale__node--selected .sdc-rating-scale__node-icon{color:var(--sdc-rating-scale-node-selected-color)}.sdc-rating-scale__node-title{font-size:.75rem;line-height:1}.sdc-rating-scale__extreme-label{color:var(--sdc-rating-scale-extreme-label-color);font-size:.75rem;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RatingScaleComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'sdc-rating-scale', standalone: true, imports: [CommonModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
71
+ {
72
+ provide: NG_VALUE_ACCESSOR,
73
+ useExisting: forwardRef(() => RatingScaleComponent),
74
+ multi: true
75
+ }
76
+ ], template: "<div\n class=\"sdc-rating-scale\"\n [class.sdc-rating-scale--disabled]=\"disabled\"\n>\n <div class=\"sdc-rating-scale__track\">\n @if (startLabel) {\n <span class=\"sdc-rating-scale__extreme-label sdc-rating-scale__extreme-label--start\">\n {{ startLabel | translate }}\n </span>\n }\n\n <div\n class=\"sdc-rating-scale__nodes\"\n role=\"radiogroup\"\n [attr.aria-label]=\"groupAriaLabel\"\n [attr.aria-disabled]=\"disabled\"\n >\n @for (node of nodes; track node.id) {\n <button\n type=\"button\"\n class=\"sdc-rating-scale__node\"\n [class.sdc-rating-scale__node--selected]=\"isSelected(node)\"\n [attr.aria-label]=\"getNodeAriaLabel(node)\"\n [disabled]=\"disabled\"\n (click)=\"selectNode(node)\"\n >\n @if (node.icon) {\n <i class=\"sdc-rating-scale__node-icon fa {{ node.icon }}\" aria-hidden=\"true\"></i>\n }\n\n @if (node.title) {\n <span class=\"sdc-rating-scale__node-title\">{{ node.title | translate }}</span>\n }\n </button>\n }\n </div>\n\n @if (endLabel) {\n <span class=\"sdc-rating-scale__extreme-label sdc-rating-scale__extreme-label--end\">\n {{ endLabel | translate }}\n </span>\n }\n </div>\n</div>\n", styles: [":host{display:block}.sdc-rating-scale{--sdc-rating-scale-node-bg: #fff;--sdc-rating-scale-node-border: #7892a1;--sdc-rating-scale-node-radius: 6px;--sdc-rating-scale-node-selected-bg: #d5e8ec;--sdc-rating-scale-node-selected-border: #428bca;--sdc-rating-scale-node-selected-color: #428bca;--sdc-rating-scale-node-hover-bg: #dedce5;--sdc-rating-scale-icon-color: #6e7280;--sdc-rating-scale-label-color: #212533;--sdc-rating-scale-extreme-label-color: #080808;font-family:var(--sdc-font-family, \"Open Sans\", sans-serif)}.sdc-rating-scale--disabled{cursor:not-allowed;opacity:.65}.sdc-rating-scale__track{align-items:center;display:flex;gap:.75rem}.sdc-rating-scale__nodes{align-items:center;display:flex;flex:1;gap:.5rem;justify-content:center}.sdc-rating-scale__node{align-items:center;background:var(--sdc-rating-scale-node-bg);border:1px solid var(--sdc-rating-scale-node-border);border-radius:var(--sdc-rating-scale-node-radius);box-sizing:border-box;color:var(--sdc-rating-scale-label-color);cursor:pointer;display:inline-flex;flex:1 1 0%;flex-direction:column;font-family:inherit;font-size:.875rem;gap:.25rem;justify-content:center;max-width:5.5rem;min-height:2.5rem;min-width:2.5rem;padding:.375rem .5rem;transition:background var(--sdc-transition-fast, .18s ease),border-color var(--sdc-transition-fast, .18s ease),color var(--sdc-transition-fast, .18s ease)}.sdc-rating-scale__node:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-rating-scale__node:disabled{cursor:not-allowed;pointer-events:none}.sdc-rating-scale__node:hover:not(:disabled){background:var(--sdc-rating-scale-node-hover-bg)}.sdc-rating-scale__node--selected{background:var(--sdc-rating-scale-node-selected-bg);border-color:var(--sdc-rating-scale-node-selected-border);color:var(--sdc-rating-scale-node-selected-color)}.sdc-rating-scale__node-icon{color:var(--sdc-rating-scale-icon-color);font-size:1.125rem}.sdc-rating-scale__node--selected .sdc-rating-scale__node-icon{color:var(--sdc-rating-scale-node-selected-color)}.sdc-rating-scale__node-title{font-size:.75rem;line-height:1}.sdc-rating-scale__extreme-label{color:var(--sdc-rating-scale-extreme-label-color);font-size:.75rem;white-space:nowrap}\n"] }]
77
+ }], propDecorators: { nodes: [{
78
+ type: Input
79
+ }], startLabel: [{
80
+ type: Input
81
+ }], endLabel: [{
82
+ type: Input
83
+ }], disabled: [{
84
+ type: Input
85
+ }] } });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLXNjYWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvcmF0aW5nLXNjYWxlL3JhdGluZy1zY2FsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3JhdGluZy1zY2FsZS9yYXRpbmctc2NhbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7O0FBbUJ0RixNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3QyxLQUFLLEdBQXNCLEVBQUUsQ0FBQztJQUM5QixVQUFVLENBQVU7SUFDcEIsUUFBUSxDQUFVO0lBQ2xCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFMUIsS0FBSyxHQUEyQixJQUFJLENBQUM7SUFFN0IsVUFBVSxHQUE0QyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDL0QsV0FBVyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUUzQyxJQUFJLGNBQWM7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElB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Q0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBSQVRJTkdfU0NBTEVfQVJJQV9MQUJFTF9LRVkgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9yYXRpbmctc2NhbGUuY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBSYXRpbmdTY2FsZU5vZGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3JhdGluZy1zY2FsZS50eXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXJhdGluZy1zY2FsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yYXRpbmctc2NhbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmF0aW5nLXNjYWxlLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhdGluZ1NjYWxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJhdGluZ1NjYWxlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIG5vZGVzOiBSYXRpbmdTY2FsZU5vZGVbXSA9IFtdO1xuICBASW5wdXQoKSBzdGFydExhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBlbmRMYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICB2YWx1ZTogUmF0aW5nU2NhbGVOb2RlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IFJhdGluZ1NjYWxlTm9kZSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWRGbjogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGdldCBncm91cEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN0YXJ0TGFiZWwgJiYgdGhpcy5lbmRMYWJlbCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5zdGFydExhYmVsKX0gLSAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5lbmRMYWJlbCl9YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFydExhYmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnN0YXJ0TGFiZWwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZExhYmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmVuZExhYmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudChSQVRJTkdfU0NBTEVfQVJJQV9MQUJFTF9LRVkpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChub2RlOiBSYXRpbmdTY2FsZU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaWQgPT09IG5vZGUuaWQ7XG4gIH1cblxuICBnZXROb2RlQXJpYUxhYmVsKG5vZGU6IFJhdGluZ1NjYWxlTm9kZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vZGUudGl0bGUgPyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG5vZGUudGl0bGUpIDogbm9kZS5pZDtcbiAgfVxuXG4gIHNlbGVjdE5vZGUobm9kZTogUmF0aW5nU2NhbGVOb2RlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gbm9kZTtcbiAgICB0aGlzLm9uQ2hhbmdlRm4obm9kZSk7XG4gICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogUmF0aW5nU2NhbGVOb2RlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSA/PyBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBSYXRpbmdTY2FsZU5vZGUgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2RjLXJhdGluZy1zY2FsZVwiXG4gIFtjbGFzcy5zZGMtcmF0aW5nLXNjYWxlLS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJzZGMtcmF0aW5nLXNjYWxlX190cmFja1wiPlxuICAgIEBpZiAoc3RhcnRMYWJlbCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtcmF0aW5nLXNjYWxlX19leHRyZW1lLWxhYmVsIHNkYy1yYXRpbmctc2NhbGVfX2V4dHJlbWUtbGFiZWwtLXN0YXJ0XCI+XG4gICAgICAgIHt7IHN0YXJ0TGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNkYy1yYXRpbmctc2NhbGVfX25vZGVzXCJcbiAgICAgIHJvbGU9XCJyYWRpb2dyb3VwXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ3JvdXBBcmlhTGFiZWxcIlxuICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgPlxuICAgICAgQGZvciAobm9kZSBvZiBub2RlczsgdHJhY2sgbm9kZS5pZCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJzZGMtcmF0aW5nLXNjYWxlX19ub2RlXCJcbiAgICAgICAgICBbY2xhc3Muc2RjLXJhdGluZy1zY2FsZV9fbm9kZS0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXROb2RlQXJpYUxhYmVsKG5vZGUpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3ROb2RlKG5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAobm9kZS5pY29uKSB7XG4gICAgICAgICAgICA8aSBjbGFzcz1cInNkYy1yYXRpbmctc2NhbGVfX25vZGUtaWNvbiBmYSB7eyBub2RlLmljb24gfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChub2RlLnRpdGxlKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1yYXRpbmctc2NhbGVfX25vZGUtdGl0bGVcIj57eyBub2RlLnRpdGxlIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGVuZExhYmVsKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cInNkYy1yYXRpbmctc2NhbGVfX2V4dHJlbWUtbGFiZWwgc2RjLXJhdGluZy1zY2FsZV9fZXh0cmVtZS1sYWJlbC0tZW5kXCI+XG4gICAgICAgIHt7IGVuZExhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19