@gnwebsoft/ui 4.0.21 → 4.0.23

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 (321) hide show
  1. package/package.json +1 -1
  2. package/dist/chunk-BWEFHFD4.js +0 -2399
  3. package/dist/chunk-FMN47XRJ.cjs +0 -72
  4. package/dist/chunk-FYU2OIMD.js +0 -15
  5. package/dist/chunk-HDL5E7XD.js +0 -523
  6. package/dist/chunk-LUW7V5GI.cjs +0 -15
  7. package/dist/chunk-PW777IOX.js +0 -140
  8. package/dist/chunk-QYHJIPSZ.cjs +0 -140
  9. package/dist/chunk-RVGPXTBE.js +0 -2535
  10. package/dist/chunk-T5H5X3VR.js +0 -72
  11. package/dist/chunk-TQQUGQTW.cjs +0 -2535
  12. package/dist/chunk-UZ2KNGOF.cjs +0 -523
  13. package/dist/chunk-W5EM6HLW.cjs +0 -2399
  14. package/dist/core/api/ApiClient.d.ts +0 -329
  15. package/dist/core/api/ApiClient.d.ts.map +0 -1
  16. package/dist/core/api/CorrelationIdGenerator.d.ts +0 -52
  17. package/dist/core/api/CorrelationIdGenerator.d.ts.map +0 -1
  18. package/dist/core/api/Errors/ErrorNormalizer.d.ts +0 -106
  19. package/dist/core/api/Errors/ErrorNormalizer.d.ts.map +0 -1
  20. package/dist/core/api/Interceptors/InterceptorManager.d.ts +0 -236
  21. package/dist/core/api/Interceptors/InterceptorManager.d.ts.map +0 -1
  22. package/dist/core/api/Models/FilterModel.d.ts +0 -22
  23. package/dist/core/api/Models/FilterModel.d.ts.map +0 -1
  24. package/dist/core/api/Models/QueryParams.d.ts +0 -13
  25. package/dist/core/api/Models/QueryParams.d.ts.map +0 -1
  26. package/dist/core/api/Models/index.d.ts +0 -3
  27. package/dist/core/api/Models/index.d.ts.map +0 -1
  28. package/dist/core/api/RequestManager.d.ts +0 -142
  29. package/dist/core/api/RequestManager.d.ts.map +0 -1
  30. package/dist/core/api/Retry/RetryHandler.d.ts +0 -100
  31. package/dist/core/api/Retry/RetryHandler.d.ts.map +0 -1
  32. package/dist/core/api/Signals/SignalManager.d.ts +0 -153
  33. package/dist/core/api/Signals/SignalManager.d.ts.map +0 -1
  34. package/dist/core/api/Utils/ResponseParser.d.ts +0 -105
  35. package/dist/core/api/Utils/ResponseParser.d.ts.map +0 -1
  36. package/dist/core/api/Utils/UrlBuilder.d.ts +0 -111
  37. package/dist/core/api/Utils/UrlBuilder.d.ts.map +0 -1
  38. package/dist/core/api/createApiClient.d.ts +0 -247
  39. package/dist/core/api/createApiClient.d.ts.map +0 -1
  40. package/dist/core/api/index.d.ts +0 -7
  41. package/dist/core/api/index.d.ts.map +0 -1
  42. package/dist/core/api/types/ApiError.d.ts +0 -17
  43. package/dist/core/api/types/ApiError.d.ts.map +0 -1
  44. package/dist/core/api/types/ApiResponse.d.ts +0 -76
  45. package/dist/core/api/types/ApiResponse.d.ts.map +0 -1
  46. package/dist/core/api/types/CancelToken.d.ts +0 -15
  47. package/dist/core/api/types/CancelToken.d.ts.map +0 -1
  48. package/dist/core/api/types/ErrorInterceptor.d.ts +0 -3
  49. package/dist/core/api/types/ErrorInterceptor.d.ts.map +0 -1
  50. package/dist/core/api/types/ErrorResponseData.d.ts +0 -68
  51. package/dist/core/api/types/ErrorResponseData.d.ts.map +0 -1
  52. package/dist/core/api/types/RequestConfig.d.ts +0 -21
  53. package/dist/core/api/types/RequestConfig.d.ts.map +0 -1
  54. package/dist/core/api/types/RequestInterceptor.d.ts +0 -3
  55. package/dist/core/api/types/RequestInterceptor.d.ts.map +0 -1
  56. package/dist/core/api/types/ResponseInterceptor.d.ts +0 -3
  57. package/dist/core/api/types/ResponseInterceptor.d.ts.map +0 -1
  58. package/dist/core/api/types/ValidationErrors.d.ts +0 -7
  59. package/dist/core/api/types/ValidationErrors.d.ts.map +0 -1
  60. package/dist/core/api/types/index.d.ts +0 -10
  61. package/dist/core/api/types/index.d.ts.map +0 -1
  62. package/dist/core/api/useValidationErrors.d.ts +0 -11
  63. package/dist/core/api/useValidationErrors.d.ts.map +0 -1
  64. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts +0 -7
  65. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts.map +0 -1
  66. package/dist/core/components/AuthorizedView/index.d.ts +0 -2
  67. package/dist/core/components/AuthorizedView/index.d.ts.map +0 -1
  68. package/dist/core/components/CancelButton/CancelButton.d.ts +0 -4
  69. package/dist/core/components/CancelButton/CancelButton.d.ts.map +0 -1
  70. package/dist/core/components/CancelButton/index.d.ts +0 -2
  71. package/dist/core/components/CancelButton/index.d.ts.map +0 -1
  72. package/dist/core/components/ClearButton/ClearButton.d.ts +0 -63
  73. package/dist/core/components/ClearButton/ClearButton.d.ts.map +0 -1
  74. package/dist/core/components/ClearButton/index.d.ts +0 -2
  75. package/dist/core/components/ClearButton/index.d.ts.map +0 -1
  76. package/dist/core/components/Containers/SimpleContainer.d.ts +0 -10
  77. package/dist/core/components/Containers/SimpleContainer.d.ts.map +0 -1
  78. package/dist/core/components/Containers/index.d.ts +0 -2
  79. package/dist/core/components/Containers/index.d.ts.map +0 -1
  80. package/dist/core/components/FilterButton/FilterButton.d.ts +0 -86
  81. package/dist/core/components/FilterButton/FilterButton.d.ts.map +0 -1
  82. package/dist/core/components/FilterButton/index.d.ts +0 -2
  83. package/dist/core/components/FilterButton/index.d.ts.map +0 -1
  84. package/dist/core/components/FilterDisplay/FilterChip.d.ts +0 -9
  85. package/dist/core/components/FilterDisplay/FilterChip.d.ts.map +0 -1
  86. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts +0 -10
  87. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts.map +0 -1
  88. package/dist/core/components/FilterDisplay/index.d.ts +0 -3
  89. package/dist/core/components/FilterDisplay/index.d.ts.map +0 -1
  90. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts +0 -99
  91. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts.map +0 -1
  92. package/dist/core/components/FilterWrapper/index.d.ts +0 -2
  93. package/dist/core/components/FilterWrapper/index.d.ts.map +0 -1
  94. package/dist/core/components/Footer/Footer.d.ts +0 -3
  95. package/dist/core/components/Footer/Footer.d.ts.map +0 -1
  96. package/dist/core/components/Footer/index.d.ts +0 -2
  97. package/dist/core/components/Footer/index.d.ts.map +0 -1
  98. package/dist/core/components/LabelText/LabelText.d.ts +0 -103
  99. package/dist/core/components/LabelText/LabelText.d.ts.map +0 -1
  100. package/dist/core/components/LabelText/index.d.ts +0 -2
  101. package/dist/core/components/LabelText/index.d.ts.map +0 -1
  102. package/dist/core/components/RenderIf/RenderIf.d.ts +0 -7
  103. package/dist/core/components/RenderIf/RenderIf.d.ts.map +0 -1
  104. package/dist/core/components/RenderIf/index.d.ts +0 -2
  105. package/dist/core/components/RenderIf/index.d.ts.map +0 -1
  106. package/dist/core/components/SectionBox/SectionBox.d.ts +0 -15
  107. package/dist/core/components/SectionBox/SectionBox.d.ts.map +0 -1
  108. package/dist/core/components/SectionBox/index.d.ts +0 -2
  109. package/dist/core/components/SectionBox/index.d.ts.map +0 -1
  110. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts +0 -17
  111. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts.map +0 -1
  112. package/dist/core/components/SimpleTabs/index.d.ts +0 -2
  113. package/dist/core/components/SimpleTabs/index.d.ts.map +0 -1
  114. package/dist/core/components/SubmitButton/SubmitButton.d.ts +0 -6
  115. package/dist/core/components/SubmitButton/SubmitButton.d.ts.map +0 -1
  116. package/dist/core/components/SubmitButton/index.d.ts +0 -2
  117. package/dist/core/components/SubmitButton/index.d.ts.map +0 -1
  118. package/dist/core/components/WithRef/WithRef.d.ts +0 -14
  119. package/dist/core/components/WithRef/WithRef.d.ts.map +0 -1
  120. package/dist/core/components/WithRef/index.d.ts +0 -2
  121. package/dist/core/components/WithRef/index.d.ts.map +0 -1
  122. package/dist/core/components/index.d.ts +0 -15
  123. package/dist/core/components/index.d.ts.map +0 -1
  124. package/dist/core/config.d.ts +0 -24
  125. package/dist/core/config.d.ts.map +0 -1
  126. package/dist/core/hooks/index.d.ts +0 -3
  127. package/dist/core/hooks/index.d.ts.map +0 -1
  128. package/dist/core/hooks/makeQuery.d.ts +0 -12
  129. package/dist/core/hooks/makeQuery.d.ts.map +0 -1
  130. package/dist/core/hooks/useApiClient.d.ts +0 -3
  131. package/dist/core/hooks/useApiClient.d.ts.map +0 -1
  132. package/dist/core/hooks/useFormErrorHandler.d.ts +0 -35
  133. package/dist/core/hooks/useFormErrorHandler.d.ts.map +0 -1
  134. package/dist/core/hooks/useListView.d.ts +0 -20
  135. package/dist/core/hooks/useListView.d.ts.map +0 -1
  136. package/dist/core/index.cjs +0 -123
  137. package/dist/core/index.d.ts +0 -8
  138. package/dist/core/index.d.ts.map +0 -1
  139. package/dist/core/index.js +0 -123
  140. package/dist/core/models.d.ts +0 -5
  141. package/dist/core/models.d.ts.map +0 -1
  142. package/dist/core/types/FilterLabel.d.ts +0 -6
  143. package/dist/core/types/FilterLabel.d.ts.map +0 -1
  144. package/dist/core/types/ListModels.d.ts +0 -18
  145. package/dist/core/types/ListModels.d.ts.map +0 -1
  146. package/dist/core/types/OptionsRequest.d.ts +0 -4
  147. package/dist/core/types/OptionsRequest.d.ts.map +0 -1
  148. package/dist/core/types/index.d.ts +0 -4
  149. package/dist/core/types/index.d.ts.map +0 -1
  150. package/dist/core/utils/CacheUtility/index.d.ts +0 -15
  151. package/dist/core/utils/CacheUtility/index.d.ts.map +0 -1
  152. package/dist/core/utils/calculateFilterCount.d.ts +0 -2
  153. package/dist/core/utils/calculateFilterCount.d.ts.map +0 -1
  154. package/dist/core/utils/format-time.d.ts +0 -79
  155. package/dist/core/utils/format-time.d.ts.map +0 -1
  156. package/dist/core/utils/getEmptyObject.d.ts +0 -7
  157. package/dist/core/utils/getEmptyObject.d.ts.map +0 -1
  158. package/dist/core/utils/index.d.ts +0 -7
  159. package/dist/core/utils/index.d.ts.map +0 -1
  160. package/dist/core/utils/useStableRowCount.d.ts +0 -9
  161. package/dist/core/utils/useStableRowCount.d.ts.map +0 -1
  162. package/dist/core/utils/watch/core.d.ts +0 -22
  163. package/dist/core/utils/watch/core.d.ts.map +0 -1
  164. package/dist/core/utils/watch/index.d.ts +0 -49
  165. package/dist/core/utils/watch/index.d.ts.map +0 -1
  166. package/dist/core/utils/watch/utilities.d.ts +0 -34
  167. package/dist/core/utils/watch/utilities.d.ts.map +0 -1
  168. package/dist/hooks/index.cjs +0 -11
  169. package/dist/hooks/index.d.ts +0 -3
  170. package/dist/hooks/index.d.ts.map +0 -1
  171. package/dist/hooks/index.js +0 -11
  172. package/dist/hooks/useTransform/enhanced.d.ts +0 -133
  173. package/dist/hooks/useTransform/enhanced.d.ts.map +0 -1
  174. package/dist/hooks/useTransform/index.d.ts +0 -93
  175. package/dist/hooks/useTransform/index.d.ts.map +0 -1
  176. package/dist/index.cjs +0 -265
  177. package/dist/index.d.ts +0 -6
  178. package/dist/index.d.ts.map +0 -1
  179. package/dist/index.js +0 -265
  180. package/dist/types/AsyncMultiSelectPayload.d.ts +0 -5
  181. package/dist/types/AsyncMultiSelectPayload.d.ts.map +0 -1
  182. package/dist/types/AsyncSelectPayload.d.ts +0 -5
  183. package/dist/types/AsyncSelectPayload.d.ts.map +0 -1
  184. package/dist/types/OperationResponse.d.ts +0 -5
  185. package/dist/types/OperationResponse.d.ts.map +0 -1
  186. package/dist/types/OptionItem.d.ts +0 -66
  187. package/dist/types/OptionItem.d.ts.map +0 -1
  188. package/dist/types/api.d.ts +0 -127
  189. package/dist/types/api.d.ts.map +0 -1
  190. package/dist/types/events.d.ts +0 -74
  191. package/dist/types/events.d.ts.map +0 -1
  192. package/dist/types/index.cjs +0 -31
  193. package/dist/types/index.d.ts +0 -14
  194. package/dist/types/index.d.ts.map +0 -1
  195. package/dist/types/index.js +0 -31
  196. package/dist/types/utilities.d.ts +0 -458
  197. package/dist/types/utilities.d.ts.map +0 -1
  198. package/dist/utils/flattenObjectKeys.d.ts +0 -63
  199. package/dist/utils/flattenObjectKeys.d.ts.map +0 -1
  200. package/dist/utils/getTimezone.d.ts +0 -4
  201. package/dist/utils/getTimezone.d.ts.map +0 -1
  202. package/dist/utils/handleServerErrors.d.ts +0 -70
  203. package/dist/utils/handleServerErrors.d.ts.map +0 -1
  204. package/dist/utils/index.cjs +0 -55
  205. package/dist/utils/index.d.ts +0 -9
  206. package/dist/utils/index.d.ts.map +0 -1
  207. package/dist/utils/index.js +0 -55
  208. package/dist/utils/propertyExists.d.ts +0 -35
  209. package/dist/utils/propertyExists.d.ts.map +0 -1
  210. package/dist/utils/readValueAsDate.d.ts +0 -4
  211. package/dist/utils/readValueAsDate.d.ts.map +0 -1
  212. package/dist/utils/removeLeadingTrailingSlashes.d.ts +0 -2
  213. package/dist/utils/removeLeadingTrailingSlashes.d.ts.map +0 -1
  214. package/dist/utils/schemaTools.d.ts +0 -209
  215. package/dist/utils/schemaTools.d.ts.map +0 -1
  216. package/dist/utils/typeGuards.d.ts +0 -316
  217. package/dist/utils/typeGuards.d.ts.map +0 -1
  218. package/dist/utils/watch/core.d.ts +0 -22
  219. package/dist/utils/watch/core.d.ts.map +0 -1
  220. package/dist/utils/watch/index.d.ts +0 -49
  221. package/dist/utils/watch/index.d.ts.map +0 -1
  222. package/dist/utils/watch/utilities.d.ts +0 -34
  223. package/dist/utils/watch/utilities.d.ts.map +0 -1
  224. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts +0 -9
  225. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts.map +0 -1
  226. package/dist/wrappers/AsyncMultiSelect/index.d.ts +0 -3
  227. package/dist/wrappers/AsyncMultiSelect/index.d.ts.map +0 -1
  228. package/dist/wrappers/AsyncMultiSelect/types.d.ts +0 -19
  229. package/dist/wrappers/AsyncMultiSelect/types.d.ts.map +0 -1
  230. package/dist/wrappers/AsyncSelect/index.d.ts +0 -9
  231. package/dist/wrappers/AsyncSelect/index.d.ts.map +0 -1
  232. package/dist/wrappers/AsyncSelect/types.d.ts +0 -20
  233. package/dist/wrappers/AsyncSelect/types.d.ts.map +0 -1
  234. package/dist/wrappers/Button.d.ts +0 -49
  235. package/dist/wrappers/Button.d.ts.map +0 -1
  236. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts +0 -102
  237. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts.map +0 -1
  238. package/dist/wrappers/CheckboxElement/index.d.ts +0 -3
  239. package/dist/wrappers/CheckboxElement/index.d.ts.map +0 -1
  240. package/dist/wrappers/CheckboxElement/types.d.ts +0 -76
  241. package/dist/wrappers/CheckboxElement/types.d.ts.map +0 -1
  242. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts +0 -98
  243. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts.map +0 -1
  244. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts +0 -49
  245. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts.map +0 -1
  246. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts +0 -171
  247. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts.map +0 -1
  248. package/dist/wrappers/CheckboxGroup/index.d.ts +0 -3
  249. package/dist/wrappers/CheckboxGroup/index.d.ts.map +0 -1
  250. package/dist/wrappers/CheckboxGroup/types.d.ts +0 -106
  251. package/dist/wrappers/CheckboxGroup/types.d.ts.map +0 -1
  252. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts +0 -131
  253. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts.map +0 -1
  254. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts +0 -57
  255. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts.map +0 -1
  256. package/dist/wrappers/DatePickerElement/hooks/index.d.ts +0 -24
  257. package/dist/wrappers/DatePickerElement/hooks/index.d.ts.map +0 -1
  258. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts +0 -63
  259. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts.map +0 -1
  260. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts +0 -79
  261. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts.map +0 -1
  262. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts +0 -73
  263. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts.map +0 -1
  264. package/dist/wrappers/DatePickerElement/index.d.ts +0 -47
  265. package/dist/wrappers/DatePickerElement/index.d.ts.map +0 -1
  266. package/dist/wrappers/DatePickerElement/types.d.ts +0 -183
  267. package/dist/wrappers/DatePickerElement/types.d.ts.map +0 -1
  268. package/dist/wrappers/DatePickerElement/utils.d.ts +0 -89
  269. package/dist/wrappers/DatePickerElement/utils.d.ts.map +0 -1
  270. package/dist/wrappers/DateTimePickerElement/index.d.ts +0 -1
  271. package/dist/wrappers/DateTimePickerElement/index.d.ts.map +0 -1
  272. package/dist/wrappers/DateTimePickerElement/types.d.ts +0 -1
  273. package/dist/wrappers/DateTimePickerElement/types.d.ts.map +0 -1
  274. package/dist/wrappers/Field/index.d.ts +0 -42
  275. package/dist/wrappers/Field/index.d.ts.map +0 -1
  276. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts +0 -177
  277. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts.map +0 -1
  278. package/dist/wrappers/NumberFieldElement/index.d.ts +0 -3
  279. package/dist/wrappers/NumberFieldElement/index.d.ts.map +0 -1
  280. package/dist/wrappers/OTPInputElement/HelperText.d.ts +0 -8
  281. package/dist/wrappers/OTPInputElement/HelperText.d.ts.map +0 -1
  282. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts +0 -32
  283. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts.map +0 -1
  284. package/dist/wrappers/OTPInputElement/index.d.ts +0 -3
  285. package/dist/wrappers/OTPInputElement/index.d.ts.map +0 -1
  286. package/dist/wrappers/PasswordElement/PasswordElement.d.ts +0 -104
  287. package/dist/wrappers/PasswordElement/PasswordElement.d.ts.map +0 -1
  288. package/dist/wrappers/PasswordElement/index.d.ts +0 -2
  289. package/dist/wrappers/PasswordElement/index.d.ts.map +0 -1
  290. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts +0 -38
  291. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts.map +0 -1
  292. package/dist/wrappers/RadioButtonGroup/index.d.ts +0 -2
  293. package/dist/wrappers/RadioButtonGroup/index.d.ts.map +0 -1
  294. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts +0 -22
  295. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts.map +0 -1
  296. package/dist/wrappers/SelectCascadeElement/index.d.ts +0 -2
  297. package/dist/wrappers/SelectCascadeElement/index.d.ts.map +0 -1
  298. package/dist/wrappers/SelectElement/SelectElement.d.ts +0 -93
  299. package/dist/wrappers/SelectElement/SelectElement.d.ts.map +0 -1
  300. package/dist/wrappers/SelectElement/index.d.ts +0 -2
  301. package/dist/wrappers/SelectElement/index.d.ts.map +0 -1
  302. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts +0 -21
  303. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts.map +0 -1
  304. package/dist/wrappers/SelectMultiElement/index.d.ts +0 -2
  305. package/dist/wrappers/SelectMultiElement/index.d.ts.map +0 -1
  306. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts +0 -179
  307. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts.map +0 -1
  308. package/dist/wrappers/TextFieldElement/index.d.ts +0 -3
  309. package/dist/wrappers/TextFieldElement/index.d.ts.map +0 -1
  310. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts +0 -30
  311. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts.map +0 -1
  312. package/dist/wrappers/TimePickerElement/index.d.ts +0 -2
  313. package/dist/wrappers/TimePickerElement/index.d.ts.map +0 -1
  314. package/dist/wrappers/index.cjs +0 -59
  315. package/dist/wrappers/index.d.ts +0 -15
  316. package/dist/wrappers/index.d.ts.map +0 -1
  317. package/dist/wrappers/index.js +0 -59
  318. package/dist/wrappers/types/common.d.ts +0 -87
  319. package/dist/wrappers/types/common.d.ts.map +0 -1
  320. package/dist/wrappers/types/index.d.ts +0 -8
  321. package/dist/wrappers/types/index.d.ts.map +0 -1
@@ -1,2535 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3;// src/core/api/CorrelationIdGenerator.ts
2
- function generateUUID() {
3
- if (typeof crypto !== "undefined" && crypto.randomUUID) {
4
- return crypto.randomUUID();
5
- }
6
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
7
- const r = Math.random() * 16 | 0;
8
- const v = c === "x" ? r : r & 3 | 8;
9
- return v.toString(16);
10
- });
11
- }
12
- function generateCorrelationId(prefix) {
13
- const uuid = generateUUID();
14
- return prefix ? `${prefix}-${uuid}` : uuid;
15
- }
16
-
17
- // src/core/api/Errors/ErrorNormalizer.ts
18
- var ErrorNormalizer = class {
19
- /**
20
- * Maps an HTTP status code to a standardized error type category.
21
- *
22
- * This categorization helps consumers handle different error classes appropriately:
23
- * - `validation_error` (400): Client sent invalid data
24
- * - `client_error` (401-499): Client-side issues (auth, permissions, not found, etc.)
25
- * - `server_error` (500-599): Server-side failures
26
- * - `unknown_error`: Unrecognized status codes
27
- *
28
- * @param status - HTTP status code from the response
29
- * @returns The error type category as a string
30
- *
31
- * @example
32
- * ```typescript
33
- * normalizer.getErrorType(400); // => 'validation_error'
34
- * normalizer.getErrorType(404); // => 'client_error'
35
- * normalizer.getErrorType(500); // => 'server_error'
36
- * normalizer.getErrorType(0); // => 'unknown_error'
37
- * ```
38
- */
39
- getErrorType(status) {
40
- if (status >= 400 && status < 500) {
41
- return status === 400 ? "validation_error" : "client_error";
42
- } else if (status >= 500) {
43
- return "server_error";
44
- }
45
- return "unknown_error";
46
- }
47
- /**
48
- * Maps an HTTP status code to a human-readable error title.
49
- *
50
- * Provides user-friendly error messages for common HTTP status codes.
51
- * Falls back to a generic "HTTP Error {status}" format for unmapped codes.
52
- *
53
- * @param status - HTTP status code from the response
54
- * @returns A human-readable error title
55
- *
56
- * @example
57
- * ```typescript
58
- * normalizer.getErrorTitle(404); // => 'Not Found'
59
- * normalizer.getErrorTitle(500); // => 'Internal Server Error'
60
- * normalizer.getErrorTitle(999); // => 'HTTP Error 999'
61
- * ```
62
- */
63
- getErrorTitle(status) {
64
- const titles = {
65
- 400: "Bad Request",
66
- 401: "Unauthorized",
67
- 403: "Forbidden",
68
- 404: "Not Found",
69
- 405: "Method Not Allowed",
70
- 408: "Request Timeout",
71
- 409: "Conflict",
72
- 422: "Unprocessable Entity",
73
- 429: "Too Many Requests",
74
- 500: "Internal Server Error",
75
- 502: "Bad Gateway",
76
- 503: "Service Unavailable",
77
- 504: "Gateway Timeout"
78
- };
79
- return titles[status] || `HTTP Error ${status}`;
80
- }
81
- /**
82
- * Normalizes any error into a consistent, structured ApiError format.
83
- *
84
- * This method handles various error scenarios and ensures they all conform to
85
- * the {@link ApiError} interface with appropriate categorization and metadata:
86
- *
87
- * - **Existing ApiErrors**: Enhances with missing fields (traceId, config)
88
- * - **AbortErrors**: Marks as `request_cancelled` with isAborted flag
89
- * - **Timeout Errors**: Categorizes as `timeout_error` with 408 status
90
- * - **Network Errors**: Categorizes as `network_error` with 0 status
91
- * - **Unknown Errors**: Fallback category for unexpected error types
92
- *
93
- * All normalized errors include:
94
- * - `type`: Error category for programmatic handling
95
- * - `title`: Human-readable error title
96
- * - `status`: HTTP status code (or 0 for non-HTTP errors)
97
- * - `traceId`: Correlation ID for distributed tracing
98
- * - `isAborted`: Boolean flag indicating if request was cancelled
99
- * - `config`: Original request configuration for debugging
100
- *
101
- * @param error - The error to normalize (can be any type)
102
- * @param config - The request configuration that led to this error
103
- * @param correlationId - Optional correlation ID for tracing
104
- * @returns A fully structured ApiError instance
105
- *
106
- * @example
107
- * Normalizing a fetch AbortError:
108
- * ```typescript
109
- * try {
110
- * await fetch(url, { signal });
111
- * } catch (error) {
112
- * const apiError = normalizer.normalizeError(error, config, 'req-123');
113
- * // apiError.type === 'request_cancelled'
114
- * // apiError.isAborted === true
115
- * }
116
- * ```
117
- *
118
- * @example
119
- * Normalizing a timeout:
120
- * ```typescript
121
- * const timeoutError = new Error('Request timeout after 30000ms');
122
- * const apiError = normalizer.normalizeError(timeoutError, config);
123
- * // apiError.type === 'timeout_error'
124
- * // apiError.status === 408
125
- * ```
126
- */
127
- normalizeError(error, config, correlationId) {
128
- if (error === null || error === void 0) {
129
- return Object.assign(new Error("An unknown error occurred"), {
130
- type: "unknown_error",
131
- title: "Unknown Error",
132
- status: 0,
133
- traceId: correlationId,
134
- isAborted: false,
135
- config
136
- });
137
- }
138
- if (typeof error === "string") {
139
- return Object.assign(new Error(error), {
140
- type: "unknown_error",
141
- title: "Unknown Error",
142
- status: 0,
143
- traceId: correlationId,
144
- isAborted: false,
145
- config
146
- });
147
- }
148
- const err = error;
149
- if (err.type || err.title || err.errors) {
150
- return Object.assign(
151
- error instanceof Error ? error : new Error(_nullishCoalesce(err.message, () => ( "Unknown error"))),
152
- {
153
- type: err.type,
154
- title: err.title,
155
- status: err.status,
156
- traceId: err.traceId || correlationId,
157
- errors: err.errors,
158
- isAborted: err.isAborted || false,
159
- config
160
- }
161
- );
162
- }
163
- if (err.name === "AbortError" || err.isAborted) {
164
- return Object.assign(new Error(_nullishCoalesce(err.message, () => ( "Request was aborted"))), {
165
- type: "request_cancelled",
166
- title: "Request was cancelled",
167
- status: 0,
168
- traceId: correlationId,
169
- isAborted: true,
170
- config
171
- });
172
- }
173
- if (_optionalChain([err, 'access', _ => _.message, 'optionalAccess', _2 => _2.includes, 'call', _3 => _3("timeout")])) {
174
- return Object.assign(new Error(err.message), {
175
- type: "timeout_error",
176
- title: "Request Timeout",
177
- status: 408,
178
- traceId: correlationId,
179
- isAborted: true,
180
- config
181
- });
182
- }
183
- if (_optionalChain([err, 'access', _4 => _4.message, 'optionalAccess', _5 => _5.includes, 'call', _6 => _6("network")])) {
184
- return Object.assign(new Error(_nullishCoalesce(err.message, () => ( "Network request failed"))), {
185
- type: "network_error",
186
- title: "Network Error",
187
- status: 0,
188
- traceId: correlationId,
189
- isAborted: false,
190
- config
191
- });
192
- }
193
- return Object.assign(
194
- new Error(_nullishCoalesce(err.message, () => ( "An unknown error occurred"))),
195
- {
196
- type: "unknown_error",
197
- title: "Unknown Error",
198
- status: 0,
199
- traceId: correlationId,
200
- isAborted: false,
201
- config
202
- }
203
- );
204
- }
205
- };
206
-
207
- // src/core/api/Interceptors/InterceptorManager.ts
208
- var InterceptorManager = (_class = class {constructor() { _class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this); }
209
- /**
210
- * Array of registered request interceptors
211
- * @private
212
- */
213
- __init() {this.requestInterceptors = []}
214
- /**
215
- * Array of registered response interceptors
216
- * @private
217
- */
218
- __init2() {this.responseInterceptors = []}
219
- /**
220
- * Array of registered error interceptors
221
- * @private
222
- */
223
- __init3() {this.errorInterceptors = []}
224
- /**
225
- * Registers a request interceptor to modify requests before they are sent.
226
- *
227
- * Request interceptors can:
228
- * - Add or modify headers
229
- * - Transform request bodies
230
- * - Add query parameters
231
- * - Implement request signing
232
- * - Log outgoing requests
233
- *
234
- * @param interceptor - Async function that receives and returns RequestConfig
235
- * @returns Cleanup function to unregister this interceptor
236
- *
237
- * @example
238
- * ```typescript
239
- * // Add authentication header
240
- * const unregister = manager.addRequestInterceptor(async (config) => {
241
- * const token = await getAuthToken();
242
- * config.headers = config.headers || new Headers();
243
- * config.headers.set('Authorization', `Bearer ${token}`);
244
- * return config;
245
- * });
246
- *
247
- * // Later, remove the interceptor
248
- * unregister();
249
- * ```
250
- */
251
- addRequestInterceptor(interceptor) {
252
- this.requestInterceptors.push(interceptor);
253
- return () => {
254
- const index = this.requestInterceptors.indexOf(interceptor);
255
- if (index > -1) this.requestInterceptors.splice(index, 1);
256
- };
257
- }
258
- /**
259
- * Registers a response interceptor to transform responses before they are returned.
260
- *
261
- * Response interceptors can:
262
- * - Transform response data format
263
- * - Extract nested data structures
264
- * - Add computed properties
265
- * - Cache responses
266
- * - Log successful responses
267
- *
268
- * @param interceptor - Async function that receives and returns ApiResponse
269
- * @returns Cleanup function to unregister this interceptor
270
- *
271
- * @example
272
- * ```typescript
273
- * // Extract data from envelope
274
- * manager.addResponseInterceptor(async (response) => {
275
- * if (response.apiData?.result) {
276
- * response.apiData = response.apiData.result;
277
- * }
278
- * return response;
279
- * });
280
- *
281
- * // Add timestamps
282
- * manager.addResponseInterceptor(async (response) => {
283
- * return {
284
- * ...response,
285
- * receivedAt: new Date().toISOString()
286
- * };
287
- * });
288
- * ```
289
- */
290
- addResponseInterceptor(interceptor) {
291
- this.responseInterceptors.push(interceptor);
292
- return () => {
293
- const index = this.responseInterceptors.indexOf(interceptor);
294
- if (index > -1) this.responseInterceptors.splice(index, 1);
295
- };
296
- }
297
- /**
298
- * Registers an error interceptor to handle or transform errors before they are thrown.
299
- *
300
- * Error interceptors can:
301
- * - Log errors to monitoring services
302
- * - Transform error formats
303
- * - Implement retry logic
304
- * - Show user notifications
305
- * - Extract validation errors
306
- *
307
- * **Note:** Error interceptors should re-throw the error (or a transformed version)
308
- * to maintain the error flow. The final error is always thrown.
309
- *
310
- * @param interceptor - Async function that receives and returns (or throws) ApiError
311
- * @returns Cleanup function to unregister this interceptor
312
- *
313
- * @example
314
- * ```typescript
315
- * // Log to monitoring service
316
- * manager.addErrorInterceptor(async (error) => {
317
- * if (error.status >= 500) {
318
- * await Sentry.captureException(error, {
319
- * extra: { traceId: error.traceId }
320
- * });
321
- * }
322
- * throw error; // Re-throw to continue error flow
323
- * });
324
- *
325
- * // Transform error messages
326
- * manager.addErrorInterceptor(async (error) => {
327
- * if (error.status === 404) {
328
- * error.title = 'Resource not found';
329
- * }
330
- * throw error;
331
- * });
332
- * ```
333
- */
334
- addErrorInterceptor(interceptor) {
335
- this.errorInterceptors.push(interceptor);
336
- return () => {
337
- const index = this.errorInterceptors.indexOf(interceptor);
338
- if (index > -1) this.errorInterceptors.splice(index, 1);
339
- };
340
- }
341
- /**
342
- * Applies all registered request interceptors in sequential order.
343
- *
344
- * Each interceptor receives the config modified by the previous interceptor,
345
- * forming a processing pipeline. If any interceptor throws an error,
346
- * the pipeline stops and the error propagates.
347
- *
348
- * @param config - The initial request configuration
349
- * @returns The modified request configuration after all interceptors
350
- *
351
- * @example
352
- * ```typescript
353
- * const config = { method: 'GET', url: '/users' };
354
- * const finalConfig = await manager.applyRequestInterceptors(config);
355
- * // finalConfig has been processed by all registered interceptors
356
- * ```
357
- */
358
- async applyRequestInterceptors(config) {
359
- let modifiedConfig = { ...config };
360
- for (const interceptor of this.requestInterceptors) {
361
- modifiedConfig = await interceptor(modifiedConfig);
362
- }
363
- return modifiedConfig;
364
- }
365
- /**
366
- * Applies all registered response interceptors in sequential order.
367
- *
368
- * Each interceptor receives the response modified by the previous interceptor,
369
- * forming a processing pipeline. If any interceptor throws an error,
370
- * the pipeline stops and the error propagates.
371
- *
372
- * @template T - The type of the response data
373
- * @param response - The initial API response
374
- * @returns The modified response after all interceptors
375
- *
376
- * @example
377
- * ```typescript
378
- * const response = { data: { id: 1, name: 'John' } };
379
- * const finalResponse = await manager.applyResponseInterceptors(response);
380
- * // finalResponse has been processed by all registered interceptors
381
- * ```
382
- */
383
- async applyResponseInterceptors(response) {
384
- let modifiedResponse = response;
385
- for (const interceptor of this.responseInterceptors) {
386
- modifiedResponse = await interceptor(modifiedResponse);
387
- }
388
- return modifiedResponse;
389
- }
390
- /**
391
- * Applies all registered error interceptors in sequential order and re-throws.
392
- *
393
- * Each interceptor receives the error (potentially modified by previous interceptors).
394
- * Interceptors can transform the error before re-throwing it. The final error
395
- * is always thrown to maintain error flow.
396
- *
397
- * If an interceptor itself throws an error, that becomes the new error to process
398
- * by subsequent interceptors.
399
- *
400
- * @param error - The initial API error
401
- * @returns Never returns (always throws)
402
- * @throws The final error after all interceptors have processed it
403
- *
404
- * @example
405
- * ```typescript
406
- * try {
407
- * await manager.applyErrorInterceptors(error);
408
- * } catch (finalError) {
409
- * // finalError has been processed by all registered error interceptors
410
- * }
411
- * ```
412
- */
413
- async applyErrorInterceptors(error) {
414
- let modifiedError = error;
415
- for (const interceptor of this.errorInterceptors) {
416
- try {
417
- modifiedError = await interceptor(modifiedError);
418
- } catch (e) {
419
- modifiedError = e;
420
- }
421
- }
422
- throw modifiedError;
423
- }
424
- }, _class);
425
-
426
- // src/core/api/RequestManager.ts
427
- var RequestManager = (_class2 = class {constructor() { _class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this); }
428
- /**
429
- * Map of active request keys to their abort controllers
430
- * @private
431
- */
432
- __init4() {this.activeRequests = /* @__PURE__ */ new Map()}
433
- /**
434
- * Map of request keys to their correlation IDs for tracing
435
- * @private
436
- */
437
- __init5() {this.correlationMap = /* @__PURE__ */ new Map()}
438
- /**
439
- * Registers a new request for tracking and cancellation management.
440
- *
441
- * If a request with the same key already exists, it will be automatically
442
- * cancelled before the new one is registered (request deduplication).
443
- *
444
- * @param key - Unique identifier for the request (typically method + URL + timestamp)
445
- * @param controller - AbortController for cancelling the request
446
- * @param correlationId - Correlation ID for distributed tracing
447
- *
448
- * @example
449
- * ```typescript
450
- * const controller = new AbortController();
451
- * manager.add('GET_/api/users_1699999999', controller, 'api-abc123');
452
- * ```
453
- */
454
- add(key, controller, correlationId) {
455
- this.cancel(key);
456
- this.activeRequests.set(key, controller);
457
- this.correlationMap.set(key, correlationId);
458
- }
459
- /**
460
- * Removes a request from tracking without cancelling it.
461
- *
462
- * This is typically called when a request completes successfully or fails.
463
- * Use {@link cancel} instead if you need to abort the request.
464
- *
465
- * @param key - Unique identifier for the request to remove
466
- *
467
- * @example
468
- * ```typescript
469
- * // Called automatically after request completes
470
- * manager.remove('GET_/api/users_1699999999');
471
- * ```
472
- */
473
- remove(key) {
474
- this.activeRequests.delete(key);
475
- this.correlationMap.delete(key);
476
- }
477
- /**
478
- * Cancels a specific request and removes it from tracking.
479
- *
480
- * If the request doesn't exist or was already cancelled, this operation is a no-op.
481
- * The associated AbortController's signal will be triggered, causing any active
482
- * fetch operations to abort.
483
- *
484
- * @param key - Unique identifier for the request to cancel
485
- *
486
- * @example
487
- * ```typescript
488
- * // User navigates away, cancel the pending request
489
- * manager.cancel('GET_/api/users_1699999999');
490
- * ```
491
- */
492
- cancel(key) {
493
- const controller = this.activeRequests.get(key);
494
- if (controller) {
495
- controller.abort();
496
- this.activeRequests.delete(key);
497
- this.correlationMap.delete(key);
498
- }
499
- }
500
- /**
501
- * Cancels all active requests and clears all tracking data.
502
- *
503
- * This is useful for cleanup scenarios such as:
504
- * - User logout
505
- * - Component unmount
506
- * - Navigation to a different part of the application
507
- * - Error recovery that requires a clean slate
508
- *
509
- * @example
510
- * ```typescript
511
- * // Cancel all pending requests on logout
512
- * function handleLogout() {
513
- * apiClient.cancelAllRequests();
514
- * // ... rest of logout logic
515
- * }
516
- * ```
517
- */
518
- cancelAll() {
519
- this.activeRequests.forEach((controller) => controller.abort());
520
- this.activeRequests.clear();
521
- this.correlationMap.clear();
522
- }
523
- /**
524
- * Checks if a request with the given key is currently being tracked.
525
- *
526
- * @param key - Unique identifier for the request
527
- * @returns `true` if the request is active, `false` otherwise
528
- *
529
- * @example
530
- * ```typescript
531
- * if (manager.has('GET_/api/users_1699999999')) {
532
- * console.log('Request is still pending');
533
- * }
534
- * ```
535
- */
536
- has(key) {
537
- return this.activeRequests.has(key);
538
- }
539
- /**
540
- * Retrieves the correlation ID for a given request key.
541
- *
542
- * Correlation IDs are used for distributed tracing and request tracking
543
- * across services and logs.
544
- *
545
- * @param key - Unique identifier for the request
546
- * @returns The correlation ID if found, `undefined` otherwise
547
- *
548
- * @example
549
- * ```typescript
550
- * const correlationId = manager.getCorrelationId('GET_/api/users_1699999999');
551
- * if (correlationId) {
552
- * console.log('Trace request with ID:', correlationId);
553
- * }
554
- * ```
555
- */
556
- getCorrelationId(key) {
557
- return this.correlationMap.get(key);
558
- }
559
- }, _class2);
560
-
561
- // src/core/api/Retry/RetryHandler.ts
562
- var RetryHandler = class {
563
- /**
564
- * Retries a failed request with exponential backoff strategy.
565
- *
566
- * The retry logic works as follows:
567
- * 1. Attempts the request immediately
568
- * 2. On failure, checks if the error is retryable
569
- * 3. If retryable and retries remain, waits for the current delay
570
- * 4. Doubles the delay for the next attempt
571
- * 5. Repeats until success or retries exhausted
572
- *
573
- * **Non-Retryable Errors:**
574
- * - Validation errors (400) - Client sent bad data
575
- * - AbortErrors - Request was explicitly cancelled
576
- * - Requests with aborted signals
577
- *
578
- * **Abort Handling:**
579
- * If the signal is aborted during a retry delay, the retry is immediately
580
- * cancelled and an AbortError is thrown.
581
- *
582
- * @template T - The return type of the function being retried
583
- * @param fn - Async function to retry on failure
584
- * @param retries - Number of retry attempts remaining (decrements each retry)
585
- * @param delay - Current delay in milliseconds before next retry
586
- * @param signal - Optional AbortSignal to cancel retries
587
- * @returns Promise resolving to the function's result on success
588
- * @throws The last error encountered if all retries are exhausted
589
- * @throws AbortError if the signal is aborted during execution or delay
590
- *
591
- * @example
592
- * Basic retry usage:
593
- * ```typescript
594
- * const handler = new RetryHandler();
595
- * const fetchUser = () => fetch('/api/users/123').then(r => r.json());
596
- *
597
- * try {
598
- * const user = await handler.retryRequest(
599
- * fetchUser,
600
- * 3, // 3 retries
601
- * 1000 // Start with 1s delay
602
- * );
603
- * console.log('User:', user);
604
- * } catch (error) {
605
- * console.error('Failed after all retries:', error);
606
- * }
607
- * ```
608
- *
609
- * @example
610
- * With cancellation support:
611
- * ```typescript
612
- * const controller = new AbortController();
613
- * const signal = controller.signal;
614
- *
615
- * // Cancel after 5 seconds
616
- * setTimeout(() => controller.abort(), 5000);
617
- *
618
- * try {
619
- * await handler.retryRequest(fetchUser, 5, 1000, signal);
620
- * } catch (error) {
621
- * if (error.name === 'AbortError') {
622
- * console.log('Retry cancelled');
623
- * }
624
- * }
625
- * ```
626
- */
627
- async retryRequest(fn, retries, delay, signal) {
628
- try {
629
- if (_optionalChain([signal, 'optionalAccess', _7 => _7.aborted])) {
630
- throw new Error(signal.reason || "Request aborted");
631
- }
632
- return await fn();
633
- } catch (error) {
634
- const err = error;
635
- if (err.name === "AbortError" || _optionalChain([signal, 'optionalAccess', _8 => _8.aborted])) {
636
- throw error;
637
- }
638
- if (err.type === "validation_error" || err.status === 400) {
639
- throw error;
640
- }
641
- if (retries === 0) throw error;
642
- await new Promise((resolve, reject) => {
643
- const timeoutId = setTimeout(resolve, delay);
644
- if (signal) {
645
- signal.addEventListener(
646
- "abort",
647
- () => {
648
- clearTimeout(timeoutId);
649
- reject(new Error(signal.reason || "Request aborted"));
650
- },
651
- { once: true }
652
- );
653
- }
654
- });
655
- return this.retryRequest(fn, retries - 1, delay * 2, signal);
656
- }
657
- }
658
- };
659
-
660
- // src/core/api/Signals/SignalManager.ts
661
- var SignalManager = class {
662
- /**
663
- * Creates a combined AbortController that aborts when any source signal aborts.
664
- *
665
- * This method implements the "any" pattern for cancellation: the combined signal
666
- * will abort as soon as ANY of the source signals abort. This is useful for
667
- * coordinating multiple cancellation conditions:
668
- * - User clicks cancel button
669
- * - Request timeout expires
670
- * - Component unmounts
671
- * - Parent request is cancelled
672
- *
673
- * **Early Abort Optimization:**
674
- * If any source signal is already aborted when this method is called,
675
- * the returned controller is immediately aborted without setting up listeners.
676
- *
677
- * **Memory Management:**
678
- * Event listeners are registered with `{ once: true }` to prevent memory leaks,
679
- * as they automatically clean up after firing.
680
- *
681
- * @param signals - Array of AbortSignals to combine (undefined values are ignored)
682
- * @returns A new AbortController that aborts when any source signal aborts
683
- *
684
- * @example
685
- * User cancellation + timeout:
686
- * ```typescript
687
- * const userController = new AbortController();
688
- * const timeout = manager.createTimeoutSignal(30000);
689
- *
690
- * const combined = manager.createCombinedSignal([
691
- * userController.signal,
692
- * timeout.signal
693
- * ]);
694
- *
695
- * // Request will be cancelled after 30s OR when user clicks cancel
696
- * fetch('/api/data', { signal: combined.signal });
697
- * ```
698
- *
699
- * @example
700
- * React component with cleanup:
701
- * ```typescript
702
- * useEffect(() => {
703
- * const controller = new AbortController();
704
- *
705
- * const combined = manager.createCombinedSignal([
706
- * controller.signal,
707
- * unmountSignal // From component lifecycle
708
- * ]);
709
- *
710
- * fetchData(combined.signal);
711
- *
712
- * return () => controller.abort(); // Cleanup
713
- * }, []);
714
- * ```
715
- */
716
- createCombinedSignal(signals) {
717
- const controller = new AbortController();
718
- for (const signal of signals) {
719
- if (signal) {
720
- if (signal.aborted) {
721
- controller.abort(signal.reason);
722
- break;
723
- }
724
- signal.addEventListener(
725
- "abort",
726
- () => {
727
- controller.abort(signal.reason);
728
- },
729
- { once: true }
730
- );
731
- }
732
- }
733
- return controller;
734
- }
735
- /**
736
- * Creates an AbortController that automatically aborts after a specified timeout.
737
- *
738
- * This method creates a time-based cancellation mechanism useful for implementing
739
- * request timeouts and deadlines. The signal will automatically abort after the
740
- * specified duration, providing a consistent timeout experience.
741
- *
742
- * **Automatic Cleanup:**
743
- * If the signal is aborted by other means before the timeout expires, the internal
744
- * setTimeout is automatically cleared to prevent memory leaks.
745
- *
746
- * **Abort Reason:**
747
- * The abort reason includes the timeout duration for debugging purposes:
748
- * `"Request timeout after {timeout}ms"`
749
- *
750
- * @param timeout - Timeout duration in milliseconds
751
- * @returns An AbortController that will abort after the timeout
752
- *
753
- * @example
754
- * Simple request timeout:
755
- * ```typescript
756
- * const manager = new SignalManager();
757
- * const timeout = manager.createTimeoutSignal(5000); // 5 seconds
758
- *
759
- * try {
760
- * const response = await fetch('/api/slow-endpoint', {
761
- * signal: timeout.signal
762
- * });
763
- * const data = await response.json();
764
- * } catch (error) {
765
- * if (error.name === 'AbortError') {
766
- * console.error('Request timed out after 5 seconds');
767
- * }
768
- * }
769
- * ```
770
- *
771
- * @example
772
- * Different timeouts for different operations:
773
- * ```typescript
774
- * // Short timeout for quick operations
775
- * const quickTimeout = manager.createTimeoutSignal(2000);
776
- * await fetch('/api/health', { signal: quickTimeout.signal });
777
- *
778
- * // Long timeout for heavy operations
779
- * const longTimeout = manager.createTimeoutSignal(60000);
780
- * await fetch('/api/export', { signal: longTimeout.signal });
781
- * ```
782
- *
783
- * @example
784
- * Manual cancellation before timeout:
785
- * ```typescript
786
- * const timeout = manager.createTimeoutSignal(30000);
787
- *
788
- * // If user cancels, timeout is automatically cleaned up
789
- * timeout.abort('User cancelled');
790
- * // Internal setTimeout is cleared, no memory leak
791
- * ```
792
- */
793
- createTimeoutSignal(timeout) {
794
- const controller = new AbortController();
795
- const timeoutId = setTimeout(() => {
796
- controller.abort(`Request timeout after ${timeout}ms`);
797
- }, timeout);
798
- controller.signal.addEventListener(
799
- "abort",
800
- () => {
801
- clearTimeout(timeoutId);
802
- },
803
- { once: true }
804
- );
805
- return controller;
806
- }
807
- };
808
-
809
- // src/core/api/Utils/ResponseParser.ts
810
- var ResponseParser = class {
811
- /**
812
- * Parses the HTTP response body into an appropriate JavaScript type.
813
- *
814
- * The parsing strategy is determined by the Content-Type header:
815
- * 1. **JSON** (application/json): Calls `response.json()`
816
- * 2. **Text** (text/*): Calls `response.text()`
817
- * 3. **Binary** (application/octet-stream): Calls `response.blob()`
818
- * 4. **Unknown**: Reads as text, attempts JSON parse, falls back to raw text
819
- *
820
- * **Fallback Behavior:**
821
- * For responses without a Content-Type header or with unknown types, the parser
822
- * attempts to parse as JSON first (common for APIs that don't set proper headers).
823
- * If JSON parsing fails, it returns the raw text.
824
- *
825
- * @param response - The Fetch API Response object to parse
826
- * @returns Promise resolving to the parsed response data
827
- * @returns Can be: JSON object/array, string, or Blob depending on Content-Type
828
- *
829
- * @example
830
- * API response parsing:
831
- * ```typescript
832
- * const response = await fetch('/api/users');
833
- * const data = await parser.parseResponse(response);
834
- *
835
- * if (typeof data === 'string') {
836
- * console.log('Text response:', data);
837
- * } else if (data instanceof Blob) {
838
- * console.log('Binary response:', data.size, 'bytes');
839
- * } else {
840
- * console.log('JSON response:', data);
841
- * }
842
- * ```
843
- *
844
- * @example
845
- * Handling different content types:
846
- * ```typescript
847
- * // CSV file download
848
- * const csvResponse = await fetch('/api/export.csv');
849
- * const blob = await parser.parseResponse(csvResponse);
850
- * // Returns Blob for download
851
- *
852
- * // JSON API
853
- * const jsonResponse = await fetch('/api/users');
854
- * const users = await parser.parseResponse(jsonResponse);
855
- * // Returns parsed JSON array
856
- *
857
- * // Plain text logs
858
- * const logResponse = await fetch('/api/logs');
859
- * const logs = await parser.parseResponse(logResponse);
860
- * // Returns string
861
- * ```
862
- */
863
- async parseResponse(response) {
864
- const contentType = response.headers.get("content-type");
865
- if (_optionalChain([contentType, 'optionalAccess', _9 => _9.includes, 'call', _10 => _10("application/json")])) {
866
- return response.json();
867
- } else if (_optionalChain([contentType, 'optionalAccess', _11 => _11.includes, 'call', _12 => _12("text/")])) {
868
- return response.text();
869
- } else if (_optionalChain([contentType, 'optionalAccess', _13 => _13.includes, 'call', _14 => _14("application/octet-stream")])) {
870
- return response.blob();
871
- } else {
872
- const text = await response.text();
873
- try {
874
- return JSON.parse(text);
875
- } catch (e2) {
876
- return text;
877
- }
878
- }
879
- }
880
- };
881
-
882
- // src/core/api/Utils/UrlBuilder.ts
883
- var UrlBuilder = class {
884
- /**
885
- * Builds a complete URL by combining base URL, endpoint, and query parameters.
886
- *
887
- * The URL construction process:
888
- * 1. Combines `baseURL` and `endpoint` using URL API
889
- * 2. Iterates through query parameters
890
- * 3. Skips null/undefined values
891
- * 4. Handles arrays by appending multiple values with same key
892
- * 5. Converts all values to strings
893
- * 6. Returns fully-qualified URL string
894
- *
895
- * **Path Handling:**
896
- * The endpoint can be either relative or absolute:
897
- * - Relative: `/users` → Combined with baseURL
898
- * - Absolute: `https://other-api.com/users` → Uses absolute URL
899
- *
900
- * **Encoding:**
901
- * All parameter values are automatically URL-encoded by the URL API,
902
- * so special characters (spaces, &, =, etc.) are safely handled.
903
- *
904
- * @param baseURL - Base URL for the API (e.g., 'https://api.example.com')
905
- * @param endpoint - API endpoint path relative to baseURL (e.g., '/users/123')
906
- * @param params - Optional query parameters as key-value pairs
907
- * @returns The fully-qualified URL string with encoded query parameters
908
- *
909
- * @example
910
- * Basic URL construction:
911
- * ```typescript
912
- * const url = builder.buildURL(
913
- * 'https://api.example.com',
914
- * '/search',
915
- * { q: 'hello world', limit: 10 }
916
- * );
917
- * // => "https://api.example.com/search?q=hello+world&limit=10"
918
- * ```
919
- *
920
- * @example
921
- * Array parameters:
922
- * ```typescript
923
- * const url = builder.buildURL(
924
- * 'https://api.example.com',
925
- * '/posts',
926
- * { tags: ['javascript', 'typescript', 'react'] }
927
- * );
928
- * // => "https://api.example.com/posts?tags=javascript&tags=typescript&tags=react"
929
- * ```
930
- *
931
- * @example
932
- * Null/undefined handling:
933
- * ```typescript
934
- * const url = builder.buildURL(
935
- * 'https://api.example.com',
936
- * '/users',
937
- * {
938
- * name: 'John',
939
- * age: null, // Skipped
940
- * email: undefined // Skipped
941
- * }
942
- * );
943
- * // => "https://api.example.com/users?name=John"
944
- * ```
945
- *
946
- * @example
947
- * Special characters encoding:
948
- * ```typescript
949
- * const url = builder.buildURL(
950
- * 'https://api.example.com',
951
- * '/search',
952
- * { q: 'foo & bar', category: 'code/examples' }
953
- * );
954
- * // => "https://api.example.com/search?q=foo+%26+bar&category=code%2Fexamples"
955
- * ```
956
- */
957
- buildURL(baseURL, endpoint, params) {
958
- const normalizedEndpoint = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
959
- const url = new URL(normalizedEndpoint, baseURL);
960
- if (params) {
961
- Object.keys(params).forEach((key) => {
962
- const value = params[key];
963
- if (value !== void 0 && value !== null) {
964
- if (Array.isArray(value)) {
965
- value.forEach((v) => url.searchParams.append(key, String(v)));
966
- } else {
967
- url.searchParams.append(key, String(value));
968
- }
969
- }
970
- });
971
- }
972
- return url.toString();
973
- }
974
- };
975
-
976
- // src/core/api/ApiClient.ts
977
- var ApiClient = (_class3 = class {
978
-
979
-
980
- __init6() {this.interceptorManager = new InterceptorManager()}
981
- __init7() {this.signalManager = new SignalManager()}
982
- __init8() {this.errorNormalizer = new ErrorNormalizer()}
983
- __init9() {this.responseParser = new ResponseParser()}
984
- __init10() {this.urlBuilder = new UrlBuilder()}
985
- __init11() {this.retryHandler = new RetryHandler()}
986
- __init12() {this.requestManager = new RequestManager()}
987
- __init13() {this.authToken = null}
988
- __init14() {this.correlationIdPrefix = "api"}
989
- __init15() {this.includeCorrelationId = true}
990
- /**
991
- * Creates a new API client instance
992
- * @param baseURL - Base URL for all API requests (default: empty string for relative URLs)
993
- * @param defaultTimeout - Default request timeout in milliseconds (default: 30000)
994
- */
995
- constructor(baseURL = "", defaultTimeout = 3e4) {;_class3.prototype.__init6.call(this);_class3.prototype.__init7.call(this);_class3.prototype.__init8.call(this);_class3.prototype.__init9.call(this);_class3.prototype.__init10.call(this);_class3.prototype.__init11.call(this);_class3.prototype.__init12.call(this);_class3.prototype.__init13.call(this);_class3.prototype.__init14.call(this);_class3.prototype.__init15.call(this);
996
- this.baseURL = baseURL;
997
- this.defaultTimeout = defaultTimeout;
998
- }
999
- /**
1000
- * Sets the prefix for auto-generated correlation IDs
1001
- * @param prefix - The prefix to use for correlation IDs (e.g., 'api', 'web', 'mobile')
1002
- */
1003
- setCorrelationIdPrefix(prefix) {
1004
- this.correlationIdPrefix = prefix;
1005
- }
1006
- /**
1007
- * Enables or disables automatic correlation ID generation
1008
- * @param include - Whether to include correlation IDs in requests
1009
- */
1010
- setIncludeCorrelationId(include) {
1011
- this.includeCorrelationId = include;
1012
- }
1013
- /**
1014
- * Registers a request interceptor to modify requests before they're sent
1015
- * @param interceptor - Function to intercept and potentially modify request config
1016
- * @returns Function to unregister this interceptor
1017
- *
1018
- * @example
1019
- * ```typescript
1020
- * const unregister = client.addRequestInterceptor(async (config) => {
1021
- * config.headers = config.headers || new Headers();
1022
- * config.headers.set('X-Client-Version', '1.0.0');
1023
- * return config;
1024
- * });
1025
- *
1026
- * // Later, to remove the interceptor:
1027
- * unregister();
1028
- * ```
1029
- */
1030
- addRequestInterceptor(interceptor) {
1031
- return this.interceptorManager.addRequestInterceptor(interceptor);
1032
- }
1033
- /**
1034
- * Registers a response interceptor to modify responses before they're returned
1035
- * @param interceptor - Function to intercept and potentially modify responses
1036
- * @returns Function to unregister this interceptor
1037
- *
1038
- * @example
1039
- * ```typescript
1040
- * client.addResponseInterceptor(async (response) => {
1041
- * // Transform data format
1042
- * if (response.apiData) {
1043
- * response.apiData = camelCaseKeys(response.apiData);
1044
- * }
1045
- * return response;
1046
- * });
1047
- * ```
1048
- */
1049
- addResponseInterceptor(interceptor) {
1050
- return this.interceptorManager.addResponseInterceptor(interceptor);
1051
- }
1052
- /**
1053
- * Registers an error interceptor to handle or transform errors
1054
- * @param interceptor - Function to intercept and potentially modify errors
1055
- * @returns Function to unregister this interceptor
1056
- *
1057
- * @example
1058
- * ```typescript
1059
- * client.addErrorInterceptor(async (error) => {
1060
- * // Log errors to monitoring service
1061
- * if (error.status >= 500) {
1062
- * await monitoringService.logError(error);
1063
- * }
1064
- * return error; // Re-throw the error
1065
- * });
1066
- * ```
1067
- */
1068
- addErrorInterceptor(interceptor) {
1069
- return this.interceptorManager.addErrorInterceptor(interceptor);
1070
- }
1071
- /**
1072
- * Sets the authentication token for subsequent requests
1073
- * @param token - JWT token or null to clear authentication
1074
- *
1075
- * @example
1076
- * ```typescript
1077
- * // Set token after login
1078
- * client.setAuthToken(loginResponse.accessToken);
1079
- *
1080
- * // Clear token on logout
1081
- * client.setAuthToken(null);
1082
- * ```
1083
- */
1084
- setAuthToken(token) {
1085
- this.authToken = token;
1086
- }
1087
- /**
1088
- * Retrieves the current authentication token
1089
- * @returns The current auth token or null if not set
1090
- */
1091
- getAuthToken() {
1092
- return this.authToken;
1093
- }
1094
- /**
1095
- * Cancels a specific request by its key
1096
- * @param key - The unique key identifying the request to cancel
1097
- */
1098
- cancelRequest(key) {
1099
- this.requestManager.cancel(key);
1100
- }
1101
- /**
1102
- * Cancels all pending requests
1103
- * Useful for cleanup on navigation or component unmount
1104
- */
1105
- cancelAllRequests() {
1106
- this.requestManager.cancelAll();
1107
- }
1108
- /**
1109
- * Core request method that handles all HTTP operations
1110
- * @template T - The expected response data type
1111
- * @param endpoint - API endpoint relative to baseURL
1112
- * @param config - Request configuration options
1113
- * @returns Promise resolving to ApiResponse with data or error
1114
- *
1115
- * @example
1116
- * ```typescript
1117
- * const response = await client.request<User>('/users/123', {
1118
- * method: 'GET',
1119
- * timeout: 5000,
1120
- * throwErrors: false
1121
- * });
1122
- * ```
1123
- */
1124
- async request(endpoint, config = {}) {
1125
- const correlationId = config.correlationId || (!config.skipCorrelationId && this.includeCorrelationId ? generateCorrelationId(this.correlationIdPrefix) : void 0);
1126
- const requestKey = `${config.method || "GET"}_${endpoint}_${Date.now()}`;
1127
- const masterController = new AbortController();
1128
- try {
1129
- const signals = [
1130
- config.signal,
1131
- _optionalChain([config, 'access', _15 => _15.cancelToken, 'optionalAccess', _16 => _16.signal]),
1132
- masterController.signal
1133
- ];
1134
- const timeout = config.timeout || this.defaultTimeout;
1135
- const timeoutController = this.signalManager.createTimeoutSignal(timeout);
1136
- signals.push(timeoutController.signal);
1137
- const combinedController = this.signalManager.createCombinedSignal(signals);
1138
- if (correlationId) {
1139
- this.requestManager.add(requestKey, masterController, correlationId);
1140
- }
1141
- const finalConfig = await this.interceptorManager.applyRequestInterceptors({
1142
- ...config,
1143
- signal: combinedController.signal,
1144
- correlationId
1145
- });
1146
- const url = this.urlBuilder.buildURL(
1147
- this.baseURL,
1148
- endpoint,
1149
- finalConfig.params
1150
- );
1151
- const headers = new Headers(finalConfig.headers);
1152
- if (correlationId) {
1153
- headers.set("X-Correlation-Id", correlationId);
1154
- headers.set("X-Request-Id", correlationId);
1155
- }
1156
- if (this.authToken && !finalConfig.skipAuthRefresh) {
1157
- headers.set("Authorization", `Bearer ${this.authToken}`);
1158
- }
1159
- let fetchBody = finalConfig.body;
1160
- if (finalConfig.body && typeof finalConfig.body === "object" && !(finalConfig.body instanceof FormData) && !(finalConfig.body instanceof Blob) && !(finalConfig.body instanceof ArrayBuffer) && !(finalConfig.body instanceof URLSearchParams) && !(finalConfig.body instanceof ReadableStream)) {
1161
- headers.set("Content-Type", "application/json");
1162
- fetchBody = JSON.stringify(finalConfig.body);
1163
- } else if (finalConfig.body instanceof FormData) {
1164
- headers.delete("Content-Type");
1165
- }
1166
- finalConfig.headers = headers;
1167
- const fetchPromise = async () => {
1168
- try {
1169
- const response = await fetch(url, {
1170
- ...finalConfig,
1171
- body: fetchBody,
1172
- signal: combinedController.signal
1173
- });
1174
- const responseData = await this.responseParser.parseResponse(response);
1175
- if (!response.ok) {
1176
- const errorData = responseData;
1177
- const error = Object.assign(
1178
- new Error(
1179
- errorData.title || `HTTP ${response.status}: ${response.statusText}`
1180
- ),
1181
- {
1182
- type: errorData.type || this.errorNormalizer.getErrorType(response.status),
1183
- title: errorData.title || this.errorNormalizer.getErrorTitle(response.status),
1184
- status: response.status,
1185
- traceId: errorData.traceId || correlationId,
1186
- errors: errorData.errors,
1187
- isAborted: false,
1188
- config: finalConfig
1189
- }
1190
- );
1191
- if (finalConfig.throwErrors !== false) {
1192
- throw error;
1193
- } else {
1194
- return await this.interceptorManager.applyResponseInterceptors({
1195
- error
1196
- });
1197
- }
1198
- }
1199
- const apiResponse = {
1200
- data: responseData
1201
- };
1202
- return await this.interceptorManager.applyResponseInterceptors(
1203
- apiResponse
1204
- );
1205
- } catch (error) {
1206
- if (error.name === "AbortError") {
1207
- const abortError = Object.assign(
1208
- new Error(error.message || "Request aborted"),
1209
- {
1210
- type: "request_cancelled",
1211
- title: "Request was cancelled",
1212
- status: 0,
1213
- traceId: correlationId,
1214
- isAborted: true,
1215
- config: finalConfig
1216
- }
1217
- );
1218
- if (finalConfig.throwErrors !== false) {
1219
- throw abortError;
1220
- } else {
1221
- return await this.interceptorManager.applyResponseInterceptors({
1222
- error: abortError
1223
- });
1224
- }
1225
- }
1226
- throw error;
1227
- }
1228
- };
1229
- if (finalConfig.retries && finalConfig.retries > 0) {
1230
- return await this.retryHandler.retryRequest(
1231
- fetchPromise,
1232
- finalConfig.retries,
1233
- finalConfig.retryDelay || 1e3,
1234
- combinedController.signal
1235
- );
1236
- }
1237
- return await fetchPromise();
1238
- } catch (error) {
1239
- const apiError = this.errorNormalizer.normalizeError(
1240
- error,
1241
- config,
1242
- correlationId
1243
- );
1244
- if (config.throwErrors !== false) {
1245
- await this.interceptorManager.applyErrorInterceptors(apiError);
1246
- throw apiError;
1247
- } else {
1248
- return {
1249
- error: apiError
1250
- };
1251
- }
1252
- } finally {
1253
- this.requestManager.remove(requestKey);
1254
- }
1255
- }
1256
- /**
1257
- * Performs a GET request
1258
- * @template T - The expected response data type
1259
- * @param endpoint - API endpoint
1260
- * @param config - Optional request configuration
1261
- * @returns Promise resolving to ApiResponse
1262
- *
1263
- * @example
1264
- * ```typescript
1265
- * const { apiData, error } = await client.get<User[]>('/users', {
1266
- * params: { active: true },
1267
- * timeout: 5000
1268
- * });
1269
- * ```
1270
- */
1271
- get(endpoint, config) {
1272
- return this.request(endpoint, { ...config, method: "GET" });
1273
- }
1274
- /**
1275
- * Performs a POST request
1276
- * @template T - The expected response data type
1277
- * @template TData - The request body data type
1278
- * @param endpoint - API endpoint
1279
- * @param data - Request body data
1280
- * @param config - Optional request configuration
1281
- * @returns Promise resolving to ApiResponse
1282
- *
1283
- * @example
1284
- * ```typescript
1285
- * const { apiData, error } = await client.post<User, CreateUserDto>('/users', {
1286
- * name: 'John Doe',
1287
- * email: 'john@example.com'
1288
- * });
1289
- * ```
1290
- */
1291
- post(endpoint, data, config) {
1292
- return this.request(endpoint, { ...config, method: "POST", body: data });
1293
- }
1294
- /**
1295
- * Performs a PUT request
1296
- * @template T - The expected response data type
1297
- * @template TData - The request body data type
1298
- * @param endpoint - API endpoint
1299
- * @param data - Request body data
1300
- * @param config - Optional request configuration
1301
- * @returns Promise resolving to ApiResponse
1302
- *
1303
- * @example
1304
- * ```typescript
1305
- * const { apiData, error } = await client.put<User, UpdateUserDto>(
1306
- * '/users/123',
1307
- * { name: 'Jane Doe' }
1308
- * );
1309
- * ```
1310
- */
1311
- put(endpoint, data, config) {
1312
- return this.request(endpoint, { ...config, method: "PUT", body: data });
1313
- }
1314
- /**
1315
- * Performs a PATCH request
1316
- * @template T - The expected response data type
1317
- * @template TData - The request body data type
1318
- * @param endpoint - API endpoint
1319
- * @param data - Request body data
1320
- * @param config - Optional request configuration
1321
- * @returns Promise resolving to ApiResponse
1322
- *
1323
- * @example
1324
- * ```typescript
1325
- * const { apiData, error } = await client.patch<User>(
1326
- * '/users/123',
1327
- * { status: 'active' }
1328
- * );
1329
- * ```
1330
- */
1331
- patch(endpoint, data, config) {
1332
- return this.request(endpoint, {
1333
- ...config,
1334
- method: "PATCH",
1335
- body: data
1336
- });
1337
- }
1338
- /**
1339
- * Performs a DELETE request
1340
- * @template T - The expected response data type
1341
- * @param endpoint - API endpoint
1342
- * @param config - Optional request configuration
1343
- * @returns Promise resolving to ApiResponse
1344
- *
1345
- * @example
1346
- * ```typescript
1347
- * const { error } = await client.delete('/users/123');
1348
- * if (!error) {
1349
- * console.log('User deleted successfully');
1350
- * }
1351
- * ```
1352
- */
1353
- delete(endpoint, config) {
1354
- return this.request(endpoint, { ...config, method: "DELETE" });
1355
- }
1356
- /**
1357
- * Performs a filtered list request with pagination and sorting
1358
- * @template TListModel - The type of individual list items
1359
- * @template TFilter - The filter criteria type
1360
- * @param url - API endpoint
1361
- * @param data - Pagination and filter data
1362
- * @param config - Optional request configuration
1363
- * @returns Promise resolving to paginated list response
1364
- *
1365
- * @example
1366
- * ```typescript
1367
- * const { apiData, error } = await client.filter<User, UserFilter>(
1368
- * '/users/filter',
1369
- * {
1370
- * pageOffset: 0,
1371
- * pageSize: 20,
1372
- * sortField: 'createdAt',
1373
- * sortOrder: 'desc',
1374
- * filterModel: { status: 'active' }
1375
- * }
1376
- * );
1377
- *
1378
- * if (apiData) {
1379
- * console.log(`Found ${apiData.Total} users`);
1380
- * console.log('Users:', apiData.Data);
1381
- * }
1382
- * ```
1383
- */
1384
- filter(url, data, config) {
1385
- const mergedData = { ...data, ...data.filterModel };
1386
- return this.request(url, {
1387
- ...config,
1388
- method: "POST",
1389
- body: mergedData
1390
- });
1391
- }
1392
- }, _class3);
1393
-
1394
- // src/core/api/createApiClient.ts
1395
- var globalApiClient = null;
1396
- function createApiClient(config) {
1397
- const {
1398
- baseURL,
1399
- timeout = 3e4,
1400
- correlationIdPrefix,
1401
- includeCorrelationId = true,
1402
- tokenStorageKey,
1403
- requestInterceptors = [],
1404
- responseInterceptors = [],
1405
- errorInterceptors = []
1406
- } = config;
1407
- const client = new ApiClient(baseURL, timeout);
1408
- client.addRequestInterceptor((config2) => {
1409
- const token = localStorage.getItem(tokenStorageKey);
1410
- if (token && !config2.skipAuthRefresh) {
1411
- config2.headers = {
1412
- ...config2.headers,
1413
- Authorization: `Bearer ${token}`
1414
- };
1415
- }
1416
- return config2;
1417
- });
1418
- client.setCorrelationIdPrefix(correlationIdPrefix);
1419
- client.setIncludeCorrelationId(includeCorrelationId);
1420
- requestInterceptors.forEach((interceptor) => {
1421
- client.addRequestInterceptor(interceptor);
1422
- });
1423
- responseInterceptors.forEach((interceptor) => {
1424
- client.addResponseInterceptor(interceptor);
1425
- });
1426
- errorInterceptors.forEach((interceptor) => {
1427
- client.addErrorInterceptor(interceptor);
1428
- });
1429
- return client;
1430
- }
1431
- function getGlobalApiClient() {
1432
- if (!globalApiClient) {
1433
- throw new Error(
1434
- "getGlobalApiClient: No global client exists. Call initializeGlobalApiClient() first to configure the client."
1435
- );
1436
- }
1437
- return globalApiClient;
1438
- }
1439
- function initializeGlobalApiClient(config) {
1440
- if (globalApiClient) {
1441
- throw new Error(
1442
- "initializeGlobalApiClient: Global client already initialized. Use resetGlobalApiClient() first if you need to reinitialize."
1443
- );
1444
- }
1445
- globalApiClient = createApiClient(config);
1446
- return globalApiClient;
1447
- }
1448
- function setGlobalApiClient(client) {
1449
- globalApiClient = client;
1450
- }
1451
- function resetGlobalApiClient() {
1452
- globalApiClient = null;
1453
- }
1454
-
1455
- // src/core/api/types/CancelToken.ts
1456
- var CancelToken = class _CancelToken {
1457
-
1458
-
1459
-
1460
- constructor() {
1461
- this.abortController = new AbortController();
1462
- this.cancelPromise = new Promise((resolve) => {
1463
- this.cancelResolve = resolve;
1464
- });
1465
- }
1466
- get signal() {
1467
- return this.abortController.signal;
1468
- }
1469
- cancel(reason) {
1470
- this.abortController.abort(reason);
1471
- _optionalChain([this, 'access', _17 => _17.cancelResolve, 'optionalCall', _18 => _18()]);
1472
- }
1473
- get isCancelled() {
1474
- return this.abortController.signal.aborted;
1475
- }
1476
- throwIfCancelled() {
1477
- if (this.isCancelled) {
1478
- throw new Error("Request cancelled");
1479
- }
1480
- }
1481
- static source() {
1482
- const token = new _CancelToken();
1483
- return {
1484
- token,
1485
- cancel: (reason) => token.cancel(reason)
1486
- };
1487
- }
1488
- };
1489
-
1490
- // src/core/api/useValidationErrors.ts
1491
- var _react = require('react');
1492
- function useValidationErrors(error) {
1493
- const getFieldError = _react.useCallback.call(void 0,
1494
- (field) => {
1495
- if (!_optionalChain([error, 'optionalAccess', _19 => _19.errors]) || !error.errors[field]) return null;
1496
- const fieldError = error.errors[field];
1497
- if (typeof fieldError === "string") return fieldError;
1498
- if (Array.isArray(fieldError)) return fieldError[0];
1499
- if (typeof fieldError === "object" && "message" in fieldError) {
1500
- return fieldError.message;
1501
- }
1502
- return null;
1503
- },
1504
- [error]
1505
- );
1506
- const hasFieldError = _react.useCallback.call(void 0,
1507
- (field) => {
1508
- return !!getFieldError(field);
1509
- },
1510
- [getFieldError]
1511
- );
1512
- const getAllErrors = _react.useCallback.call(void 0, () => {
1513
- if (!_optionalChain([error, 'optionalAccess', _20 => _20.errors])) return {};
1514
- const result = {};
1515
- Object.entries(error.errors).forEach(([key, value]) => {
1516
- if (typeof value === "string") {
1517
- result[key] = value;
1518
- } else if (Array.isArray(value)) {
1519
- result[key] = value.join(", ");
1520
- } else if (typeof value === "object" && value && "message" in value) {
1521
- result[key] = value.message;
1522
- }
1523
- });
1524
- return result;
1525
- }, [error]);
1526
- return {
1527
- getFieldError,
1528
- hasFieldError,
1529
- getAllErrors,
1530
- hasErrors: _optionalChain([error, 'optionalAccess', _21 => _21.errors])
1531
- };
1532
- }
1533
-
1534
- // src/core/components/AuthorizedView/AuthorizedView.tsx
1535
- var _jsxruntime = require('react/jsx-runtime');
1536
- var AuthorizedView = ({ children, show }) => {
1537
- if (!show) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {});
1538
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
1539
- };
1540
-
1541
- // src/core/components/CancelButton/CancelButton.tsx
1542
- var _material = require('@mui/material');
1543
-
1544
- var CancelButton = ({
1545
- children = "Cancel",
1546
- variant = "outlined",
1547
- sx,
1548
- ...rest
1549
- }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Button, { variant, sx: { width: "6rem", ...sx }, ...rest, children });
1550
-
1551
- // src/core/components/ClearButton/ClearButton.tsx
1552
-
1553
-
1554
- var ClearButton = ({
1555
- isSubmitting,
1556
- handleClear,
1557
- sx,
1558
- storeKey
1559
- }) => {
1560
- const onClick = () => {
1561
- handleClear();
1562
- if (storeKey != null) {
1563
- localStorage.removeItem(storeKey);
1564
- }
1565
- };
1566
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1567
- _material.Button,
1568
- {
1569
- variant: "outlined",
1570
- onClick,
1571
- disabled: isSubmitting,
1572
- sx,
1573
- children: "Clear"
1574
- }
1575
- );
1576
- };
1577
-
1578
- // src/core/components/Containers/SimpleContainer.tsx
1579
-
1580
-
1581
- var SimpleContainer = ({
1582
- children,
1583
- className,
1584
- sx
1585
- }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Container, { className, sx: { ...sx }, children });
1586
-
1587
- // src/core/components/FilterButton/FilterButton.tsx
1588
- var _FilterAlt = require('@mui/icons-material/FilterAlt'); var _FilterAlt2 = _interopRequireDefault(_FilterAlt);
1589
- var _lab = require('@mui/lab');
1590
-
1591
-
1592
- var FilterButton = ({
1593
- isSubmitting,
1594
- show,
1595
- title,
1596
- icon,
1597
- sx,
1598
- iconSx
1599
- }) => {
1600
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1601
- _lab.LoadingButton,
1602
- {
1603
- type: "submit",
1604
- variant: "contained",
1605
- loading: isSubmitting,
1606
- disabled: !show,
1607
- disableRipple: true,
1608
- color: "primary",
1609
- sx: {
1610
- display: "flex",
1611
- alignItems: "center",
1612
- ...sx
1613
- },
1614
- startIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Badge, { color: "error", variant: "standard", children: icon ? icon : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _FilterAlt2.default, { width: "20", height: "20", sx: iconSx }) }),
1615
- children: _optionalChain([title, 'optionalAccess', _22 => _22.trim, 'call', _23 => _23()]) === "" || !title ? "Filter" : title
1616
- }
1617
- );
1618
- };
1619
-
1620
- // src/core/components/FilterDisplay/FilterChip.tsx
1621
- var _Chip = require('@mui/material/Chip'); var _Chip2 = _interopRequireDefault(_Chip);
1622
-
1623
-
1624
- var FilterChip = _react.memo.call(void 0,
1625
- ({
1626
- fieldKey,
1627
- filter,
1628
- onDelete
1629
- }) => {
1630
- const hasValue = filter.Value !== null && filter.Value !== void 0 && filter.Value !== "";
1631
- const label = `${fieldKey.replace("PK", "")}: ${filter.Label}`;
1632
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1633
- _Chip2.default,
1634
- {
1635
- label,
1636
- variant: hasValue ? "filled" : "outlined",
1637
- size: "small",
1638
- onDelete: hasValue ? onDelete : void 0
1639
- },
1640
- fieldKey
1641
- );
1642
- }
1643
- );
1644
- FilterChip.displayName = "FilterChip";
1645
-
1646
- // src/core/components/FilterDisplay/FilterDisplay.tsx
1647
-
1648
-
1649
-
1650
- var ProgramsFilterDisplay = _react.memo.call(void 0,
1651
- (props) => {
1652
- const { friendlyFilter, onFriendlyFilterChange } = props;
1653
- const deleteHandlers = _react.useMemo.call(void 0, () => {
1654
- if (!onFriendlyFilterChange) return {};
1655
- const handlers = {};
1656
- for (const key of Object.keys(friendlyFilter)) {
1657
- handlers[key] = () => onFriendlyFilterChange(key);
1658
- }
1659
- return handlers;
1660
- }, [onFriendlyFilterChange, friendlyFilter]);
1661
- const chipList = _react.useMemo.call(void 0, () => {
1662
- return Object.entries(friendlyFilter).map(([key, filter]) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1663
- FilterChip,
1664
- {
1665
- fieldKey: key,
1666
- filter,
1667
- onDelete: deleteHandlers[key]
1668
- },
1669
- key
1670
- ));
1671
- }, [friendlyFilter, deleteHandlers]);
1672
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Card, { sx: { mb: 2 }, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.CardContent, { children: [
1673
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "h6", gutterBottom: true, children: "Active Filters" }),
1674
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { display: "flex", gap: 1, flexWrap: "wrap", children: chipList })
1675
- ] }) });
1676
- }
1677
- );
1678
- ProgramsFilterDisplay.displayName = "FilterDisplay";
1679
-
1680
- // src/core/components/FilterWrapper/FilterWrapper.tsx
1681
- var _ManageSearch = require('@mui/icons-material/ManageSearch'); var _ManageSearch2 = _interopRequireDefault(_ManageSearch);
1682
-
1683
-
1684
-
1685
-
1686
-
1687
-
1688
-
1689
-
1690
-
1691
-
1692
-
1693
- var FilterWrapper = ({
1694
- children,
1695
- title,
1696
- filterCount,
1697
- cardSx,
1698
- textSx,
1699
- icon,
1700
- iconSx,
1701
- showCount
1702
- }) => {
1703
- const theme = _material.useTheme.call(void 0, );
1704
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1705
- _material.Card,
1706
- {
1707
- sx: {
1708
- position: "relative",
1709
- borderRadius: "0px",
1710
- mb: 2,
1711
- ...cardSx
1712
- },
1713
- children: [
1714
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1715
- _material.CardHeader,
1716
- {
1717
- sx: {
1718
- display: "flex",
1719
- flexWrap: "wrap",
1720
- p: "1rem",
1721
- ".MuiCardHeader-action": {
1722
- margin: 0,
1723
- alignSelf: "center"
1724
- },
1725
- alignItems: "center"
1726
- },
1727
- title: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
1728
- icon ? icon : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1729
- _ManageSearch2.default,
1730
- {
1731
- sx: {
1732
- height: "2.5rem",
1733
- color: theme.palette.primary.main,
1734
- ...iconSx
1735
- }
1736
- }
1737
- ),
1738
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1739
- _material.Typography,
1740
- {
1741
- variant: "h5",
1742
- sx: {
1743
- fontWeight: "bold",
1744
- color: theme.palette.primary.main,
1745
- ...textSx
1746
- },
1747
- children: [
1748
- title ? title : "Filter",
1749
- " ",
1750
- showCount ? `(${filterCount ? filterCount : 0})` : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {})
1751
- ]
1752
- }
1753
- )
1754
- ] })
1755
- }
1756
- ),
1757
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Divider, {}),
1758
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CardContent, { sx: { py: 2 }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { container: true, spacing: 2, children }) })
1759
- ]
1760
- }
1761
- );
1762
- };
1763
-
1764
- // src/core/components/Footer/Footer.tsx
1765
-
1766
-
1767
- var Footer = () => {
1768
- const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
1769
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1770
- _material.Box,
1771
- {
1772
- component: "footer",
1773
- sx: {
1774
- py: 2,
1775
- px: 4,
1776
- mt: "auto",
1777
- backgroundColor: (theme) => theme.palette.mode === "light" ? theme.palette.grey[200] : theme.palette.grey[800]
1778
- },
1779
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", color: "text.secondary", align: "center", children: `\xA9 Copyright ${currentYear} GN. All rights reserved by Parul University.` })
1780
- }
1781
- );
1782
- };
1783
-
1784
- // src/core/components/LabelText/LabelText.tsx
1785
-
1786
-
1787
- var LabelText = ({
1788
- label,
1789
- value,
1790
- gridSize,
1791
- containerSize,
1792
- labelSx,
1793
- valueSx
1794
- }) => {
1795
- const theme = _material.useTheme.call(void 0, );
1796
- const defaultGridSize = {
1797
- labelSize: { xs: 6, sm: 6, md: 6 },
1798
- valueSize: { xs: 12, sm: 6, md: 6 }
1799
- };
1800
- const defaultContainerSize = { xs: 12, sm: 6, md: 6 };
1801
- const size = gridSize || defaultGridSize;
1802
- const container = containerSize || defaultContainerSize;
1803
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1804
- _material.Grid,
1805
- {
1806
- size: container,
1807
- sx: {
1808
- display: "flex",
1809
- flexDirection: { xs: "column", sm: "row", md: "row" },
1810
- "&:hover": {
1811
- "&:hover": {
1812
- backgroundColor: _optionalChain([theme, 'access', _24 => _24.vars, 'optionalAccess', _25 => _25.palette, 'access', _26 => _26.action, 'access', _27 => _27.hover])
1813
- },
1814
- overflow: "hidden"
1815
- }
1816
- },
1817
- children: [
1818
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1819
- _material.Grid,
1820
- {
1821
- size: size.labelSize,
1822
- sx: {
1823
- padding: "5px",
1824
- fontSize: "14px",
1825
- textAlign: { xs: "left", sm: "right", md: "right" },
1826
- ...labelSx
1827
- },
1828
- children: [
1829
- label,
1830
- " :"
1831
- ]
1832
- }
1833
- ),
1834
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1835
- _material.Grid,
1836
- {
1837
- size: size.valueSize,
1838
- sx: { padding: "5px", display: "flex", flexWrap: "wrap" },
1839
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: value, arrow: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1840
- _material.Typography,
1841
- {
1842
- sx: {
1843
- fontSize: "14px",
1844
- wordBreak: "break-word",
1845
- overflow: "hidden",
1846
- display: "-webkit-box",
1847
- textOverflow: "ellipsis",
1848
- WebkitLineClamp: 2,
1849
- WebkitBoxOrient: "vertical",
1850
- ...valueSx,
1851
- color: "#078dee"
1852
- },
1853
- children: value ? value : "-"
1854
- }
1855
- ) })
1856
- }
1857
- )
1858
- ]
1859
- }
1860
- );
1861
- };
1862
-
1863
- // src/core/components/RenderIf/RenderIf.tsx
1864
-
1865
- var RenderIf = ({
1866
- show,
1867
- children
1868
- }) => {
1869
- return show ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children }) : null;
1870
- };
1871
-
1872
- // src/core/components/SectionBox/SectionBox.tsx
1873
-
1874
-
1875
-
1876
- var getSectionTheme = (variant = "default") => {
1877
- const themes = {
1878
- default: {
1879
- bgcolor: "#faebd7",
1880
- color: "#925d21"
1881
- },
1882
- form: {
1883
- bgcolor: "#cdced1",
1884
- color: "black"
1885
- },
1886
- info: {
1887
- bgcolor: "#e3f2fd",
1888
- color: "#1976d2"
1889
- },
1890
- warning: {
1891
- bgcolor: "#fff3e0",
1892
- color: "#f57c00"
1893
- },
1894
- error: {
1895
- bgcolor: "#ffebee",
1896
- color: "#d32f2f"
1897
- }
1898
- };
1899
- return themes[variant];
1900
- };
1901
- var SectionBox = _react.memo.call(void 0,
1902
- ({
1903
- title,
1904
- children,
1905
- spacing = 0,
1906
- containerSx,
1907
- titleSx,
1908
- variant = "default",
1909
- icon,
1910
- actions
1911
- }) => {
1912
- const themeColors = _react.useMemo.call(void 0, () => getSectionTheme(variant), [variant]);
1913
- const headerSx = _react.useMemo.call(void 0,
1914
- () => ({
1915
- px: 1.5,
1916
- py: 0.1,
1917
- width: "fit-content",
1918
- ...themeColors,
1919
- ...titleSx
1920
- }),
1921
- [themeColors, titleSx]
1922
- );
1923
- const contentSx = _react.useMemo.call(void 0,
1924
- () => ({
1925
- padding: "16px",
1926
- ...containerSx
1927
- }),
1928
- [containerSx]
1929
- );
1930
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1931
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Box, { sx: { display: "flex", flexDirection: "column", width: "100%" }, children: [
1932
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1933
- _material.Stack,
1934
- {
1935
- direction: "row",
1936
- justifyContent: "space-between",
1937
- alignItems: "center",
1938
- sx: headerSx,
1939
- children: [
1940
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
1941
- icon,
1942
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { sx: { fontSize: "15px", fontWeight: 400 }, children: title })
1943
- ] }),
1944
- actions
1945
- ]
1946
- }
1947
- ),
1948
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Divider, {})
1949
- ] }),
1950
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { container: true, spacing, sx: contentSx, children })
1951
- ] });
1952
- }
1953
- );
1954
-
1955
- // src/core/components/SimpleTabs/SimpleTabs.tsx
1956
-
1957
-
1958
-
1959
-
1960
- var SimpleTabs = ({
1961
- tabs,
1962
- defaultValue = 1,
1963
- onTabChange,
1964
- children,
1965
- tabSx,
1966
- tabsSx
1967
- }) => {
1968
- const [value, setValue] = _react.useState.call(void 0, defaultValue);
1969
- const handleChange = (event, newValue) => {
1970
- setValue(newValue);
1971
- if (onTabChange) onTabChange(newValue);
1972
- };
1973
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _lab.TabContext, { value, children: [
1974
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { sx: { borderBottom: 1, borderColor: "divider", width: "100%" }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1975
- _material.Tabs,
1976
- {
1977
- value,
1978
- onChange: handleChange,
1979
- sx: { px: 2, py: 0, ...tabsSx },
1980
- children: tabs.map((tab) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1981
- _material.Tab,
1982
- {
1983
- label: tab.label,
1984
- value: tab.value,
1985
- disabled: tab.permission === false,
1986
- sx: { fontSize: "1rem", ...tabSx }
1987
- },
1988
- tab.value
1989
- ))
1990
- }
1991
- ) }),
1992
- children
1993
- ] });
1994
- };
1995
-
1996
- // src/core/components/SubmitButton/SubmitButton.tsx
1997
-
1998
-
1999
- var SubmitButton = ({
2000
- loading = false,
2001
- ...rest
2002
- }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2003
- _lab.LoadingButton,
2004
- {
2005
- loading,
2006
- variant: "contained",
2007
- color: "primary",
2008
- type: "submit",
2009
- ...rest,
2010
- sx: { fontWeight: 400 },
2011
- children: "Submit"
2012
- }
2013
- );
2014
-
2015
- // src/core/components/WithRef/WithRef.tsx
2016
-
2017
- function withDataModal(component) {
2018
- return _react.forwardRef.call(void 0,
2019
- (props, ref) => component({ ...props, ref })
2020
- );
2021
- }
2022
-
2023
- // src/core/config.ts
2024
- var Config = {
2025
- defaultPageSize: 20,
2026
- apiBaseUrl: "http://localhost:5143"
2027
- // apiBaseUrl: 'http://192.168.1.246:5143',
2028
- };
2029
- var dateTimePatterns = {
2030
- dateTime: "DD MMM YYYY h:mm A",
2031
- // 17 Apr 2022 12:00 am
2032
- date: "DD MMM YYYY",
2033
- // 17 Apr 2022
2034
- month_year_short_format: "MMM YYYY",
2035
- month_year_full_format: "MMMM YYYY",
2036
- year: "YYYY",
2037
- time: "h:mm a",
2038
- // 12:00 am
2039
- split: {
2040
- dateTime: "DD/MM/YYYY h:mm A",
2041
- // 17/04/2022 12:00 am
2042
- date: "DD/MM/YYYY"
2043
- // 17/04/2022
2044
- },
2045
- paramCase: {
2046
- dateTime: "DD-MM-YYYY h:mm A",
2047
- // 17-04-2022 12:00 am
2048
- date: "DD-MM-YYYY",
2049
- // 17-04-2022
2050
- dateReverse: "YYYY-MM-DD",
2051
- // 2022-04-17 for compare date
2052
- MonthYear: "MMM-YYYY"
2053
- }
2054
- };
2055
-
2056
- // src/core/hooks/useApiClient.ts
2057
-
2058
- function useApiClient(config) {
2059
- return _react.useMemo.call(void 0,
2060
- () => createApiClient(config),
2061
- // eslint-disable-next-line react-hooks/exhaustive-deps
2062
- [
2063
- config.baseURL,
2064
- config.timeout,
2065
- config.correlationIdPrefix,
2066
- config.includeCorrelationId,
2067
- config.tokenStorageKey,
2068
- config.authToken,
2069
- config.requestInterceptors,
2070
- config.responseInterceptors,
2071
- config.errorInterceptors
2072
- ]
2073
- );
2074
- }
2075
-
2076
- // src/core/hooks/useFormErrorHandler.ts
2077
-
2078
- var _sonner = require('sonner');
2079
- var useFormErrorHandler = ({
2080
- setError,
2081
- successMessage = {
2082
- create: "Created successfully",
2083
- update: "Updated successfully"
2084
- },
2085
- errorMessage = {
2086
- noChanges: "No changes were made",
2087
- general: "Failed to save. Please try again."
2088
- }
2089
- }) => {
2090
- const getFieldError = _react.useCallback.call(void 0,
2091
- (fields, fieldName) => {
2092
- if (!fields || !fields[fieldName]) return void 0;
2093
- const fieldError = fields[fieldName];
2094
- if (typeof fieldError === "string") {
2095
- return fieldError;
2096
- }
2097
- if (Array.isArray(fieldError)) {
2098
- return fieldError.join(", ");
2099
- }
2100
- if (typeof fieldError === "object" && "message" in fieldError) {
2101
- return fieldError.message;
2102
- }
2103
- return void 0;
2104
- },
2105
- []
2106
- );
2107
- const handleSuccess = _react.useCallback.call(void 0,
2108
- (isEditing, rowsAffected) => {
2109
- if (rowsAffected !== void 0 && rowsAffected > 0) {
2110
- _sonner.toast.success(
2111
- isEditing ? successMessage.update : successMessage.create
2112
- );
2113
- return true;
2114
- } else if (rowsAffected === 0) {
2115
- _sonner.toast.error(errorMessage.noChanges);
2116
- return false;
2117
- }
2118
- _sonner.toast.success(isEditing ? successMessage.update : successMessage.create);
2119
- return true;
2120
- },
2121
- [successMessage, errorMessage]
2122
- );
2123
- const handleError = _react.useCallback.call(void 0,
2124
- (processedError) => {
2125
- if (processedError.type === "validation_error" && processedError.errors && setError) {
2126
- Object.keys(processedError.errors).forEach((fieldName) => {
2127
- const fieldError = getFieldError(processedError.errors, fieldName);
2128
- if (fieldError) {
2129
- setError(fieldName, {
2130
- type: "server",
2131
- message: fieldError
2132
- });
2133
- }
2134
- });
2135
- _sonner.toast.error(
2136
- processedError.title || "Please check the form for validation errors"
2137
- );
2138
- } else {
2139
- _sonner.toast.error(processedError.title || errorMessage.general);
2140
- }
2141
- },
2142
- [errorMessage.general, getFieldError, setError]
2143
- );
2144
- return {
2145
- handleSuccess,
2146
- handleError
2147
- };
2148
- };
2149
- var useDeleteHandler = ({
2150
- successMessage = "Deleted successfully",
2151
- errorMessage = "Failed to delete. Please try again."
2152
- } = {}) => {
2153
- return useFormErrorHandler({
2154
- successMessage: {
2155
- create: successMessage,
2156
- // Not used for delete, but required for type
2157
- update: successMessage
2158
- },
2159
- errorMessage: {
2160
- noChanges: "No changes were made",
2161
- // Not typically used for delete
2162
- general: errorMessage
2163
- }
2164
- // setError is omitted (undefined) for delete operations
2165
- });
2166
- };
2167
-
2168
- // src/core/utils/CacheUtility/index.ts
2169
- var _reactquery = require('@tanstack/react-query');
2170
-
2171
- var CacheUtility = class {
2172
- constructor(queryClient) {
2173
- this.queryClient = queryClient;
2174
- }
2175
- /**
2176
- * Get cached data using only the queryKey from query factory
2177
- */
2178
- getCachedData(queryKey) {
2179
- return this.queryClient.getQueryData(queryKey);
2180
- }
2181
- /**
2182
- * Get cached data with transformation using select function
2183
- */
2184
- getCachedDataWithSelect(queryKey, select) {
2185
- const cachedData = this.queryClient.getQueryData(queryKey);
2186
- if (cachedData === void 0) {
2187
- return void 0;
2188
- }
2189
- return select(cachedData);
2190
- }
2191
- };
2192
- function useCacheUtility() {
2193
- const queryClient = _reactquery.useQueryClient.call(void 0, );
2194
- return _react.useMemo.call(void 0, () => new CacheUtility(queryClient), [queryClient]);
2195
- }
2196
-
2197
- // src/core/utils/watch/core.ts
2198
- var _reacthookform = require('react-hook-form');
2199
- var useWatchForm = (control) => _reacthookform.useWatch.call(void 0, { control });
2200
- var useWatchField = (control, name) => _reacthookform.useWatch.call(void 0, { control, name });
2201
- var useWatchFields = (control, names) => _reacthookform.useWatch.call(void 0, { control, name: names });
2202
-
2203
- // src/core/utils/watch/utilities.ts
2204
-
2205
-
2206
- var useWatchTransform = (control, name, transform) => {
2207
- const value = _reacthookform.useWatch.call(void 0, { control, name });
2208
- return _react.useMemo.call(void 0, () => transform(value), [value, transform]);
2209
- };
2210
- var useWatchDefault = (control, name, defaultValue) => {
2211
- const value = _reacthookform.useWatch.call(void 0, { control, name });
2212
- return _nullishCoalesce(value, () => ( defaultValue));
2213
- };
2214
- var useWatchBoolean = (control, name, defaultValue = false) => {
2215
- const value = _reacthookform.useWatch.call(void 0, { control, name });
2216
- return Boolean(_nullishCoalesce(value, () => ( defaultValue)));
2217
- };
2218
- var useWatchBatch = (control, fields) => {
2219
- const values = _reacthookform.useWatch.call(void 0, { control, name: fields });
2220
- return _react.useMemo.call(void 0, () => {
2221
- const result = {};
2222
- fields.forEach((field, index) => {
2223
- result[field] = values[index];
2224
- });
2225
- return result;
2226
- }, [values, fields]);
2227
- };
2228
- var useWatchConditional = (control, name, shouldWatch, fallback) => {
2229
- const activeValue = _reacthookform.useWatch.call(void 0, {
2230
- control,
2231
- name,
2232
- disabled: !shouldWatch
2233
- });
2234
- return shouldWatch ? activeValue : fallback;
2235
- };
2236
- var useWatchDebounced = (control, name, delay = 300) => {
2237
- const value = _reacthookform.useWatch.call(void 0, { control, name });
2238
- const [debouncedValue, setDebouncedValue] = _react.useState.call(void 0, value);
2239
- _react.useEffect.call(void 0, () => {
2240
- const timer = setTimeout(() => {
2241
- setDebouncedValue(value);
2242
- }, delay);
2243
- return () => clearTimeout(timer);
2244
- }, [value, delay]);
2245
- return debouncedValue;
2246
- };
2247
- var useWatchSelector = (control, name, selector, deps = []) => {
2248
- const value = _reacthookform.useWatch.call(void 0, { control, name });
2249
- return _react.useMemo.call(void 0,
2250
- () => selector(value),
2251
- [value, selector, ...deps]
2252
- // eslint-disable-line react-hooks/exhaustive-deps
2253
- );
2254
- };
2255
-
2256
- // src/core/utils/watch/index.ts
2257
- var typedWatch = {
2258
- // === CORE FUNCTIONS ===
2259
- /** Watch entire form */
2260
- form: useWatchForm,
2261
- /** Watch single field */
2262
- field: useWatchField,
2263
- /** Watch multiple fields */
2264
- fields: useWatchFields,
2265
- // === UTILITY FUNCTIONS ===
2266
- /** Watch with transformation */
2267
- transform: useWatchTransform,
2268
- /** Watch with default value */
2269
- withDefault: useWatchDefault,
2270
- /** Watch as boolean */
2271
- boolean: useWatchBoolean,
2272
- /** Watch multiple with custom keys */
2273
- batch: useWatchBatch,
2274
- /** Watch conditionally */
2275
- conditional: useWatchConditional,
2276
- /** Watch with debouncing */
2277
- debounced: useWatchDebounced,
2278
- /** Watch with selector */
2279
- selector: useWatchSelector
2280
- };
2281
-
2282
- // src/core/utils/calculateFilterCount.ts
2283
- var calculateFilterCount = (model) => Object.values(model).filter(
2284
- (v) => v !== null && v !== void 0 && String(v).trim() !== ""
2285
- ).length;
2286
-
2287
- // src/core/utils/format-time.ts
2288
- var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs);
2289
- var _duration = require('dayjs/plugin/duration'); var _duration2 = _interopRequireDefault(_duration);
2290
- var _relativeTime = require('dayjs/plugin/relativeTime'); var _relativeTime2 = _interopRequireDefault(_relativeTime);
2291
- _dayjs2.default.extend(_duration2.default);
2292
- _dayjs2.default.extend(_relativeTime2.default);
2293
- var formatPatterns = {
2294
- dateTime: "DD MMM YYYY h:mm A",
2295
- // 17 Apr 2022 12:00 am
2296
- date: "DD MMM YYYY",
2297
- // 17 Apr 2022
2298
- month_year_short_format: "MMM YYYY",
2299
- month_year_full_format: "MMMM YYYY",
2300
- year: "YYYY",
2301
- time: "h:mm a",
2302
- // 12:00 am
2303
- split: {
2304
- dateTime: "DD/MM/YYYY h:mm A",
2305
- // 17/04/2022 12:00 am
2306
- date: "DD/MM/YYYY"
2307
- // 17/04/2022
2308
- },
2309
- paramCase: {
2310
- dateTime: "DD-MM-YYYY h:mm A",
2311
- // 17-04-2022 12:00 am
2312
- date: "DD-MM-YYYY",
2313
- // 17-04-2022
2314
- dateReverse: "YYYY-MM-DD",
2315
- // 2022-04-17 for compare date
2316
- MonthYear: "MMM-YYYY"
2317
- }
2318
- };
2319
- var isValidDate = (date) => date !== null && date !== void 0 && _dayjs2.default.call(void 0, date).isValid();
2320
- function today(template) {
2321
- return _dayjs2.default.call(void 0, /* @__PURE__ */ new Date()).startOf("day").format(template);
2322
- }
2323
- function fDateTime(date, template) {
2324
- if (!isValidDate(date)) {
2325
- return "Invalid date";
2326
- }
2327
- return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.dateTime)));
2328
- }
2329
- function fDate(date, template) {
2330
- if (!isValidDate(date)) {
2331
- return "Invalid date";
2332
- }
2333
- return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.date)));
2334
- }
2335
- function fTime(date, template) {
2336
- if (!isValidDate(date)) {
2337
- return "Invalid date";
2338
- }
2339
- return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.time)));
2340
- }
2341
- function fTimestamp(date) {
2342
- if (!isValidDate(date)) {
2343
- return "Invalid date";
2344
- }
2345
- return _dayjs2.default.call(void 0, date).valueOf();
2346
- }
2347
- function fToNow(date) {
2348
- if (!isValidDate(date)) {
2349
- return "Invalid date";
2350
- }
2351
- return _dayjs2.default.call(void 0, date).toNow(true);
2352
- }
2353
- function fIsBetween(inputDate, startDate, endDate) {
2354
- if (!isValidDate(inputDate) || !isValidDate(startDate) || !isValidDate(endDate)) {
2355
- return false;
2356
- }
2357
- const formattedInputDate = fTimestamp(inputDate);
2358
- const formattedStartDate = fTimestamp(startDate);
2359
- const formattedEndDate = fTimestamp(endDate);
2360
- if (formattedInputDate === "Invalid date" || formattedStartDate === "Invalid date" || formattedEndDate === "Invalid date") {
2361
- return false;
2362
- }
2363
- return formattedInputDate >= formattedStartDate && formattedInputDate <= formattedEndDate;
2364
- }
2365
- function fIsAfter(startDate, endDate) {
2366
- if (!isValidDate(startDate) || !isValidDate(endDate)) {
2367
- return false;
2368
- }
2369
- return _dayjs2.default.call(void 0, startDate).isAfter(endDate);
2370
- }
2371
- function fIsSame(startDate, endDate, unitToCompare) {
2372
- if (!isValidDate(startDate) || !isValidDate(endDate)) {
2373
- return false;
2374
- }
2375
- return _dayjs2.default.call(void 0, startDate).isSame(endDate, _nullishCoalesce(unitToCompare, () => ( "year")));
2376
- }
2377
- function fDateRangeShortLabel(startDate, endDate, initial) {
2378
- if (!isValidDate(startDate) || !isValidDate(endDate) || fIsAfter(startDate, endDate)) {
2379
- return "Invalid date";
2380
- }
2381
- let label = `${fDate(startDate)} - ${fDate(endDate)}`;
2382
- if (initial) {
2383
- return label;
2384
- }
2385
- const isSameYear = fIsSame(startDate, endDate, "year");
2386
- const isSameMonth = fIsSame(startDate, endDate, "month");
2387
- const isSameDay = fIsSame(startDate, endDate, "day");
2388
- if (isSameYear && !isSameMonth) {
2389
- label = `${fDate(startDate, "DD MMM")} - ${fDate(endDate)}`;
2390
- } else if (isSameYear && isSameMonth && !isSameDay) {
2391
- label = `${fDate(startDate, "DD")} - ${fDate(endDate)}`;
2392
- } else if (isSameYear && isSameMonth && isSameDay) {
2393
- label = `${fDate(endDate)}`;
2394
- }
2395
- return label;
2396
- }
2397
- function fAdd({
2398
- years = 0,
2399
- months = 0,
2400
- days = 0,
2401
- hours = 0,
2402
- minutes = 0,
2403
- seconds = 0,
2404
- milliseconds = 0
2405
- }) {
2406
- const result = _dayjs2.default.call(void 0, ).add(
2407
- _dayjs2.default.duration({
2408
- years,
2409
- months,
2410
- days,
2411
- hours,
2412
- minutes,
2413
- seconds,
2414
- milliseconds
2415
- })
2416
- ).format();
2417
- return result;
2418
- }
2419
- function fSub({
2420
- years = 0,
2421
- months = 0,
2422
- days = 0,
2423
- hours = 0,
2424
- minutes = 0,
2425
- seconds = 0,
2426
- milliseconds = 0
2427
- }) {
2428
- const result = _dayjs2.default.call(void 0, ).subtract(
2429
- _dayjs2.default.duration({
2430
- years,
2431
- months,
2432
- days,
2433
- hours,
2434
- minutes,
2435
- seconds,
2436
- milliseconds
2437
- })
2438
- ).format();
2439
- return result;
2440
- }
2441
-
2442
- // src/core/utils/getEmptyObject.ts
2443
- function getEmptyObject(data, defaultValues = {}) {
2444
- const obj = {};
2445
- for (const key of Object.keys(data)) {
2446
- const value = data[key];
2447
- const type = typeof value;
2448
- if (type === "number") {
2449
- obj[key] = 0;
2450
- } else if (type === "string" || type === "boolean") {
2451
- obj[key] = null;
2452
- } else if (value instanceof Date) {
2453
- obj[key] = null;
2454
- } else {
2455
- obj[key] = null;
2456
- }
2457
- }
2458
- return { ...obj, ...defaultValues };
2459
- }
2460
-
2461
- // src/core/utils/useStableRowCount.ts
2462
-
2463
- function useStableRowCount(currentTotal) {
2464
- const rowCountRef = _react.useRef.call(void 0, currentTotal || 0);
2465
- const stableRowCount = _react.useMemo.call(void 0, () => {
2466
- if (currentTotal !== void 0) {
2467
- rowCountRef.current = currentTotal;
2468
- }
2469
- return rowCountRef.current;
2470
- }, [currentTotal]);
2471
- return stableRowCount;
2472
- }
2473
-
2474
-
2475
-
2476
-
2477
-
2478
-
2479
-
2480
-
2481
-
2482
-
2483
-
2484
-
2485
-
2486
-
2487
-
2488
-
2489
-
2490
-
2491
-
2492
-
2493
-
2494
-
2495
-
2496
-
2497
-
2498
-
2499
-
2500
-
2501
-
2502
-
2503
-
2504
-
2505
-
2506
-
2507
-
2508
-
2509
-
2510
-
2511
-
2512
-
2513
-
2514
-
2515
-
2516
-
2517
-
2518
-
2519
-
2520
-
2521
-
2522
-
2523
-
2524
-
2525
-
2526
-
2527
-
2528
-
2529
-
2530
-
2531
-
2532
-
2533
-
2534
- exports.generateCorrelationId = generateCorrelationId; exports.RequestManager = RequestManager; exports.ApiClient = ApiClient; exports.createApiClient = createApiClient; exports.getGlobalApiClient = getGlobalApiClient; exports.initializeGlobalApiClient = initializeGlobalApiClient; exports.setGlobalApiClient = setGlobalApiClient; exports.resetGlobalApiClient = resetGlobalApiClient; exports.CancelToken = CancelToken; exports.useValidationErrors = useValidationErrors; exports.AuthorizedView = AuthorizedView; exports.CancelButton = CancelButton; exports.ClearButton = ClearButton; exports.SimpleContainer = SimpleContainer; exports.FilterButton = FilterButton; exports.FilterChip = FilterChip; exports.ProgramsFilterDisplay = ProgramsFilterDisplay; exports.FilterWrapper = FilterWrapper; exports.Footer = Footer; exports.LabelText = LabelText; exports.RenderIf = RenderIf; exports.SectionBox = SectionBox; exports.SimpleTabs = SimpleTabs; exports.SubmitButton = SubmitButton; exports.withDataModal = withDataModal; exports.Config = Config; exports.dateTimePatterns = dateTimePatterns; exports.useApiClient = useApiClient; exports.useFormErrorHandler = useFormErrorHandler; exports.useDeleteHandler = useDeleteHandler; exports.CacheUtility = CacheUtility; exports.useCacheUtility = useCacheUtility; exports.useWatchForm = useWatchForm; exports.useWatchField = useWatchField; exports.useWatchFields = useWatchFields; exports.useWatchTransform = useWatchTransform; exports.useWatchDefault = useWatchDefault; exports.useWatchBoolean = useWatchBoolean; exports.useWatchBatch = useWatchBatch; exports.useWatchConditional = useWatchConditional; exports.useWatchDebounced = useWatchDebounced; exports.useWatchSelector = useWatchSelector; exports.typedWatch = typedWatch; exports.calculateFilterCount = calculateFilterCount; exports.formatPatterns = formatPatterns; exports.today = today; exports.fDateTime = fDateTime; exports.fDate = fDate; exports.fTime = fTime; exports.fTimestamp = fTimestamp; exports.fToNow = fToNow; exports.fIsBetween = fIsBetween; exports.fIsAfter = fIsAfter; exports.fIsSame = fIsSame; exports.fDateRangeShortLabel = fDateRangeShortLabel; exports.fAdd = fAdd; exports.fSub = fSub; exports.getEmptyObject = getEmptyObject; exports.useStableRowCount = useStableRowCount;
2535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImQ6XFxQcm9qZWN0c1xcR05XZWJTb2Z0LlVJXFxwYWNrYWdlc1xcdWlcXGRpc3RcXGNodW5rLVRRUVVHUVRXLmNqcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLFNBQVMsWUFBWSxDQUFDLEVBQUU7QUFDeEIsRUFBRSxHQUFHLENBQUMsT0FBTyxPQUFPLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUU7QUFDMUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM5QixFQUFFO0FBQ0YsRUFBRSxPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRztBQUN4RSxJQUFJLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BDLElBQUksTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3ZDLElBQUksT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN6QixFQUFFLENBQUMsQ0FBQztBQUNKO0FBQ0EsU0FBUyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7QUFDdkMsRUFBRSxNQUFNLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sT0FBTyxFQUFFLENBQUMsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxtQkFBQTtBQUNBLG1CQUFBO0FBQ0EsbUJBQUE7QUFDQSxtQkFBQTtBQUNBLG1CQUFBO0FBQ0EsbUJBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0Esd0JBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0Esb0JBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLHNCQUFBO0FBQ0Esc0JBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSx3QkFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0Esa0JBQUE7QUFDQSxvQkFBQTtBQUNBLG9CQUFBO0FBQ0Esb0JBQUE7QUFDQSxrQkFBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLDhCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxvQkFBQTtBQUNBLG9CQUFBO0FBQ0Esb0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esb0JBQUE7QUFDQSxvQkFBQTtBQUNBLG9CQUFBO0FBQ0Esa0JBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSx3QkFBQTtBQUNBLHdCQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0Esd0JBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSx3QkFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLHNCQUFBO0FBQ0Esd0JBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsOEJBQUE7QUFDQSxnQkFBQTtBQUNBLGdDQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSx3QkFBQTtBQUNBLE1BQUE7QUFDQSxzQkFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0Esb0JBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0E7QUFDQSxJQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0E7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IkQ6XFxQcm9qZWN0c1xcR05XZWJTb2Z0LlVJXFxwYWNrYWdlc1xcdWlcXGRpc3RcXGNodW5rLVRRUVVHUVRXLmNqcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbF19