ngx-t-forms 2.0.29 → 2.0.31

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 (161) hide show
  1. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs +104 -0
  2. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs.map +1 -0
  3. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs +85 -0
  4. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs.map +1 -0
  5. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs +643 -0
  6. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs.map +1 -0
  7. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs +97 -0
  8. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs.map +1 -0
  9. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs +195 -0
  10. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs.map +1 -0
  11. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs +261 -0
  12. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs.map +1 -0
  13. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs +85 -0
  14. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs.map +1 -0
  15. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs +156 -0
  16. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs.map +1 -0
  17. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs +368 -0
  18. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map +1 -0
  19. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs +704 -0
  20. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs.map +1 -0
  21. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs +294 -0
  22. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map +1 -0
  23. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs +240 -0
  24. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs.map +1 -0
  25. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs +205 -0
  26. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs.map +1 -0
  27. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs +86 -0
  28. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs.map +1 -0
  29. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs +22 -0
  30. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs.map +1 -0
  31. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs +179 -0
  32. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs.map +1 -0
  33. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs +319 -0
  34. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs.map +1 -0
  35. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs +379 -0
  36. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs.map +1 -0
  37. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs +124 -0
  38. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs.map +1 -0
  39. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
  40. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
  41. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs +180 -0
  42. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs.map +1 -0
  43. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs +2 -0
  44. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs.map +1 -0
  45. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs +105 -0
  46. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs.map +1 -0
  47. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs +181 -0
  48. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs.map +1 -0
  49. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs} +12 -14
  50. package/fesm2022/ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs.map +1 -0
  51. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs +66 -0
  52. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs.map +1 -0
  53. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
  54. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
  55. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
  56. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
  57. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs +38 -0
  58. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs.map +1 -0
  59. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs +38 -0
  60. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs.map +1 -0
  61. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
  62. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
  63. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs +336 -0
  64. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs.map +1 -0
  65. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
  66. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
  67. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs +905 -0
  68. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs.map +1 -0
  69. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs +19461 -0
  70. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs.map +1 -0
  71. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs +555 -0
  72. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs.map +1 -0
  73. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs +748 -0
  74. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs.map +1 -0
  75. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs +358 -0
  76. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs.map +1 -0
  77. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs +272 -0
  78. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs.map +1 -0
  79. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs +398 -0
  80. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs.map +1 -0
  81. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
  82. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
  83. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs +98 -0
  84. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs.map +1 -0
  85. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs +150 -0
  86. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs.map +1 -0
  87. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs +169 -0
  88. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs.map +1 -0
  89. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs +204 -0
  90. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs.map +1 -0
  91. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs +95 -0
  92. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs.map +1 -0
  93. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs +82 -0
  94. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs.map +1 -0
  95. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs +733 -0
  96. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs.map +1 -0
  97. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs +1303 -0
  98. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs.map +1 -0
  99. package/fesm2022/ngx-t-forms.mjs +2 -1
  100. package/fesm2022/ngx-t-forms.mjs.map +1 -1
  101. package/package.json +20 -18
  102. package/styles/_editor-mixins.scss +62 -0
  103. package/styles/_json-editor-syntax.scss +26 -0
  104. package/styles/_signature-pad.scss +26 -0
  105. package/styles/_tokens.scss +148 -0
  106. package/types/ngx-t-forms.d.ts +1767 -621
  107. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs +0 -313
  108. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map +0 -1
  109. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs +0 -191
  110. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map +0 -1
  111. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs +0 -207
  112. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map +0 -1
  113. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs +0 -204
  114. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map +0 -1
  115. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs +0 -289
  116. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs +0 -134
  118. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs +0 -22
  120. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs.map +0 -1
  121. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  122. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  123. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs +0 -345
  124. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map +0 -1
  125. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs +0 -147
  126. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs.map +0 -1
  127. package/fesm2022/ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map +0 -1
  128. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs +0 -105
  129. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map +0 -1
  130. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs +0 -109
  131. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs +0 -155
  133. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs +0 -28
  135. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs +0 -43
  137. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs +0 -116
  139. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs +0 -296
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map +0 -1
  142. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs +0 -83
  143. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs +0 -16844
  145. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs +0 -613
  147. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs +0 -269
  149. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map +0 -1
  150. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs +0 -190
  151. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map +0 -1
  152. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs +0 -291
  153. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map +0 -1
  154. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs +0 -156
  155. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs.map +0 -1
  156. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs +0 -186
  157. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map +0 -1
  158. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs +0 -187
  159. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map +0 -1
  160. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs +0 -215
  161. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.html","../../../projects/ngx-t-forms/src/lib/shared/functions/mapColors.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TextFieldModule } from '@angular/cdk/text-field';\r\n\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { tap } from 'rxjs';\r\nimport { FormColumnInputs, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { getInputIcon } from '../../../../../../shared/functions/getInputIcon';\r\n\r\n@Component({\r\n selector: 'lib-points-creation',\r\n templateUrl: './points-creation.component.html',\r\n styleUrls: ['./points-creation.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n imports: [\r\n ReactiveFormsModule,\r\n FormsModule,\r\n TextFieldModule,\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n ],\r\n})\r\nexport class PointsCreationComponent {\r\n readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n /** Tower step column config that drives column layout, types, and disabled/readonly state. */\r\n readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n\r\n /** Existing points list pushed in from the parent (workflow-adjudication-reactive-input). */\r\n // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n // `WorkflowAdjudicationValue | null` union of three incompatible shapes. Until the parent\r\n // template is split per adjudication step type, this input must remain `any`.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n readonly value = input<any>(null);\r\n\r\n /** Emits the updated points list whenever the user saves, edits, or removes a row. */\r\n readonly pointsChange = output<WorkflowAdjudicationScoreSheetValue[]>();\r\n\r\n protected pointRow: WorkflowAdjudicationScoreSheetValue = this.#createDefaultPointRow();\r\n protected selectAllWorkflowInputs: FormColumnInputs[] = [];\r\n #points: WorkflowAdjudicationScoreSheetValue[] = [];\r\n\r\n /** Material table columns derived from the input config. */\r\n protected readonly cols = computed(() => {\r\n const cfg = this.inputConfig();\r\n let cols: string[] = (cfg?.adjudicationPointTypes?.length || 0) > 0\r\n ? ['description', 'totalPoints', 'pointType', 'actions']\r\n : ['description', 'totalPoints', 'actions'];\r\n if (cfg?.disabled || !!cfg?.readonly) {\r\n cols = cols.filter(col => col !== 'actions');\r\n }\r\n return cols;\r\n });\r\n\r\n /** Mirrors the legacy `set value` setter — pushes incoming `value` into the internal `#points` buffer. */\r\n protected readonly valueBridge = effect(() => {\r\n const next = this.value();\r\n this.#points = (next || []) as WorkflowAdjudicationScoreSheetValue[];\r\n });\r\n\r\n constructor() {\r\n this.#config.formBuilder.getCurrentFormAvailableInputOptions().pipe(\r\n tap((inputs: FormColumnInputs[]) => {\r\n this.selectAllWorkflowInputs = inputs;\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n protected get points(): WorkflowAdjudicationScoreSheetValue[] {\r\n const cfg = this.inputConfig();\r\n if (cfg?.disabled || !!cfg?.readonly) {\r\n return this.#points;\r\n }\r\n return [...this.#points, this.pointRow];\r\n }\r\n\r\n protected get filteredInputs(): FormColumnInputs[] {\r\n const description = this.pointRow.description?.toLowerCase() || '';\r\n if (!description) {\r\n return this.selectAllWorkflowInputs;\r\n }\r\n const regex = new RegExp(description.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i');\r\n return this.selectAllWorkflowInputs.filter((input: FormColumnInputs) =>\r\n (typeof input.label === 'string' && regex.test(input.label)) ||\r\n (typeof input.hintLabel === 'string' && regex.test(input.hintLabel)),\r\n );\r\n }\r\n\r\n protected get pointInEditIsValid(): boolean {\r\n const cfg = this.inputConfig();\r\n const typeRequired = (cfg?.adjudicationPointTypes?.length || 0) > 0;\r\n return !!this.pointRow.description && this.pointRow.totalPoints > 0 && (!typeRequired || !!this.pointRow.pointType);\r\n }\r\n\r\n #createDefaultPointRow(): WorkflowAdjudicationScoreSheetValue {\r\n return {\r\n id: '',\r\n formControlName: '',\r\n totalPoints: 0,\r\n description: '',\r\n pointType: '',\r\n inputId: undefined,\r\n isEditRow: true,\r\n };\r\n }\r\n\r\n #resetPointRow(): void {\r\n this.pointRow = this.#createDefaultPointRow();\r\n }\r\n\r\n protected selectActiveInput(input: FormColumnInputs): void {\r\n const cfg = this.inputConfig();\r\n this.pointRow = {\r\n ...this.pointRow,\r\n totalPoints: 0,\r\n description: input.label || '',\r\n id: input.id,\r\n formControlName: input.formControlName,\r\n pointType: this.pointRow.pointType || cfg?.adjudicationPointTypes[0] || '',\r\n inputId: input.id,\r\n };\r\n }\r\n\r\n protected selectPointType(pointType: MatSelectChange): void {\r\n this.pointRow = {\r\n ...this.pointRow,\r\n pointType: pointType.value,\r\n };\r\n }\r\n\r\n protected savePoints(): void {\r\n const pointToSave: WorkflowAdjudicationScoreSheetValue = {\r\n ...this.pointRow,\r\n id: this.pointRow.id || uuidv4(),\r\n formControlName: this.pointRow.formControlName || this.pointRow.description,\r\n isEditRow: undefined,\r\n };\r\n this.#points = [...this.#points, pointToSave];\r\n this.pointsChange.emit(this.#points);\r\n this.#resetPointRow();\r\n }\r\n\r\n protected edit(element: WorkflowAdjudicationScoreSheetValue): void {\r\n this.pointRow = {\r\n ...element,\r\n isEditRow: true,\r\n };\r\n this.#points = this.#points.filter(p => p.id !== element.id);\r\n this.pointsChange.emit(this.#points);\r\n }\r\n\r\n protected remove(element: WorkflowAdjudicationScoreSheetValue): void {\r\n this.#points = this.#points.filter(p => p.id !== element.id);\r\n this.pointsChange.emit(this.#points);\r\n }\r\n\r\n protected getInputIcon(input: FormColumnInputs): string {\r\n return getInputIcon(input.element);\r\n }\r\n}\r\n","<div style=\"resize: both; overflow: auto;\">\r\n @if (!points || points.length === 1) {\r\n <h5 style=\"margin-bottom: 5px; margin-top: 0px;\">\r\n &#8505;&#65039; To add a scoring item:\r\n </h5>\r\n <ol>\r\n <li>\r\n <strong>Enter Description:</strong>\r\n <ul style=\"margin-top: 5px; margin-bottom: 5px; padding-left: 20px; list-style-type: disc;\">\r\n <li>\r\n To <strong>link</strong> a field: You <strong>must select it</strong> from the list first (you can\r\n edit it after).\r\n </li>\r\n <li>\r\n For a <strong>custom</strong> point: <strong>Ignore the list</strong> and just type your own\r\n description.\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>Set Details:</strong>\r\n Assign the <strong>Points</strong> and select the <strong>Point Type</strong>.\r\n </li>\r\n <li>\r\n <strong>Save:</strong>\r\n Click the <strong>\"Save\"</strong> button to add the item.\r\n </li>\r\n </ol>\r\n }\r\n <table mat-table [dataSource]=\"points\" matSort>\r\n <ng-container matColumnDef=\"description\">\r\n <th mat-header-cell *matHeaderCellDef>Description</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow) {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <textarea [matAutocomplete]=\"auto\" [(ngModel)]=\"pointRow.description\" matInput cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" placeholder=\"Enter point description\"></textarea>\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n @for (input of filteredInputs; track input.id) {\r\n <mat-option [value]=\"input.label\" (click)=\"selectActiveInput(input)\">\r\n <div style=\"display: flex;align-items: center;gap:8px\">\r\n <mat-icon style=\"font-size:24px; width:24px; height:24px;\"\r\n [attr.aria-label]=\"input.label\">\r\n {{ getInputIcon(input) }}\r\n </mat-icon>\r\n <span>\r\n <div style=\"font-size: 0.75em;\">\r\n <strong>\r\n {{ input.label }}\r\n </strong>\r\n </div>\r\n <div\r\n style=\"font-size: 0.75em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ input.hintLabel || input.formControlName }}\r\n </div>\r\n </span>\r\n </div>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n } @else {\r\n {{ element.description }}\r\n }\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"totalPoints\">\r\n <th mat-header-cell *matHeaderCellDef>Points</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow) {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <input matInput [(ngModel)]=\"pointRow.totalPoints\"\r\n placeholder=\"Enter points , eg 50\" type=\"number\">\r\n </mat-form-field>\r\n } @else {\r\n {{ element.totalPoints }}\r\n }\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"pointType\">\r\n <th mat-header-cell *matHeaderCellDef>Point Type</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow) {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <mat-select (selectionChange)=\"selectPointType($event)\" ngDefaultControl\r\n [value]=\"pointRow.pointType\"\r\n placeholder=\"Select\">\r\n @for (type of inputConfig()?.adjudicationPointTypes || []; track $index) {\r\n <mat-option [value]=\"type\">{{ type }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else {\r\n {{ element.pointType }}\r\n }\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"actions\" [stickyEnd]=\"true\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span style=\"display: flex; justify-content: center;\">\r\n @if (element.isEditRow) {\r\n <button matTooltip=\"Save Point in Edit\" color=\"primary\" style=\"white-space: nowrap;\r\n height: 26px;\r\n margin-bottom: 0px;\" mat-flat-button (click)=\"savePoints()\" [disabled]=\"!pointInEditIsValid || inputConfig()?.disabled || inputConfig()?.readonly\">\r\n <span style=\"font-size: 0.875em;\">\r\n save\r\n </span>\r\n </button>\r\n } @else {\r\n <button mat-icon-button (click)=\"edit(element)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"remove(element)\">\r\n <mat-icon>delete_forever</mat-icon>\r\n </button>\r\n }\r\n </span>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"cols()\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: cols()\"></tr>\r\n </table>\r\n</div>\r\n","export function getColorForNumber(targetNumber: number, numbers: number[], asc = true): string {\r\n if (numbers.length === 0) {\r\n throw new Error(\"The numbers array must not be empty.\");\r\n }\r\n\r\n // Avoid sorting the original array\r\n const sortedNumbers = [...numbers].sort((a, b) => asc ? a - b : b - a);\r\n const min = sortedNumbers[0];\r\n const max = sortedNumbers[sortedNumbers.length - 1];\r\n if (!min || !max) {\r\n return \"rgb(173, 173, 173)\";\r\n }\r\n if (min === max) {\r\n return \"rgb(173, 173, 173)\"; // Return gray if there is no range\r\n }\r\n\r\n const interpolateColor = (value: number): string => {\r\n const fraction = (value - min) / (max - min);\r\n const colors = [\r\n { color: [247, 0, 0], pos: 0.0 }, // Red\r\n { color: [247, 187, 0], pos: 0.25 }, // Orange\r\n { color: [247, 247, 0], pos: 0.5 }, // Yellow\r\n { color: [207, 247, 0], pos: 0.75 }, // Light green\r\n { color: [96, 247, 0], pos: 1.0 } // Green\r\n ];\r\n\r\n for (let i = 0; i < colors.length - 1; i++) {\r\n const nextColor = colors[i + 1]\r\n const currentColor = colors[i]\r\n if (currentColor && nextColor && fraction <= nextColor.pos) {\r\n\r\n const range = nextColor.pos - currentColor.pos;\r\n const localFraction = (fraction - currentColor.pos) / range;\r\n const r = Math.round(currentColor.color[0]! + localFraction * (nextColor.color[0]! - currentColor.color[0]!));\r\n const g = Math.round(currentColor.color[1]! + localFraction * (nextColor.color[1]! - currentColor.color[1]!));\r\n const b = Math.round(currentColor.color[2]! + localFraction * (nextColor.color[2]! - currentColor.color[2]!));\r\n return `rgb(${r}, ${g}, ${b})`;\r\n }\r\n }\r\n\r\n return `rgb(${colors[colors.length - 1]?.color[0]}, ${colors[colors.length - 1]?.color[1]}, ${colors[colors.length - 1]?.color[2]},0.6)`;\r\n };\r\n\r\n return interpolateColor(targetNumber);\r\n}\r\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { OutputData } from '@editorjs/editorjs';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { EditorJsInputComponent } from '../../../../../editor-input-element/core/editor-js-input/editor-js-input.component';\r\n\r\nexport interface SubmissionReviewDialogData {\r\n readonly: boolean;\r\n respondentNameKey: string;\r\n respondentCodeKey: string;\r\n activeRowNotes: OutputData | undefined;\r\n row: {\r\n nameOfBidder: string;\r\n [key: string]: unknown;\r\n adj_microFlow_review_notes: OutputData | undefined;\r\n adj_microFlow_assignedScore: Record<string, number>;\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'lib-submission-review-dialog',\r\n templateUrl: './submission-review-dialog.component.html',\r\n styleUrl: './submission-review-dialog.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n imports: [MatDialogModule, MatFormFieldModule, MatButtonModule, EditorJsInputComponent],\r\n})\r\nexport class SubmissionReviewDialogComponent {\r\n protected readonly dialogRef = inject<MatDialogRef<SubmissionReviewDialogComponent>>(MatDialogRef);\r\n protected readonly data = inject<SubmissionReviewDialogData>(MAT_DIALOG_DATA);\r\n\r\n protected changedNotes: OutputData | undefined;\r\n\r\n protected get notesInputConfig(): ITowerStepColumn {\r\n return {\r\n id: 'adj_microFlow_review_notes',\r\n label: 'Notes',\r\n readonly: this.data.readonly,\r\n required: false,\r\n formControlName: 'adj_microFlow_review_notes',\r\n } as ITowerStepColumn;\r\n }\r\n\r\n protected get respondentName(): string {\r\n const raw = this.data.row[this.data.respondentNameKey];\r\n return typeof raw === 'string' ? raw : '';\r\n }\r\n\r\n protected notesChanged(notes: OutputData | undefined): void {\r\n this.changedNotes = notes;\r\n }\r\n}\r\n","<span mat-dialog-title>\r\n Review Feedback For <span class=\"bidder-name\">{{ respondentName }}</span>\r\n</span>\r\n\r\n<div class=\"dialog-instructions\">\r\n <p>\r\n Your notes will be visible to the respondent. Provide <strong>clear, constructive feedback</strong> to\r\n guide their future submissions.\r\n </p>\r\n</div>\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\">\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n display: absolute;\r\n left: 0;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <lib-editor-js-input [value]=\"data.row['adj_microFlow_review_notes'] || data.activeRowNotes\"\r\n (valueChanged)=\"notesChanged($event)\" ngDefaultControl [inputConfig]=\"notesInputConfig\"\r\n [required]=\"notesInputConfig.required\">\r\n </lib-editor-js-input>\r\n <mat-hint>\r\n <strong>Tip:</strong> Use bold, lists, and tables to structure your feedback.\r\n </mat-hint>\r\n </mat-form-field>\r\n</mat-dialog-content>\r\n\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-dialog-close mat-button >\r\n Cancel\r\n </button>\r\n @if( !data.readonly){\r\n <button mat-flat-button\r\n [mat-dialog-close]=\"changedNotes\"\r\n >\r\n Save Feedback\r\n </button>}\r\n</mat-dialog-actions>","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { BehaviorSubject, Observable, catchError, combineLatest, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\r\n\r\nimport { OutputData } from '@editorjs/editorjs';\r\nimport { InputDataTypes, ITowerStepColumn, IWorkflowDocListCols, AdjResponseReviewColumnMapping, WorkflowAdjudicationMicroFlowReviewValue } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * Internal review status union for adjudication micro-flow rows.\r\n * Mirrors the shared `WorkflowAdjudicationMicroFlowReviewValue.adj_microFlow_review`\r\n * optional literal union and includes `undefined` for the \"not yet reviewed\" branch.\r\n */\r\ntype AdjMicroFlowReviewStatus = 'compliant' | 'non-compliant' | undefined;\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens/index';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { SubmissionReviewDialogComponent } from './elements/submission-review-dialog/submission-review-dialog.component';\r\n\r\n// --- TYPE DEFINITIONS FOR ROBUSTNESS ---\r\n\r\nexport interface ISubmission extends Record<string, any> {\r\n id: string;\r\n adjudicationPricePreferenceCalculationColor?: string;\r\n backgroundShades?: Record<string, string>;\r\n}\r\nexport interface tableCols extends Omit<IWorkflowDocListCols, 'type'> {\r\n /** Widened locally to allow the internal `'actions'` cell type used by this template's @switch. */\r\n type?: IWorkflowDocListCols['type'] | 'actions';\r\n showColor?: boolean;\r\n maxWidth?: string;\r\n}\r\ninterface IViewModel {\r\n submissions: ISubmission[];\r\n columnMapping: AdjResponseReviewColumnMapping;\r\n displayColumns?: tableCols[];\r\n displayCols: string[];\r\n loading: boolean;\r\n error?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-submission-review',\r\n templateUrl: './submission-review.component.html',\r\n styleUrls: ['./submission-review.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n imports: [\r\n AsyncPipe,\r\n DecimalPipe,\r\n FormsModule,\r\n OverlayModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n DaysAgoPipe,\r\n ],\r\n})\r\nexport class SubmissionReviewComponent {\r\n readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly dialog = inject(MatDialog);\r\n\r\n readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n // A stream to push updates of the review values (`this.value`)\r\n readonly #valueChanges$ = new BehaviorSubject<WorkflowAdjudicationMicroFlowReviewValue[] | null>([]);\r\n\r\n readonly #valueSignal = signal<WorkflowAdjudicationMicroFlowReviewValue[] | null>([]);\r\n #value: WorkflowAdjudicationMicroFlowReviewValue[] | null = [];\r\n\r\n readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n /** The current review payload. Null while loading. */\r\n // Parent (`workflow-adjudication-reactive-input`) passes a `WorkflowAdjudicationValue | null`\r\n // union that includes three incompatible shapes (score-sheet array, micro-flow review array,\r\n // response-elected-supplier object). This component only consumes the micro-flow branch; the\r\n // input must remain `any` until parent template typing is split per micro-flow.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step type, then narrow this input.\r\n readonly value = input<any>(null);\r\n\r\n protected readonly valueBridge = effect(() => {\r\n const next = this.value() ?? [];\r\n if (_isEqual(next, this.#value)) return;\r\n this.#value = next;\r\n this.#valueSignal.set(next);\r\n this.#valueChanges$.next(next);\r\n });\r\n\r\n readonly reviewChange = output<WorkflowAdjudicationMicroFlowReviewValue[]>();\r\n\r\n protected selected: string = '';\r\n protected columnMapping: AdjResponseReviewColumnMapping | undefined = undefined;\r\n protected submissions: ISubmission[] = [];\r\n\r\n readonly #initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: { respondentNameKey: '', respondentCodeKey: '' },\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n\r\n // Stream for the initial data fetch. Only re-runs when `refreshTrigger` is fired.\r\n readonly #fetchedData$ = this.#refreshTrigger.pipe(\r\n switchMap(() => this.#config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1))),\r\n shareReplay(1)\r\n );\r\n\r\n /**\r\n * REFACTORED: The new vm$ combines the one-time fetched data with the ongoing stream\r\n * of local review changes (`valueChanges$`). This prevents re-fetching from the server\r\n * every time a status or note is changed.\r\n */\r\n protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.#fetchedData$,\r\n this.#valueChanges$\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const { submissions, columnMapping } = res;\r\n\r\n this.columnMapping = columnMapping;\r\n this.submissions = submissions;\r\n // FIX: Pass reviewValues as an argument to make the function pure.\r\n\r\n const enrichedSubmissions = this.#enrichSubmissionsData(submissions, columnMapping, reviewValues) || this.#value || [];\r\n const calcKey = columnMapping.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n const sortedSubmissions = [...enrichedSubmissions].sort((a, b) => Number(b[calcKey]) - Number(a[calcKey]));\r\n const newVm: IViewModel = {\r\n loading: false,\r\n submissions: sortedSubmissions || this.#value,\r\n columnMapping: columnMapping,\r\n displayCols: [columnMapping.respondentNameKey, 'adjudicationPricePreferenceCalculation', 'status', 'actions'],\r\n displayColumns: [\r\n { label: 'name', formControlName: columnMapping.respondentNameKey, type: InputDataTypes.String },\r\n { label: 'Preference', formControlName: 'adjudicationPricePreferenceCalculation', type: InputDataTypes.Number, showColor: true },\r\n { label: 'Actions', formControlName: 'actions', type: InputDataTypes.String },\r\n { label: 'status and Notes', formControlName: 'status', type: 'actions' },\r\n ],\r\n error: undefined,\r\n };\r\n\r\n return newVm;\r\n }),\r\n startWith(this.#initialState),\r\n catchError(() => {\r\n return of({ ...this.#initialState, loading: false, error: 'Failed to load submissions.' });\r\n }),\r\n shareReplay(1)\r\n );\r\n\r\n loadMicroSubmissions(): void {\r\n this.#refreshTrigger.next();\r\n }\r\n\r\n /**\r\n * REFACTORED: Now accepts `reviewValues` as a parameter instead of relying on `this.value`.\r\n */\r\n #enrichSubmissionsData(\r\n submissions: ISubmission[],\r\n cols: AdjResponseReviewColumnMapping,\r\n reviewValues: WorkflowAdjudicationMicroFlowReviewValue[] | null\r\n ): ISubmission[] {\r\n const numberSets = new Map<string, number[]>();\r\n numberSets.set(\r\n cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation',\r\n submissions.map((s) => Number(s[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0))\r\n );\r\n // NOTE(phase-4): the legacy fallback assigns review-value rows into a submission-shaped slot —\r\n // the two only share `id`, so most downstream property reads degrade to undefined. Preserved\r\n // for behavioural parity. `ISubmission` extends `Record<string, any>`, so review-value entries\r\n // satisfy the structural shape (with most fields as undefined). Flagged as a pre-existing\r\n // latent defect — out of scope for Phase 4 type tightening.\r\n const list: ReadonlyArray<ISubmission> = submissions.length > 0\r\n ? submissions\r\n : ((this.#value ?? []) as ReadonlyArray<ISubmission>);\r\n return list.map((submission: ISubmission) => {\r\n const priceCalcKey = cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n const numbers = numberSets.get(priceCalcKey) || [];\r\n const color = numbers.length === 0 ? submission.adjudicationPricePreferenceCalculationColor : this.#getColorString(submission[priceCalcKey], numbers);\r\n const backgroundShades = numbers.length === 0 ? submission['backgroundShades'] : { [priceCalcKey]: this.#getScoreShade(color ?? '') };\r\n // Use the passed `reviewValues` argument\r\n // T-A widened upstream `adj_microFlow_review_notes` to `unknown` (consumer-side narrowing).\r\n // The local consumer expects an OutputData payload; narrow with a cast at the boundary.\r\n const submissionReview: Partial<WorkflowAdjudicationMicroFlowReviewValue> & { adj_microFlow_review_notes?: OutputData } =\r\n (reviewValues?.find((v) => v.id === submission.id) ?? {}) as Partial<WorkflowAdjudicationMicroFlowReviewValue> & { adj_microFlow_review_notes?: OutputData };\r\n\r\n return {\r\n ...submission,\r\n submissionIsReviewed: !!submissionReview,\r\n adj_microFlow_review_notes: submissionReview?.adj_microFlow_review_notes || '',\r\n submissionHasReviewNotes: !!submissionReview?.adj_microFlow_review_notes,\r\n adj_microFlow_review: submissionReview?.['adj_microFlow_review'],\r\n adjudicationPricePreferenceCalculationColor: color,\r\n adjudicationPricePreferenceCalculation: submission[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'],\r\n backgroundShades\r\n };\r\n });\r\n }\r\n\r\n #getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n\r\n #getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n\r\n viewMicroSubmission(res: ISubmission): void {\r\n const alreadyInValue = this.#value?.find((v) => v.id === res.id);\r\n if (!alreadyInValue) {\r\n const newReview: WorkflowAdjudicationMicroFlowReviewValue = this.#buildReviewRecord(res, undefined);\r\n const newValue = [...(this.#value || []), newReview];\r\n this.reviewChange.emit(newValue);\r\n }\r\n this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n /**\r\n * Builds a review record from a submission row. Status, createdAt and updatedAt are\r\n * all optional on the shared `WorkflowAdjudicationMicroFlowReviewValue` type, so\r\n * `undefined` flows through naturally without any casts.\r\n */\r\n #buildReviewRecord(res: ISubmission, status: AdjMicroFlowReviewStatus): WorkflowAdjudicationMicroFlowReviewValue {\r\n const cm = this.columnMapping;\r\n const createdAt: Date | undefined = res[cm?.responseDateKey || 'createdAt'] || undefined;\r\n const updatedAt: Date | undefined = res[cm?.responseDateKey || 'updatedAt'] || undefined;\r\n return {\r\n id: res.id,\r\n adj_microFlow_review: status,\r\n nameOfBidder: res[cm?.respondentNameKey || ''] || '',\r\n supplierNumber: res[cm?.respondentCodeKey || ''] || '',\r\n createdAt,\r\n updatedAt,\r\n adjudicationPricePreferenceCalculation: res[cm?.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0,\r\n reference: res['reference'] || '',\r\n };\r\n }\r\n\r\n protected reviewStatuses = [\r\n {\r\n label: '✅ Compliant',\r\n value: 'compliant',\r\n color: 'var(--mat-sys-primary)',\r\n },\r\n {\r\n label: '❌ Non-compliant',\r\n value: 'non-compliant',\r\n color: 'var(--mat-sys-error)',\r\n },\r\n ];\r\n\r\n setResponseStatus(res: ISubmission, status: MatSelectChange): void {\r\n const alreadyInValue = this.#value?.find((v) => v.id === res.id);\r\n const statusValue = status.value as AdjMicroFlowReviewStatus;\r\n\r\n if (!alreadyInValue) {\r\n const newReview = this.#buildReviewRecord(res, statusValue);\r\n this.reviewChange.emit([...(this.#value || []), newReview]);\r\n this.reachedMax([...(this.#value || []), newReview]);\r\n return;\r\n }\r\n const newValue = (this.#value || []).map((v) => {\r\n if (v.id === res.id) {\r\n return { ...v, adj_microFlow_review: statusValue };\r\n }\r\n return v;\r\n });\r\n\r\n this.reviewChange.emit(newValue);\r\n this.reachedMax(newValue);\r\n }\r\n\r\n protected readonly maxLimit = computed(() => {\r\n const hasMax = this.inputConfig()?.maxLength;\r\n if (!hasMax || isNaN(Number(hasMax))) {\r\n return undefined;\r\n }\r\n return Number(hasMax);\r\n });\r\n\r\n reachedMax(newValue: WorkflowAdjudicationMicroFlowReviewValue[] | null): void {\r\n const hasMax = this.inputConfig()?.maxLength;\r\n if (!hasMax || isNaN(Number(hasMax))) {\r\n return; // No limit set, do nothin\r\n }\r\n const allCompetentSubmissions = newValue?.filter((v) => (v.adj_microFlow_review as unknown) === 'compliant').length || 0;\r\n if (!(allCompetentSubmissions >= (Number(hasMax) || 1))) {\r\n return;\r\n }\r\n const missingSubmission = this.submissions\r\n .filter((s) => !newValue?.find((v) => v.id === s.id))\r\n .map((s) => this.#buildReviewRecord(s, 'non-compliant'));\r\n const unique = new Set([...(newValue || []), ...missingSubmission]);\r\n this.reviewChange.emit(Array.from(unique));\r\n }\r\n\r\n protected notesOpenForRowId: string | null = null;\r\n // FIX: A Map to hold notes being edited, keyed by row ID. This prevents shared state.\r\n\r\n /**\r\n * REFACTORED: Saves the notes from the `notesBeingEdited` map.\r\n */\r\n notesBlur(notesToSave: OutputData | undefined): void {\r\n if (!this.notesOpenForRowId || !notesToSave) {\r\n this.notesOpenForRowId = null;\r\n return;\r\n }\r\n\r\n const alreadyInValue = this.#value?.find((v) => v.id === this.notesOpenForRowId);\r\n\r\n if (!alreadyInValue) {\r\n const newReview: WorkflowAdjudicationMicroFlowReviewValue = {\r\n id: this.notesOpenForRowId,\r\n adj_microFlow_review_notes: notesToSave,\r\n adj_microFlow_review: undefined,\r\n nameOfBidder: '',\r\n supplierNumber: '',\r\n createdAt: undefined,\r\n updatedAt: undefined,\r\n adjudicationPricePreferenceCalculation: 0,\r\n reference: '',\r\n };\r\n this.reviewChange.emit([...(this.#value || []), newReview]);\r\n } else {\r\n const newValue = (this.#value ?? []).map((v) => {\r\n if (v.id === this.notesOpenForRowId) {\r\n return { ...v, adj_microFlow_review_notes: notesToSave };\r\n }\r\n return v;\r\n });\r\n this.reviewChange.emit(newValue);\r\n }\r\n\r\n // Clean up and close the overlay\r\n }\r\n\r\n protected bulkOperations = [\r\n {\r\n label: '✅ Set all to Compliant',\r\n value: 'compliant',\r\n color: 'var(--mat-sys-primary)',\r\n },\r\n {\r\n label: '❌ Set all to Non-compliant',\r\n value: 'non-compliant',\r\n color: 'var(--mat-sys-error)',\r\n },\r\n {\r\n label: '🔄 Reset all ',\r\n value: 'reset',\r\n color: 'var(--mat-sys-secondary)',\r\n }\r\n ];\r\n\r\n protected readonly bulkStatus = computed(() => {\r\n // Re-read on submissions and value changes via the signal\r\n void this.#valueSignal();\r\n const allCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'compliant');\r\n\r\n if (allCompliant) {\r\n return 'compliant';\r\n }\r\n\r\n const allNonCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'non-compliant');\r\n if (allNonCompliant) {\r\n return 'non-compliant';\r\n }\r\n\r\n return 'mixed';\r\n });\r\n\r\n bulkStatusChanged(event: MatSelectChange): void {\r\n const newStatus = event.value;\r\n if (newStatus === 'reset') {\r\n this.reviewChange.emit([]);\r\n return;\r\n }\r\n // Create a Map of existing values for efficient O(1) lookup\r\n const existingValueMap = new Map((this.#value ?? []).map(v => [v.id, v]));\r\n\r\n // Destructure column keys with fallbacks for cleaner access\r\n const {\r\n respondentNameKey = '',\r\n respondentCodeKey = '',\r\n responseDateKey = 'createdAt',\r\n responsePreferenceCalculationKey = 'adjudicationPricePreferenceCalculation',\r\n } = this.columnMapping || {};\r\n\r\n let allItems = this.submissions.map(s => {\r\n // Efficiently look up the existing value using the Map\r\n const existingValue = existingValueMap.get(s.id);\r\n\r\n // If it exists, spread its properties to preserve them and update the status\r\n if (existingValue) {\r\n return { ...existingValue, adj_microFlow_review: newStatus };\r\n }\r\n\r\n // Otherwise, create a new object from the submission data\r\n return {\r\n id: s.id,\r\n adj_microFlow_review: newStatus,\r\n nameOfBidder: s[respondentNameKey] || '',\r\n supplierNumber: s[respondentCodeKey] || '',\r\n createdAt: s[responseDateKey] || undefined,\r\n updatedAt: s[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n adjudicationPricePreferenceCalculation: s[responsePreferenceCalculationKey] || 0,\r\n reference: s['reference'] || '',\r\n };\r\n });\r\n\r\n // Apply the compliance limit if necessary\r\n const limit = this.maxLimit();\r\n if (limit !== undefined && newStatus === 'compliant') {\r\n // Sort by preference calculation, highest first\r\n allItems.sort((a, b) =>\r\n (b.adjudicationPricePreferenceCalculation ?? 0) - (a.adjudicationPricePreferenceCalculation ?? 0)\r\n );\r\n\r\n // Mark items beyond the limit as 'non-compliant'\r\n allItems = allItems.map((item, index) => {\r\n if (index >= limit) {\r\n return { ...item, adj_microFlow_review: 'non-compliant' };\r\n }\r\n return item;\r\n });\r\n }\r\n\r\n this.reviewChange.emit(allItems as WorkflowAdjudicationMicroFlowReviewValue[]);\r\n }\r\n\r\n openNotes(row: ISubmission): void {\r\n this.notesOpenForRowId = row.id;\r\n\r\n const stringfiedTemplate = JSON.stringify(this.inputConfig()?.adjudicationReviewFeedbackTemplate);\r\n const template = stringfiedTemplate?.replace(/\\$bidderName/g, row[this.columnMapping?.respondentNameKey || ''])\r\n ?.replace(/\\$bidderCode/g, row[this.columnMapping?.respondentCodeKey || ''])\r\n ?.replace(/\\$responseDate/g, row[this.columnMapping?.responseDateKey || ''])\r\n ?.replace(/\\$responsePreferenceCalculation/g, row[this.columnMapping?.responsePreferenceCalculationKey || ''] || '0');\r\n\r\n this.dialog.open(\r\n SubmissionReviewDialogComponent, {\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n respondentNameKey: this.columnMapping?.respondentNameKey || '',\r\n respondentCodeKey: this.columnMapping?.respondentCodeKey || '',\r\n readonly: this.inputConfig()?.readonly || false,\r\n activeRowNotes: JSON.parse(template || '{}') as OutputData | undefined\r\n },\r\n autoFocus: false,\r\n disableClose: true\r\n }).afterClosed().pipe(\r\n take(1),\r\n tap((result: OutputData | undefined) => {\r\n this.notesBlur(result);\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n canChangeStatus(row: ISubmission): boolean {\r\n if (row['adj_microFlow_review'] === 'compliant') return true;\r\n const maxLength = this.inputConfig()?.maxLength;\r\n // check if max exists and is a number\r\n if (!maxLength || isNaN(Number(maxLength))) {\r\n return true; // No limit set, allow status change\r\n }\r\n const allCompetentSubmissions = this.#value?.filter((v) => (v.adj_microFlow_review as unknown) === 'compliant').length || 0;\r\n return allCompetentSubmissions < (Number(maxLength) || 1);\r\n }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n\r\n @if (vm.loading) {\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n } @else if (vm.error) {\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n } @else {\r\n @if (!vm.displayCols.length) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">⚙️ This step needs to be configured to show data.</h5>\r\n <ol>\r\n <li>\r\n <strong>Why you're seeing this:</strong>\r\n <ul>\r\n <li>This component is designed for a <strong>\"Submission Review\"</strong> workflow step.</li>\r\n <li>It's currently missing the required column setup.</li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>What to do (for Administrators):</strong>\r\n To fix this, go to the <strong>Workflow Builder</strong> and for this specific step, <strong>map the display\r\n columns</strong> to the desired submission data (e.g., form fields or document keys).\r\n </li>\r\n </ol>\r\n </div>\r\n } @else if (!vm.submissions.length) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if the <strong>submission closing date has\r\n passed</strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n } @else {\r\n @if (!value() || (value()?.length ?? 0) === 0) {\r\n <!-- value() typed `any` per parent's mixed union; length check survives null -->\r\n\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n <strong>Non-compliant</strong>.\r\n </li>\r\n <li>\r\n <strong>Add Note (If Non-compliant):</strong>\r\n <ul>\r\n <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n </ul>\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n\r\n @if (col.formControlName === 'status' && !inputConfig()?.readonly) {\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <mat-label>\r\n Bulk Status Selection\r\n </mat-label>\r\n <mat-select\r\n [style.color]=\"bulkStatus() === 'non-compliant' ? 'var(--mat-sys-error)' : bulkStatus()==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n (selectionChange)=\"bulkStatusChanged($event)\" ngDefaultControl [value]=\"bulkStatus()\"\r\n placeholder=\" Select Status\">\r\n @for (type of bulkOperations || []; track type) {\r\n <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n } @else {\r\n {{ col.label }}\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" [class.selected-row]=\"selected === row.id\"\r\n (click)=\"$event.stopPropagation()\" [class.price-preference-cell]=\"true\"\r\n [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n\r\n @if (col.formControlName === 'actions') {\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n @if (!(inputConfig()?.readonly) || (inputConfig()?.readonly) && !!row['submissionHasReviewNotes']) {\r\n <button (click)=\"openNotes(row)\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" matTooltipPosition=\"after\"\r\n [matTooltip]=\"\r\n `Add a review note for **` + row[vm.columnMapping.respondentNameKey] + `**`\" mat-icon-button>\r\n <mat-icon [style.color]=\"\r\n notesOpenForRowId === row.id ? 'var(--mat-sys-primary)' : (row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']?'var(--mat-sys-error)':'')\r\n \">\r\n {{ !row['submissionHasReviewNotes']? 'add_comment' : 'comment' }}\r\n </mat-icon>\r\n </button>\r\n }\r\n </span>\r\n } @else if (col.formControlName === 'status') {\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <mat-select [disabled]=\"!canChangeStatus(row) || inputConfig()?.readonly === true\"\r\n [style.color]=\"row['adj_microFlow_review'] === 'non-compliant' ? 'var(--mat-sys-error)' : row['adj_microFlow_review']==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n (selectionChange)=\"setResponseStatus(row,$event)\" ngDefaultControl [value]=\"row.adj_microFlow_review\"\r\n placeholder=\" Select Status\">\r\n @for (type of reviewStatuses || []; track type) {\r\n <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n }\r\n </mat-select>\r\n @if (row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']) {\r\n <mat-hint style=\"color:var(--mat-sys-error)\">\r\n Rejection reason is required. Add a review note.\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n <div class=\"number-cell\">\r\n <span>\r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n </span>\r\n @if (col.showColor) {\r\n <mat-icon [style.color]=\"row.adjudicationPricePreferenceCalculationColor\">\r\n fiber_manual_record\r\n </mat-icon>\r\n }\r\n </div>\r\n }\r\n @default {\r\n @if ($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{row[vm.columnMapping.respondentCodeKey]}}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo}}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n }\r\n }\r\n\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormGroupDirective,\r\n NgForm,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { Observable, map, startWith } from 'rxjs';\r\nimport { WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\n\r\nexport interface ScoreSheetGroup {\r\n key: string;\r\n name: string;\r\n}\r\n\r\nexport interface PointAssignmentDialogData {\r\n readonly: boolean;\r\n row: { nameOfBidder: string; adj_microFlow_assignedScore: Record<string, number> };\r\n scoreSheetGroups: ScoreSheetGroup[];\r\n groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n existingScores: Record<string, Record<string, number | null>>;\r\n}\r\n\r\n/** Shows validation errors as soon as the control becomes dirty + invalid. */\r\nexport class ShowErrorOnDirtyMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, _form: FormGroupDirective | NgForm | null): boolean {\r\n return !!(control && control.invalid && control.dirty);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'lib-point-assignment-dialog',\r\n templateUrl: './point-assignment-dialog.component.html',\r\n styleUrl: './point-assignment-dialog.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n imports: [\r\n AsyncPipe,\r\n ReactiveFormsModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatExpansionModule,\r\n MatDividerModule,\r\n ],\r\n})\r\nexport class PointAssignmentDialogComponent implements OnInit {\r\n protected readonly dialogRef = inject<MatDialogRef<PointAssignmentDialogComponent>>(MatDialogRef);\r\n protected readonly data = inject<PointAssignmentDialogData>(MAT_DIALOG_DATA);\r\n readonly #fb = inject(FormBuilder);\r\n\r\n protected pointsForm!: FormGroup;\r\n protected totalPoints$!: Observable<number>;\r\n protected maxPossiblePoints = 0;\r\n protected readonly matcher = new ShowErrorOnDirtyMatcher();\r\n\r\n ngOnInit(): void {\r\n this.#calculateMaxPoints();\r\n this.pointsForm = this.#buildForm();\r\n this.totalPoints$ = this.#createTotalPointsObservable();\r\n }\r\n\r\n protected correctMaxValue(event: Event, groupKey: string, controlId: string, maxPoints: number): void {\r\n const inputElement = event.target as HTMLInputElement;\r\n const currentValue = parseFloat(inputElement.value);\r\n\r\n if (currentValue > maxPoints) {\r\n this.pointsForm.get([groupKey, controlId])?.patchValue(maxPoints);\r\n }\r\n }\r\n\r\n #buildForm(): FormGroup {\r\n const groupOfGroups = this.data.scoreSheetGroups.reduce((acc, group) => {\r\n const scoresInGroup = this.data.groupedScoreSheet[group.key] || [];\r\n const groupControls = scoresInGroup.reduce((ctrls, score) => {\r\n const existingScore = this.data.row.adj_microFlow_assignedScore?.[score.id] ?? null;\r\n ctrls[score.id] = new FormControl(existingScore, [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(score.totalPoints),\r\n ]);\r\n return ctrls;\r\n }, {} as Record<string, FormControl>);\r\n acc[group.key] = this.#fb.group(groupControls);\r\n return acc;\r\n }, {} as Record<string, FormGroup>);\r\n return this.#fb.group(groupOfGroups);\r\n }\r\n\r\n #calculateMaxPoints(): void {\r\n this.maxPossiblePoints = Object.values(this.data.groupedScoreSheet)\r\n .flat()\r\n .reduce((acc, score) => acc + score.totalPoints, 0);\r\n }\r\n\r\n #createTotalPointsObservable(): Observable<number> {\r\n return this.pointsForm.valueChanges.pipe(\r\n startWith(this.pointsForm.value),\r\n map(formValue => {\r\n let total = 0;\r\n Object.values(formValue || {}).forEach((group: unknown) => {\r\n if (group && typeof group === 'object') {\r\n Object.values(group).forEach(score => {\r\n total += Number(score) || 0;\r\n });\r\n }\r\n });\r\n return total;\r\n }),\r\n );\r\n }\r\n}\r\n","<span mat-dialog-title>\r\n Assign Points for <span class=\"bidder-name\">{{ data.row['nameOfBidder'] }}</span>\r\n</span>\r\n @if( !data.readonly){\r\n<div class=\"dialog-instructions\">\r\n @if(!pointsForm.dirty && !pointsForm.touched){\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">💯 How to Assign Points\r\n\r\n </h5>\r\n <ol>\r\n <li>\r\n <strong>Enter a score</strong> for each item listed below.\r\n </li>\r\n <li>\r\n <strong>Follow the rules:</strong>\r\n <ul>\r\n <li>Your score cannot be higher than the maximum points shown (e.g., / 10).</li>\r\n <li>The <strong>\"Save Points\"</strong> button at the bottom will turn blue when everything is filled\r\n out correctly.</li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>Click the blue \"Save Points\" button</strong> to finish.\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">✍️ Editing Your Scores</h5>\r\n <ol>\r\n <li>\r\n <strong>You are viewing saved scores.</strong> To make a change, simply click on a score and type in a\r\n new number.\r\n </li>\r\n <li>\r\n The <strong>Total Points</strong> bar at the top will update as you make edits.\r\n </li>\r\n <li>\r\n Click <strong>\"Save Points\"</strong> to confirm your changes when you're done.\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n</div>\r\n\r\n }\r\n\r\n\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\" [formGroup]=\"pointsForm\">\r\n <div class=\"summary-bar\">\r\n <h3>Total Points: {{ totalPoints$ | async }} / {{ maxPossiblePoints }}</h3>\r\n <mat-progress-bar mode=\"determinate\"\r\n [value]=\"((totalPoints$ | async) || 0) / maxPossiblePoints * 100\"></mat-progress-bar>\r\n </div>\r\n\r\n <mat-accordion multi>\r\n @for (group of data.scoreSheetGroups; track group.key) {\r\n <mat-expansion-panel [expanded]=\"true\" [formGroupName]=\"group.key\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>{{ group.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n @for (score of data.groupedScoreSheet[group.key] || []; track score.id) {\r\n <div class=\"score-item\">\r\n <label [for]=\"score.id\" class=\"score-description\">{{ score.description }}</label>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"score-input\">\r\n <mat-label>Score</mat-label>\r\n <input [disabled]=\"data.readonly\" matInput type=\"number\" placeholder=\"0\" [id]=\"score.id\"\r\n [formControlName]=\"score.id\" [max]=\"score.totalPoints\" min=\"0\" [errorStateMatcher]=\"matcher\"\r\n (input)=\"correctMaxValue($event, group.key, score.id, score.totalPoints)\" />\r\n <span matSuffix>\r\n <span style=\"min-width: 58px; display:flex\">\r\n / {{ score.totalPoints }}\r\n </span>\r\n </span>\r\n\r\n @if (pointsForm.get(group.key)?.get(score.id)?.hasError('required')) {\r\n <mat-error>A score is required.</mat-error>\r\n }\r\n @if (pointsForm.get(group.key)?.get(score.id)?.hasError('max')) {\r\n <mat-error>Score cannot exceed {{ score.totalPoints }}.</mat-error>\r\n }\r\n @if (pointsForm.get(group.key)?.get(score.id)?.hasError('min')) {\r\n <mat-error>Score cannot be negative.</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <mat-divider></mat-divider>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-button mat-dialog-close>Cancel</button>\r\n @if( !data.readonly){\r\n <button mat-flat-button color=\"primary\" \r\n [mat-dialog-close]=\"pointsForm.getRawValue()\"\r\n [disabled]=\"pointsForm.invalid\">\r\n Save Points\r\n </button>\r\n }\r\n\r\n</mat-dialog-actions>","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, computed, effect, inject, input, output, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { BehaviorSubject, Observable, catchError, combineLatest, map, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\r\n\r\nimport { AdjResponseReviewColumnMapping, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { ISubmission, tableCols } from '../submission-review/submission-review.component';\r\nimport { PointAssignmentDialogComponent } from './elements/point-assignment-dialog/point-assignment-dialog.component';\r\n\r\nexport interface IViewModel {\r\n submissions: ISubmission[];\r\n columnMapping: AdjResponseReviewColumnMapping;\r\n displayColumns?: tableCols[];\r\n displayCols: string[];\r\n loading: boolean;\r\n groupedScoreSheet?: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n scoreSheetGroups?: { name: string; key: string }[];\r\n error?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-point-assignment',\r\n templateUrl: './point-assignment.component.html',\r\n styleUrls: ['./point-assignment.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n imports: [\r\n AsyncPipe,\r\n DecimalPipe,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatRippleModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n DaysAgoPipe,\r\n ],\r\n})\r\nexport class PointAssignmentComponent {\r\n readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #dialog = inject(MatDialog);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n // A stream to push updates of the review values (`this.value`)\r\n readonly #valueChanges$ = new BehaviorSubject<unknown[] | null>([]);\r\n\r\n readonly #initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: {} as AdjResponseReviewColumnMapping,\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n\r\n readonly #valueSignal = signal<unknown[] | null>([]);\r\n\r\n readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n // `WorkflowAdjudicationValue | null` union of three incompatible shapes. Until the parent\r\n // template is split per adjudication step type, this input must remain `any`; narrow\r\n // inside `valueBridge`.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n readonly value = input<any>(null);\r\n\r\n protected readonly valueBridge = effect(() => {\r\n const raw = this.value();\r\n const next: unknown[] = Array.isArray(raw) ? raw : [];\r\n if (_isEqual(next, this.#valueSignal())) return;\r\n this.#valueSignal.set(next);\r\n this.#valueChanges$.next(next);\r\n });\r\n\r\n // NOTE(phase-4): Trap 6 — emitter forwards enriched `ISubmission[]` rows (with score-sheet\r\n // augmentation) back to the parent which then writes through the `WorkflowAdjudicationValue`\r\n // union. D-013: the parent (`workflow-adjudication-reactive-input`) `(pointsChange)=\"setValue($event)\"`\r\n // binding only typechecks under strictTemplates if `$event` is assignable to that union; the\r\n // enriched `ISubmission[]` payload matches no single branch (missing formControlName/totalPoints/\r\n // description), so the emitted type must stay `any[]` to preserve parity. Narrows when the parent\r\n // template is split per adjudication step type.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this emitter.\r\n readonly pointsChange = output<any[]>();\r\n\r\n // Stream for the initial data fetch. Only re-runs when `refreshTrigger` is fired.\r\n readonly #fetchedData$ = this.#refreshTrigger.pipe(\r\n switchMap(() => this.#config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1))),\r\n shareReplay(1),\r\n );\r\n\r\n protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.#fetchedData$,\r\n this.#valueChanges$,\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const { columnMapping, submissions, scoreSheet } = res;\r\n // group scoresheet by pointType\r\n const groupedScoreSheet = (scoreSheet || []).reduce((acc, curr) => {\r\n const pointType = curr.pointType || 'default';\r\n if (!acc[pointType]) {\r\n acc[pointType] = [];\r\n }\r\n acc[pointType].push(curr);\r\n return acc;\r\n }, {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>);\r\n\r\n const dataModel: IViewModel = {\r\n submissions: this.#enrichSubmissionsData(submissions || [], reviewValues),\r\n loading: false,\r\n error: undefined,\r\n groupedScoreSheet,\r\n scoreSheetGroups: Object.keys(groupedScoreSheet).map((key) => ({\r\n name: key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n key,\r\n })),\r\n columnMapping,\r\n displayCols: [\r\n 'nameOfBidder',\r\n 'adj_microFlow_review',\r\n 'adjudicationPricePreferenceCalculation',\r\n 'adj_microFlow_scoreSheetTotalPoints',\r\n 'actions',\r\n ],\r\n displayColumns: [\r\n { label: 'name', formControlName: 'nameOfBidder', type: 'string' } as tableCols,\r\n { label: 'Pref Calc', formControlName: 'adjudicationPricePreferenceCalculation', type: 'number', showColor: true } as tableCols,\r\n { label: 'status', formControlName: 'adj_microFlow_review', type: 'string' } as tableCols,\r\n { label: 'Score', formControlName: 'adj_microFlow_scoreSheetTotalPoints', type: 'number', showColor: true } as tableCols,\r\n { label: '', formControlName: 'actions', type: 'string' } as tableCols,\r\n ],\r\n };\r\n\r\n return { ...dataModel };\r\n }),\r\n startWith(this.#initialState),\r\n catchError(() => of({ ...this.#initialState, loading: false, error: 'Failed to load submissions.' })),\r\n shareReplay(1),\r\n );\r\n\r\n protected readonly readonly = computed(() => this.inputConfig()?.readonly ?? false);\r\n\r\n loadMicroSubmissions(): void {\r\n this.#refreshTrigger.next();\r\n }\r\n\r\n viewMicroSubmission(res: { id: string }): void {\r\n this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n #enrichSubmissionsData(submissions: ISubmission[], reviewValues: unknown[] | null): ISubmission[] {\r\n const numberSets = new Map<string, number[]>();\r\n numberSets.set(\r\n 'adjudicationPricePreferenceCalculation',\r\n submissions.map((s) => Number(s['adjudicationPricePreferenceCalculation'] || 0)),\r\n );\r\n const list = submissions.length > 0 ? submissions : ((reviewValues as ISubmission[]) || []);\r\n return list.map((submission) => {\r\n const numbers = numberSets.get('adjudicationPricePreferenceCalculation') || [];\r\n const color = numbers.length === 0\r\n ? submission['adjudicationPricePreferenceCalculationColor']\r\n : this.#getColorString(submission['adjudicationPricePreferenceCalculation'], numbers);\r\n const backgroundShades = { ['adjudicationPricePreferenceCalculation']: this.#getScoreShade(color ?? '') };\r\n const existing = (this.#valueSignal() as ISubmission[] | null)?.find((v) => v.id === submission.id);\r\n return {\r\n ...submission,\r\n adj_microFlow_review: submission['adj_microFlow_review'] === 'compliant' ? '✅' : '❌',\r\n adjudicationPricePreferenceCalculationColor: color,\r\n backgroundShades,\r\n ...existing,\r\n };\r\n });\r\n }\r\n\r\n #getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n\r\n #getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n\r\n openPointAssignmentDialog(\r\n row: ISubmission,\r\n groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]> | undefined,\r\n scoreSheetGroups: { name: string; key: string }[] | undefined,\r\n ): void {\r\n this.#dialog\r\n .open(PointAssignmentDialogComponent, {\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n groupedScoreSheet,\r\n scoreSheetGroups,\r\n readonly: this.inputConfig()?.readonly || false,\r\n },\r\n autoFocus: false,\r\n disableClose: true,\r\n })\r\n .afterClosed()\r\n .pipe(\r\n take(1),\r\n switchMap((result: Record<string, Record<string, number>> | undefined) => {\r\n if (!result) return of(null);\r\n // Update the value with the new point assignments\r\n const assignment = Object.values(result).reduce((acc, curr) => {\r\n acc = { ...acc, ...curr };\r\n return acc;\r\n }, {} as Record<string, number>);\r\n row['adj_microFlow_assignedScore'] = assignment;\r\n const currentList = (this.#valueSignal() as ISubmission[] | null) ?? [];\r\n const alreadyInValue = currentList.find((v) => v.id === row.id);\r\n let newValue: ISubmission[];\r\n if (!alreadyInValue) {\r\n newValue = [\r\n ...currentList,\r\n {\r\n ...row,\r\n adj_microFlow_assignedScore: assignment,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n },\r\n ];\r\n } else {\r\n newValue = currentList.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n adj_microFlow_assignedScore: assignment,\r\n };\r\n }\r\n return v;\r\n });\r\n }\r\n return of(newValue);\r\n }),\r\n tap((newValue) => {\r\n if (!newValue || this.inputConfig()?.readonly) return;\r\n this.pointsChange.emit(newValue);\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe();\r\n }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n @if (vm.loading) {\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n } @else if (vm.error) {\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n } @else {\r\n @if (vm.submissions.length === 0) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n compliant </strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n } @else {\r\n @if (!value || value.length === 0) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n <strong>Non-compliant</strong>.\r\n </li>\r\n <li>\r\n <strong>Add Note (If Non-compliant):</strong>\r\n <ul>\r\n <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n </ul>\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n {{ col.label }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n [class.price-preference-cell]=\"true\"\r\n [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n @if (col.formControlName === 'actions') {\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"'View and review **' + row[vm.columnMapping.respondentNameKey] + '\\'s\\' Submission'\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n </span>\r\n } @else if (col.formControlName === 'adj_microFlow_scoreSheetTotalPoints') {\r\n <button\r\n (click)=\"openPointAssignmentDialog(row, vm?.groupedScoreSheet, vm.scoreSheetGroups)\"\r\n [id]=\"row.id\" mat-stroked-button>\r\n {{ (row[col.formControlName] | number:'0.0-0') || 'Assign Points' }}\r\n </button>\r\n } @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n {{ (row[col.formControlName] | number:'0.0-0') || 'N/A' }}\r\n }\r\n @default {\r\n @if ($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{ row[vm.columnMapping.respondentCodeKey] }}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey || ''] | daysAgo }}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n }\r\n }\r\n}\r\n","import { AsyncPipe, DecimalPipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n AdjResponseReviewColumnMapping,\r\n InputDataTypes,\r\n ITowerStepColumn,\r\n WorkflowAdjudicationScoreSheetValue,\r\n} from 'ngx-t-forms-types';\r\nimport {\r\n BehaviorSubject,\r\n Observable,\r\n catchError,\r\n combineLatest,\r\n map,\r\n of,\r\n shareReplay,\r\n startWith,\r\n switchMap,\r\n take,\r\n tap,\r\n} from 'rxjs';\r\n\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { IViewModel } from '../point-assignment/point-assignment.component';\r\nimport { PointAssignmentDialogComponent } from '../point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component';\r\nimport { ISubmission } from '../submission-review/submission-review.component';\r\n\r\n/**\r\n * NOTE(phase-4): the parent `workflow-adjudication-reactive-input` binds `value` from a union\r\n * of three adjudication payloads (score-sheet, micro-flow review, elected-supplier). This\r\n * component consumes the micro-flow review branch — until the parent splits its template by\r\n * `adjudicationStep` (Trap 6), the input must accept the broader shape (`unknown`) and narrow\r\n * via the `toSupplierValue` guard.\r\n *\r\n * NOTE(phase-4 shared-type drift): the shared `WorkflowAdjudicationMicroFlowReviewValue` does\r\n * not declare `adj_microFlow_supplierAppointed`, `adj_microFlow_assignedScore`, or\r\n * `adj_microFlow_scoreSheetTotalPoints`, but the runtime payload carries them through this\r\n * component. `SupplierRow` extends `ISubmission` (a `Record<string, any>`) and adds the known\r\n * fields for editor support; the shared type should be widened in a follow-up.\r\n */\r\ntype SupplierRow = ISubmission & {\r\n adj_microFlow_supplierAppointed?: boolean;\r\n adj_microFlow_assignedScore?: Record<string, number>;\r\n adj_microFlow_scoreSheetTotalPoints?: number;\r\n adj_microFlow_pointsAwarded?: number;\r\n adj_microFlow_pricePointCalculation?: number;\r\n colColors?: Record<string, string>;\r\n};\r\n\r\nfunction toSupplierValue(input: unknown): SupplierRow[] {\r\n // Runtime guard — the parent supplies a union of array / object payloads.\r\n return Array.isArray(input) ? (input as SupplierRow[]) : [];\r\n}\r\n\r\n@Component({\r\n selector: 'lib-supplier-selection',\r\n templateUrl: './supplier-selection.component.html',\r\n styleUrl: './supplier-selection.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n AsyncPipe,\r\n DecimalPipe,\r\n FormsModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatRippleModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n DaysAgoPipe,\r\n ],\r\n})\r\nexport class SupplierSelectionComponent {\r\n readonly inputConfig = input<ITowerStepColumn | undefined>(undefined);\r\n\r\n // Phase-4 TODO: parent (workflow-adjudication-reactive-input) accepts broader `WorkflowAdjudicationValue` union.\r\n // Emitting narrower `SupplierRow[]` is structurally compatible at runtime; output widened to `any` for template typecheck (Trap 6).\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n readonly supplierSelection = output<any>();\r\n\r\n readonly #config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #dialog = inject(MatDialog);\r\n\r\n readonly #refreshTrigger = new BehaviorSubject<void>(undefined);\r\n // A stream to push updates of the review values (`this.value`)\r\n readonly #valueChanges$ = new BehaviorSubject<SupplierRow[]>([]);\r\n\r\n readonly #initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: {} as AdjResponseReviewColumnMapping,\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n\r\n #value: SupplierRow[] = [];\r\n\r\n // NOTE(phase-4): Trap 6 — parent (`workflow-adjudication-reactive-input`) binds a\r\n // `WorkflowAdjudicationValue | null` union of three incompatible shapes. The template\r\n // also reads `value.length` directly. Until parent template is split per adjudication step\r\n // the input must remain `any`; narrow inside the `valueBridge` via `toSupplierValue`.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): split parent template by adjudication step, then narrow this input.\r\n readonly value = input<any>(null);\r\n\r\n protected readonly valueBridge = effect(() => {\r\n const next = toSupplierValue(this.value());\r\n if (_isEqual(next, this.#value)) return;\r\n this.#value = next;\r\n this.#valueChanges$.next(this.#value);\r\n });\r\n\r\n readonly #fetchedData$ = this.#refreshTrigger.pipe(\r\n switchMap(() =>\r\n this.#config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1)),\r\n ),\r\n shareReplay(1),\r\n );\r\n\r\n protected loadMicroSubmissions(): void {\r\n this.#refreshTrigger.next();\r\n }\r\n\r\n protected readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.#fetchedData$,\r\n this.#valueChanges$,\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const {\r\n columnMapping,\r\n submissions,\r\n scoreSheet,\r\n adjudicationPricePreferenceCalculationFormula,\r\n } = res;\r\n //group scoreSheet by pointType\r\n const groupedScoreSheet = (scoreSheet || []).reduce(\r\n (acc, curr) => {\r\n const pointType = curr.pointType || 'default';\r\n if (!acc[pointType]) {\r\n acc[pointType] = [];\r\n }\r\n acc[pointType].push(curr);\r\n return acc;\r\n },\r\n {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>,\r\n );\r\n const totalPossibleScore = (scoreSheet || []).reduce(\r\n (acc, curr) => acc + curr.totalPoints,\r\n 0,\r\n );\r\n\r\n const maxPointsAwarded: number =\r\n adjudicationPricePreferenceCalculationFormula ===\r\n '80(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n ? 20\r\n : adjudicationPricePreferenceCalculationFormula ===\r\n '90(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n ? 10\r\n : 100;\r\n const dataModel = {\r\n submissions: this.#enrichSubmissionsData(\r\n submissions || [],\r\n reviewValues,\r\n totalPossibleScore,\r\n maxPointsAwarded,\r\n ),\r\n loading: false,\r\n error: undefined,\r\n groupedScoreSheet,\r\n\r\n scoreSheetGroups: Object.keys(groupedScoreSheet).map((key) => ({\r\n name: key\r\n .replace(/([a-z])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n key: key,\r\n })),\r\n maxPointsAwarded,\r\n totalPossibleScore,\r\n columnMapping: columnMapping,\r\n displayCols: [\r\n 'nameOfBidder',\r\n 'adjudicationPricePreferenceCalculation',\r\n 'adj_microFlow_pointsAwarded',\r\n 'adj_microFlow_pricePointCalculation',\r\n\r\n 'actions',\r\n 'adj_microFlow_supplierAppointed',\r\n ],\r\n displayColumns: [\r\n { label: 'name', formControlName: 'nameOfBidder', type: InputDataTypes.String },\r\n {\r\n label: `${100 - maxPointsAwarded}`,\r\n formControlName: 'adjudicationPricePreferenceCalculation',\r\n type: InputDataTypes.Number,\r\n },\r\n {\r\n label: `${maxPointsAwarded}`,\r\n formControlName: 'adj_microFlow_pointsAwarded',\r\n type: InputDataTypes.Number,\r\n },\r\n {\r\n label: 'Total',\r\n formControlName: 'adj_microFlow_pricePointCalculation',\r\n type: InputDataTypes.Number,\r\n },\r\n // `actions` is an internal cell type used by the template `@switch`; widened locally in `tableCols`.\r\n { label: '', formControlName: 'actions', type: 'actions' as const },\r\n {\r\n label: 'Appointed',\r\n formControlName: 'adj_microFlow_supplierAppointed',\r\n type: InputDataTypes.Boolean,\r\n showColor: true,\r\n },\r\n ],\r\n };\r\n return {\r\n ...dataModel,\r\n } as IViewModel;\r\n }),\r\n startWith(this.#initialState),\r\n catchError(() => {\r\n return of({\r\n ...this.#initialState,\r\n loading: false,\r\n error: 'Failed to load submissions.',\r\n });\r\n }),\r\n shareReplay(1),\r\n );\r\n\r\n protected viewMicroSubmission(res: ISubmission): void {\r\n this.#config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n #enrichSubmissionsData(\r\n submissions: ISubmission[],\r\n value: SupplierRow[],\r\n totalPossibleScore: number,\r\n maxPointsAwarded: number,\r\n ): SupplierRow[] {\r\n // 1. Handle edge cases first for clarity.\r\n\r\n // 2. Improve performance by creating a lookup map to avoid O(n^2) complexity.\r\n // This is much faster than using .find() inside a loop.\r\n const valueMap = new Map<string, SupplierRow>(\r\n this.#value?.map((v) => [v.id, v]) || [],\r\n );\r\n const list: ISubmission[] = submissions.length > 0 ? submissions : (value || []);\r\n // 3. First pass: Enrich submissions with calculated scores.\r\n const enrichedSubmissions: SupplierRow[] = list.map((submission) => {\r\n const v = valueMap.get(submission.id);\r\n\r\n // Use nullish coalescing (??) for cleaner fallback logic.\r\n const totalPoints =\r\n (v?.['adj_microFlow_scoreSheetTotalPoints'] as number | undefined) ??\r\n (submission?.['adj_microFlow_scoreSheetTotalPoints'] as number | undefined) ??\r\n 0;\r\n\r\n // Simplify calculation: remove unnecessary try-catch. Division by zero in JS results\r\n // in Infinity, not an error. The check for totalPossibleScore > 0 handles this.\r\n const pointsAwarded =\r\n totalPossibleScore > 0\r\n ? (totalPoints / totalPossibleScore) * maxPointsAwarded\r\n : 0;\r\n\r\n const pricePointCalculation =\r\n (Number(submission['adjudicationPricePreferenceCalculation'] ?? 0)) + pointsAwarded;\r\n\r\n return {\r\n ...submission,\r\n ...v,\r\n adj_microFlow_pointsAwarded: pointsAwarded,\r\n adj_microFlow_pricePointCalculation: pricePointCalculation,\r\n };\r\n });\r\n\r\n // 4. Define keys to process to avoid repetition (DRY principle).\r\n const keysToColor = ['adj_microFlow_pricePointCalculation'] as const;\r\n\r\n // 5. Correctly build the number sets from the *newly enriched* data.\r\n const numberSets = new Map<string, number[]>();\r\n for (const key of keysToColor) {\r\n const values = enrichedSubmissions.map((s) => Number(s[key] ?? 0));\r\n numberSets.set(key, values);\r\n }\r\n\r\n // 6. Second pass: Add colors and shades based on the complete dataset.\r\n return enrichedSubmissions.map((submission) => {\r\n const colColors: Record<string, string> = {};\r\n const backgroundShades: Record<string, string> = {\r\n ...(submission.backgroundShades ?? {}),\r\n };\r\n\r\n for (const key of keysToColor) {\r\n const scoreValue = Number(submission[key] ?? 0);\r\n const allScores = numberSets.get(key) || [];\r\n const color = this.#getColorString(scoreValue, allScores);\r\n\r\n colColors[key] = color;\r\n backgroundShades[key] = this.#getScoreShade(color);\r\n }\r\n backgroundShades['adjudicationPricePreferenceCalculation'] = '';\r\n\r\n return {\r\n ...submission,\r\n colColors,\r\n backgroundShades,\r\n };\r\n });\r\n }\r\n\r\n #getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n\r\n #getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n\r\n protected openPointAssignmentDialog(\r\n row: SupplierRow,\r\n groupedScoreSheet:\r\n | Record<string, WorkflowAdjudicationScoreSheetValue[]>\r\n | undefined,\r\n scoreSheetGroups:\r\n | {\r\n name: string;\r\n key: string;\r\n }[]\r\n | undefined,\r\n ): void {\r\n this.#dialog\r\n .open(PointAssignmentDialogComponent, {\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n groupedScoreSheet,\r\n scoreSheetGroups,\r\n },\r\n autoFocus: false,\r\n disableClose: true,\r\n })\r\n .afterClosed()\r\n .pipe(\r\n take(1),\r\n switchMap((result: Record<string, Record<string, number>>) => {\r\n if (!result) return of(null);\r\n // Update the value with the new point assignments\r\n const assignment = Object.values(result).reduce(\r\n (acc, curr) => {\r\n acc = {\r\n ...acc,\r\n ...curr,\r\n };\r\n return acc;\r\n },\r\n {} as Record<string, number>,\r\n );\r\n row['adj_microFlow_assignedScore'] = assignment;\r\n const alreadyInValue = this.#value?.find((v) => v.id === row.id);\r\n let newValue: SupplierRow[];\r\n if (!alreadyInValue) {\r\n newValue = [\r\n ...(this.#value || []),\r\n {\r\n ...row,\r\n adj_microFlow_assignedScore: assignment,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce(\r\n (acc, curr) => acc + curr,\r\n 0,\r\n ),\r\n },\r\n ];\r\n } else {\r\n newValue =\r\n this.#value?.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(\r\n assignment,\r\n ).reduce((acc, curr) => acc + curr, 0),\r\n adj_microFlow_assignedScore: assignment,\r\n };\r\n }\r\n return v;\r\n }) || [];\r\n }\r\n\r\n return of(newValue);\r\n }),\r\n tap((newValue) => {\r\n if (!newValue) return;\r\n this.supplierSelection.emit(newValue);\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe();\r\n }\r\n\r\n protected appointASupplier(row: ISubmission): void {\r\n if (this.inputConfig()?.readonly) {\r\n return;\r\n }\r\n if (row['adj_microFlow_supplierAppointed']) {\r\n row['adj_microFlow_supplierAppointed'] = false;\r\n } else {\r\n row['adj_microFlow_supplierAppointed'] = true;\r\n }\r\n const alreadyInValue = this.#value?.find((v) => v.id === row.id);\r\n let newValue: SupplierRow[] | undefined;\r\n if (!alreadyInValue) {\r\n const otherRows = this.#value?.map((v) => ({\r\n ...v,\r\n adj_microFlow_supplierAppointed: false,\r\n }));\r\n newValue = [...(otherRows || []), row];\r\n } else {\r\n newValue =\r\n this.#value?.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_supplierAppointed: row['adj_microFlow_supplierAppointed'],\r\n };\r\n }\r\n return {\r\n ...v,\r\n adj_microFlow_supplierAppointed: false,\r\n };\r\n }) || [];\r\n }\r\n if (newValue) {\r\n this.supplierSelection.emit(newValue);\r\n }\r\n }\r\n}\r\n","@if (vm$ | async; as vm) {\r\n @if (vm.loading) {\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n } @else if (vm.error) {\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n } @else {\r\n\r\n @if (vm.submissions.length === 0) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n compliant </strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n } @else {\r\n\r\n @if (!value || value.length === 0) {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Appoint</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Appoint:</strong> Click the <strong>Appoint</strong> button to appoint the supplier.\r\n </li>\r\n\r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n {{ col.label }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n [class.price-preference-cell]=\"true\" [style.border-bottom-color]=\"row.colColors[col.formControlName]\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n @if (col.formControlName === 'actions') {\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n </span>\r\n } @else if (col.formControlName === 'adj_microFlow_supplierAppointed') {\r\n @if (row[col.formControlName] === true) {\r\n <button (click)=\"appointASupplier(row)\" mat-flat-button color=\"primary\">\r\n <mat-icon>\r\n check_circle\r\n </mat-icon>\r\n Appointed\r\n </button>\r\n } @else {\r\n <button (click)=\"appointASupplier(row)\" mat-stroked-button>\r\n Appoint\r\n </button>\r\n }\r\n } @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n }\r\n @default {\r\n @if ($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{ row[vm.columnMapping.respondentCodeKey] }}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo }}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewEncapsulation,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport {\r\n AdjudicationSteps,\r\n FormBuilderFunctions,\r\n ITowerStepColumn,\r\n WorkflowAdjudicationMicroFlowReviewValue,\r\n WorkflowAdjudicationResponseElectedSupplierSelectionValue,\r\n WorkflowAdjudicationScoreSheetValue,\r\n} from 'ngx-t-forms-types';\r\n\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { PointsCreationComponent } from '../points-creation/points-creation.component';\r\nimport { SubmissionReviewComponent } from '../submission-review/submission-review.component';\r\nimport { PointAssignmentComponent } from '../point-assignment/point-assignment.component';\r\nimport { SupplierSelectionComponent } from '../supplier-selection/supplier-selection.component';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-workflow-adjudication-reactive-input',\r\n nextId: 0,\r\n};\r\n\r\ntype WorkflowAdjudicationValue =\r\n | WorkflowAdjudicationScoreSheetValue[]\r\n | WorkflowAdjudicationMicroFlowReviewValue[]\r\n | WorkflowAdjudicationResponseElectedSupplierSelectionValue;\r\n\r\n@Component({\r\n selector: 'lib-workflow-adjudication-reactive-input',\r\n templateUrl: './workflow-adjudication-reactive-input.component.html',\r\n styleUrl: './workflow-adjudication-reactive-input.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n imports: [\r\n TitleCasePipe,\r\n PointsCreationComponent,\r\n SubmissionReviewComponent,\r\n SupplierSelectionComponent,\r\n PointAssignmentComponent,\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: WorkflowAdjudicationReactiveInputComponent }],\r\n})\r\nexport class WorkflowAdjudicationReactiveInputComponent extends BaseCustomInput<WorkflowAdjudicationValue> {\r\n override get empty(): boolean {\r\n return this.value === null || this.value === undefined || Object.keys(this.value).length === 0;\r\n }\r\n\r\n override get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n readonly editorMode = input<boolean>(false);\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n\r\n protected readonly adjudicationSteps = AdjudicationSteps;\r\n\r\n constructor() {\r\n super(\r\n inject(NgControl, { self: true, optional: true }) as NgControl,\r\n inject<ElementRef<HTMLElement>>(ElementRef),\r\n customInputConfig,\r\n );\r\n }\r\n\r\n protected setValue(value: WorkflowAdjudicationValue): void {\r\n this.value = value;\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n}\r\n","@switch (inputConfig().adjudicationStep) {\r\n@case (adjudicationSteps.ScoreCreation) {\r\n<lib-points-creation [inputConfig]=\"inputConfig()\" [value]=\"value\" (pointsChange)=\"setValue($event)\">\r\n</lib-points-creation>\r\n}\r\n@case (adjudicationSteps.SubMissionReview) {\r\n<lib-submission-review [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n (reviewChange)=\"setValue($event)\"></lib-submission-review>\r\n}\r\n@case (adjudicationSteps.SupplierSelection) {\r\n<lib-supplier-selection [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n (supplierSelection)=\"setValue($event)\"></lib-supplier-selection>\r\n}\r\n@case (adjudicationSteps.PointAssignment) {\r\n<lib-point-assignment [inputConfig]=\"inputConfig()\" [value]=\"value\"\r\n (pointsChange)=\"setValue($event)\"></lib-point-assignment>\r\n}\r\n@default {\r\n<h6>\r\n {{ inputConfig().adjudicationStep | titlecase }} is not implemented yet.\r\n</h6>\r\n}\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { WorkflowAdjudicationReactiveInputComponent } from './elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps a workflow-adjudication reactive control inside a `mat-form-field`. */\r\n@Component({\r\n selector: 'lib-workflow-adjudication',\r\n templateUrl: './workflow-adjudication.component.html',\r\n styleUrl: './workflow-adjudication.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n TFormInputStatusComponent,\r\n WorkflowAdjudicationReactiveInputComponent,\r\n ],\r\n})\r\nexport class WorkflowAdjudicationComponent {\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly editorMode = input<boolean>(false);\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n readonly reload = output<void>();\r\n\r\n protected readonly errorMessage = computed(() =>\r\n getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n );\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n @if (inputConfig(); as inputConfig) {\r\n <mat-form-field\r\n [appearance]=\"inputConfig.appearance || 'fill'\"\r\n [floatLabel]=\"'always'\"\r\n subscriptSizing=\"dynamic\"\r\n >\r\n <mat-label>\r\n {{ inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n <lib-workflow-adjudication-reactive-input\r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n [required]=\"inputConfig.required\"\r\n [formGroup]=\"formGroup()\"\r\n [editorMode]=\"editorMode()\"\r\n [formBuilderFunctions]=\"formBuilderFunctions()\"\r\n ></lib-workflow-adjudication-reactive-input>\r\n\r\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n </mat-hint>\r\n }\r\n\r\n @if (!!errorMessage()) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n }\r\n\r\n @if (inputConfig.canReload?.canReload) {\r\n <button\r\n mat-icon-button\r\n style=\"margin-right: 4px;\"\r\n matTooltip=\"Click to refresh this field.\"\r\n class=\"input-sync-button\"\r\n (click)=\"inputConfig.canReload.emit()\"\r\n matSuffix\r\n >\r\n <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (inputConfig.prefixIcon) {\r\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.prefixText) {\r\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n }\r\n @if (inputConfig.suffixText) {\r\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n }\r\n\r\n @if (inputConfig.maxLength && formGroup()) {\r\n <mat-hint align=\"end\">\r\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n</form>\r\n"],"names":["uuidv4","i3","i4","i6","i7","i8","i9","i10","i11","i2","i5","i1"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2Ca,uBAAuB,CAAA;AACzB,IAAA,OAAO;AACP,IAAA,WAAW;AAiBpB,IAAA,OAAO;AAoBP,IAAA,WAAA,GAAA;AAtCS,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA+B,SAAS,kFAAC;;;;;;AAO5D,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAM,IAAI,4EAAC;;QAGxB,IAAA,CAAA,YAAY,GAAG,MAAM,EAAyC;AAE7D,QAAA,IAAA,CAAA,QAAQ,GAAwC,IAAI,CAAC,sBAAsB,EAAE;QAC7E,IAAA,CAAA,uBAAuB,GAAuB,EAAE;QAC1D,IAAA,CAAA,OAAO,GAA0C,EAAE;;AAGhC,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACtC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,IAAI,GAAa,CAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC,IAAI;kBAC9D,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS;kBACrD,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC;YAC7C,IAAI,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE;AACpC,gBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC;YAC9C;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,2EAAC;;AAGiB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,MAAK;AAC3C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;YACzB,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAA0C;AACtE,QAAA,CAAC,kFAAC;AAGA,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,mCAAmC,EAAE,CAAC,IAAI,CACjE,GAAG,CAAC,CAAC,MAA0B,KAAI;AACjC,YAAA,IAAI,CAAC,uBAAuB,GAAG,MAAM;AACvC,QAAA,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC,CAAC,SAAS,EAAE;IACf;AAEA,IAAA,IAAc,MAAM,GAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE;YACpC,OAAO,IAAI,CAAC,OAAO;QACrB;QACA,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;IACzC;AAEA,IAAA,IAAc,cAAc,GAAA;AAC1B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;QAClE,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO,IAAI,CAAC,uBAAuB;QACrC;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;QACpF,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,KAAuB,KACjE,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAC3D,aAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CACrE;IACH;AAEA,IAAA,IAAc,kBAAkB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACnE,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IACrH;IAEA,sBAAsB,GAAA;QACpB,OAAO;AACL,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,eAAe,EAAE,EAAE;AACnB,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,SAAS,EAAE,IAAI;SAChB;IACH;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC/C;AAEU,IAAA,iBAAiB,CAAC,KAAuB,EAAA;AACjD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;AAChB,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,WAAW,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YAC9B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,eAAe,EAAE,KAAK,CAAC,eAAe;AACtC,YAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE;YAC1E,OAAO,EAAE,KAAK,CAAC,EAAE;SAClB;IACH;AAEU,IAAA,eAAe,CAAC,SAA0B,EAAA;QAClD,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;YAChB,SAAS,EAAE,SAAS,CAAC,KAAK;SAC3B;IACH;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,WAAW,GAAwC;YACvD,GAAG,IAAI,CAAC,QAAQ;YAChB,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAIA,EAAM,EAAE;YAChC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW;AAC3E,YAAA,SAAS,EAAE,SAAS;SACrB;QACD,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,cAAc,EAAE;IACvB;AAEU,IAAA,IAAI,CAAC,OAA4C,EAAA;QACzD,IAAI,CAAC,QAAQ,GAAG;AACd,YAAA,GAAG,OAAO;AACV,YAAA,SAAS,EAAE,IAAI;SAChB;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACtC;AAEU,IAAA,MAAM,CAAC,OAA4C,EAAA;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACtC;AAEU,IAAA,YAAY,CAAC,KAAuB,EAAA;AAC5C,QAAA,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;IACpC;+GA1IW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CpC,uhNA4HA,EAAA,MAAA,EAAA,CAAA,yZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/FI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,OAAA,EAAA,8BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,eAAe,8iBACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBArBnC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC;wBACP,mBAAmB;wBACnB,WAAW;wBACX,eAAe;wBACf,qBAAqB;wBACrB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,cAAc;wBACd,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,uhNAAA,EAAA,MAAA,EAAA,CAAA,yZAAA,CAAA,EAAA;;;AEzCG,SAAU,iBAAiB,CAAC,YAAoB,EAAE,OAAiB,EAAE,GAAG,GAAG,IAAI,EAAA;AACjF,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;IAC3D;;AAGA,IAAA,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtE,IAAA,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,IAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;AACd,QAAA,OAAO,oBAAoB;IAC/B;AACA,IAAA,IAAI,GAAG,KAAK,GAAG,EAAE;QACb,OAAO,oBAAoB,CAAC;IAChC;AAEA,IAAA,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAAY;AAC/C,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG;AACX,YAAA,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;AAChC,YAAA,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;AACnC,YAAA,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;AAClC,YAAA,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;AACnC,YAAA,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;SACpC;AAED,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC;YAC9B,IAAI,YAAY,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS,CAAC,GAAG,EAAE;gBAExD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG;gBAC9C,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,IAAI,KAAK;AAC3D,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;AAC7G,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;AAC7G,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;AAC7G,gBAAA,OAAO,OAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG;YAClC;QACJ;AAEA,QAAA,OAAO,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO;AAC5I,IAAA,CAAC;AAED,IAAA,OAAO,gBAAgB,CAAC,YAAY,CAAC;AACzC;;MCfa,+BAA+B,CAAA;AAR5C,IAAA,WAAA,GAAA;AASqB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgD,YAAY,CAAC;AAC/E,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAA6B,eAAe,CAAC;AAsB9E,IAAA;AAlBC,IAAA,IAAc,gBAAgB,GAAA;QAC5B,OAAO;AACL,YAAA,EAAE,EAAE,4BAA4B;AAChC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;AAC5B,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,eAAe,EAAE,4BAA4B;SAC1B;IACvB;AAEA,IAAA,IAAc,cAAc,GAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACtD,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE;IAC3C;AAEU,IAAA,YAAY,CAAC,KAA6B,EAAA;AAClD,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;+GAvBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7B5C,ugDAsCqB,EAAA,MAAA,EAAA,CAAA,2pBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXT,eAAe,uoBAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAE3E,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAR3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,mBAGvB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC,CAAC,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,ugDAAA,EAAA,MAAA,EAAA,CAAA,2pBAAA,CAAA,EAAA;;;MEoD5E,yBAAyB,CAAA;AAvBtC,IAAA,WAAA,GAAA;AAwBW,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAE1B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;;AAEtD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAoD,EAAE,CAAC;AAE3F,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAoD,EAAE,mFAAC;QACrF,IAAA,CAAA,MAAM,GAAsD,EAAE;AAErD,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA+B,SAAS,kFAAC;;;;;;;AAO5D,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAM,IAAI,4EAAC;AAEd,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,MAAK;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC/B,YAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAAE;AACjC,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,CAAC,kFAAC;QAEO,IAAA,CAAA,YAAY,GAAG,MAAM,EAA8C;QAElE,IAAA,CAAA,QAAQ,GAAW,EAAE;QACrB,IAAA,CAAA,aAAa,GAA+C,SAAS;QACrE,IAAA,CAAA,WAAW,GAAkB,EAAE;AAEhC,QAAA,IAAA,CAAA,aAAa,GAAe;AACnC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,EAAE;YACf,aAAa,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE;AAC/D,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,KAAK,EAAE,SAAS;SACjB;;AAGQ,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAChD,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,kCAAkC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5F,WAAW,CAAC,CAAC,CAAC,CACf;AAED;;;;AAIG;QACgB,IAAA,CAAA,GAAG,GAA2B,aAAa,CAAC;AAC7D,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC;AACN,SAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,KAAI;AAC1B,YAAA,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,GAAG;AAE1C,YAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,YAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;AAG9B,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;AACtH,YAAA,MAAM,OAAO,GAAG,aAAa,CAAC,gCAAgC,IAAI,wCAAwC;AAC1G,YAAA,MAAM,iBAAiB,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1G,YAAA,MAAM,KAAK,GAAe;AACxB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,WAAW,EAAE,iBAAiB,IAAI,IAAI,CAAC,MAAM;AAC7C,gBAAA,aAAa,EAAE,aAAa;gBAC5B,WAAW,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,wCAAwC,EAAE,QAAQ,EAAE,SAAS,CAAC;AAC7G,gBAAA,cAAc,EAAE;AACd,oBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,iBAAiB,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE;AAChG,oBAAA,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,wCAAwC,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;AAChI,oBAAA,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE;oBAC7E,EAAE,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;AAC1E,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;aACjB;AAED,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAC7B,UAAU,CAAC,MAAK;AACd,YAAA,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;AAC5F,QAAA,CAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;AA2FS,QAAA,IAAA,CAAA,cAAc,GAAG;AACzB,YAAA;AACE,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,KAAK,EAAE,wBAAwB;AAChC,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,KAAK,EAAE,sBAAsB;AAC9B,aAAA;SACF;AAuBkB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS;YAC5C,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;AACpC,gBAAA,OAAO,SAAS;YAClB;AACA,YAAA,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,CAAC,+EAAC;QAkBQ,IAAA,CAAA,iBAAiB,GAAkB,IAAI;AAwCvC,QAAA,IAAA,CAAA,cAAc,GAAG;AACzB,YAAA;AACE,gBAAA,KAAK,EAAE,wBAAwB;AAC/B,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,KAAK,EAAE,wBAAwB;AAChC,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,4BAA4B;AACnC,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,KAAK,EAAE,sBAAsB;AAC9B,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,KAAK,EAAE,0BAA0B;AAClC;SACF;AAEkB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;;AAE5C,YAAA,KAAK,IAAI,CAAC,YAAY,EAAE;YACxB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,WAAW,CAAC;YAE7F,IAAI,YAAY,EAAE;AAChB,gBAAA,OAAO,WAAW;YACpB;YAEA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,eAAe,CAAC;YACpG,IAAI,eAAe,EAAE;AACnB,gBAAA,OAAO,eAAe;YACxB;AAEA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,iFAAC;AAqGH,IAAA;AA5ZU,IAAA,OAAO;AACP,IAAA,WAAW;AAGX,IAAA,eAAe;;AAEf,IAAA,cAAc;AAEd,IAAA,YAAY;AACrB,IAAA,MAAM;AAyBG,IAAA,aAAa;;AAUb,IAAA,aAAa;IA+CtB,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;AAEA;;AAEG;AACH,IAAA,sBAAsB,CACpB,WAA0B,EAC1B,IAAoC,EACpC,YAA+D,EAAA;AAE/D,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB;AAC9C,QAAA,UAAU,CAAC,GAAG,CACZ,IAAI,CAAC,gCAAgC,IAAI,wCAAwC,EACjF,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1H;;;;;;AAMD,QAAA,MAAM,IAAI,GAA+B,WAAW,CAAC,MAAM,GAAG;AAC5D,cAAE;eACE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAgC;AACvD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAuB,KAAI;AAC1C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gCAAgC,IAAI,wCAAwC;YACtG,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,2CAA2C,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;AACrJ,YAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;;;;YAIrI,MAAM,gBAAgB,IACnB,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAoG;YAE9J,OAAO;AACL,gBAAA,GAAG,UAAU;gBACb,oBAAoB,EAAE,CAAC,CAAC,gBAAgB;AACxC,gBAAA,0BAA0B,EAAE,gBAAgB,EAAE,0BAA0B,IAAI,EAAE;AAC9E,gBAAA,wBAAwB,EAAE,CAAC,CAAC,gBAAgB,EAAE,0BAA0B;AACxE,gBAAA,oBAAoB,EAAE,gBAAgB,GAAG,sBAAsB,CAAC;AAChE,gBAAA,2CAA2C,EAAE,KAAK;gBAClD,sCAAsC,EAAE,UAAU,CAAC,IAAI,CAAC,gCAAgC,IAAI,wCAAwC,CAAC;gBACrI;aACD;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,CAAC,MAAc,EAAE,OAAiB,EAAA;QAC/C,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IACjD;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AACxB,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA,MAAA,CAAQ,CAAC;IAC/D;AAEA,IAAA,mBAAmB,CAAC,GAAgB,EAAA;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,SAAS,GAA6C,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC;AACnG,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC;AACpD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7D;AAEA;;;;AAIG;IACH,kBAAkB,CAAC,GAAgB,EAAE,MAAgC,EAAA;AACnE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa;AAC7B,QAAA,MAAM,SAAS,GAAqB,GAAG,CAAC,EAAE,EAAE,eAAe,IAAI,WAAW,CAAC,IAAI,SAAS;AACxF,QAAA,MAAM,SAAS,GAAqB,GAAG,CAAC,EAAE,EAAE,eAAe,IAAI,WAAW,CAAC,IAAI,SAAS;QACxF,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;AACV,YAAA,oBAAoB,EAAE,MAAM;YAC5B,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,iBAAiB,IAAI,EAAE,CAAC,IAAI,EAAE;YACpD,cAAc,EAAE,GAAG,CAAC,EAAE,EAAE,iBAAiB,IAAI,EAAE,CAAC,IAAI,EAAE;YACtD,SAAS;YACT,SAAS;YACT,sCAAsC,EAAE,GAAG,CAAC,EAAE,EAAE,gCAAgC,IAAI,wCAAwC,CAAC,IAAI,CAAC;AAClI,YAAA,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE;SAClC;IACH;IAeA,iBAAiB,CAAC,GAAgB,EAAE,MAAuB,EAAA;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAChE,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAiC;QAE5D,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC;AAC3D,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACpD;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAI;YAC7C,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,GAAG,CAAC,EAAE,oBAAoB,EAAE,WAAW,EAAE;YACpD;AACA,YAAA,OAAO,CAAC;AACV,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC3B;AAUA,IAAA,UAAU,CAAC,QAA2D,EAAA;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS;QAC5C,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;AACpC,YAAA,OAAO;QACT;QACA,MAAM,uBAAuB,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,oBAAgC,KAAK,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC;AACxH,QAAA,IAAI,EAAE,uBAAuB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YACvD;QACF;AACA,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AACnD,aAAA,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAC1D,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C;;AAKA;;AAEG;AACH,IAAA,SAAS,CAAC,WAAmC,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE;AAC3C,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;YAC7B;QACF;QAEA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,iBAAiB,CAAC;QAEhF,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,MAAM,SAAS,GAA6C;gBAC1D,EAAE,EAAE,IAAI,CAAC,iBAAiB;AAC1B,gBAAA,0BAA0B,EAAE,WAAW;AACvC,gBAAA,oBAAoB,EAAE,SAAS;AAC/B,gBAAA,YAAY,EAAE,EAAE;AAChB,gBAAA,cAAc,EAAE,EAAE;AAClB,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,sCAAsC,EAAE,CAAC;AACzC,gBAAA,SAAS,EAAE,EAAE;aACd;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7D;aAAO;AACL,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAI;gBAC7C,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,iBAAiB,EAAE;oBACnC,OAAO,EAAE,GAAG,CAAC,EAAE,0BAA0B,EAAE,WAAW,EAAE;gBAC1D;AACA,gBAAA,OAAO,CAAC;AACV,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC;;IAGF;AAqCA,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AACtC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK;AAC7B,QAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B;QACF;;AAEA,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;;QAGzE,MAAM,EACJ,iBAAiB,GAAG,EAAE,EACtB,iBAAiB,GAAG,EAAE,EACtB,eAAe,GAAG,WAAW,EAC7B,gCAAgC,GAAG,wCAAwC,GAC5E,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE;QAE5B,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAG;;YAEtC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;;YAGhD,IAAI,aAAa,EAAE;gBACjB,OAAO,EAAE,GAAG,aAAa,EAAE,oBAAoB,EAAE,SAAS,EAAE;YAC9D;;YAGA,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,EAAE;AACR,gBAAA,oBAAoB,EAAE,SAAS;AAC/B,gBAAA,YAAY,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE;AACxC,gBAAA,cAAc,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE;AAC1C,gBAAA,SAAS,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,SAAS;AAC1C,gBAAA,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,IAAI,WAAW,CAAC,IAAI,SAAS;AAC7E,gBAAA,sCAAsC,EAAE,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC;AAChF,gBAAA,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;aAChC;AACH,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,WAAW,EAAE;;YAEpD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KACjB,CAAC,CAAC,CAAC,sCAAsC,IAAI,CAAC,KAAK,CAAC,CAAC,sCAAsC,IAAI,CAAC,CAAC,CAClG;;YAGD,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACtC,gBAAA,IAAI,KAAK,IAAI,KAAK,EAAE;oBAClB,OAAO,EAAE,GAAG,IAAI,EAAE,oBAAoB,EAAE,eAAe,EAAE;gBAC3D;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAsD,CAAC;IAChF;AAEA,IAAA,SAAS,CAAC,GAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,EAAE;AAE/B,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,kCAAkC,CAAC;AACjG,QAAA,MAAM,QAAQ,GAAG,kBAAkB,EAAE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,IAAI,EAAE,CAAC;AAC5G,cAAE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,IAAI,EAAE,CAAC;AAC3E,cAAE,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC;AAC3E,cAAE,OAAO,CAAC,kCAAkC,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,gCAAgC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC;AAEvH,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,+BAA+B,EAAE;AACjC,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,IAAI,EAAE;gBACJ,GAAG;AACH,gBAAA,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB,IAAI,EAAE;AAC9D,gBAAA,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB,IAAI,EAAE;gBAC9D,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,IAAI,KAAK;gBAC/C,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI;AAC5C,aAAA;AACD,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE;AACf,SAAA,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CACnB,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,MAA8B,KAAI;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACxB,QAAA,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC,CAAC,SAAS,EAAE;IACf;AAEA,IAAA,eAAe,CAAC,GAAgB,EAAA;AAC9B,QAAA,IAAI,GAAG,CAAC,sBAAsB,CAAC,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS;;QAE/C,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;YAC1C,OAAO,IAAI,CAAC;QACd;QACA,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,oBAAgC,KAAK,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC;QAC3H,OAAO,uBAAuB,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3D;+GA5ZW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/EtC,iuTA2LA,EAAA,MAAA,EAAA,CAAA,8yBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1HI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,4DAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAZhB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,WAAW,0CAYX,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGF,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAvBrC,SAAS;+BACE,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC;wBACP,SAAS;wBACT,WAAW;wBACX,WAAW;wBACX,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,wBAAwB;wBACxB,eAAe;wBACf,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,iuTAAA,EAAA,MAAA,EAAA,CAAA,8yBAAA,CAAA,EAAA;;;AE1CH;MACa,uBAAuB,CAAA;IAClC,YAAY,CAAC,OAA2B,EAAE,KAAyC,EAAA;AACjF,QAAA,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IACxD;AACD;MAoBY,8BAA8B,CAAA;AAlB3C,IAAA,WAAA,GAAA;AAmBqB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA+C,YAAY,CAAC;AAC9E,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAA4B,eAAe,CAAC;AACnE,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC;QAIxB,IAAA,CAAA,iBAAiB,GAAG,CAAC;AACZ,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,uBAAuB,EAAE;AAyD3D,IAAA;AA9DU,IAAA,GAAG;IAOZ,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,4BAA4B,EAAE;IACzD;AAEU,IAAA,eAAe,CAAC,KAAY,EAAE,QAAgB,EAAE,SAAiB,EAAE,SAAiB,EAAA;AAC5F,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAA0B;QACrD,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC;AAEnD,QAAA,IAAI,YAAY,GAAG,SAAS,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC;QACnE;IACF;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AACrE,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;YAClE,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC1D,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI;gBACnF,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE;AAC/C,oBAAA,UAAU,CAAC,QAAQ;AACnB,oBAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACjB,oBAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;AAClC,iBAAA,CAAC;AACF,gBAAA,OAAO,KAAK;YACd,CAAC,EAAE,EAAiC,CAAC;AACrC,YAAA,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;AAC9C,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAA+B,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;IACtC;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;AAC/D,aAAA,IAAI;AACJ,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD;IAEA,4BAA4B,GAAA;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CACtC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAChC,GAAG,CAAC,SAAS,IAAG;YACd,IAAI,KAAK,GAAG,CAAC;AACb,YAAA,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAc,KAAI;AACxD,gBAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,IAAG;AACnC,wBAAA,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC7B,oBAAA,CAAC,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,KAAK;QACd,CAAC,CAAC,CACH;IACH;+GAhEW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,uFC5D3C,wjJA4GqB,EAAA,MAAA,EAAA,CAAA,2pBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1DjB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,uoBACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,qXACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,gBAAgB,8HARhB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAWA,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAlB1C,SAAS;+BACE,6BAA6B,EAAA,eAAA,EAGtB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC;wBACP,SAAS;wBACT,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,oBAAoB;wBACpB,kBAAkB;wBAClB,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,wjJAAA,EAAA,MAAA,EAAA,CAAA,2pBAAA,CAAA,EAAA;;;MEJU,wBAAwB,CAAA;AApBrC,IAAA,WAAA,GAAA;AAqBW,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;;AAEtD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAmB,EAAE,CAAC;AAE1D,QAAA,IAAA,CAAA,aAAa,GAAe;AACnC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,aAAa,EAAE,EAAoC;AACnD,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,KAAK,EAAE,SAAS;SACjB;AAEQ,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAmB,EAAE,mFAAC;AAE3C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA+B,SAAS,kFAAC;;;;;;AAM5D,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAM,IAAI,4EAAC;AAEd,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,MAAK;AAC3C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,IAAI,GAAc,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;YACrD,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAAE;AACzC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,CAAC,kFAAC;;;;;;;;;QAUO,IAAA,CAAA,YAAY,GAAG,MAAM,EAAS;;AAG9B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAChD,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,kCAAkC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5F,WAAW,CAAC,CAAC,CAAC,CACf;QAEkB,IAAA,CAAA,GAAG,GAA2B,aAAa,CAAC;AAC7D,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC,cAAc;AACpB,SAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,KAAI;YAC1B,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,GAAG;;AAEtD,YAAA,MAAM,iBAAiB,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;AAChE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS;AAC7C,gBAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACnB,oBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACrB;gBACA,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,gBAAA,OAAO,GAAG;YACZ,CAAC,EAAE,EAA2D,CAAC;AAE/D,YAAA,MAAM,SAAS,GAAe;gBAC5B,WAAW,EAAE,IAAI,CAAC,sBAAsB,CAAC,WAAW,IAAI,EAAE,EAAE,YAAY,CAAC;AACzE,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,SAAS;gBAChB,iBAAiB;AACjB,gBAAA,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC7D,oBAAA,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;oBACtF,GAAG;AACJ,iBAAA,CAAC,CAAC;gBACH,aAAa;AACb,gBAAA,WAAW,EAAE;oBACX,cAAc;oBACd,sBAAsB;oBACtB,wCAAwC;oBACxC,qCAAqC;oBACrC,SAAS;AACV,iBAAA;AACD,gBAAA,cAAc,EAAE;oBACd,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAe;AAC/E,oBAAA,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,wCAAwC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAe;oBAC/H,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAe;AACzF,oBAAA,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,qCAAqC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAe;oBACxH,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAe;AACvE,iBAAA;aACF;AAED,YAAA,OAAO,EAAE,GAAG,SAAS,EAAE;AACzB,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAC7B,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC,EACrG,WAAW,CAAC,CAAC,CAAC,CACf;AAEkB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,IAAI,KAAK,+EAAC;AAyGpF,IAAA;AA7MU,IAAA,OAAO;AACP,IAAA,OAAO;AACP,IAAA,WAAW;AAEX,IAAA,eAAe;;AAEf,IAAA,cAAc;AAEd,IAAA,aAAa;AASb,IAAA,YAAY;;AA6BZ,IAAA,aAAa;IAwDtB,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;AAEA,IAAA,mBAAmB,CAAC,GAAmB,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7D;IAEA,sBAAsB,CAAC,WAA0B,EAAE,YAA8B,EAAA;AAC/E,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB;QAC9C,UAAU,CAAC,GAAG,CACZ,wCAAwC,EACxC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,CACjF;AACD,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,IAAK,YAA8B,IAAI,EAAE,CAAC;AAC3F,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;YAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,wCAAwC,CAAC,IAAI,EAAE;AAC9E,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK;AAC/B,kBAAE,UAAU,CAAC,6CAA6C;AAC1D,kBAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,wCAAwC,CAAC,EAAE,OAAO,CAAC;AACvF,YAAA,MAAM,gBAAgB,GAAG,EAAE,CAAC,wCAAwC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;YACzG,MAAM,QAAQ,GAAI,IAAI,CAAC,YAAY,EAA2B,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;YACnG,OAAO;AACL,gBAAA,GAAG,UAAU;AACb,gBAAA,oBAAoB,EAAE,UAAU,CAAC,sBAAsB,CAAC,KAAK,WAAW,GAAG,GAAG,GAAG,GAAG;AACpF,gBAAA,2CAA2C,EAAE,KAAK;gBAClD,gBAAgB;AAChB,gBAAA,GAAG,QAAQ;aACZ;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AACxB,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA,MAAA,CAAQ,CAAC;IAC/D;IAEA,eAAe,CAAC,MAAc,EAAE,OAAiB,EAAA;QAC/C,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IACjD;AAEA,IAAA,yBAAyB,CACvB,GAAgB,EAChB,iBAAoF,EACpF,gBAA6D,EAAA;AAE7D,QAAA,IAAI,CAAC;aACF,IAAI,CAAC,8BAA8B,EAAE;AACpC,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,IAAI,EAAE;gBACJ,GAAG;gBACH,iBAAiB;gBACjB,gBAAgB;gBAChB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,IAAI,KAAK;AAChD,aAAA;AACD,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE,IAAI;SACnB;AACA,aAAA,WAAW;aACX,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,CAAC,MAA0D,KAAI;AACvE,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;AAE5B,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;gBAC5D,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE;AACzB,gBAAA,OAAO,GAAG;YACZ,CAAC,EAAE,EAA4B,CAAC;AAChC,YAAA,GAAG,CAAC,6BAA6B,CAAC,GAAG,UAAU;YAC/C,MAAM,WAAW,GAAI,IAAI,CAAC,YAAY,EAA2B,IAAI,EAAE;AACvE,YAAA,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/D,YAAA,IAAI,QAAuB;YAC3B,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,QAAQ,GAAG;AACT,oBAAA,GAAG,WAAW;AACd,oBAAA;AACE,wBAAA,GAAG,GAAG;AACN,wBAAA,2BAA2B,EAAE,UAAU;wBACvC,mCAAmC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;AACpG,qBAAA;iBACF;YACH;iBAAO;gBACL,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;oBAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;wBACnB,OAAO;AACL,4BAAA,GAAG,CAAC;4BACJ,mCAAmC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;AACnG,4BAAA,2BAA2B,EAAE,UAAU;yBACxC;oBACH;AACA,oBAAA,OAAO,CAAC;AACV,gBAAA,CAAC,CAAC;YACJ;AACA,YAAA,OAAO,EAAE,CAAC,QAAQ,CAAC;AACrB,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,QAAQ,KAAI;YACf,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ;gBAAE;AAC/C,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,EAAE;IAChB;+GA7MW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtDrC,44KA+GA,EAAA,MAAA,EAAA,CAAA,ksCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpEI,WAAW,8BACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,0TAThB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EASX,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGF,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBApBpC,SAAS;+BACE,sBAAsB,EAAA,eAAA,EAGf,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC;wBACP,SAAS;wBACT,WAAW;wBACX,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,aAAa;wBACb,wBAAwB;wBACxB,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,44KAAA,EAAA,MAAA,EAAA,CAAA,ksCAAA,CAAA,EAAA;;;AEiBH,SAAS,eAAe,CAAC,KAAc,EAAA;;AAErC,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAI,KAAuB,GAAG,EAAE;AAC7D;MAqBa,0BAA0B,CAAA;AAnBvC,IAAA,WAAA,GAAA;AAoBW,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA+B,SAAS,kFAAC;;;;QAK5D,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAAO;AAEjC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAE3B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;;AAEtD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAgB,EAAE,CAAC;AAEvD,QAAA,IAAA,CAAA,aAAa,GAAe;AACnC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,aAAa,EAAE,EAAoC;AACnD,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,KAAK,EAAE,SAAS;SACjB;QAED,IAAA,CAAA,MAAM,GAAkB,EAAE;;;;;;AAOjB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAM,IAAI,4EAAC;AAEd,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,MAAK;YAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1C,YAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAAE;AACjC,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YAClB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACvC,QAAA,CAAC,kFAAC;AAEO,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAChD,SAAS,CAAC,MACR,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,kCAAkC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC5E,EACD,WAAW,CAAC,CAAC,CAAC,CACf;QAMkB,IAAA,CAAA,GAAG,GAA2B,aAAa,CAAC;AAC7D,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC,cAAc;AACpB,SAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,KAAI;YAC1B,MAAM,EACJ,aAAa,EACb,WAAW,EACX,UAAU,EACV,6CAA6C,GAC9C,GAAG,GAAG;;AAEP,YAAA,MAAM,iBAAiB,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CACjD,CAAC,GAAG,EAAE,IAAI,KAAI;AACZ,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS;AAC7C,gBAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACnB,oBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACrB;gBACA,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,gBAAA,OAAO,GAAG;YACZ,CAAC,EACD,EAA2D,CAC5D;YACD,MAAM,kBAAkB,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAClD,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,WAAW,EACrC,CAAC,CACF;YAED,MAAM,gBAAgB,GACpB,6CAA6C;gBAC7C;AACE,kBAAE;AACF,kBAAE,6CAA6C;oBAC3C;AACF,sBAAE;sBACA,GAAG;AACX,YAAA,MAAM,SAAS,GAAG;AAChB,gBAAA,WAAW,EAAE,IAAI,CAAC,sBAAsB,CACtC,WAAW,IAAI,EAAE,EACjB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB;AACD,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,SAAS;gBAChB,iBAAiB;AAEjB,gBAAA,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC7D,oBAAA,IAAI,EAAE;AACH,yBAAA,OAAO,CAAC,iBAAiB,EAAE,OAAO;AAClC,yBAAA,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;AAC3C,oBAAA,GAAG,EAAE,GAAG;AACT,iBAAA,CAAC,CAAC;gBACH,gBAAgB;gBAChB,kBAAkB;AAClB,gBAAA,aAAa,EAAE,aAAa;AAC5B,gBAAA,WAAW,EAAE;oBACX,cAAc;oBACd,wCAAwC;oBACxC,6BAA6B;oBAC7B,qCAAqC;oBAErC,SAAS;oBACT,iCAAiC;AAClC,iBAAA;AACD,gBAAA,cAAc,EAAE;AACd,oBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE;AAC/E,oBAAA;AACE,wBAAA,KAAK,EAAE,CAAA,EAAG,GAAG,GAAG,gBAAgB,CAAA,CAAE;AAClC,wBAAA,eAAe,EAAE,wCAAwC;wBACzD,IAAI,EAAE,cAAc,CAAC,MAAM;AAC5B,qBAAA;AACD,oBAAA;wBACE,KAAK,EAAE,CAAA,EAAG,gBAAgB,CAAA,CAAE;AAC5B,wBAAA,eAAe,EAAE,6BAA6B;wBAC9C,IAAI,EAAE,cAAc,CAAC,MAAM;AAC5B,qBAAA;AACD,oBAAA;AACE,wBAAA,KAAK,EAAE,OAAO;AACd,wBAAA,eAAe,EAAE,qCAAqC;wBACtD,IAAI,EAAE,cAAc,CAAC,MAAM;AAC5B,qBAAA;;oBAED,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,SAAkB,EAAE;AACnE,oBAAA;AACE,wBAAA,KAAK,EAAE,WAAW;AAClB,wBAAA,eAAe,EAAE,iCAAiC;wBAClD,IAAI,EAAE,cAAc,CAAC,OAAO;AAC5B,wBAAA,SAAS,EAAE,IAAI;AAChB,qBAAA;AACF,iBAAA;aACF;YACD,OAAO;AACL,gBAAA,GAAG,SAAS;aACC;AACjB,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAC7B,UAAU,CAAC,MAAK;AACd,YAAA,OAAO,EAAE,CAAC;gBACR,GAAG,IAAI,CAAC,aAAa;AACrB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,6BAA6B;AACrC,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;AAiNF,IAAA;AAtWU,IAAA,OAAO;AACP,IAAA,WAAW;AACX,IAAA,OAAO;AAEP,IAAA,eAAe;;AAEf,IAAA,cAAc;AAEd,IAAA,aAAa;AAStB,IAAA,MAAM;AAgBG,IAAA,aAAa;IAOZ,oBAAoB,GAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;AA6GU,IAAA,mBAAmB,CAAC,GAAgB,EAAA;AAC5C,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7D;AAEA,IAAA,sBAAsB,CACpB,WAA0B,EAC1B,KAAoB,EACpB,kBAA0B,EAC1B,gBAAwB,EAAA;;;;QAMxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CACzC;AACD,QAAA,MAAM,IAAI,GAAkB,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,IAAI,KAAK,IAAI,EAAE,CAAC;;QAEhF,MAAM,mBAAmB,GAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;YACjE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;;AAGrC,YAAA,MAAM,WAAW,GACd,CAAC,GAAG,qCAAqC,CAAwB;gBACjE,UAAU,GAAG,qCAAqC,CAAwB;AAC3E,gBAAA,CAAC;;;AAIH,YAAA,MAAM,aAAa,GACjB,kBAAkB,GAAG;AACnB,kBAAE,CAAC,WAAW,GAAG,kBAAkB,IAAI;kBACrC,CAAC;AAEP,YAAA,MAAM,qBAAqB,GACzB,CAAC,MAAM,CAAC,UAAU,CAAC,wCAAwC,CAAC,IAAI,CAAC,CAAC,IAAI,aAAa;YAErF,OAAO;AACL,gBAAA,GAAG,UAAU;AACb,gBAAA,GAAG,CAAC;AACJ,gBAAA,2BAA2B,EAAE,aAAa;AAC1C,gBAAA,mCAAmC,EAAE,qBAAqB;aAC3D;AACH,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,CAAC,qCAAqC,CAAU;;AAGpE,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB;AAC9C,QAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,YAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;QAC7B;;AAGA,QAAA,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,UAAU,KAAI;YAC5C,MAAM,SAAS,GAA2B,EAAE;AAC5C,YAAA,MAAM,gBAAgB,GAA2B;AAC/C,gBAAA,IAAI,UAAU,CAAC,gBAAgB,IAAI,EAAE,CAAC;aACvC;AAED,YAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;gBAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC;AAEzD,gBAAA,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK;gBACtB,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YACpD;AACA,YAAA,gBAAgB,CAAC,wCAAwC,CAAC,GAAG,EAAE;YAE/D,OAAO;AACL,gBAAA,GAAG,UAAU;gBACb,SAAS;gBACT,gBAAgB;aACjB;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AACxB,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA,MAAA,CAAQ,CAAC;IAC/D;IAEA,eAAe,CAAC,MAAc,EAAE,OAAiB,EAAA;QAC/C,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IACjD;AAEU,IAAA,yBAAyB,CACjC,GAAgB,EAChB,iBAEa,EACb,gBAKa,EAAA;AAEb,QAAA,IAAI,CAAC;aACF,IAAI,CAAC,8BAA8B,EAAE;AACpC,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,IAAI,EAAE;gBACJ,GAAG;gBACH,iBAAiB;gBACjB,gBAAgB;AACjB,aAAA;AACD,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE,IAAI;SACnB;AACA,aAAA,WAAW;aACX,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,CAAC,MAA8C,KAAI;AAC3D,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;AAE5B,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,IAAI,KAAI;AACZ,gBAAA,GAAG,GAAG;AACJ,oBAAA,GAAG,GAAG;AACN,oBAAA,GAAG,IAAI;iBACR;AACD,gBAAA,OAAO,GAAG;YACZ,CAAC,EACD,EAA4B,CAC7B;AACD,YAAA,GAAG,CAAC,6BAA6B,CAAC,GAAG,UAAU;YAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAChE,YAAA,IAAI,QAAuB;YAC3B,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,QAAQ,GAAG;AACT,oBAAA,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AACtB,oBAAA;AACE,wBAAA,GAAG,GAAG;AACN,wBAAA,2BAA2B,EAAE,UAAU;wBACvC,mCAAmC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CACnE,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,EACzB,CAAC,CACF;AACF,qBAAA;iBACF;YACH;iBAAO;gBACL,QAAQ;oBACN,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAI;wBACrB,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;4BACnB,OAAO;AACL,gCAAA,GAAG,CAAC;gCACJ,mCAAmC,EAAE,MAAM,CAAC,MAAM,CAChD,UAAU,CACX,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;AACtC,gCAAA,2BAA2B,EAAE,UAAU;6BACxC;wBACH;AACA,wBAAA,OAAO,CAAC;oBACV,CAAC,CAAC,IAAI,EAAE;YACZ;AAEA,YAAA,OAAO,EAAE,CAAC,QAAQ,CAAC;AACrB,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,IAAI,CAAC,QAAQ;gBAAE;AACf,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,EAAE;IAChB;AAEU,IAAA,gBAAgB,CAAC,GAAgB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE;YAChC;QACF;AACA,QAAA,IAAI,GAAG,CAAC,iCAAiC,CAAC,EAAE;AAC1C,YAAA,GAAG,CAAC,iCAAiC,CAAC,GAAG,KAAK;QAChD;aAAO;AACL,YAAA,GAAG,CAAC,iCAAiC,CAAC,GAAG,IAAI;QAC/C;QACA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAChE,QAAA,IAAI,QAAmC;QACvC,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;AACzC,gBAAA,GAAG,CAAC;AACJ,gBAAA,+BAA+B,EAAE,KAAK;AACvC,aAAA,CAAC,CAAC;YACH,QAAQ,GAAG,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC;QACxC;aAAO;YACL,QAAQ;gBACN,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAI;oBACrB,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;wBACnB,OAAO;AACL,4BAAA,GAAG,CAAC;AACJ,4BAAA,+BAA+B,EAAE,GAAG,CAAC,iCAAiC,CAAC;yBACxE;oBACH;oBACA,OAAO;AACL,wBAAA,GAAG,CAAC;AACJ,wBAAA,+BAA+B,EAAE,KAAK;qBACvC;gBACH,CAAC,CAAC,IAAI,EAAE;QACZ;QACA,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC;IACF;+GA7WW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7FvC,uhKA+GA,EAAA,MAAA,EAAA,CAAA,y0CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7BI,WAAW,8BACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,0TAThB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EASX,WAAW,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGF,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAnBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,SAAS;wBACT,WAAW;wBACX,WAAW;wBACX,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,wBAAwB;wBACxB,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,WAAW;AACZ,qBAAA,EAAA,QAAA,EAAA,uhKAAA,EAAA,MAAA,EAAA,CAAA,y0CAAA,CAAA,EAAA;;;AEjEH,MAAM,iBAAiB,GAA0B;AAC/C,IAAA,WAAW,EAAE,0CAA0C;AACvD,IAAA,MAAM,EAAE,CAAC;CACV;AA0BK,MAAO,0CAA2C,SAAQ,eAA0C,CAAA;AACxG,IAAA,IAAa,KAAK,GAAA;QAChB,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;IAChG;AAEA,IAAA,IAAa,gBAAgB,GAAA;QAC3B,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;IACpC;AAQA,IAAA,WAAA,GAAA;QACE,KAAK,CACH,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAc,EAC9D,MAAM,CAA0B,UAAU,CAAC,EAC3C,iBAAiB,CAClB;AAXM,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAoB;AAChD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAmC,SAAS,2FAAC;QAE/D,IAAA,CAAA,iBAAiB,GAAG,iBAAiB;IAQxD;AAEU,IAAA,QAAQ,CAAC,KAAgC,EAAA;AACjD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;+GA3BW,0CAA0C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1C,0CAA0C,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0CAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAF1C,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrDxG,w7BAuBA,EAAA,MAAA,EAAA,CAAA,6ZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDyBI,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,yBAAyB,+HACzB,0BAA0B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAJxB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAQJ,0CAA0C,EAAA,UAAA,EAAA,CAAA;kBAnBtD,SAAS;+BACE,0CAA0C,EAAA,eAAA,EAGnC,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,kBAAkB,EAAE,kBAAkB;AACtC,wBAAA,MAAM,EAAE,IAAI;qBACb,EAAA,OAAA,EACQ;wBACP,aAAa;wBACb,uBAAuB;wBACvB,yBAAyB;wBACzB,0BAA0B;wBAC1B,wBAAwB;qBACzB,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAA,0CAA4C,EAAE,CAAC,EAAA,QAAA,EAAA,w7BAAA,EAAA,MAAA,EAAA,CAAA,6ZAAA,CAAA,EAAA;;;AE1CxG;MAgBa,6BAA6B,CAAA;AAf1C,IAAA,WAAA,GAAA;AAgBW,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAoB;AAChD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAa;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAmC,SAAS,2FAAC;QACzE,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;AAEb,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,mFAC3D;AACF,IAAA;+GAVY,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3B1C,w6EAmEA,EAAA,MAAA,EAAA,CAAA,0IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjDI,mBAAmB,q6BACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yBAAyB,6FACzB,0CAA0C,EAAA,QAAA,EAAA,0CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGjC,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAfzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,eAAA,EAGpB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,mBAAmB;wBACnB,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,gBAAgB;wBAChB,yBAAyB;wBACzB,0CAA0C;AAC3C,qBAAA,EAAA,QAAA,EAAA,w6EAAA,EAAA,MAAA,EAAA,CAAA,0IAAA,CAAA,EAAA;;;;;"}
@@ -1,2 +1,3 @@
1
- export { n as DialogTemplateComponent, o as FORM_ACTIONS_TOKEN, p as FORM_CONFIG_TOKEN, q as FORM_INPUTS_TOKEN, r as FORM_SLIDES_TOKEN, u as FormBuilderComponent, c as FormTowerControllerService, v as FormatDataPipe, w as FormsComponent, x as MSCOA_TREE_PROVIDER, y as MULTIPLE_FORM_INPUT_TOKEN, z as MscoaFormInputComponent, N as NGX_T_FORMS_CONFIG_TOKEN, B as NgxTFormsComponent, C as NgxTFormsService, P as PropertyAccessError, E as SignatureInputElementComponent, T as TDynamicDataEditComponent, b as TDynamicDataViewComponent, G as TFormInputComponent, U as UTILS_OBJECT_TOKEN, H as UserFormStepperComponent, V as ValidationExpressioCreatorComponent, a as assignDeepPropertyToObject, I as createFileFromBase64, K as formGenerator, L as getPipedValueFromDataType, O as getSampleValueForInput, Q as getSectionElements, R as getSignatureImage, W as getUrl, X as getValueFromValueAccessor, Y as initFormConfigToV2, Z as provideNgxTForms, $ as returnDeepProperty, a0 as returnMappedPathValue, s as safeReturnDeepProperty, t as testAgainstItem, a1 as textIconsForUserHints, a2 as validateExpressionSyntax, a3 as validateObjectAgainstString } from './ngx-t-forms-ngx-t-forms-D9qmig6g.mjs';
1
+ export { o as DialogTemplateComponent, H as FORM_ACTIONS_TOKEN, I as FORM_CONFIG_TOKEN, K as FORM_INPUTS_TOKEN, L as FORM_ROUTE_SOURCE, O as FORM_SLIDES_TOKEN, p as FormBuilderComponent, Q as FormTowerControllerService, x as FormatDataPipe, q as FormsComponent, R as HttpPipelineRepository, W as IMPORT_TOWER_INSTANCE_ID, X as INPUT_SECRET_TOKEN, Y as MSCOA_TREE_PROVIDER, Z as MULTIPLE_FORM_INPUT_TOKEN, M as MscoaFormInputComponent, N as NGX_T_FORMS_CONFIG_TOKEN, $ as NgxTFormsComponent, a0 as NgxTFormsService, a1 as PIPELINE_REPOSITORY, a2 as PipelineRepository, a3 as PropertyAccessError, S as SignatureInputElementComponent, T as TDynamicDataEditComponent, b as TDynamicDataViewComponent, a4 as TFormImportController, r as TFormInputComponent, a5 as UTILS_OBJECT_TOKEN, U as UserFormStepperComponent, V as ValidationExpressioCreatorComponent, a as assignDeepPropertyToObject, a6 as createFileFromBase64, a7 as formGenerator, a8 as getPipedValueFromDataType, a9 as getSampleValueForInput, aa as getSectionElements, u as getSignatureImage, ab as getUrl, ac as getValueFromValueAccessor, ad as initFormConfigToV2, ae as provideNgxTForms, af as returnDeepProperty, w as returnMappedPathValue, s as safeReturnDeepProperty, ag as sheetConsolodation, t as testAgainstItem, ah as textIconsForUserHints, ai as validateExpressionSyntax, aj as validateObjectAgainstString, ak as withHttpPipeline, al as withInputSecret, am as withRouterFormId } from './ngx-t-forms-ngx-t-forms-u_kigDid.mjs';
2
+ export { WorkflowFunctionTypes } from 'ngx-t-forms-types';
2
3
  //# sourceMappingURL=ngx-t-forms.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-t-forms.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"ngx-t-forms.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-t-forms",
3
- "version": "2.0.29",
3
+ "version": "2.0.31",
4
4
  "description": "Angular forms module for creating dynamic forms through configuration. Supports form validation, custom controls, and complex form structures.",
5
5
  "license": "UNLICENSED",
6
6
  "author": {
@@ -18,34 +18,36 @@
18
18
  "form-builder"
19
19
  ],
20
20
  "peerDependencies": {
21
- "@angular/cdk": "^21.1.0",
22
- "@angular/common": "^21.1.0",
23
- "@angular/core": "^21.1.0",
24
- "@angular/forms": "^21.1.0",
25
- "@angular/material": "^21.1.0",
26
- "@editorjs/code": "^2.9.3",
21
+ "@angular/cdk": "^21.0.0",
22
+ "@angular/common": "^21.0.0",
23
+ "@angular/core": "^21.0.0",
24
+ "@angular/forms": "^21.0.0",
25
+ "@angular/material": "^21.0.0",
26
+ "@angular/router": "^21.0.0",
27
+ "@editorjs/code": "^2.9.4",
27
28
  "@editorjs/delimiter": "^1.4.2",
28
- "@editorjs/editorjs": "^2.30.7",
29
- "@editorjs/embed": "^2.7.6",
29
+ "@editorjs/editorjs": "^2.31.6",
30
+ "@editorjs/embed": "^2.7.7",
30
31
  "@editorjs/header": "^2.8.8",
31
- "@editorjs/image": "^2.10.1",
32
- "@editorjs/list": "^2.0.2",
32
+ "@editorjs/image": "^2.10.3",
33
+ "@editorjs/list": "^2.0.9",
33
34
  "@editorjs/marker": "^1.4.0",
34
35
  "@editorjs/paragraph": "^2.11.7",
35
36
  "@editorjs/quote": "^2.7.6",
36
37
  "@editorjs/raw": "^2.5.1",
37
- "@editorjs/table": "^2.4.3",
38
+ "@editorjs/table": "^2.4.5",
38
39
  "@editorjs/text-variant-tune": "^1.0.3",
39
40
  "db-aggregation-pipeline-builder": "^1.0.0",
40
41
  "html5-qrcode": "^2.3.8",
41
- "joi": "^17.13.3",
42
- "mathjs": "^14.2.0",
43
- "ngx-t-forms-types": "^0.0.17",
42
+ "katex": "^0.16.11",
43
+ "mathjs": "^15.2.0",
44
+ "ngx-t-forms-types": "^0.0.21",
44
45
  "ngx-ui-tour-md-menu": "^16.0.0",
45
- "qrcode": "^1.5.3",
46
+ "qrcode": "^1.5.4",
47
+ "quill": "^2.0.3",
46
48
  "rxjs": "~7.8.0",
47
- "signature_pad": "^5.0.4",
48
- "uuid": "^11.0.5"
49
+ "signature_pad": "^5.1.3",
50
+ "uuid": "^11.1.0"
49
51
  },
50
52
  "dependencies": {
51
53
  "tslib": "^2.3.0"
@@ -0,0 +1,62 @@
1
+ // ngx-t-forms — Shared editor mixins (TDDE editor redesign · Phase 0)
2
+ // =====================================================================
3
+ //
4
+ // Internal SCSS helpers consumed by the t-dynamic-data-edit editor components
5
+ // via `@use '..../styles/editor-mixins' as editor;`. They only reference
6
+ // `var(--lib-forms-*)` tokens (defined globally on :root in _tokens.scss) so
7
+ // they stay dark-mode-safe and never hardcode a hex literal (CLAUDE.md §3).
8
+ //
9
+ // These are the single source of truth for the recurring editor "look" so the
10
+ // 21 editors stay consistent instead of re-inventing focus rings, cards and
11
+ // chips 21 times.
12
+
13
+ /// Material-style focus ring: primary border + soft primary halo.
14
+ @mixin focus-ring {
15
+ outline: none;
16
+ border-color: var(--lib-forms-primary);
17
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--lib-forms-primary) 25%, transparent);
18
+ }
19
+
20
+ /// Disabled affordance — dim + inert. Pair with `aria-disabled`/`[disabled]`.
21
+ @mixin disabled {
22
+ opacity: 0.55;
23
+ pointer-events: none;
24
+ }
25
+
26
+ /// Section / group card (GDP §17 soft elevation, no divider lines).
27
+ @mixin card {
28
+ background: var(--lib-forms-surface);
29
+ border: 1px solid color-mix(in srgb, var(--lib-forms-outline) 15%, transparent);
30
+ border-radius: var(--lib-forms-radius-lg, 12px);
31
+ box-shadow: var(--lib-forms-shadow-resting);
32
+ }
33
+
34
+ /// Token-styled text input matching the outline mat-form-field metrics.
35
+ @mixin field-input {
36
+ min-height: 2.25rem;
37
+ padding: 0.5rem 0.75rem;
38
+ border: 1px solid var(--lib-forms-outline);
39
+ border-radius: var(--lib-forms-radius-sm, 8px);
40
+ background: var(--lib-forms-surface);
41
+ font-size: 0.875rem;
42
+ color: var(--lib-forms-on-surface);
43
+ transition:
44
+ border-color var(--lib-forms-duration-hover, 300ms) var(--lib-forms-easing),
45
+ box-shadow var(--lib-forms-duration-hover, 300ms) var(--lib-forms-easing);
46
+
47
+ &:focus {
48
+ @include focus-ring;
49
+ }
50
+ }
51
+
52
+ /// Removable chip / tag (design-rule-book §14).
53
+ @mixin chip {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: 0.5rem;
57
+ padding: 0.25rem 0.5rem 0.25rem 0.625rem;
58
+ background: color-mix(in srgb, var(--lib-forms-primary) 10%, transparent);
59
+ border-radius: var(--lib-forms-radius-pill, 6px);
60
+ font-size: 0.8125rem;
61
+ color: var(--lib-forms-on-surface);
62
+ }