@gnggln/ng-ui-system 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (721) hide show
  1. package/accordion/entry-accordion.d.ts +4 -0
  2. package/accordion/index.d.ts +5 -0
  3. package/accordion/lib/components/accordion/accordion.component.d.ts +125 -0
  4. package/accordion/lib/components/accordion/accordion.types.d.ts +64 -0
  5. package/accordion/lib/components/accordion/index.d.ts +2 -0
  6. package/accordion/lib/core/types/index.d.ts +133 -0
  7. package/base-layout/entry-base-layout.d.ts +4 -0
  8. package/base-layout/index.d.ts +5 -0
  9. package/base-layout/lib/components/base-layout/base-layout.component.d.ts +108 -0
  10. package/base-layout/lib/components/base-layout/base-layout.types.d.ts +40 -0
  11. package/base-layout/lib/components/base-layout/index.d.ts +13 -0
  12. package/base-layout/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  13. package/base-layout/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  14. package/base-layout/lib/components/blackbox/blackbox.service.d.ts +144 -0
  15. package/base-layout/lib/components/blackbox/blackbox.types.d.ts +238 -0
  16. package/base-layout/lib/components/button/button-area.component.d.ts +93 -0
  17. package/base-layout/lib/components/button/button.component.d.ts +61 -0
  18. package/base-layout/lib/components/button/button.types.d.ts +75 -0
  19. package/base-layout/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  20. package/base-layout/lib/components/page-header/page-header.component.d.ts +59 -0
  21. package/base-layout/lib/components/page-header/page-header.types.d.ts +96 -0
  22. package/base-layout/lib/core/types/index.d.ts +133 -0
  23. package/blackbox/entry-blackbox.d.ts +4 -0
  24. package/blackbox/index.d.ts +5 -0
  25. package/blackbox/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  26. package/blackbox/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  27. package/blackbox/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  28. package/blackbox/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  29. package/blackbox/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  30. package/blackbox/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  31. package/blackbox/lib/components/blackbox/blackbox.service.d.ts +144 -0
  32. package/blackbox/lib/components/blackbox/blackbox.types.d.ts +238 -0
  33. package/blackbox/lib/components/blackbox/index.d.ts +23 -0
  34. package/blackbox/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  35. package/blackbox/lib/components/button/button-area.component.d.ts +93 -0
  36. package/blackbox/lib/components/button/button.component.d.ts +61 -0
  37. package/blackbox/lib/components/button/button.types.d.ts +75 -0
  38. package/blackbox/lib/components/button/index.d.ts +15 -0
  39. package/blackbox/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  40. package/blackbox/lib/components/modal/index.d.ts +4 -0
  41. package/blackbox/lib/components/modal/modal.component.d.ts +44 -0
  42. package/blackbox/lib/components/modal/modal.service.d.ts +93 -0
  43. package/blackbox/lib/components/modal/modal.types.d.ts +110 -0
  44. package/blackbox/lib/core/types/index.d.ts +133 -0
  45. package/button/entry-button.d.ts +4 -0
  46. package/button/index.d.ts +5 -0
  47. package/button/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  48. package/button/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  49. package/button/lib/components/blackbox/blackbox.service.d.ts +144 -0
  50. package/button/lib/components/blackbox/blackbox.types.d.ts +238 -0
  51. package/button/lib/components/button/button-area.component.d.ts +93 -0
  52. package/button/lib/components/button/button.component.d.ts +61 -0
  53. package/button/lib/components/button/button.types.d.ts +75 -0
  54. package/button/lib/components/button/index.d.ts +15 -0
  55. package/button/lib/core/types/index.d.ts +133 -0
  56. package/core/entry-core.d.ts +5 -0
  57. package/core/index.d.ts +5 -0
  58. package/core/lib/core/types/index.d.ts +133 -0
  59. package/core/lib/core/utils/index.d.ts +60 -0
  60. package/crud-table/entry-crud-table.d.ts +4 -0
  61. package/crud-table/index.d.ts +5 -0
  62. package/crud-table/lib/components/accordion/accordion.component.d.ts +125 -0
  63. package/crud-table/lib/components/accordion/accordion.types.d.ts +64 -0
  64. package/crud-table/lib/components/accordion/index.d.ts +2 -0
  65. package/crud-table/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  66. package/crud-table/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  67. package/crud-table/lib/components/blackbox/blackbox.service.d.ts +144 -0
  68. package/crud-table/lib/components/blackbox/blackbox.types.d.ts +238 -0
  69. package/crud-table/lib/components/button/button-area.component.d.ts +93 -0
  70. package/crud-table/lib/components/button/button.component.d.ts +61 -0
  71. package/crud-table/lib/components/button/button.types.d.ts +75 -0
  72. package/crud-table/lib/components/button/index.d.ts +15 -0
  73. package/crud-table/lib/components/crud-table/crud-table.component.d.ts +143 -0
  74. package/crud-table/lib/components/crud-table/crud-table.types.d.ts +207 -0
  75. package/crud-table/lib/components/crud-table/index.d.ts +15 -0
  76. package/crud-table/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  77. package/crud-table/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  78. package/crud-table/lib/components/form-builder/form-builder.component.d.ts +279 -0
  79. package/crud-table/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  80. package/crud-table/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  81. package/crud-table/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  82. package/crud-table/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  83. package/crud-table/lib/components/form-builder/services/location.service.d.ts +83 -0
  84. package/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  85. package/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  86. package/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  87. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  88. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  89. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  90. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  91. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  92. package/crud-table/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  93. package/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  94. package/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  95. package/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  96. package/crud-table/lib/components/form-builder/types/condition.types.d.ts +51 -0
  97. package/crud-table/lib/components/form-builder/types/field.types.d.ts +330 -0
  98. package/crud-table/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  99. package/crud-table/lib/components/form-builder/types/schema.types.d.ts +304 -0
  100. package/crud-table/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  101. package/crud-table/lib/components/form-builder/types/validation.types.d.ts +179 -0
  102. package/crud-table/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  103. package/crud-table/lib/components/modal/modal.service.d.ts +93 -0
  104. package/crud-table/lib/components/modal/modal.types.d.ts +110 -0
  105. package/crud-table/lib/core/logging/logger.config.d.ts +18 -0
  106. package/crud-table/lib/core/logging/logger.service.d.ts +75 -0
  107. package/crud-table/lib/core/logging/logger.types.d.ts +70 -0
  108. package/crud-table/lib/core/types/index.d.ts +133 -0
  109. package/esm2022/accordion/entry-accordion.mjs +5 -0
  110. package/esm2022/accordion/gnggln-ng-ui-system-accordion.mjs +5 -0
  111. package/esm2022/accordion/lib/components/accordion/accordion.component.mjs +398 -0
  112. package/esm2022/accordion/lib/components/accordion/accordion.types.mjs +6 -0
  113. package/esm2022/accordion/lib/components/accordion/index.mjs +2 -0
  114. package/esm2022/accordion/lib/core/types/index.mjs +6 -0
  115. package/esm2022/base-layout/entry-base-layout.mjs +5 -0
  116. package/esm2022/base-layout/gnggln-ng-ui-system-base-layout.mjs +5 -0
  117. package/esm2022/base-layout/lib/components/base-layout/base-layout.component.mjs +272 -0
  118. package/esm2022/base-layout/lib/components/base-layout/base-layout.types.mjs +6 -0
  119. package/esm2022/base-layout/lib/components/base-layout/index.mjs +14 -0
  120. package/esm2022/base-layout/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  121. package/esm2022/base-layout/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  122. package/esm2022/base-layout/lib/components/blackbox/blackbox.service.mjs +323 -0
  123. package/esm2022/base-layout/lib/components/blackbox/blackbox.types.mjs +25 -0
  124. package/esm2022/base-layout/lib/components/button/button-area.component.mjs +210 -0
  125. package/esm2022/base-layout/lib/components/button/button.component.mjs +180 -0
  126. package/esm2022/base-layout/lib/components/button/button.types.mjs +6 -0
  127. package/esm2022/base-layout/lib/components/page-header/breadcrumb.service.mjs +243 -0
  128. package/esm2022/base-layout/lib/components/page-header/page-header.component.mjs +243 -0
  129. package/esm2022/base-layout/lib/components/page-header/page-header.types.mjs +21 -0
  130. package/esm2022/base-layout/lib/core/types/index.mjs +6 -0
  131. package/esm2022/blackbox/entry-blackbox.mjs +5 -0
  132. package/esm2022/blackbox/gnggln-ng-ui-system-blackbox.mjs +5 -0
  133. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  134. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  135. package/esm2022/blackbox/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  136. package/esm2022/blackbox/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  137. package/esm2022/blackbox/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  138. package/esm2022/blackbox/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  139. package/esm2022/blackbox/lib/components/blackbox/blackbox.service.mjs +323 -0
  140. package/esm2022/blackbox/lib/components/blackbox/blackbox.types.mjs +25 -0
  141. package/esm2022/blackbox/lib/components/blackbox/index.mjs +27 -0
  142. package/esm2022/blackbox/lib/components/blackbox/ui-track.directive.mjs +69 -0
  143. package/esm2022/blackbox/lib/components/button/button-area.component.mjs +210 -0
  144. package/esm2022/blackbox/lib/components/button/button.component.mjs +180 -0
  145. package/esm2022/blackbox/lib/components/button/button.types.mjs +6 -0
  146. package/esm2022/blackbox/lib/components/button/index.mjs +16 -0
  147. package/esm2022/blackbox/lib/components/modal/confirm-dialog.component.mjs +151 -0
  148. package/esm2022/blackbox/lib/components/modal/index.mjs +4 -0
  149. package/esm2022/blackbox/lib/components/modal/modal.component.mjs +139 -0
  150. package/esm2022/blackbox/lib/components/modal/modal.service.mjs +197 -0
  151. package/esm2022/blackbox/lib/components/modal/modal.types.mjs +6 -0
  152. package/esm2022/blackbox/lib/core/types/index.mjs +6 -0
  153. package/esm2022/button/entry-button.mjs +5 -0
  154. package/esm2022/button/gnggln-ng-ui-system-button.mjs +5 -0
  155. package/esm2022/button/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  156. package/esm2022/button/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  157. package/esm2022/button/lib/components/blackbox/blackbox.service.mjs +323 -0
  158. package/esm2022/button/lib/components/blackbox/blackbox.types.mjs +25 -0
  159. package/esm2022/button/lib/components/button/button-area.component.mjs +210 -0
  160. package/esm2022/button/lib/components/button/button.component.mjs +180 -0
  161. package/esm2022/button/lib/components/button/button.types.mjs +6 -0
  162. package/esm2022/button/lib/components/button/index.mjs +16 -0
  163. package/esm2022/button/lib/core/types/index.mjs +6 -0
  164. package/esm2022/core/entry-core.mjs +6 -0
  165. package/esm2022/core/gnggln-ng-ui-system-core.mjs +5 -0
  166. package/esm2022/core/lib/core/types/index.mjs +6 -0
  167. package/esm2022/core/lib/core/utils/index.mjs +102 -0
  168. package/esm2022/crud-table/entry-crud-table.mjs +5 -0
  169. package/esm2022/crud-table/gnggln-ng-ui-system-crud-table.mjs +5 -0
  170. package/esm2022/crud-table/lib/components/accordion/accordion.component.mjs +398 -0
  171. package/esm2022/crud-table/lib/components/accordion/accordion.types.mjs +6 -0
  172. package/esm2022/crud-table/lib/components/accordion/index.mjs +2 -0
  173. package/esm2022/crud-table/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  174. package/esm2022/crud-table/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  175. package/esm2022/crud-table/lib/components/blackbox/blackbox.service.mjs +323 -0
  176. package/esm2022/crud-table/lib/components/blackbox/blackbox.types.mjs +25 -0
  177. package/esm2022/crud-table/lib/components/button/button-area.component.mjs +210 -0
  178. package/esm2022/crud-table/lib/components/button/button.component.mjs +180 -0
  179. package/esm2022/crud-table/lib/components/button/button.types.mjs +6 -0
  180. package/esm2022/crud-table/lib/components/button/index.mjs +16 -0
  181. package/esm2022/crud-table/lib/components/crud-table/crud-table.component.mjs +789 -0
  182. package/esm2022/crud-table/lib/components/crud-table/crud-table.types.mjs +6 -0
  183. package/esm2022/crud-table/lib/components/crud-table/index.mjs +16 -0
  184. package/esm2022/crud-table/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  185. package/esm2022/crud-table/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  186. package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +1351 -0
  187. package/esm2022/crud-table/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  188. package/esm2022/crud-table/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  189. package/esm2022/crud-table/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  190. package/esm2022/crud-table/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  191. package/esm2022/crud-table/lib/components/form-builder/services/location.service.mjs +141 -0
  192. package/esm2022/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  193. package/esm2022/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  194. package/esm2022/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  195. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  196. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  197. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  198. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  199. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  200. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  201. package/esm2022/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  202. package/esm2022/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  203. package/esm2022/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  204. package/esm2022/crud-table/lib/components/form-builder/types/condition.types.mjs +6 -0
  205. package/esm2022/crud-table/lib/components/form-builder/types/field.types.mjs +6 -0
  206. package/esm2022/crud-table/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  207. package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +6 -0
  208. package/esm2022/crud-table/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  209. package/esm2022/crud-table/lib/components/form-builder/types/validation.types.mjs +10 -0
  210. package/esm2022/crud-table/lib/components/modal/confirm-dialog.component.mjs +151 -0
  211. package/esm2022/crud-table/lib/components/modal/modal.service.mjs +197 -0
  212. package/esm2022/crud-table/lib/components/modal/modal.types.mjs +6 -0
  213. package/esm2022/crud-table/lib/core/logging/logger.config.mjs +18 -0
  214. package/esm2022/crud-table/lib/core/logging/logger.service.mjs +295 -0
  215. package/esm2022/crud-table/lib/core/logging/logger.types.mjs +7 -0
  216. package/esm2022/crud-table/lib/core/types/index.mjs +6 -0
  217. package/esm2022/crud-table/lib/sources/location-data.opt.json +8942 -0
  218. package/esm2022/crud-table/lib/sources/nazioni.opt.json +215 -0
  219. package/esm2022/form-builder/entry-form-builder.mjs +5 -0
  220. package/esm2022/form-builder/gnggln-ng-ui-system-form-builder.mjs +5 -0
  221. package/esm2022/form-builder/lib/components/accordion/accordion.component.mjs +398 -0
  222. package/esm2022/form-builder/lib/components/accordion/accordion.types.mjs +6 -0
  223. package/esm2022/form-builder/lib/components/accordion/index.mjs +2 -0
  224. package/esm2022/form-builder/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  225. package/esm2022/form-builder/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  226. package/esm2022/form-builder/lib/components/blackbox/blackbox.service.mjs +323 -0
  227. package/esm2022/form-builder/lib/components/blackbox/blackbox.types.mjs +25 -0
  228. package/esm2022/form-builder/lib/components/button/button-area.component.mjs +210 -0
  229. package/esm2022/form-builder/lib/components/button/button.component.mjs +180 -0
  230. package/esm2022/form-builder/lib/components/button/button.types.mjs +6 -0
  231. package/esm2022/form-builder/lib/components/button/index.mjs +16 -0
  232. package/esm2022/form-builder/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  233. package/esm2022/form-builder/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  234. package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +1351 -0
  235. package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +1064 -0
  236. package/esm2022/form-builder/lib/components/form-builder/index.mjs +24 -0
  237. package/esm2022/form-builder/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  238. package/esm2022/form-builder/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  239. package/esm2022/form-builder/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  240. package/esm2022/form-builder/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  241. package/esm2022/form-builder/lib/components/form-builder/services/location.service.mjs +141 -0
  242. package/esm2022/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  243. package/esm2022/form-builder/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  244. package/esm2022/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  245. package/esm2022/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  246. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  247. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  248. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  249. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  250. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  251. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  252. package/esm2022/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  253. package/esm2022/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  254. package/esm2022/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  255. package/esm2022/form-builder/lib/components/form-builder/types/condition.types.mjs +6 -0
  256. package/esm2022/form-builder/lib/components/form-builder/types/field.types.mjs +6 -0
  257. package/esm2022/form-builder/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  258. package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +3 -0
  259. package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +6 -0
  260. package/esm2022/form-builder/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  261. package/esm2022/form-builder/lib/components/form-builder/types/validation.types.mjs +10 -0
  262. package/esm2022/form-builder/lib/core/logging/logger.config.mjs +18 -0
  263. package/esm2022/form-builder/lib/core/logging/logger.service.mjs +295 -0
  264. package/esm2022/form-builder/lib/core/logging/logger.types.mjs +7 -0
  265. package/esm2022/form-builder/lib/core/types/index.mjs +6 -0
  266. package/esm2022/form-builder/lib/sources/location-data.opt.json +8942 -0
  267. package/esm2022/form-builder/lib/sources/nazioni.opt.json +215 -0
  268. package/esm2022/form-builder-editor/entry-form-builder-editor.mjs +5 -0
  269. package/esm2022/form-builder-editor/gnggln-ng-ui-system-form-builder-editor.mjs +5 -0
  270. package/esm2022/form-builder-editor/lib/components/accordion/accordion.component.mjs +398 -0
  271. package/esm2022/form-builder-editor/lib/components/accordion/accordion.types.mjs +6 -0
  272. package/esm2022/form-builder-editor/lib/components/accordion/index.mjs +2 -0
  273. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  274. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  275. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.service.mjs +323 -0
  276. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.types.mjs +25 -0
  277. package/esm2022/form-builder-editor/lib/components/button/button-area.component.mjs +210 -0
  278. package/esm2022/form-builder-editor/lib/components/button/button.component.mjs +180 -0
  279. package/esm2022/form-builder-editor/lib/components/button/button.types.mjs +6 -0
  280. package/esm2022/form-builder-editor/lib/components/button/index.mjs +16 -0
  281. package/esm2022/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  282. package/esm2022/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  283. package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +1351 -0
  284. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  285. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  286. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  287. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  288. package/esm2022/form-builder-editor/lib/components/form-builder/services/location.service.mjs +141 -0
  289. package/esm2022/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  290. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  291. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  292. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  293. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  294. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  295. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  296. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  297. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  298. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  299. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  300. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  301. package/esm2022/form-builder-editor/lib/components/form-builder/types/condition.types.mjs +6 -0
  302. package/esm2022/form-builder-editor/lib/components/form-builder/types/field.types.mjs +6 -0
  303. package/esm2022/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  304. package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +3 -0
  305. package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +6 -0
  306. package/esm2022/form-builder-editor/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  307. package/esm2022/form-builder-editor/lib/components/form-builder/types/validation.types.mjs +10 -0
  308. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  309. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  310. package/esm2022/form-builder-editor/lib/components/form-builder-editor/index.mjs +23 -0
  311. package/esm2022/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  312. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  313. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  314. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  315. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  316. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  317. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  318. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  319. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  320. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  321. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  322. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +473 -0
  323. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  324. package/esm2022/form-builder-editor/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  325. package/esm2022/form-builder-editor/lib/components/modal/confirm-dialog.component.mjs +151 -0
  326. package/esm2022/form-builder-editor/lib/components/modal/index.mjs +4 -0
  327. package/esm2022/form-builder-editor/lib/components/modal/modal.component.mjs +139 -0
  328. package/esm2022/form-builder-editor/lib/components/modal/modal.service.mjs +197 -0
  329. package/esm2022/form-builder-editor/lib/components/modal/modal.types.mjs +6 -0
  330. package/esm2022/form-builder-editor/lib/core/logging/logger.config.mjs +18 -0
  331. package/esm2022/form-builder-editor/lib/core/logging/logger.service.mjs +295 -0
  332. package/esm2022/form-builder-editor/lib/core/logging/logger.types.mjs +7 -0
  333. package/esm2022/form-builder-editor/lib/core/types/index.mjs +6 -0
  334. package/esm2022/form-builder-editor/lib/sources/location-data.opt.json +8942 -0
  335. package/esm2022/form-builder-editor/lib/sources/nazioni.opt.json +215 -0
  336. package/esm2022/http/entry-http.mjs +5 -0
  337. package/esm2022/http/gnggln-ng-ui-system-http.mjs +5 -0
  338. package/esm2022/http/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  339. package/esm2022/http/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  340. package/esm2022/http/lib/components/blackbox/blackbox.service.mjs +323 -0
  341. package/esm2022/http/lib/components/blackbox/blackbox.types.mjs +25 -0
  342. package/esm2022/http/lib/components/http/http-message.handler.mjs +143 -0
  343. package/esm2022/http/lib/components/http/http.service.mjs +228 -0
  344. package/esm2022/http/lib/components/http/http.tokens.mjs +29 -0
  345. package/esm2022/http/lib/components/http/http.types.mjs +6 -0
  346. package/esm2022/http/lib/components/http/index.mjs +19 -0
  347. package/esm2022/http/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  348. package/esm2022/http/lib/components/layout-builder/layout.service.mjs +239 -0
  349. package/esm2022/http/lib/components/toast/toast-container.component.mjs +80 -0
  350. package/esm2022/http/lib/components/toast/toast.component.mjs +151 -0
  351. package/esm2022/http/lib/components/toast/toast.service.mjs +156 -0
  352. package/esm2022/http/lib/components/toast/toast.types.mjs +12 -0
  353. package/esm2022/http/lib/core/types/index.mjs +6 -0
  354. package/esm2022/http/lib/core/utils/index.mjs +102 -0
  355. package/esm2022/layout-builder/entry-layout-builder.mjs +5 -0
  356. package/esm2022/layout-builder/gnggln-ng-ui-system-layout-builder.mjs +5 -0
  357. package/esm2022/layout-builder/lib/components/layout-builder/index.mjs +18 -0
  358. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.component.mjs +1804 -0
  359. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  360. package/esm2022/layout-builder/lib/components/layout-builder/layout.service.mjs +239 -0
  361. package/esm2022/layout-builder/lib/core/types/index.mjs +6 -0
  362. package/esm2022/lib/components/accordion/accordion.component.mjs +106 -61
  363. package/esm2022/lib/components/accordion/accordion.types.mjs +1 -1
  364. package/esm2022/lib/components/base-layout/base-layout.component.mjs +88 -34
  365. package/esm2022/lib/components/base-layout/base-layout.types.mjs +1 -1
  366. package/esm2022/lib/components/base-layout/index.mjs +1 -1
  367. package/esm2022/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  368. package/esm2022/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  369. package/esm2022/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  370. package/esm2022/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  371. package/esm2022/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  372. package/esm2022/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  373. package/esm2022/lib/components/blackbox/blackbox.service.mjs +323 -0
  374. package/esm2022/lib/components/blackbox/blackbox.types.mjs +25 -0
  375. package/esm2022/lib/components/blackbox/index.mjs +27 -0
  376. package/esm2022/lib/components/blackbox/ui-track.directive.mjs +69 -0
  377. package/esm2022/lib/components/button/button-area.component.mjs +16 -2
  378. package/esm2022/lib/components/button/button.component.mjs +23 -7
  379. package/esm2022/lib/components/button/button.types.mjs +1 -1
  380. package/esm2022/lib/components/crud-table/crud-table.component.mjs +14 -14
  381. package/esm2022/lib/components/form-builder/form-builder.component.mjs +710 -183
  382. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +789 -235
  383. package/esm2022/lib/components/form-builder/index.mjs +7 -2
  384. package/esm2022/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  385. package/esm2022/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  386. package/esm2022/lib/components/form-builder/services/location.service.mjs +4 -3
  387. package/esm2022/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  388. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  389. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  390. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  391. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  392. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  393. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  394. package/esm2022/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  395. package/esm2022/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  396. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +3 -3
  397. package/esm2022/lib/components/form-builder/types/field.types.mjs +1 -1
  398. package/esm2022/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  399. package/esm2022/lib/components/form-builder/types/index.mjs +3 -2
  400. package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
  401. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -2
  402. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +3 -3
  403. package/esm2022/lib/components/form-builder-editor/index.mjs +3 -1
  404. package/esm2022/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  405. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +2 -2
  406. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +2 -1
  407. package/esm2022/lib/components/http/http-message.handler.mjs +143 -0
  408. package/esm2022/lib/components/http/http.service.mjs +228 -0
  409. package/esm2022/lib/components/http/http.tokens.mjs +29 -0
  410. package/esm2022/lib/components/http/http.types.mjs +6 -0
  411. package/esm2022/lib/components/http/index.mjs +19 -0
  412. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +27 -15
  413. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +3 -3
  414. package/esm2022/lib/components/modal/modal.service.mjs +5 -2
  415. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +5 -4
  416. package/esm2022/lib/components/table/paginated-table.component.mjs +17 -3
  417. package/esm2022/lib/components/table/table.types.mjs +1 -1
  418. package/esm2022/lib/components/toast/index.mjs +18 -0
  419. package/esm2022/lib/components/toast/toast-container.component.mjs +80 -0
  420. package/esm2022/lib/components/toast/toast.component.mjs +151 -0
  421. package/esm2022/lib/components/toast/toast.service.mjs +156 -0
  422. package/esm2022/lib/components/toast/toast.types.mjs +12 -0
  423. package/esm2022/lib/core/logging/index.mjs +10 -0
  424. package/esm2022/lib/core/logging/logger.config.mjs +18 -0
  425. package/esm2022/lib/core/logging/logger.service.mjs +295 -0
  426. package/esm2022/lib/core/logging/logger.types.mjs +7 -0
  427. package/esm2022/lib/core/types/index.mjs +1 -1
  428. package/esm2022/lib/core/utils/index.mjs +50 -1
  429. package/esm2022/lib/version/ng-ui-system-version.mjs +12 -0
  430. package/esm2022/modal/entry-modal.mjs +5 -0
  431. package/esm2022/modal/gnggln-ng-ui-system-modal.mjs +5 -0
  432. package/esm2022/modal/lib/components/button/button.component.mjs +180 -0
  433. package/esm2022/modal/lib/components/button/button.types.mjs +6 -0
  434. package/esm2022/modal/lib/components/modal/confirm-dialog.component.mjs +151 -0
  435. package/esm2022/modal/lib/components/modal/index.mjs +4 -0
  436. package/esm2022/modal/lib/components/modal/modal.component.mjs +139 -0
  437. package/esm2022/modal/lib/components/modal/modal.service.mjs +197 -0
  438. package/esm2022/modal/lib/components/modal/modal.types.mjs +6 -0
  439. package/esm2022/modal/lib/core/types/index.mjs +6 -0
  440. package/esm2022/page-header/entry-page-header.mjs +5 -0
  441. package/esm2022/page-header/gnggln-ng-ui-system-page-header.mjs +5 -0
  442. package/esm2022/page-header/lib/components/page-header/breadcrumb.service.mjs +243 -0
  443. package/esm2022/page-header/lib/components/page-header/index.mjs +20 -0
  444. package/esm2022/page-header/lib/components/page-header/page-header.component.mjs +243 -0
  445. package/esm2022/page-header/lib/components/page-header/page-header.types.mjs +21 -0
  446. package/esm2022/public-api.mjs +17 -8
  447. package/esm2022/table/entry-table.mjs +5 -0
  448. package/esm2022/table/gnggln-ng-ui-system-table.mjs +5 -0
  449. package/esm2022/table/lib/components/table/index.mjs +2 -0
  450. package/esm2022/table/lib/components/table/paginated-table.component.mjs +421 -0
  451. package/esm2022/table/lib/components/table/table.types.mjs +6 -0
  452. package/esm2022/table/lib/core/utils/index.mjs +102 -0
  453. package/esm2022/toast/entry-toast.mjs +5 -0
  454. package/esm2022/toast/gnggln-ng-ui-system-toast.mjs +5 -0
  455. package/esm2022/toast/lib/components/toast/index.mjs +18 -0
  456. package/esm2022/toast/lib/components/toast/toast-container.component.mjs +80 -0
  457. package/esm2022/toast/lib/components/toast/toast.component.mjs +151 -0
  458. package/esm2022/toast/lib/components/toast/toast.service.mjs +156 -0
  459. package/esm2022/toast/lib/components/toast/toast.types.mjs +12 -0
  460. package/esm2022/toast/lib/core/types/index.mjs +6 -0
  461. package/esm2022/toast/lib/core/utils/index.mjs +102 -0
  462. package/fesm2022/gnggln-ng-ui-system-accordion.mjs +409 -0
  463. package/fesm2022/gnggln-ng-ui-system-accordion.mjs.map +1 -0
  464. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +1905 -0
  465. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -0
  466. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +2829 -0
  467. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -0
  468. package/fesm2022/gnggln-ng-ui-system-button.mjs +1148 -0
  469. package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -0
  470. package/fesm2022/gnggln-ng-ui-system-core.mjs +117 -0
  471. package/fesm2022/gnggln-ng-ui-system-core.mjs.map +1 -0
  472. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +49600 -0
  473. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -0
  474. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +54332 -0
  475. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -0
  476. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +49609 -0
  477. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -0
  478. package/fesm2022/gnggln-ng-ui-system-http.mjs +1878 -0
  479. package/fesm2022/gnggln-ng-ui-system-http.mjs.map +1 -0
  480. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs +2064 -0
  481. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs.map +1 -0
  482. package/fesm2022/gnggln-ng-ui-system-modal.mjs +664 -0
  483. package/fesm2022/gnggln-ng-ui-system-modal.mjs.map +1 -0
  484. package/fesm2022/gnggln-ng-ui-system-page-header.mjs +526 -0
  485. package/fesm2022/gnggln-ng-ui-system-page-header.mjs.map +1 -0
  486. package/fesm2022/gnggln-ng-ui-system-table.mjs +533 -0
  487. package/fesm2022/gnggln-ng-ui-system-table.mjs.map +1 -0
  488. package/fesm2022/gnggln-ng-ui-system-toast.mjs +516 -0
  489. package/fesm2022/gnggln-ng-ui-system-toast.mjs.map +1 -0
  490. package/fesm2022/gnggln-ng-ui-system.mjs +10068 -4234
  491. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  492. package/form-builder/entry-form-builder.d.ts +4 -0
  493. package/form-builder/index.d.ts +5 -0
  494. package/form-builder/lib/components/accordion/accordion.component.d.ts +125 -0
  495. package/form-builder/lib/components/accordion/accordion.types.d.ts +64 -0
  496. package/form-builder/lib/components/accordion/index.d.ts +2 -0
  497. package/form-builder/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  498. package/form-builder/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  499. package/form-builder/lib/components/blackbox/blackbox.service.d.ts +144 -0
  500. package/form-builder/lib/components/blackbox/blackbox.types.d.ts +238 -0
  501. package/form-builder/lib/components/button/button-area.component.d.ts +93 -0
  502. package/form-builder/lib/components/button/button.component.d.ts +61 -0
  503. package/form-builder/lib/components/button/button.types.d.ts +75 -0
  504. package/form-builder/lib/components/button/index.d.ts +15 -0
  505. package/form-builder/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  506. package/form-builder/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  507. package/form-builder/lib/components/form-builder/form-builder.component.d.ts +279 -0
  508. package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +172 -0
  509. package/form-builder/lib/components/form-builder/index.d.ts +19 -0
  510. package/form-builder/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  511. package/form-builder/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  512. package/form-builder/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  513. package/form-builder/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  514. package/form-builder/lib/components/form-builder/services/location.service.d.ts +83 -0
  515. package/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  516. package/form-builder/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  517. package/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  518. package/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  519. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  520. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  521. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  522. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  523. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  524. package/form-builder/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  525. package/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  526. package/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  527. package/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  528. package/form-builder/lib/components/form-builder/types/condition.types.d.ts +51 -0
  529. package/form-builder/lib/components/form-builder/types/field.types.d.ts +330 -0
  530. package/form-builder/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  531. package/form-builder/lib/components/form-builder/types/index.d.ts +6 -0
  532. package/form-builder/lib/components/form-builder/types/schema.types.d.ts +304 -0
  533. package/form-builder/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  534. package/form-builder/lib/components/form-builder/types/validation.types.d.ts +179 -0
  535. package/form-builder/lib/core/logging/logger.config.d.ts +18 -0
  536. package/form-builder/lib/core/logging/logger.service.d.ts +75 -0
  537. package/form-builder/lib/core/logging/logger.types.d.ts +70 -0
  538. package/form-builder/lib/core/types/index.d.ts +133 -0
  539. package/form-builder-editor/entry-form-builder-editor.d.ts +4 -0
  540. package/form-builder-editor/index.d.ts +5 -0
  541. package/form-builder-editor/lib/components/accordion/accordion.component.d.ts +125 -0
  542. package/form-builder-editor/lib/components/accordion/accordion.types.d.ts +64 -0
  543. package/form-builder-editor/lib/components/accordion/index.d.ts +2 -0
  544. package/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  545. package/form-builder-editor/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  546. package/form-builder-editor/lib/components/blackbox/blackbox.service.d.ts +144 -0
  547. package/form-builder-editor/lib/components/blackbox/blackbox.types.d.ts +238 -0
  548. package/form-builder-editor/lib/components/button/button-area.component.d.ts +93 -0
  549. package/form-builder-editor/lib/components/button/button.component.d.ts +61 -0
  550. package/form-builder-editor/lib/components/button/button.types.d.ts +75 -0
  551. package/form-builder-editor/lib/components/button/index.d.ts +15 -0
  552. package/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  553. package/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  554. package/form-builder-editor/lib/components/form-builder/form-builder.component.d.ts +279 -0
  555. package/form-builder-editor/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  556. package/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  557. package/form-builder-editor/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  558. package/form-builder-editor/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  559. package/form-builder-editor/lib/components/form-builder/services/location.service.d.ts +83 -0
  560. package/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  561. package/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  562. package/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  563. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  564. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  565. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  566. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  567. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  568. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  569. package/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  570. package/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  571. package/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  572. package/form-builder-editor/lib/components/form-builder/types/condition.types.d.ts +51 -0
  573. package/form-builder-editor/lib/components/form-builder/types/field.types.d.ts +330 -0
  574. package/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  575. package/form-builder-editor/lib/components/form-builder/types/index.d.ts +6 -0
  576. package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +304 -0
  577. package/form-builder-editor/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  578. package/form-builder-editor/lib/components/form-builder/types/validation.types.d.ts +179 -0
  579. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  580. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  581. package/form-builder-editor/lib/components/form-builder-editor/index.d.ts +17 -0
  582. package/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  583. package/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  584. package/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  585. package/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  586. package/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  587. package/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  588. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  589. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  590. package/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  591. package/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  592. package/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  593. package/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  594. package/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  595. package/form-builder-editor/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  596. package/form-builder-editor/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  597. package/form-builder-editor/lib/components/modal/index.d.ts +4 -0
  598. package/form-builder-editor/lib/components/modal/modal.component.d.ts +44 -0
  599. package/form-builder-editor/lib/components/modal/modal.service.d.ts +93 -0
  600. package/form-builder-editor/lib/components/modal/modal.types.d.ts +110 -0
  601. package/form-builder-editor/lib/core/logging/logger.config.d.ts +18 -0
  602. package/form-builder-editor/lib/core/logging/logger.service.d.ts +75 -0
  603. package/form-builder-editor/lib/core/logging/logger.types.d.ts +70 -0
  604. package/form-builder-editor/lib/core/types/index.d.ts +133 -0
  605. package/http/entry-http.d.ts +4 -0
  606. package/http/index.d.ts +5 -0
  607. package/http/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  608. package/http/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  609. package/http/lib/components/blackbox/blackbox.service.d.ts +144 -0
  610. package/http/lib/components/blackbox/blackbox.types.d.ts +238 -0
  611. package/http/lib/components/http/http-message.handler.d.ts +59 -0
  612. package/http/lib/components/http/http.service.d.ts +98 -0
  613. package/http/lib/components/http/http.tokens.d.ts +29 -0
  614. package/http/lib/components/http/http.types.d.ts +50 -0
  615. package/http/lib/components/http/index.d.ts +17 -0
  616. package/http/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  617. package/http/lib/components/layout-builder/layout.service.d.ts +100 -0
  618. package/http/lib/components/toast/toast-container.component.d.ts +27 -0
  619. package/http/lib/components/toast/toast.component.d.ts +37 -0
  620. package/http/lib/components/toast/toast.service.d.ts +39 -0
  621. package/http/lib/components/toast/toast.types.d.ts +52 -0
  622. package/http/lib/core/types/index.d.ts +133 -0
  623. package/http/lib/core/utils/index.d.ts +60 -0
  624. package/layout-builder/entry-layout-builder.d.ts +4 -0
  625. package/layout-builder/index.d.ts +5 -0
  626. package/layout-builder/lib/components/layout-builder/index.d.ts +16 -0
  627. package/layout-builder/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  628. package/layout-builder/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  629. package/layout-builder/lib/components/layout-builder/layout.service.d.ts +100 -0
  630. package/layout-builder/lib/core/types/index.d.ts +133 -0
  631. package/lib/components/accordion/accordion.component.d.ts +10 -3
  632. package/lib/components/accordion/accordion.types.d.ts +2 -0
  633. package/lib/components/base-layout/base-layout.component.d.ts +36 -11
  634. package/lib/components/base-layout/base-layout.types.d.ts +14 -0
  635. package/lib/components/base-layout/index.d.ts +1 -1
  636. package/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  637. package/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  638. package/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  639. package/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  640. package/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  641. package/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  642. package/lib/components/blackbox/blackbox.service.d.ts +144 -0
  643. package/lib/components/blackbox/blackbox.types.d.ts +238 -0
  644. package/lib/components/blackbox/index.d.ts +23 -0
  645. package/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  646. package/lib/components/button/button-area.component.d.ts +6 -1
  647. package/lib/components/button/button.component.d.ts +8 -2
  648. package/lib/components/button/button.types.d.ts +5 -0
  649. package/lib/components/form-builder/form-builder.component.d.ts +125 -29
  650. package/lib/components/form-builder/form-wizard.component.d.ts +89 -4
  651. package/lib/components/form-builder/index.d.ts +7 -1
  652. package/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  653. package/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  654. package/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  655. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  656. package/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  657. package/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  658. package/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  659. package/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  660. package/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  661. package/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  662. package/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  663. package/lib/components/form-builder/types/field.types.d.ts +48 -6
  664. package/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  665. package/lib/components/form-builder/types/index.d.ts +4 -3
  666. package/lib/components/form-builder/types/schema.types.d.ts +83 -6
  667. package/lib/components/form-builder/types/validation.types.d.ts +5 -0
  668. package/lib/components/form-builder-editor/index.d.ts +2 -0
  669. package/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  670. package/lib/components/http/http-message.handler.d.ts +59 -0
  671. package/lib/components/http/http.service.d.ts +98 -0
  672. package/lib/components/http/http.tokens.d.ts +29 -0
  673. package/lib/components/http/http.types.d.ts +50 -0
  674. package/lib/components/http/index.d.ts +17 -0
  675. package/lib/components/page-header/breadcrumb.service.d.ts +2 -2
  676. package/lib/components/table/table.types.d.ts +5 -0
  677. package/lib/components/toast/index.d.ts +17 -0
  678. package/lib/components/toast/toast-container.component.d.ts +27 -0
  679. package/lib/components/toast/toast.component.d.ts +37 -0
  680. package/lib/components/toast/toast.service.d.ts +39 -0
  681. package/lib/components/toast/toast.types.d.ts +52 -0
  682. package/lib/core/logging/index.d.ts +8 -0
  683. package/lib/core/logging/logger.config.d.ts +18 -0
  684. package/lib/core/logging/logger.service.d.ts +75 -0
  685. package/lib/core/logging/logger.types.d.ts +70 -0
  686. package/lib/core/types/index.d.ts +76 -0
  687. package/lib/core/utils/index.d.ts +31 -0
  688. package/lib/version/ng-ui-system-version.d.ts +9 -0
  689. package/modal/entry-modal.d.ts +4 -0
  690. package/modal/index.d.ts +5 -0
  691. package/modal/lib/components/button/button.component.d.ts +61 -0
  692. package/modal/lib/components/button/button.types.d.ts +75 -0
  693. package/modal/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  694. package/modal/lib/components/modal/index.d.ts +4 -0
  695. package/modal/lib/components/modal/modal.component.d.ts +44 -0
  696. package/modal/lib/components/modal/modal.service.d.ts +93 -0
  697. package/modal/lib/components/modal/modal.types.d.ts +110 -0
  698. package/modal/lib/core/types/index.d.ts +133 -0
  699. package/package.json +93 -8
  700. package/page-header/entry-page-header.d.ts +4 -0
  701. package/page-header/index.d.ts +5 -0
  702. package/page-header/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  703. package/page-header/lib/components/page-header/index.d.ts +16 -0
  704. package/page-header/lib/components/page-header/page-header.component.d.ts +59 -0
  705. package/page-header/lib/components/page-header/page-header.types.d.ts +96 -0
  706. package/public-api.d.ts +11 -6
  707. package/table/entry-table.d.ts +4 -0
  708. package/table/index.d.ts +5 -0
  709. package/table/lib/components/table/index.d.ts +2 -0
  710. package/table/lib/components/table/paginated-table.component.d.ts +85 -0
  711. package/table/lib/components/table/table.types.d.ts +86 -0
  712. package/table/lib/core/utils/index.d.ts +60 -0
  713. package/toast/entry-toast.d.ts +4 -0
  714. package/toast/index.d.ts +5 -0
  715. package/toast/lib/components/toast/index.d.ts +17 -0
  716. package/toast/lib/components/toast/toast-container.component.d.ts +27 -0
  717. package/toast/lib/components/toast/toast.component.d.ts +37 -0
  718. package/toast/lib/components/toast/toast.service.d.ts +39 -0
  719. package/toast/lib/components/toast/toast.types.d.ts +52 -0
  720. package/toast/lib/core/types/index.d.ts +133 -0
  721. package/toast/lib/core/utils/index.d.ts +60 -0
@@ -0,0 +1,1064 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, HostListener, } from '@angular/core';
2
+ import { LucideAngularModule } from 'lucide-angular';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { UiButtonComponent } from '../../components/button/index';
5
+ import { UiFormBuilderComponent } from './form-builder.component';
6
+ import { UiWizardSyncService, } from './services/wizard-sync.service';
7
+ import { UiLoggerService } from '../../core/logging/logger.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "lucide-angular";
10
+ // ─── Componenti interni ───────────────────────────────────────────
11
+ /**
12
+ * Header del wizard: progresso e info dello step corrente.
13
+ * Con `progressStyle: 'steps'` emette `stepSelect` per saltare a uno step già completato.
14
+ */
15
+ export class UiWizardHeaderComponent {
16
+ constructor() {
17
+ this.stepGroups = [];
18
+ this.progressPercent = 0;
19
+ this.currentStepTitle = '';
20
+ this.currentStepDescription = '';
21
+ /** Quando true, i bullet step non sono interattivi (es. wizard disabilitato). */
22
+ this.disableStepIndicators = false;
23
+ this.stepSelect = new EventEmitter();
24
+ }
25
+ /** Indice step selezionabile tramite bullet/titolo (solo step già completati, non il corrente). */
26
+ isStepIndicatorNavigable(stepIndex) {
27
+ if (this.config.allowStepIndicatorNavigation === false)
28
+ return false;
29
+ if (this.disableStepIndicators)
30
+ return false;
31
+ if (this.config.allowBackNavigation === false)
32
+ return false;
33
+ return (stepIndex !== this.state.currentStep &&
34
+ this.state.completedSteps.has(stepIndex));
35
+ }
36
+ /** Testo accessibile per il pulsante step (navigazione). */
37
+ stepAriaLabel(stepTitle) {
38
+ return `Vai allo step: ${stepTitle}`;
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardHeaderComponent, isStandalone: true, selector: "ui-wizard-header", inputs: { config: "config", stepGroups: "stepGroups", state: "state", progressPercent: "progressPercent", currentStepTitle: "currentStepTitle", currentStepDescription: "currentStepDescription", disableStepIndicators: "disableStepIndicators" }, outputs: { stepSelect: "stepSelect" }, ngImport: i0, template: `
42
+ <div class="ui-form-wizard__header">
43
+ @if (config.showProgress !== false) {
44
+ @if (config.progressStyle !== 'steps') {
45
+ <div class="ui-form-wizard__progress-bar">
46
+ <div
47
+ class="ui-form-wizard__progress-fill"
48
+ [style.width.%]="progressPercent"
49
+ ></div>
50
+ </div>
51
+ <span class="ui-form-wizard__progress-text">
52
+ {{ progressPercent }}% completato
53
+ </span>
54
+ } @else {
55
+ <div class="ui-form-wizard__steps">
56
+ @for (
57
+ group of stepGroups;
58
+ track $index;
59
+ let i = $index
60
+ ) {
61
+ <div
62
+ class="ui-form-wizard__step"
63
+ [class.ui-form-wizard__step--current]="
64
+ i === state.currentStep
65
+ "
66
+ [class.ui-form-wizard__step--completed]="
67
+ state.completedSteps.has(i)
68
+ "
69
+ [class.ui-form-wizard__step--visited]="
70
+ state.visitedSteps.has(i)
71
+ "
72
+ [class.ui-form-wizard__step--navigable]="
73
+ isStepIndicatorNavigable(i)
74
+ "
75
+ >
76
+ @if (isStepIndicatorNavigable(i)) {
77
+ <button
78
+ type="button"
79
+ class="ui-form-wizard__step-trigger"
80
+ [attr.aria-label]="
81
+ stepAriaLabel(
82
+ group[0].wizardStep?.stepTitle ||
83
+ group[0].title ||
84
+ 'Step ' + (i + 1)
85
+ )
86
+ "
87
+ (click)="stepSelect.emit(i)"
88
+ >
89
+ <div class="ui-form-wizard__step-circle">
90
+ @if (state.completedSteps.has(i)) {
91
+ <lucide-icon name="check" [size]="16" />
92
+ } @else {
93
+ <span>{{ i + 1 }}</span>
94
+ }
95
+ </div>
96
+ <div class="ui-form-wizard__step-label">
97
+ {{
98
+ group[0].wizardStep?.stepTitle ||
99
+ group[0].title ||
100
+ 'Step ' + (i + 1)
101
+ }}
102
+ </div>
103
+ </button>
104
+ } @else {
105
+ <div
106
+ class="ui-form-wizard__step-static"
107
+ [attr.aria-current]="
108
+ i === state.currentStep ? 'step' : null
109
+ "
110
+ >
111
+ <div class="ui-form-wizard__step-circle">
112
+ @if (state.completedSteps.has(i)) {
113
+ <lucide-icon name="check" [size]="16" />
114
+ } @else {
115
+ <span>{{ i + 1 }}</span>
116
+ }
117
+ </div>
118
+ <div class="ui-form-wizard__step-label">
119
+ {{
120
+ group[0].wizardStep?.stepTitle ||
121
+ group[0].title ||
122
+ 'Step ' + (i + 1)
123
+ }}
124
+ </div>
125
+ </div>
126
+ }
127
+ </div>
128
+ }
129
+ </div>
130
+ }
131
+ }
132
+
133
+ <div class="ui-form-wizard__step-info">
134
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
135
+ @if (currentStepDescription) {
136
+ <p class="ui-form-wizard__step-description">
137
+ {{ currentStepDescription }}
138
+ </p>
139
+ }
140
+ <span class="ui-form-wizard__step-counter">
141
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
142
+ </span>
143
+ </div>
144
+ </div>
145
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], encapsulation: i0.ViewEncapsulation.None }); }
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, decorators: [{
148
+ type: Component,
149
+ args: [{
150
+ selector: 'ui-wizard-header',
151
+ standalone: true,
152
+ imports: [LucideAngularModule],
153
+ encapsulation: ViewEncapsulation.None,
154
+ template: `
155
+ <div class="ui-form-wizard__header">
156
+ @if (config.showProgress !== false) {
157
+ @if (config.progressStyle !== 'steps') {
158
+ <div class="ui-form-wizard__progress-bar">
159
+ <div
160
+ class="ui-form-wizard__progress-fill"
161
+ [style.width.%]="progressPercent"
162
+ ></div>
163
+ </div>
164
+ <span class="ui-form-wizard__progress-text">
165
+ {{ progressPercent }}% completato
166
+ </span>
167
+ } @else {
168
+ <div class="ui-form-wizard__steps">
169
+ @for (
170
+ group of stepGroups;
171
+ track $index;
172
+ let i = $index
173
+ ) {
174
+ <div
175
+ class="ui-form-wizard__step"
176
+ [class.ui-form-wizard__step--current]="
177
+ i === state.currentStep
178
+ "
179
+ [class.ui-form-wizard__step--completed]="
180
+ state.completedSteps.has(i)
181
+ "
182
+ [class.ui-form-wizard__step--visited]="
183
+ state.visitedSteps.has(i)
184
+ "
185
+ [class.ui-form-wizard__step--navigable]="
186
+ isStepIndicatorNavigable(i)
187
+ "
188
+ >
189
+ @if (isStepIndicatorNavigable(i)) {
190
+ <button
191
+ type="button"
192
+ class="ui-form-wizard__step-trigger"
193
+ [attr.aria-label]="
194
+ stepAriaLabel(
195
+ group[0].wizardStep?.stepTitle ||
196
+ group[0].title ||
197
+ 'Step ' + (i + 1)
198
+ )
199
+ "
200
+ (click)="stepSelect.emit(i)"
201
+ >
202
+ <div class="ui-form-wizard__step-circle">
203
+ @if (state.completedSteps.has(i)) {
204
+ <lucide-icon name="check" [size]="16" />
205
+ } @else {
206
+ <span>{{ i + 1 }}</span>
207
+ }
208
+ </div>
209
+ <div class="ui-form-wizard__step-label">
210
+ {{
211
+ group[0].wizardStep?.stepTitle ||
212
+ group[0].title ||
213
+ 'Step ' + (i + 1)
214
+ }}
215
+ </div>
216
+ </button>
217
+ } @else {
218
+ <div
219
+ class="ui-form-wizard__step-static"
220
+ [attr.aria-current]="
221
+ i === state.currentStep ? 'step' : null
222
+ "
223
+ >
224
+ <div class="ui-form-wizard__step-circle">
225
+ @if (state.completedSteps.has(i)) {
226
+ <lucide-icon name="check" [size]="16" />
227
+ } @else {
228
+ <span>{{ i + 1 }}</span>
229
+ }
230
+ </div>
231
+ <div class="ui-form-wizard__step-label">
232
+ {{
233
+ group[0].wizardStep?.stepTitle ||
234
+ group[0].title ||
235
+ 'Step ' + (i + 1)
236
+ }}
237
+ </div>
238
+ </div>
239
+ }
240
+ </div>
241
+ }
242
+ </div>
243
+ }
244
+ }
245
+
246
+ <div class="ui-form-wizard__step-info">
247
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
248
+ @if (currentStepDescription) {
249
+ <p class="ui-form-wizard__step-description">
250
+ {{ currentStepDescription }}
251
+ </p>
252
+ }
253
+ <span class="ui-form-wizard__step-counter">
254
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
255
+ </span>
256
+ </div>
257
+ </div>
258
+ `,
259
+ }]
260
+ }], propDecorators: { config: [{
261
+ type: Input
262
+ }], stepGroups: [{
263
+ type: Input
264
+ }], state: [{
265
+ type: Input
266
+ }], progressPercent: [{
267
+ type: Input
268
+ }], currentStepTitle: [{
269
+ type: Input
270
+ }], currentStepDescription: [{
271
+ type: Input
272
+ }], disableStepIndicators: [{
273
+ type: Input
274
+ }], stepSelect: [{
275
+ type: Output
276
+ }] } });
277
+ /**
278
+ * Footer del wizard: pulsanti di navigazione e salvataggio.
279
+ * Emette eventi per Previous, Next, Finish, Save.
280
+ */
281
+ export class UiWizardFooterComponent {
282
+ constructor() {
283
+ this.isLastStep = false;
284
+ this.previous = new EventEmitter();
285
+ this.next = new EventEmitter();
286
+ this.finish = new EventEmitter();
287
+ this.save = new EventEmitter();
288
+ }
289
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
290
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardFooterComponent, isStandalone: true, selector: "ui-wizard-footer", inputs: { config: "config", state: "state", isLastStep: "isLastStep" }, outputs: { previous: "previous", next: "next", finish: "finish", save: "save" }, ngImport: i0, template: `
291
+ <div class="ui-form-wizard__footer">
292
+ @if (
293
+ config.allowBackNavigation !== false && state.currentStep > 0
294
+ ) {
295
+ <div class="ui-form-wizard__nav-action">
296
+ <ui-button
297
+ [label]="config.buttonLabels?.previous ?? 'Indietro'"
298
+ variant="outline"
299
+ icon="chevron-left"
300
+ (click)="previous.emit()"
301
+ />
302
+ <span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
303
+ </div>
304
+ } @else {
305
+ <div></div>
306
+ }
307
+
308
+ <div class="ui-form-wizard__footer-right">
309
+ @if (config.autoSave && config.buttonLabels?.save) {
310
+ <ui-button
311
+ [label]="config.buttonLabels!.save!"
312
+ variant="outline"
313
+ (click)="save.emit()"
314
+ />
315
+ }
316
+ <div class="ui-form-wizard__nav-action">
317
+ @if (isLastStep) {
318
+ <ui-button
319
+ [label]="config.buttonLabels?.finish ?? 'Completa'"
320
+ variant="primary"
321
+ icon="check"
322
+ iconPosition="trailing"
323
+ (click)="finish.emit()"
324
+ />
325
+ } @else {
326
+ <ui-button
327
+ [label]="
328
+ config.buttonLabels?.next ??
329
+ config.buttonLabels?.submit ??
330
+ 'Avanti'
331
+ "
332
+ variant="primary"
333
+ icon="chevron-right"
334
+ iconPosition="trailing"
335
+ (click)="next.emit()"
336
+ />
337
+ }
338
+ <span class="ui-form-wizard__nav-hint">Ctrl + →</span>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ `, isInline: true, dependencies: [{ kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, decorators: [{
345
+ type: Component,
346
+ args: [{
347
+ selector: 'ui-wizard-footer',
348
+ standalone: true,
349
+ imports: [UiButtonComponent],
350
+ encapsulation: ViewEncapsulation.None,
351
+ template: `
352
+ <div class="ui-form-wizard__footer">
353
+ @if (
354
+ config.allowBackNavigation !== false && state.currentStep > 0
355
+ ) {
356
+ <div class="ui-form-wizard__nav-action">
357
+ <ui-button
358
+ [label]="config.buttonLabels?.previous ?? 'Indietro'"
359
+ variant="outline"
360
+ icon="chevron-left"
361
+ (click)="previous.emit()"
362
+ />
363
+ <span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
364
+ </div>
365
+ } @else {
366
+ <div></div>
367
+ }
368
+
369
+ <div class="ui-form-wizard__footer-right">
370
+ @if (config.autoSave && config.buttonLabels?.save) {
371
+ <ui-button
372
+ [label]="config.buttonLabels!.save!"
373
+ variant="outline"
374
+ (click)="save.emit()"
375
+ />
376
+ }
377
+ <div class="ui-form-wizard__nav-action">
378
+ @if (isLastStep) {
379
+ <ui-button
380
+ [label]="config.buttonLabels?.finish ?? 'Completa'"
381
+ variant="primary"
382
+ icon="check"
383
+ iconPosition="trailing"
384
+ (click)="finish.emit()"
385
+ />
386
+ } @else {
387
+ <ui-button
388
+ [label]="
389
+ config.buttonLabels?.next ??
390
+ config.buttonLabels?.submit ??
391
+ 'Avanti'
392
+ "
393
+ variant="primary"
394
+ icon="chevron-right"
395
+ iconPosition="trailing"
396
+ (click)="next.emit()"
397
+ />
398
+ }
399
+ <span class="ui-form-wizard__nav-hint">Ctrl + →</span>
400
+ </div>
401
+ </div>
402
+ </div>
403
+ `,
404
+ }]
405
+ }], propDecorators: { config: [{
406
+ type: Input
407
+ }], state: [{
408
+ type: Input
409
+ }], isLastStep: [{
410
+ type: Input
411
+ }], previous: [{
412
+ type: Output
413
+ }], next: [{
414
+ type: Output
415
+ }], finish: [{
416
+ type: Output
417
+ }], save: [{
418
+ type: Output
419
+ }] } });
420
+ // ─── Componente wizard principale ─────────────────────────────────
421
+ /**
422
+ * Componente wizard che wrappa `UiFormBuilderComponent`
423
+ * aggiungendo navigazione multi-step, barra di progresso,
424
+ * validazione per step e sincronizzazione wireless.
425
+ * Più sezioni schema con lo stesso `wizardStep.stepNumber` formano un unico passo
426
+ * (es. più blocchi collassabili per step); metadati del passo dalla prima sezione del gruppo.
427
+ *
428
+ * @selector ui-form-wizard
429
+ *
430
+ * @example
431
+ * ```html
432
+ * <ui-form-wizard
433
+ * [schema]="wizardSchema"
434
+ * [wizardConfig]="wizardConfig"
435
+ * (wizardComplete)="onComplete($event)"
436
+ * (stepChange)="onStepChange($event)"
437
+ * />
438
+ * ```
439
+ */
440
+ export class UiFormWizardComponent {
441
+ constructor() {
442
+ this.cdr = inject(ChangeDetectorRef);
443
+ this.wizardSync = inject(UiWizardSyncService);
444
+ this.logger = inject(UiLoggerService, { optional: true });
445
+ this.destroy$ = new Subject();
446
+ /** Metodi di validazione custom per step. */
447
+ this.customValidationMethods = {};
448
+ /** Dati iniziali. */
449
+ this.initialData = {};
450
+ /** Modalita sola lettura. */
451
+ this.readonly = false;
452
+ /** Stato disabilitato. */
453
+ this.disabled = false;
454
+ /** Pulsante in caricamento. */
455
+ this.loadingFor = null;
456
+ /** Template per campi `type: 'custom'` (inoltro al form builder). */
457
+ this.customFieldTemplates = {};
458
+ // ─── Output ─────────────────────────────────────────────────────
459
+ this.stepChange = new EventEmitter();
460
+ this.stepComplete = new EventEmitter();
461
+ this.stepValidationFailed = new EventEmitter();
462
+ this.wizardComplete = new EventEmitter();
463
+ this.valueChange = new EventEmitter();
464
+ this.validationChange = new EventEmitter();
465
+ this.customEvent = new EventEmitter();
466
+ // ─── Stato ──────────────────────────────────────────────────────
467
+ this.state = {
468
+ currentStep: 0,
469
+ totalSteps: 0,
470
+ completedSteps: new Set(),
471
+ visitedSteps: new Set([0]),
472
+ isValid: false,
473
+ stepErrors: {},
474
+ };
475
+ /**
476
+ * Gruppi di sezioni schema per passo logico del wizard.
477
+ * Sezioni con lo stesso `wizardStep.stepNumber` compongono un unico passo (ordine: come in `schema.sections` dopo sort per numero).
478
+ */
479
+ this.wizardStepGroups = [];
480
+ /** Dati accumulati del form. */
481
+ this.accumulatedData = {};
482
+ /**
483
+ * Schema cachato per lo step corrente.
484
+ * Evita di creare un nuovo oggetto ad ogni ciclo di change detection,
485
+ * cosa che causerebbe rebuild infiniti nel form builder.
486
+ */
487
+ this._cachedStepSchema = null;
488
+ this._cachedStepIndex = -1;
489
+ }
490
+ // ─── Getter calcolati ───────────────────────────────────────────
491
+ get currentStepSchema() {
492
+ // Se lo step non e cambiato, restituisci lo schema cachato
493
+ if (this._cachedStepIndex === this.state.currentStep &&
494
+ this._cachedStepSchema) {
495
+ return this._cachedStepSchema;
496
+ }
497
+ const group = this.wizardStepGroups[this.state.currentStep];
498
+ if (!group?.length)
499
+ return null;
500
+ this._cachedStepSchema = {
501
+ id: this.schema.id + '-step-' + this.state.currentStep,
502
+ sections: group,
503
+ config: { ...this.schema.config, hideFooter: true, showButtons: false },
504
+ };
505
+ this._cachedStepIndex = this.state.currentStep;
506
+ return this._cachedStepSchema;
507
+ }
508
+ get currentStepTitle() {
509
+ const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
510
+ return primary?.wizardStep?.stepTitle || primary?.title || '';
511
+ }
512
+ get currentStepDescription() {
513
+ const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
514
+ return primary?.wizardStep?.stepDescription || primary?.description || '';
515
+ }
516
+ get isLastStep() {
517
+ return this.state.currentStep >= this.state.totalSteps - 1;
518
+ }
519
+ get progressPercent() {
520
+ if (this.state.totalSteps <= 1)
521
+ return 100;
522
+ return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);
523
+ }
524
+ /**
525
+ * Dati passati al form builder: unione tra valori forniti dal consumer e
526
+ * stato accumulato tra gli step. Senza questo, tornando indietro il builder
527
+ * riceverebbe solo `initialData` e ricreerebbe i campi vuoti, pur avendo
528
+ * i valori ancora in `accumulatedData`.
529
+ */
530
+ get mergedInitialDataForBuilder() {
531
+ return { ...this.initialData, ...this.accumulatedData };
532
+ }
533
+ /** Mostra la navigazione sopra il form builder. */
534
+ get showTopNav() {
535
+ if (this.wizardConfig.showNavigationButtons === false)
536
+ return false;
537
+ const pos = this.wizardConfig.navigationPosition;
538
+ return pos === 'top' || pos === 'both';
539
+ }
540
+ /** Mostra la navigazione sotto il form builder. */
541
+ get showBottomNav() {
542
+ if (this.wizardConfig.showNavigationButtons === false)
543
+ return false;
544
+ const pos = this.wizardConfig.navigationPosition;
545
+ return pos === 'bottom' || pos === 'both' || pos == null;
546
+ }
547
+ // ─── Lifecycle ──────────────────────────────────────────────────
548
+ ngOnInit() {
549
+ if (!this.schema) {
550
+ this.logger?.logWizardAction('init', { wizardId: this.wizardConfig?.wizardId, error: 'schema non presente' });
551
+ return;
552
+ }
553
+ this.wizardStepGroups = this.buildWizardStepGroups(this.schema.sections);
554
+ this.state.totalSteps = this.wizardStepGroups.length;
555
+ this.accumulatedData = { ...this.initialData };
556
+ this.logger?.logWizardAction('init', {
557
+ wizardId: this.wizardConfig?.wizardId,
558
+ schemaId: this.schema.id,
559
+ totalSteps: this.state.totalSteps,
560
+ totalSections: this.wizardStepGroups.reduce((sum, g) => sum + g.length, 0),
561
+ });
562
+ // Sincronizzazione wireless
563
+ if (this.wizardConfig.wizardId) {
564
+ this.syncWizardState();
565
+ // Ascolta navigazione esterna
566
+ this.wizardSync
567
+ .getWizardState$(this.wizardConfig.wizardId)
568
+ .pipe(takeUntil(this.destroy$))
569
+ .subscribe((data) => {
570
+ if (data && data.wizardState.currentStep !== this.state.currentStep) {
571
+ this.navigateToStep(data.wizardState.currentStep);
572
+ }
573
+ });
574
+ }
575
+ }
576
+ ngOnDestroy() {
577
+ this.logger?.logWizardAction('destroy', {
578
+ wizardId: this.wizardConfig?.wizardId,
579
+ schemaId: this.schema?.id,
580
+ currentStep: this.state.currentStep,
581
+ });
582
+ this.destroy$.next();
583
+ this.destroy$.complete();
584
+ if (this.wizardConfig?.wizardId) {
585
+ this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);
586
+ }
587
+ }
588
+ /**
589
+ * Scorciatoia: Ctrl + Freccia sinistra/destra per navigare come i pulsanti
590
+ * Indietro / Avanti (sull'ultimo step, Avanti equivale a Completa).
591
+ * Ignorata se il focus è in un campo di input per non interferire con la digitazione.
592
+ */
593
+ onDocumentKeydown(event) {
594
+ if (!this.schema || !this.wizardConfig || this.disabled)
595
+ return;
596
+ if (this.wizardConfig.showNavigationButtons === false)
597
+ return;
598
+ if (!event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)
599
+ return;
600
+ if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')
601
+ return;
602
+ if (this.isEditableKeyboardTarget(event.target))
603
+ return;
604
+ if (event.key === 'ArrowLeft') {
605
+ if (this.wizardConfig.allowBackNavigation === false)
606
+ return;
607
+ if (this.state.currentStep <= 0)
608
+ return;
609
+ event.preventDefault();
610
+ this.logger?.logWizardAction('keyboardNavigation', {
611
+ wizardId: this.wizardConfig.wizardId,
612
+ direction: 'previous',
613
+ fromStep: this.state.currentStep,
614
+ });
615
+ this.goToPreviousStep();
616
+ return;
617
+ }
618
+ // ArrowRight
619
+ event.preventDefault();
620
+ this.logger?.logWizardAction('keyboardNavigation', {
621
+ wizardId: this.wizardConfig.wizardId,
622
+ direction: this.isLastStep ? 'finish' : 'next',
623
+ fromStep: this.state.currentStep,
624
+ });
625
+ if (this.isLastStep) {
626
+ void this.finishWizard();
627
+ }
628
+ else {
629
+ void this.goToNextStep();
630
+ }
631
+ }
632
+ /** True se il target del keydown è un elemento dove la digitazione ha priorità sulla shortcut wizard. */
633
+ isEditableKeyboardTarget(target) {
634
+ if (!target || !(target instanceof HTMLElement))
635
+ return false;
636
+ const el = target;
637
+ if (el.isContentEditable)
638
+ return true;
639
+ const tag = el.tagName;
640
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
641
+ return true;
642
+ return false;
643
+ }
644
+ // ─── Navigazione ────────────────────────────────────────────────
645
+ /** Vai allo step successivo con validazione. */
646
+ async goToNextStep() {
647
+ if (this.isLastStep)
648
+ return;
649
+ // Valida step corrente
650
+ if (!(await this.validateCurrentStep()))
651
+ return;
652
+ // Salva dati step corrente
653
+ this.state.completedSteps.add(this.state.currentStep);
654
+ await this.autoSaveIfNeeded();
655
+ this.navigateToStep(this.state.currentStep + 1);
656
+ }
657
+ /** Torna allo step precedente. */
658
+ goToPreviousStep() {
659
+ if (this.state.currentStep <= 0)
660
+ return;
661
+ this.navigateToStep(this.state.currentStep - 1);
662
+ }
663
+ /**
664
+ * Navigazione tramite indicatori step (bullet + titolo) quando `progressStyle` è `'steps'`.
665
+ * Consentito solo verso step già marcati completati.
666
+ */
667
+ onWizardStepIndicatorSelect(stepIndex) {
668
+ if (this.disabled)
669
+ return;
670
+ if (this.wizardConfig.allowStepIndicatorNavigation === false)
671
+ return;
672
+ if (this.wizardConfig.allowBackNavigation === false)
673
+ return;
674
+ if (stepIndex === this.state.currentStep)
675
+ return;
676
+ if (!this.state.completedSteps.has(stepIndex))
677
+ return;
678
+ this.logger?.logWizardAction('navigation', {
679
+ wizardId: this.wizardConfig.wizardId,
680
+ via: 'stepIndicator',
681
+ fromStep: this.state.currentStep,
682
+ toStep: stepIndex,
683
+ });
684
+ this.navigateToStep(stepIndex);
685
+ }
686
+ /** Completa il wizard. */
687
+ async finishWizard() {
688
+ if (!(await this.validateCurrentStep())) {
689
+ this.logger?.logWizardAction('stepValidationFailed', {
690
+ wizardId: this.wizardConfig.wizardId,
691
+ step: this.state.currentStep,
692
+ context: 'finish',
693
+ });
694
+ return;
695
+ }
696
+ this.state.completedSteps.add(this.state.currentStep);
697
+ await this.autoSaveIfNeeded();
698
+ this.logger?.logWizardAction('complete', {
699
+ wizardId: this.wizardConfig.wizardId,
700
+ schemaId: this.schema?.id,
701
+ totalSteps: this.state.totalSteps,
702
+ completedSteps: Array.from(this.state.completedSteps),
703
+ });
704
+ this.wizardComplete.emit(this.accumulatedData);
705
+ }
706
+ /** Salva lo step corrente manualmente. */
707
+ async saveCurrentStep() {
708
+ if (this.wizardConfig.onStepSave) {
709
+ const data = this.formBuilder?.getFormValue() || {};
710
+ this.logger?.logWizardAction('save', {
711
+ wizardId: this.wizardConfig.wizardId,
712
+ step: this.state.currentStep,
713
+ schemaId: this.schema?.id,
714
+ });
715
+ await this.wizardConfig.onStepSave(data, this.state.currentStep);
716
+ }
717
+ }
718
+ // ─── Callback form builder ─────────────────────────────────────
719
+ onValueChange(data) {
720
+ this.accumulatedData = { ...this.accumulatedData, ...data };
721
+ this.logger?.logWizardAction('valueChange', {
722
+ wizardId: this.wizardConfig.wizardId,
723
+ step: this.state.currentStep,
724
+ schemaId: this.schema?.id,
725
+ changedKeys: Object.keys(data),
726
+ });
727
+ this.valueChange.emit(this.accumulatedData);
728
+ }
729
+ onValidationChange(state) {
730
+ this.state.isValid = state.valid;
731
+ this.validationChange.emit(state);
732
+ }
733
+ // ─── Navigazione interna ───────────────────────────────────────
734
+ navigateToStep(targetStep) {
735
+ if (targetStep < 0 || targetStep >= this.state.totalSteps)
736
+ return;
737
+ const from = this.state.currentStep;
738
+ this.state.currentStep = targetStep;
739
+ this.state.visitedSteps.add(targetStep);
740
+ // Invalida la cache per forzare la creazione di un nuovo schema
741
+ this._cachedStepSchema = null;
742
+ this._cachedStepIndex = -1;
743
+ this.logger?.logWizardAction('stepChange', {
744
+ wizardId: this.wizardConfig.wizardId,
745
+ from,
746
+ to: targetStep,
747
+ direction: targetStep > from ? 'next' : 'previous',
748
+ schemaId: this.schema?.id,
749
+ });
750
+ this.stepChange.emit({
751
+ from,
752
+ to: targetStep,
753
+ direction: targetStep > from ? 'next' : 'previous',
754
+ });
755
+ this.syncWizardState();
756
+ this.cdr.markForCheck();
757
+ }
758
+ async validateCurrentStep() {
759
+ this.formBuilder?.validateAllFields();
760
+ const group = this.wizardStepGroups[this.state.currentStep];
761
+ const primary = group?.[0];
762
+ const validateCustomComponents = primary?.wizardStep?.validation?.validateCustomComponents !== false;
763
+ const customFieldKeys = new Set(this.getCustomFieldKeysForGroup(group));
764
+ const isFormValid = validateCustomComponents
765
+ ? (this.formBuilder?.isFormValid() ?? true)
766
+ : (this.formBuilder?.isFormValidExcludingFieldKeys(customFieldKeys) ??
767
+ true);
768
+ const customFnName = primary?.wizardStep?.customValidationFn;
769
+ if (customFnName && this.customValidationMethods[customFnName]) {
770
+ const customValid = await this.customValidationMethods[customFnName](this.accumulatedData, this.state.currentStep, isFormValid);
771
+ if (!customValid) {
772
+ this.stepValidationFailed.emit({
773
+ step: this.state.currentStep,
774
+ errors: ['Validazione custom fallita'],
775
+ });
776
+ return false;
777
+ }
778
+ }
779
+ if (!isFormValid && primary?.wizardStep?.validation?.required !== false) {
780
+ let details = this.formBuilder?.getDetailedFormErrors() || [];
781
+ if (!validateCustomComponents && group?.length) {
782
+ details = this.filterErrorDetailsExcludingCustomFields(details, group, customFieldKeys);
783
+ }
784
+ const errors = details.flatMap((e) => e.errors);
785
+ this.logger?.logWizardAction('stepValidationFailed', {
786
+ wizardId: this.wizardConfig.wizardId,
787
+ step: this.state.currentStep,
788
+ errors,
789
+ });
790
+ this.stepValidationFailed.emit({
791
+ step: this.state.currentStep,
792
+ errors,
793
+ });
794
+ return false;
795
+ }
796
+ this.logger?.logWizardAction('stepComplete', {
797
+ wizardId: this.wizardConfig.wizardId,
798
+ step: this.state.currentStep,
799
+ schemaId: this.schema?.id,
800
+ });
801
+ this.stepComplete.emit({
802
+ step: this.state.currentStep,
803
+ data: this.formBuilder?.getFormValue() || {},
804
+ });
805
+ return true;
806
+ }
807
+ /**
808
+ * Raggruppa le sezioni con `wizardStep` per `stepNumber` (ordine stabile per numero, poi ordine di apparizione nello schema).
809
+ */
810
+ buildWizardStepGroups(sections) {
811
+ const withWizard = sections.filter((s) => s.wizardStep);
812
+ withWizard.sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
813
+ const groups = [];
814
+ for (const s of withWizard) {
815
+ const num = s.wizardStep.stepNumber;
816
+ const prev = groups[groups.length - 1];
817
+ if (prev?.length &&
818
+ (prev[0].wizardStep.stepNumber || 0) === (num || 0)) {
819
+ prev.push(s);
820
+ }
821
+ else {
822
+ groups.push([s]);
823
+ }
824
+ }
825
+ return groups;
826
+ }
827
+ /** Chiavi dei campi `custom` in tutte le sezioni del passo corrente. */
828
+ getCustomFieldKeysForGroup(group) {
829
+ if (!group?.length)
830
+ return [];
831
+ const keys = [];
832
+ for (const section of group) {
833
+ for (const f of section.fields || []) {
834
+ if (f.type === 'custom')
835
+ keys.push(f.key);
836
+ }
837
+ }
838
+ return keys;
839
+ }
840
+ /** Rimuove dagli errori i campi custom quando `validateCustomComponents` è false. */
841
+ filterErrorDetailsExcludingCustomFields(details, group, customKeys) {
842
+ const sectionIds = group.map((s) => s.id);
843
+ return details.filter((d) => {
844
+ const logicalKey = this.logicalFieldKeyFromDetailKeyForGroup(d.fieldKey, sectionIds);
845
+ return !customKeys.has(logicalKey);
846
+ });
847
+ }
848
+ /**
849
+ * Risolve la chiave logica del campo rispetto a tutte le sezioni del gruppo (campi flat o repeatable).
850
+ */
851
+ logicalFieldKeyFromDetailKeyForGroup(fieldKey, sectionIds) {
852
+ for (const id of sectionIds) {
853
+ const k = this.logicalFieldKeyFromDetailKey(fieldKey, id);
854
+ if (k !== fieldKey)
855
+ return k;
856
+ }
857
+ return fieldKey;
858
+ }
859
+ /** Estrae la chiave campo da `fieldKey` flat o `sectionId[i].fieldKey`. */
860
+ logicalFieldKeyFromDetailKey(fieldKey, sectionId) {
861
+ const re = new RegExp(`^${this.escapeRegExp(sectionId)}\\[\\d+\\]\\.(.+)$`);
862
+ const m = fieldKey.match(re);
863
+ return m ? m[1] : fieldKey;
864
+ }
865
+ escapeRegExp(s) {
866
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
867
+ }
868
+ async autoSaveIfNeeded() {
869
+ if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {
870
+ const data = this.formBuilder?.getFormValue() || {};
871
+ await this.wizardConfig.onStepSave(data, this.state.currentStep);
872
+ }
873
+ }
874
+ syncWizardState() {
875
+ if (!this.wizardConfig.wizardId)
876
+ return;
877
+ const syncData = {
878
+ wizardId: this.wizardConfig.wizardId,
879
+ wizardState: { ...this.state },
880
+ wizardSteps: this.wizardStepGroups.map((g) => ({
881
+ title: g[0]?.wizardStep?.stepTitle || g[0]?.title,
882
+ description: g[0]?.wizardStep?.stepDescription || g[0]?.description,
883
+ })),
884
+ isWizardMode: true,
885
+ schema: this.schema,
886
+ };
887
+ this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);
888
+ }
889
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
890
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor", customFieldTemplates: "customFieldTemplates", customFieldTemplateFallback: "customFieldTemplateFallback" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, host: { listeners: { "document:keydown": "onDocumentKeydown($event)" } }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
891
+ @if (schema && wizardConfig) {
892
+ <div class="ui-form-wizard">
893
+ <!-- Header wizard (nascosto se wireless) -->
894
+ @if (!wizardConfig.wirelessHeading) {
895
+ <ui-wizard-header
896
+ [config]="wizardConfig"
897
+ [stepGroups]="wizardStepGroups"
898
+ [state]="state"
899
+ [progressPercent]="progressPercent"
900
+ [currentStepTitle]="currentStepTitle"
901
+ [currentStepDescription]="currentStepDescription"
902
+ [disableStepIndicators]="disabled"
903
+ (stepSelect)="onWizardStepIndicatorSelect($event)"
904
+ />
905
+ }
906
+
907
+ <!-- Navigazione sopra il form -->
908
+ @if (showTopNav) {
909
+ <ui-wizard-footer
910
+ class="ui-form-wizard__footer ui-form-wizard__footer--top"
911
+ [config]="wizardConfig"
912
+ [state]="state"
913
+ [isLastStep]="isLastStep"
914
+ (previous)="goToPreviousStep()"
915
+ (next)="goToNextStep()"
916
+ (finish)="finishWizard()"
917
+ (save)="saveCurrentStep()"
918
+ />
919
+ }
920
+
921
+ <div class="ui-form-wizard__content">
922
+ <!-- Form builder per lo step corrente -->
923
+ <ui-form-builder
924
+ [schema]="currentStepSchema!"
925
+ [initialData]="mergedInitialDataForBuilder"
926
+ [readonly]="readonly"
927
+ [disabled]="disabled"
928
+ [loadingFor]="loadingFor"
929
+ [customFieldTemplates]="customFieldTemplates"
930
+ [customFieldTemplateFallback]="customFieldTemplateFallback"
931
+ (valueChange)="onValueChange($event)"
932
+ (validationChange)="onValidationChange($event)"
933
+ (customEvent)="customEvent.emit($event)"
934
+ />
935
+ </div>
936
+
937
+ <!-- Navigazione sotto il form -->
938
+ @if (showBottomNav) {
939
+ <ui-wizard-footer
940
+ class="ui-form-wizard__footer"
941
+ [config]="wizardConfig"
942
+ [state]="state"
943
+ [isLastStep]="isLastStep"
944
+ (previous)="goToPreviousStep()"
945
+ (next)="goToNextStep()"
946
+ (finish)="finishWizard()"
947
+ (save)="saveCurrentStep()"
948
+ />
949
+ }
950
+ </div>
951
+ }
952
+ `, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor", "customFieldTemplates", "customFieldTemplateFallback"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }, { kind: "component", type: UiWizardHeaderComponent, selector: "ui-wizard-header", inputs: ["config", "stepGroups", "state", "progressPercent", "currentStepTitle", "currentStepDescription", "disableStepIndicators"], outputs: ["stepSelect"] }, { kind: "component", type: UiWizardFooterComponent, selector: "ui-wizard-footer", inputs: ["config", "state", "isLastStep"], outputs: ["previous", "next", "finish", "save"] }], encapsulation: i0.ViewEncapsulation.None }); }
953
+ }
954
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, decorators: [{
955
+ type: Component,
956
+ args: [{ selector: 'ui-form-wizard', standalone: true, imports: [
957
+ LucideAngularModule,
958
+ UiButtonComponent,
959
+ UiFormBuilderComponent,
960
+ UiWizardHeaderComponent,
961
+ UiWizardFooterComponent,
962
+ ], encapsulation: ViewEncapsulation.None, template: `
963
+ @if (schema && wizardConfig) {
964
+ <div class="ui-form-wizard">
965
+ <!-- Header wizard (nascosto se wireless) -->
966
+ @if (!wizardConfig.wirelessHeading) {
967
+ <ui-wizard-header
968
+ [config]="wizardConfig"
969
+ [stepGroups]="wizardStepGroups"
970
+ [state]="state"
971
+ [progressPercent]="progressPercent"
972
+ [currentStepTitle]="currentStepTitle"
973
+ [currentStepDescription]="currentStepDescription"
974
+ [disableStepIndicators]="disabled"
975
+ (stepSelect)="onWizardStepIndicatorSelect($event)"
976
+ />
977
+ }
978
+
979
+ <!-- Navigazione sopra il form -->
980
+ @if (showTopNav) {
981
+ <ui-wizard-footer
982
+ class="ui-form-wizard__footer ui-form-wizard__footer--top"
983
+ [config]="wizardConfig"
984
+ [state]="state"
985
+ [isLastStep]="isLastStep"
986
+ (previous)="goToPreviousStep()"
987
+ (next)="goToNextStep()"
988
+ (finish)="finishWizard()"
989
+ (save)="saveCurrentStep()"
990
+ />
991
+ }
992
+
993
+ <div class="ui-form-wizard__content">
994
+ <!-- Form builder per lo step corrente -->
995
+ <ui-form-builder
996
+ [schema]="currentStepSchema!"
997
+ [initialData]="mergedInitialDataForBuilder"
998
+ [readonly]="readonly"
999
+ [disabled]="disabled"
1000
+ [loadingFor]="loadingFor"
1001
+ [customFieldTemplates]="customFieldTemplates"
1002
+ [customFieldTemplateFallback]="customFieldTemplateFallback"
1003
+ (valueChange)="onValueChange($event)"
1004
+ (validationChange)="onValidationChange($event)"
1005
+ (customEvent)="customEvent.emit($event)"
1006
+ />
1007
+ </div>
1008
+
1009
+ <!-- Navigazione sotto il form -->
1010
+ @if (showBottomNav) {
1011
+ <ui-wizard-footer
1012
+ class="ui-form-wizard__footer"
1013
+ [config]="wizardConfig"
1014
+ [state]="state"
1015
+ [isLastStep]="isLastStep"
1016
+ (previous)="goToPreviousStep()"
1017
+ (next)="goToNextStep()"
1018
+ (finish)="finishWizard()"
1019
+ (save)="saveCurrentStep()"
1020
+ />
1021
+ }
1022
+ </div>
1023
+ }
1024
+ `, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"] }]
1025
+ }], propDecorators: { formBuilder: [{
1026
+ type: ViewChild,
1027
+ args: [UiFormBuilderComponent]
1028
+ }], schema: [{
1029
+ type: Input
1030
+ }], wizardConfig: [{
1031
+ type: Input
1032
+ }], customValidationMethods: [{
1033
+ type: Input
1034
+ }], initialData: [{
1035
+ type: Input
1036
+ }], readonly: [{
1037
+ type: Input
1038
+ }], disabled: [{
1039
+ type: Input
1040
+ }], loadingFor: [{
1041
+ type: Input
1042
+ }], customFieldTemplates: [{
1043
+ type: Input
1044
+ }], customFieldTemplateFallback: [{
1045
+ type: Input
1046
+ }], stepChange: [{
1047
+ type: Output
1048
+ }], stepComplete: [{
1049
+ type: Output
1050
+ }], stepValidationFailed: [{
1051
+ type: Output
1052
+ }], wizardComplete: [{
1053
+ type: Output
1054
+ }], valueChange: [{
1055
+ type: Output
1056
+ }], validationChange: [{
1057
+ type: Output
1058
+ }], customEvent: [{
1059
+ type: Output
1060
+ }], onDocumentKeydown: [{
1061
+ type: HostListener,
1062
+ args: ['document:keydown', ['$event']]
1063
+ }] } });
1064
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWdCbEUsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBRXBFLHFFQUFxRTtBQUVyRTs7O0dBR0c7QUFnSEgsTUFBTSxPQUFPLHVCQUF1QjtJQS9HcEM7UUFpSFcsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxpRkFBaUY7UUFDeEUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBaUJuRDtJQWZDLG1HQUFtRztJQUNuRyx3QkFBd0IsQ0FBQyxTQUFpQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLHFCQUFxQjtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUQsT0FBTyxDQUNMLFNBQVMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUN6QyxDQUFDO0lBQ0osQ0FBQztJQUVELDREQUE0RDtJQUM1RCxhQUFhLENBQUMsU0FBaUI7UUFDN0IsT0FBTyxrQkFBa0IsU0FBUyxFQUFFLENBQUM7SUFDdkMsQ0FBQzsrR0ExQlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsdVdBMUd4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3R1QsMkRBMUdTLG1CQUFtQjs7NEZBNEdsQix1QkFBdUI7a0JBL0duQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3R1Q7aUJBQ0Y7OEJBRVUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTs7QUFtQlQ7OztHQUdHO0FBNERILE1BQU0sT0FBTyx1QkFBdUI7SUEzRHBDO1FBOERXLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbEIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDcEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FDM0M7K0dBVFksdUJBQXVCO21HQUF2Qix1QkFBdUIscU9BdER4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9EVCw0REF0RFMsaUJBQWlCOzs0RkF3RGhCLHVCQUF1QjtrQkEzRG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUM1QixhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RUO2lCQUNGOzhCQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNOztBQUdULHFFQUFxRTtBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBNkVILE1BQU0sT0FBTyxxQkFBcUI7SUE1RWxDO1FBNkVtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFZaEQsNkNBQTZDO1FBQ3BDLDRCQUF1QixHQUF5QyxFQUFFLENBQUM7UUFFNUUscUJBQXFCO1FBQ1osZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFFdEMsNkJBQTZCO1FBQ3BCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUIsMEJBQTBCO1FBQ2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUIsK0JBQStCO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRTFDLHFFQUFxRTtRQUM1RCx5QkFBb0IsR0FBeUMsRUFBRSxDQUFDO1FBS3pFLG1FQUFtRTtRQUV6RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFDekQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUM3RCx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFHN0MsQ0FBQztRQUNLLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUNoRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFDN0MscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDN0QsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUU5RCxtRUFBbUU7UUFFbkUsVUFBSyxHQUFrQjtZQUNyQixXQUFXLEVBQUUsQ0FBQztZQUNkLFVBQVUsRUFBRSxDQUFDO1lBQ2IsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFVO1lBQ2pDLFlBQVksRUFBRSxJQUFJLEdBQUcsQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBRUY7OztXQUdHO1FBQ0gscUJBQWdCLEdBQXNCLEVBQUUsQ0FBQztRQUV6QyxnQ0FBZ0M7UUFDeEIsb0JBQWUsR0FBZSxFQUFFLENBQUM7UUFFekM7Ozs7V0FJRztRQUNILHNCQUFpQixHQUF3QixJQUFJLENBQUM7UUFDdEMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDLENBQUM7S0FvZHZDO0lBbGRDLG1FQUFtRTtJQUVuRSxJQUFJLGlCQUFpQjtRQUNuQiwyREFBMkQ7UUFDM0QsSUFDRSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1lBQ2hELElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDdkIsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDdEQsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtTQUN4RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsT0FBTyxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsSUFBSSxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksVUFBVTtRQUNaLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsS0FBSyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRCxPQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsS0FBSyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRCxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDO0lBQzNELENBQUM7SUFFRCxtRUFBbUU7SUFFbkUsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDOUcsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFO1lBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVE7WUFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQzNFLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXZCLDhCQUE4QjtZQUM5QixJQUFJLENBQUMsVUFBVTtpQkFDWixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7aUJBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDcEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUTtZQUNyQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBRUgsaUJBQWlCLENBQUMsS0FBb0I7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUNoRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEtBQUssS0FBSztZQUFFLE9BQU87UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRO1lBQ25FLE9BQU87UUFDVCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssWUFBWTtZQUFFLE9BQU87UUFDcEUsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFFeEQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsS0FBSyxLQUFLO2dCQUFFLE9BQU87WUFDNUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDeEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLG9CQUFvQixFQUFFO2dCQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2dCQUNwQyxTQUFTLEVBQUUsVUFBVTtnQkFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVzthQUNqQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUVELGFBQWE7UUFDYixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsb0JBQW9CLEVBQUU7WUFDakQsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzlDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELHlHQUF5RztJQUNqRyx3QkFBd0IsQ0FBQyxNQUEwQjtRQUN6RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksV0FBVyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2xCLElBQUksRUFBRSxDQUFDLGlCQUFpQjtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDdkIsSUFBSSxHQUFHLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxVQUFVLElBQUksR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxtRUFBbUU7SUFFbkUsZ0RBQWdEO0lBQ2hELEtBQUssQ0FBQyxZQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRTVCLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQUUsT0FBTztRQUVoRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBMkIsQ0FBQyxTQUFpQjtRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsNEJBQTRCLEtBQUssS0FBSztZQUFFLE9BQU87UUFDckUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixLQUFLLEtBQUs7WUFBRSxPQUFPO1FBQzVELElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUFFLE9BQU87UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPO1FBRXRELElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFlBQVksRUFBRTtZQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO1lBQ3BDLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDaEMsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLEtBQUssQ0FBQyxZQUFZO1FBQ2hCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFO2dCQUNuRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2dCQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2dCQUM1QixPQUFPLEVBQUUsUUFBUTthQUNsQixDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7WUFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLGNBQWMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1NBQ3RELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7Z0JBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7Z0JBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGtFQUFrRTtJQUVsRSxhQUFhLENBQUMsSUFBZ0I7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLGFBQWEsRUFBRTtZQUMxQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO1lBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN6QixXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUE0QjtRQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGtFQUFrRTtJQUUxRCxjQUFjLENBQUMsVUFBa0I7UUFDdkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRWxFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEMsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNCLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFlBQVksRUFBRTtZQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO1lBQ3BDLElBQUk7WUFDSixFQUFFLEVBQUUsVUFBVTtZQUNkLFNBQVMsRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDbEQsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtTQUMxQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixJQUFJO1lBQ0osRUFBRSxFQUFFLFVBQVU7WUFDZCxTQUFTLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVO1NBQ25ELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLElBQUksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLHdCQUF3QixHQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsS0FBSyxLQUFLLENBQUM7UUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFeEUsTUFBTSxXQUFXLEdBQUcsd0JBQXdCO1lBQzFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsNkJBQTZCLENBQUMsZUFBZSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsQ0FBQztRQUVWLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUM7UUFFN0QsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQ2xFLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUN0QixXQUFXLENBQ1osQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztvQkFDNUIsTUFBTSxFQUFFLENBQUMsNEJBQTRCLENBQUM7aUJBQ3ZDLENBQUMsQ0FBQztnQkFDSCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsd0JBQXdCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMvQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHVDQUF1QyxDQUNwRCxPQUFPLEVBQ1AsS0FBSyxFQUNMLGVBQWUsQ0FDaEIsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ25ELFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7Z0JBQ3BDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7Z0JBQzVCLE1BQU07YUFDUCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUM3QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2dCQUM1QixNQUFNO2FBQ1AsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFO1lBQzNDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7WUFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1NBQzFCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRTtTQUM3QyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNLLHFCQUFxQixDQUFDLFFBQXlCO1FBQ3JELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RCxVQUFVLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ1AsQ0FBQyxDQUFDLENBQUMsVUFBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFXLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUNwRSxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFXLENBQUMsVUFBVSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFDcEQsQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHdFQUF3RTtJQUNoRSwwQkFBMEIsQ0FDaEMsS0FBa0M7UUFFbEMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTtvQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFGQUFxRjtJQUM3RSx1Q0FBdUMsQ0FDN0MsT0FBNEIsRUFDNUIsS0FBc0IsRUFDdEIsVUFBdUI7UUFFdkIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQ0FBb0MsQ0FDMUQsQ0FBQyxDQUFDLFFBQVEsRUFDVixVQUFVLENBQ1gsQ0FBQztZQUNGLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0NBQW9DLENBQzFDLFFBQWdCLEVBQ2hCLFVBQW9CO1FBRXBCLEtBQUssTUFBTSxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsS0FBSyxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsMkVBQTJFO0lBQ25FLDRCQUE0QixDQUNsQyxRQUFnQixFQUNoQixTQUFpQjtRQUVqQixNQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVksQ0FBQyxDQUFTO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQjtRQUM1QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFeEMsTUFBTSxRQUFRLEdBQXFCO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7WUFDcEMsV0FBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzlCLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUs7Z0JBQ2pELFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGVBQWUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVzthQUNwRSxDQUFDLENBQUM7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7K0dBL2hCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixndkJBTXJCLHNCQUFzQixnREF2RXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThEVCx5aElBckVDLG1CQUFtQiwrQkFFbkIsc0JBQXNCLHVTQWxJYix1QkFBdUIsMk5BNEZ2Qix1QkFBdUI7OzRGQTRHdkIscUJBQXFCO2tCQTVFakMsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1AsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLHNCQUFzQjt3QkFDdEIsdUJBQXVCO3dCQUN2Qix1QkFBdUI7cUJBQ3hCLGlCQUNjLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERUOzhCQVNrQyxXQUFXO3NCQUE3QyxTQUFTO3VCQUFDLHNCQUFzQjtnQkFLeEIsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUlHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkF3SlAsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIFZpZXdDaGlsZCxcclxuICBpbmplY3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtRXJyb3JEZXRhaWwsXHJcbiAgVWlGb3JtVmFsaWRhdGlvblN0YXRlLFxyXG59IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlXaXphcmRTeW5jU2VydmljZSxcclxuICBVaVdpemFyZFN5bmNEYXRhLFxyXG59IGZyb20gJy4vc2VydmljZXMvd2l6YXJkLXN5bmMuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50aSBpbnRlcm5pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuLyoqXHJcbiAqIEhlYWRlciBkZWwgd2l6YXJkOiBwcm9ncmVzc28gZSBpbmZvIGRlbGxvIHN0ZXAgY29ycmVudGUuXHJcbiAqIENvbiBgcHJvZ3Jlc3NTdHlsZTogJ3N0ZXBzJ2AgZW1ldHRlIGBzdGVwU2VsZWN0YCBwZXIgc2FsdGFyZSBhIHVubyBzdGVwIGdpw6AgY29tcGxldGF0by5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWhlYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZV0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19oZWFkZXJcIj5cclxuICAgICAgQGlmIChjb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgIEBpZiAoY29uZmlnLnByb2dyZXNzU3R5bGUgIT09ICdzdGVwcycpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3Byb2dyZXNzLXRleHRcIj5cclxuICAgICAgICAgICAge3sgcHJvZ3Jlc3NQZXJjZW50IH19JSBjb21wbGV0YXRvXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBzXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKFxyXG4gICAgICAgICAgICAgIGdyb3VwIG9mIHN0ZXBHcm91cHM7XHJcbiAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS1jdXJyZW50XT1cIlxyXG4gICAgICAgICAgICAgICAgICBpID09PSBzdGF0ZS5jdXJyZW50U3RlcFxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY29tcGxldGVkXT1cIlxyXG4gICAgICAgICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLXZpc2l0ZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLW5hdmlnYWJsZV09XCJcclxuICAgICAgICAgICAgICAgICAgaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwQXJpYUxhYmVsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcFNlbGVjdC5lbWl0KGkpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1zdGF0aWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGkgPT09IHN0YXRlLmN1cnJlbnRTdGVwID8gJ3N0ZXAnIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0udGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RlcCAnICsgKGkgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWluZm9cIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC10aXRsZVwiPnt7IGN1cnJlbnRTdGVwVGl0bGUgfX08L2gyPlxyXG4gICAgICAgIEBpZiAoY3VycmVudFN0ZXBEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgPHAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICB7eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY291bnRlclwiPlxyXG4gICAgICAgICAgUGFzc28ge3sgc3RhdGUuY3VycmVudFN0ZXAgKyAxIH19IGRpIHt7IHN0YXRlLnRvdGFsU3RlcHMgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQgPSAwO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwVGl0bGUgPSAnJztcclxuICBASW5wdXQoKSBjdXJyZW50U3RlcERlc2NyaXB0aW9uID0gJyc7XHJcbiAgLyoqIFF1YW5kbyB0cnVlLCBpIGJ1bGxldCBzdGVwIG5vbiBzb25vIGludGVyYXR0aXZpIChlcy4gd2l6YXJkIGRpc2FiaWxpdGF0bykuICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVN0ZXBJbmRpY2F0b3JzID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBJbmRpY2Ugc3RlcCBzZWxlemlvbmFiaWxlIHRyYW1pdGUgYnVsbGV0L3RpdG9sbyAoc29sbyBzdGVwIGdpw6AgY29tcGxldGF0aSwgbm9uIGlsIGNvcnJlbnRlKS4gKi9cclxuICBpc1N0ZXBJbmRpY2F0b3JOYXZpZ2FibGUoc3RlcEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd1N0ZXBJbmRpY2F0b3JOYXZpZ2F0aW9uID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZVN0ZXBJbmRpY2F0b3JzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHN0ZXBJbmRleCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhzdGVwSW5kZXgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlc3RvIGFjY2Vzc2liaWxlIHBlciBpbCBwdWxzYW50ZSBzdGVwIChuYXZpZ2F6aW9uZSkuICovXHJcbiAgc3RlcEFyaWFMYWJlbChzdGVwVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYFZhaSBhbGxvIHN0ZXA6ICR7c3RlcFRpdGxlfWA7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRm9vdGVyIGRlbCB3aXphcmQ6IHB1bHNhbnRpIGRpIG5hdmlnYXppb25lIGUgc2FsdmF0YWdnaW8uXHJcbiAqIEVtZXR0ZSBldmVudGkgcGVyIFByZXZpb3VzLCBOZXh0LCBGaW5pc2gsIFNhdmUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXdpemFyZC1mb290ZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1VpQnV0dG9uQ29tcG9uZW50XSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3RlclwiPlxyXG4gICAgICBAaWYgKFxyXG4gICAgICAgIGNvbmZpZy5hbGxvd0JhY2tOYXZpZ2F0aW9uICE9PSBmYWxzZSAmJiBzdGF0ZS5jdXJyZW50U3RlcCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5wcmV2aW91cyA/PyAnSW5kaWV0cm8nXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzLmVtaXQoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fbmF2LWhpbnRcIj5DdHJsICsg4oaQPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3Rlci1yaWdodFwiPlxyXG4gICAgICAgIEBpZiAoY29uZmlnLmF1dG9TYXZlICYmIGNvbmZpZy5idXR0b25MYWJlbHM/LnNhdmUpIHtcclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHMhLnNhdmUhXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZS5lbWl0KClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggPz8gJ0NvbXBsZXRhJ1wiXHJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGljb249XCJjaGVja1wiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2guZW1pdCgpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIlxyXG4gICAgICAgICAgICAgICAgY29uZmlnLmJ1dHRvbkxhYmVscz8ubmV4dCA/P1xyXG4gICAgICAgICAgICAgICAgICBjb25maWcuYnV0dG9uTGFiZWxzPy5zdWJtaXQgPz9cclxuICAgICAgICAgICAgICAgICAgJ0F2YW50aSdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJuZXh0LmVtaXQoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtaGludFwiPkN0cmwgKyDihpI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkRm9vdGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGF0ZSE6IFVpV2l6YXJkU3RhdGU7XHJcbiAgQElucHV0KCkgaXNMYXN0U3RlcCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcHJldmlvdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGZpbmlzaCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSAIENvbXBvbmVudGUgd2l6YXJkIHByaW5jaXBhbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSB3aXphcmQgY2hlIHdyYXBwYSBgVWlGb3JtQnVpbGRlckNvbXBvbmVudGBcclxuICogYWdnaXVuZ2VuZG8gbmF2aWdhemlvbmUgbXVsdGktc3RlcCwgYmFycmEgZGkgcHJvZ3Jlc3NvLFxyXG4gKiB2YWxpZGF6aW9uZSBwZXIgc3RlcCBlIHNpbmNyb25penphemlvbmUgd2lyZWxlc3MuXHJcbiAqIFBpw7kgc2V6aW9uaSBzY2hlbWEgY29uIGxvIHN0ZXNzbyBgd2l6YXJkU3RlcC5zdGVwTnVtYmVyYCBmb3JtYW5vIHVuIHVuaWNvIHBhc3NvXHJcbiAqIChlcy4gcGnDuSBibG9jY2hpIGNvbGxhc3NhYmlsaSBwZXIgc3RlcCk7IG1ldGFkYXRpIGRlbCBwYXNzbyBkYWxsYSBwcmltYSBzZXppb25lIGRlbCBncnVwcG8uXHJcbiAqXHJcbiAqIEBzZWxlY3RvciB1aS1mb3JtLXdpemFyZFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDx1aS1mb3JtLXdpemFyZFxyXG4gKiAgIFtzY2hlbWFdPVwid2l6YXJkU2NoZW1hXCJcclxuICogICBbd2l6YXJkQ29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAqICAgKHdpemFyZENvbXBsZXRlKT1cIm9uQ29tcGxldGUoJGV2ZW50KVwiXHJcbiAqICAgKHN0ZXBDaGFuZ2UpPVwib25TdGVwQ2hhbmdlKCRldmVudClcIlxyXG4gKiAvPlxyXG4gKiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktZm9ybS13aXphcmQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTHVjaWRlQW5ndWxhck1vZHVsZSxcclxuICAgIFVpQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtQnVpbGRlckNvbXBvbmVudCxcclxuICAgIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgVWlXaXphcmRGb290ZXJDb21wb25lbnQsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICBAaWYgKHNjaGVtYSAmJiB3aXphcmRDb25maWcpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkXCI+XHJcbiAgICAgICAgPCEtLSBIZWFkZXIgd2l6YXJkIChuYXNjb3N0byBzZSB3aXJlbGVzcykgLS0+XHJcbiAgICAgICAgQGlmICghd2l6YXJkQ29uZmlnLndpcmVsZXNzSGVhZGluZykge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1oZWFkZXJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gICAgICAgICAgICBbc3RlcEdyb3Vwc109XCJ3aXphcmRTdGVwR3JvdXBzXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICBbY3VycmVudFN0ZXBUaXRsZV09XCJjdXJyZW50U3RlcFRpdGxlXCJcclxuICAgICAgICAgICAgW2N1cnJlbnRTdGVwRGVzY3JpcHRpb25dPVwiY3VycmVudFN0ZXBEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlU3RlcEluZGljYXRvcnNdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbldpemFyZFN0ZXBJbmRpY2F0b3JTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBOYXZpZ2F6aW9uZSBzb3ByYSBpbCBmb3JtIC0tPlxyXG4gICAgICAgIEBpZiAoc2hvd1RvcE5hdikge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1mb290ZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyIHVpLWZvcm0td2l6YXJkX19mb290ZXItLXRvcFwiXHJcbiAgICAgICAgICAgIFtjb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW2lzTGFzdFN0ZXBdPVwiaXNMYXN0U3RlcFwiXHJcbiAgICAgICAgICAgIChwcmV2aW91cyk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgIChmaW5pc2gpPVwiZmluaXNoV2l6YXJkKClcIlxyXG4gICAgICAgICAgICAoc2F2ZSk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19jb250ZW50XCI+XHJcbiAgICAgICAgICA8IS0tIEZvcm0gYnVpbGRlciBwZXIgbG8gc3RlcCBjb3JyZW50ZSAtLT5cclxuICAgICAgICAgIDx1aS1mb3JtLWJ1aWxkZXJcclxuICAgICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgICBbaW5pdGlhbERhdGFdPVwibWVyZ2VkSW5pdGlhbERhdGFGb3JCdWlsZGVyXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlc109XCJjdXN0b21GaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2tdPVwiY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrXCJcclxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGN1c3RvbUV2ZW50KT1cImN1c3RvbUV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE5hdmlnYXppb25lIHNvdHRvIGlsIGZvcm0gLS0+XHJcbiAgICAgICAgQGlmIChzaG93Qm90dG9tTmF2KSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWZvb3RlclxyXG4gICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19mb290ZXJcIlxyXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAgICAgICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgIFtpc0xhc3RTdGVwXT1cImlzTGFzdFN0ZXBcIlxyXG4gICAgICAgICAgICAocHJldmlvdXMpPVwiZ29Ub1ByZXZpb3VzU3RlcCgpXCJcclxuICAgICAgICAgICAgKG5leHQpPVwiZ29Ub05leHRTdGVwKClcIlxyXG4gICAgICAgICAgICAoZmluaXNoKT1cImZpbmlzaFdpemFyZCgpXCJcclxuICAgICAgICAgICAgKHNhdmUpPVwic2F2ZUN1cnJlbnRTdGVwKClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KFVpTG9nZ2VyU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChVaUZvcm1CdWlsZGVyQ29tcG9uZW50KSBmb3JtQnVpbGRlcj86IFVpRm9ybUJ1aWxkZXJDb21wb25lbnQ7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbnB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFNjaGVtYSBjb21wbGV0byBkZWwgZm9ybSAodHV0dGUgbGUgc2V6aW9uaSBjb24gd2l6YXJkU3RlcCkuICovXHJcbiAgQElucHV0KCkgc2NoZW1hITogVWlGb3JtU2NoZW1hO1xyXG5cclxuICAvKiogQ29uZmlndXJhemlvbmUgZGVsIHdpemFyZC4gKi9cclxuICBASW5wdXQoKSB3aXphcmRDb25maWchOiBVaVdpemFyZENvbmZpZztcclxuXHJcbiAgLyoqIE1ldG9kaSBkaSB2YWxpZGF6aW9uZSBjdXN0b20gcGVyIHN0ZXAuICovXHJcbiAgQElucHV0KCkgY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVpV2l6YXJkVmFsaWRhdGlvbkZuPiA9IHt9O1xyXG5cclxuICAvKiogRGF0aSBpbml6aWFsaS4gKi9cclxuICBASW5wdXQoKSBpbml0aWFsRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKiogTW9kYWxpdGEgc29sYSBsZXR0dXJhLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdGF0byBkaXNhYmlsaXRhdG8uICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFB1bHNhbnRlIGluIGNhcmljYW1lbnRvLiAqL1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogVGVtcGxhdGUgcGVyIGNhbXBpIGB0eXBlOiAnY3VzdG9tJ2AgKGlub2x0cm8gYWwgZm9ybSBidWlsZGVyKS4gKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8dW5rbm93bj4+ID0ge307XHJcblxyXG4gIC8qKiBGYWxsYmFjayB0ZW1wbGF0ZSBwZXIgY2FtcGkgY3VzdG9tIChpbm9sdHJvIGFsIGZvcm0gYnVpbGRlcikuICovXHJcbiAgQElucHV0KCkgY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgc3RlcDogbnVtYmVyO1xyXG4gICAgZXJyb3JzOiBzdHJpbmdbXTtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSB3aXphcmRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybVZhbGlkYXRpb25TdGF0ZT4oKTtcclxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybUN1c3RvbUV2ZW50PigpO1xyXG5cclxuICAvLyDilIDilIDilIAgU3RhdG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHN0YXRlOiBVaVdpemFyZFN0YXRlID0ge1xyXG4gICAgY3VycmVudFN0ZXA6IDAsXHJcbiAgICB0b3RhbFN0ZXBzOiAwLFxyXG4gICAgY29tcGxldGVkU3RlcHM6IG5ldyBTZXQ8bnVtYmVyPigpLFxyXG4gICAgdmlzaXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oWzBdKSxcclxuICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgc3RlcEVycm9yczoge30sXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogR3J1cHBpIGRpIHNlemlvbmkgc2NoZW1hIHBlciBwYXNzbyBsb2dpY28gZGVsIHdpemFyZC5cclxuICAgKiBTZXppb25pIGNvbiBsbyBzdGVzc28gYHdpemFyZFN0ZXAuc3RlcE51bWJlcmAgY29tcG9uZ29ubyB1biB1bmljbyBwYXNzbyAob3JkaW5lOiBjb21lIGluIGBzY2hlbWEuc2VjdGlvbnNgIGRvcG8gc29ydCBwZXIgbnVtZXJvKS5cclxuICAgKi9cclxuICB3aXphcmRTdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG5cclxuICAvKiogRGF0aSBhY2N1bXVsYXRpIGRlbCBmb3JtLiAqL1xyXG4gIHByaXZhdGUgYWNjdW11bGF0ZWREYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjaGVtYSBjYWNoYXRvIHBlciBsbyBzdGVwIGNvcnJlbnRlLlxyXG4gICAqIEV2aXRhIGRpIGNyZWFyZSB1biBudW92byBvZ2dldHRvIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvbixcclxuICAgKiBjb3NhIGNoZSBjYXVzZXJlYmJlIHJlYnVpbGQgaW5maW5pdGkgbmVsIGZvcm0gYnVpbGRlci5cclxuICAgKi9cclxuICBfY2FjaGVkU3RlcFNjaGVtYTogVWlGb3JtU2NoZW1hIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FjaGVkU3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIEdldHRlciBjYWxjb2xhdGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFNjaGVtYSgpOiBVaUZvcm1TY2hlbWEgfCBudWxsIHtcclxuICAgIC8vIFNlIGxvIHN0ZXAgbm9uIGUgY2FtYmlhdG8sIHJlc3RpdHVpc2NpIGxvIHNjaGVtYSBjYWNoYXRvXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSB7XHJcbiAgICAgIGlkOiB0aGlzLnNjaGVtYS5pZCArICctc3RlcC0nICsgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2VjdGlvbnM6IGdyb3VwLFxyXG4gICAgICBjb25maWc6IHsgLi4udGhpcy5zY2hlbWEuY29uZmlnLCBoaWRlRm9vdGVyOiB0cnVlLCBzaG93QnV0dG9uczogZmFsc2UgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwSW5kZXggPSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcHJpbWFyeSA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXT8uWzBdO1xyXG4gICAgcmV0dXJuIHByaW1hcnk/LndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fCBwcmltYXJ5Py50aXRsZSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdPy5bMF07XHJcbiAgICByZXR1cm4gcHJpbWFyeT8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHByaW1hcnk/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoXHJcbiAgICAgICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC8gKHRoaXMuc3RhdGUudG90YWxTdGVwcyAtIDEpKSAqIDEwMCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRpIHBhc3NhdGkgYWwgZm9ybSBidWlsZGVyOiB1bmlvbmUgdHJhIHZhbG9yaSBmb3JuaXRpIGRhbCBjb25zdW1lciBlXHJcbiAgICogc3RhdG8gYWNjdW11bGF0byB0cmEgZ2xpIHN0ZXAuIFNlbnphIHF1ZXN0bywgdG9ybmFuZG8gaW5kaWV0cm8gaWwgYnVpbGRlclxyXG4gICAqIHJpY2V2ZXJlYmJlIHNvbG8gYGluaXRpYWxEYXRhYCBlIHJpY3JlZXJlYmJlIGkgY2FtcGkgdnVvdGksIHB1ciBhdmVuZG9cclxuICAgKiBpIHZhbG9yaSBhbmNvcmEgaW4gYGFjY3VtdWxhdGVkRGF0YWAuXHJcbiAgICovXHJcbiAgZ2V0IG1lcmdlZEluaXRpYWxEYXRhRm9yQnVpbGRlcigpOiBVaUZvcm1EYXRhIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuaW5pdGlhbERhdGEsIC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhIH07XHJcbiAgfVxyXG5cclxuICAvKiogTW9zdHJhIGxhIG5hdmlnYXppb25lIHNvcHJhIGlsIGZvcm0gYnVpbGRlci4gKi9cclxuICBnZXQgc2hvd1RvcE5hdigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5zaG93TmF2aWdhdGlvbkJ1dHRvbnMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBwb3MgPSB0aGlzLndpemFyZENvbmZpZy5uYXZpZ2F0aW9uUG9zaXRpb247XHJcbiAgICByZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3RoJztcclxuICB9XHJcblxyXG4gIC8qKiBNb3N0cmEgbGEgbmF2aWdhemlvbmUgc290dG8gaWwgZm9ybSBidWlsZGVyLiAqL1xyXG4gIGdldCBzaG93Qm90dG9tTmF2KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMud2l6YXJkQ29uZmlnLm5hdmlnYXRpb25Qb3NpdGlvbjtcclxuICAgIHJldHVybiBwb3MgPT09ICdib3R0b20nIHx8IHBvcyA9PT0gJ2JvdGgnIHx8IHBvcyA9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2luaXQnLCB7IHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsIGVycm9yOiAnc2NoZW1hIG5vbiBwcmVzZW50ZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndpemFyZFN0ZXBHcm91cHMgPSB0aGlzLmJ1aWxkV2l6YXJkU3RlcEdyb3Vwcyh0aGlzLnNjaGVtYS5zZWN0aW9ucyk7XHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBHcm91cHMubGVuZ3RoO1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuaW5pdGlhbERhdGEgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdpbml0Jywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWc/LndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIHRvdGFsU3RlcHM6IHRoaXMuc3RhdGUudG90YWxTdGVwcyxcclxuICAgICAgdG90YWxTZWN0aW9uczogdGhpcy53aXphcmRTdGVwR3JvdXBzLnJlZHVjZSgoc3VtLCBnKSA9PiBzdW0gKyBnLmxlbmd0aCwgMCksXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzXHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy5zeW5jV2l6YXJkU3RhdGUoKTtcclxuXHJcbiAgICAgIC8vIEFzY29sdGEgbmF2aWdhemlvbmUgZXN0ZXJuYVxyXG4gICAgICB0aGlzLndpemFyZFN5bmNcclxuICAgICAgICAuZ2V0V2l6YXJkU3RhdGUkKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLndpemFyZFN0YXRlLmN1cnJlbnRTdGVwICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAoZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2Rlc3Ryb3knLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGN1cnJlbnRTdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NvcmNpYXRvaWE6IEN0cmwgKyBGcmVjY2lhIHNpbmlzdHJhL2Rlc3RyYSBwZXIgbmF2aWdhcmUgY29tZSBpIHB1bHNhbnRpXHJcbiAgICogSW5kaWV0cm8gLyBBdmFudGkgKHN1bGwndWx0aW1vIHN0ZXAsIEF2YW50aSBlcXVpdmFsZSBhIENvbXBsZXRhKS5cclxuICAgKiBJZ25vcmF0YSBzZSBpbCBmb2N1cyDDqCBpbiB1biBjYW1wbyBkaSBpbnB1dCBwZXIgbm9uIGludGVyZmVyaXJlIGNvbiBsYSBkaWdpdGF6aW9uZS5cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSB8fCAhdGhpcy53aXphcmRDb25maWcgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmICghZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmlzRWRpdGFibGVLZXlib2FyZFRhcmdldChldmVudC50YXJnZXQpKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbigna2V5Ym9hcmROYXZpZ2F0aW9uJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBkaXJlY3Rpb246ICdwcmV2aW91cycsXHJcbiAgICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmdvVG9QcmV2aW91c1N0ZXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFycm93UmlnaHRcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdrZXlib2FyZE5hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmlzTGFzdFN0ZXAgPyAnZmluaXNoJyA6ICduZXh0JyxcclxuICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmlzTGFzdFN0ZXApIHtcclxuICAgICAgdm9pZCB0aGlzLmZpbmlzaFdpemFyZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdm9pZCB0aGlzLmdvVG9OZXh0U3RlcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgc2UgaWwgdGFyZ2V0IGRlbCBrZXlkb3duIMOoIHVuIGVsZW1lbnRvIGRvdmUgbGEgZGlnaXRhemlvbmUgaGEgcHJpb3JpdMOgIHN1bGxhIHNob3J0Y3V0IHdpemFyZC4gKi9cclxuICBwcml2YXRlIGlzRWRpdGFibGVLZXlib2FyZFRhcmdldCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGVsID0gdGFyZ2V0O1xyXG4gICAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XHJcbiAgICBpZiAodGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFZhaSBhbGxvIHN0ZXAgc3VjY2Vzc2l2byBjb24gdmFsaWRhemlvbmUuICovXHJcbiAgYXN5bmMgZ29Ub05leHRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNMYXN0U3RlcCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFZhbGlkYSBzdGVwIGNvcnJlbnRlXHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHJldHVybjtcclxuXHJcbiAgICAvLyBTYWx2YSBkYXRpIHN0ZXAgY29ycmVudGVcclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICsgMSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9ybmEgYWxsbyBzdGVwIHByZWNlZGVudGUuICovXHJcbiAgZ29Ub1ByZXZpb3VzU3RlcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhemlvbmUgdHJhbWl0ZSBpbmRpY2F0b3JpIHN0ZXAgKGJ1bGxldCArIHRpdG9sbykgcXVhbmRvIGBwcm9ncmVzc1N0eWxlYCDDqCBgJ3N0ZXBzJ2AuXHJcbiAgICogQ29uc2VudGl0byBzb2xvIHZlcnNvIHN0ZXAgZ2nDoCBtYXJjYXRpIGNvbXBsZXRhdGkuXHJcbiAgICovXHJcbiAgb25XaXphcmRTdGVwSW5kaWNhdG9yU2VsZWN0KHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93U3RlcEluZGljYXRvck5hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmIChzdGVwSW5kZXggPT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHJldHVybjtcclxuICAgIGlmICghdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoc3RlcEluZGV4KSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ25hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgdmlhOiAnc3RlcEluZGljYXRvcicsXHJcbiAgICAgIGZyb21TdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICB0b1N0ZXA6IHN0ZXBJbmRleCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChzdGVwSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbXBsZXRhIGlsIHdpemFyZC4gKi9cclxuICBhc3luYyBmaW5pc2hXaXphcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgY29udGV4dDogJ2ZpbmlzaCcsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdjb21wbGV0ZScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICB0b3RhbFN0ZXBzOiB0aGlzLnN0YXRlLnRvdGFsU3RlcHMsXHJcbiAgICAgIGNvbXBsZXRlZFN0ZXBzOiBBcnJheS5mcm9tKHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLndpemFyZENvbXBsZXRlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbHZhIGxvIHN0ZXAgY29ycmVudGUgbWFudWFsbWVudGUuICovXHJcbiAgYXN5bmMgc2F2ZUN1cnJlbnRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzYXZlJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENhbGxiYWNrIGZvcm0gYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgb25WYWx1ZUNoYW5nZShkYXRhOiBVaUZvcm1EYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEsIC4uLmRhdGEgfTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3ZhbHVlQ2hhbmdlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGNoYW5nZWRLZXlzOiBPYmplY3Qua2V5cyhkYXRhKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZShzdGF0ZTogVWlGb3JtVmFsaWRhdGlvblN0YXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmlzVmFsaWQgPSBzdGF0ZS52YWxpZDtcclxuICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSBpbnRlcm5hIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9TdGVwKHRhcmdldFN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldFN0ZXAgPCAwIHx8IHRhcmdldFN0ZXAgPj0gdGhpcy5zdGF0ZS50b3RhbFN0ZXBzKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID0gdGFyZ2V0U3RlcDtcclxuICAgIHRoaXMuc3RhdGUudmlzaXRlZFN0ZXBzLmFkZCh0YXJnZXRTdGVwKTtcclxuXHJcbiAgICAvLyBJbnZhbGlkYSBsYSBjYWNoZSBwZXIgZm9yemFyZSBsYSBjcmVhemlvbmUgZGkgdW4gbnVvdm8gc2NoZW1hXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0gbnVsbDtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IC0xO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBDaGFuZ2UnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZnJvbSxcclxuICAgICAgdG86IHRhcmdldFN0ZXAsXHJcbiAgICAgIGRpcmVjdGlvbjogdGFyZ2V0U3RlcCA+IGZyb20gPyAnbmV4dCcgOiAncHJldmlvdXMnLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gZ3JvdXA/LlswXTtcclxuICAgIGNvbnN0IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyA9XHJcbiAgICAgIHByaW1hcnk/LndpemFyZFN0ZXA/LnZhbGlkYXRpb24/LnZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyAhPT0gZmFsc2U7XHJcbiAgICBjb25zdCBjdXN0b21GaWVsZEtleXMgPSBuZXcgU2V0KHRoaXMuZ2V0Q3VzdG9tRmllbGRLZXlzRm9yR3JvdXAoZ3JvdXApKTtcclxuXHJcbiAgICBjb25zdCBpc0Zvcm1WYWxpZCA9IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50c1xyXG4gICAgICA/ICh0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWUpXHJcbiAgICAgIDogKHRoaXMuZm9ybUJ1aWxkZXI/LmlzRm9ybVZhbGlkRXhjbHVkaW5nRmllbGRLZXlzKGN1c3RvbUZpZWxkS2V5cykgPz9cclxuICAgICAgICB0cnVlKTtcclxuXHJcbiAgICBjb25zdCBjdXN0b21Gbk5hbWUgPSBwcmltYXJ5Py53aXphcmRTdGVwPy5jdXN0b21WYWxpZGF0aW9uRm47XHJcblxyXG4gICAgaWYgKGN1c3RvbUZuTmFtZSAmJiB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0pIHtcclxuICAgICAgY29uc3QgY3VzdG9tVmFsaWQgPSBhd2FpdCB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0oXHJcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZERhdGEsXHJcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBpc0Zvcm1WYWxpZCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghY3VzdG9tVmFsaWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICAgIGVycm9yczogWydWYWxpZGF6aW9uZSBjdXN0b20gZmFsbGl0YSddLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNGb3JtVmFsaWQgJiYgcHJpbWFyeT8ud2l6YXJkU3RlcD8udmFsaWRhdGlvbj8ucmVxdWlyZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBkZXRhaWxzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkgfHwgW107XHJcbiAgICAgIGlmICghdmFsaWRhdGVDdXN0b21Db21wb25lbnRzICYmIGdyb3VwPy5sZW5ndGgpIHtcclxuICAgICAgICBkZXRhaWxzID0gdGhpcy5maWx0ZXJFcnJvckRldGFpbHNFeGNsdWRpbmdDdXN0b21GaWVsZHMoXHJcbiAgICAgICAgICBkZXRhaWxzLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBjdXN0b21GaWVsZEtleXMsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlcnJvcnMgPSBkZXRhaWxzLmZsYXRNYXAoKGUpID0+IGUuZXJyb3JzKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zdGVwVmFsaWRhdGlvbkZhaWxlZC5lbWl0KHtcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGVycm9ycyxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwQ29tcGxldGUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGVwQ29tcGxldGUuZW1pdCh7XHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIGRhdGE6IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYWdncnVwcGEgbGUgc2V6aW9uaSBjb24gYHdpemFyZFN0ZXBgIHBlciBgc3RlcE51bWJlcmAgKG9yZGluZSBzdGFiaWxlIHBlciBudW1lcm8sIHBvaSBvcmRpbmUgZGkgYXBwYXJpemlvbmUgbmVsbG8gc2NoZW1hKS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkV2l6YXJkU3RlcEdyb3VwcyhzZWN0aW9uczogVWlGb3JtU2VjdGlvbltdKTogVWlGb3JtU2VjdGlvbltdW10ge1xyXG4gICAgY29uc3Qgd2l0aFdpemFyZCA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy53aXphcmRTdGVwKTtcclxuICAgIHdpdGhXaXphcmQuc29ydChcclxuICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgKGEud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSAtIChiLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCksXHJcbiAgICApO1xyXG4gICAgY29uc3QgZ3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBzIG9mIHdpdGhXaXphcmQpIHtcclxuICAgICAgY29uc3QgbnVtID0gcy53aXphcmRTdGVwIS5zdGVwTnVtYmVyO1xyXG4gICAgICBjb25zdCBwcmV2ID0gZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByZXY/Lmxlbmd0aCAmJlxyXG4gICAgICAgIChwcmV2WzBdLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgPT09IChudW0gfHwgMClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJldi5wdXNoKHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKFtzXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBncm91cHM7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpYXZpIGRlaSBjYW1waSBgY3VzdG9tYCBpbiB0dXR0ZSBsZSBzZXppb25pIGRlbCBwYXNzbyBjb3JyZW50ZS4gKi9cclxuICBwcml2YXRlIGdldEN1c3RvbUZpZWxkS2V5c0Zvckdyb3VwKFxyXG4gICAgZ3JvdXA6IFVpRm9ybVNlY3Rpb25bXSB8IHVuZGVmaW5lZCxcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ3JvdXApIHtcclxuICAgICAgZm9yIChjb25zdCBmIG9mIHNlY3Rpb24uZmllbGRzIHx8IFtdKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2N1c3RvbScpIGtleXMucHVzaChmLmtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpbXVvdmUgZGFnbGkgZXJyb3JpIGkgY2FtcGkgY3VzdG9tIHF1YW5kbyBgdmFsaWRhdGVDdXN0b21Db21wb25lbnRzYCDDqCBmYWxzZS4gKi9cclxuICBwcml2YXRlIGZpbHRlckVycm9yRGV0YWlsc0V4Y2x1ZGluZ0N1c3RvbUZpZWxkcyhcclxuICAgIGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10sXHJcbiAgICBncm91cDogVWlGb3JtU2VjdGlvbltdLFxyXG4gICAgY3VzdG9tS2V5czogU2V0PHN0cmluZz4sXHJcbiAgKTogVWlGb3JtRXJyb3JEZXRhaWxbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uSWRzID0gZ3JvdXAubWFwKChzKSA9PiBzLmlkKTtcclxuICAgIHJldHVybiBkZXRhaWxzLmZpbHRlcigoZCkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dpY2FsS2V5ID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICAgICAgZC5maWVsZEtleSxcclxuICAgICAgICBzZWN0aW9uSWRzLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gIWN1c3RvbUtleXMuaGFzKGxvZ2ljYWxLZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXNvbHZlIGxhIGNoaWF2ZSBsb2dpY2EgZGVsIGNhbXBvIHJpc3BldHRvIGEgdHV0dGUgbGUgc2V6aW9uaSBkZWwgZ3J1cHBvIChjYW1waSBmbGF0IG8gcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkczogc3RyaW5nW10sXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2VjdGlvbklkcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5KGZpZWxkS2V5LCBpZCk7XHJcbiAgICAgIGlmIChrICE9PSBmaWVsZEtleSkgcmV0dXJuIGs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRLZXk7XHJcbiAgfVxyXG5cclxuICAvKiogRXN0cmFlIGxhIGNoaWF2ZSBjYW1wbyBkYSBgZmllbGRLZXlgIGZsYXQgbyBgc2VjdGlvbklkW2ldLmZpZWxkS2V5YC4gKi9cclxuICBwcml2YXRlIGxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXkoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkOiBzdHJpbmcsXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7dGhpcy5lc2NhcGVSZWdFeHAoc2VjdGlvbklkKX1cXFxcW1xcXFxkK1xcXFxdXFxcXC4oLispJGApO1xyXG4gICAgY29uc3QgbSA9IGZpZWxkS2V5Lm1hdGNoKHJlKTtcclxuICAgIHJldHVybiBtID8gbVsxXSA6IGZpZWxkS2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVSZWdFeHAoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGF1dG9TYXZlSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYXV0b1NhdmUgJiYgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge307XHJcbiAgICAgIGF3YWl0IHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUoZGF0YSwgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNXaXphcmRTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzeW5jRGF0YTogVWlXaXphcmRTeW5jRGF0YSA9IHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICB3aXphcmRTdGF0ZTogeyAuLi50aGlzLnN0YXRlIH0sXHJcbiAgICAgIHdpemFyZFN0ZXBzOiB0aGlzLndpemFyZFN0ZXBHcm91cHMubWFwKChnKSA9PiAoe1xyXG4gICAgICAgIHRpdGxlOiBnWzBdPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgZ1swXT8udGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGdbMF0/LndpemFyZFN0ZXA/LnN0ZXBEZXNjcmlwdGlvbiB8fCBnWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgfSkpLFxyXG4gICAgICBpc1dpemFyZE1vZGU6IHRydWUsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMud2l6YXJkU3luYy5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCwgc3luY0RhdGEpO1xyXG4gIH1cclxufVxyXG4iXX0=