@mediusinc/mng-commons 6.0.0-rc.5 → 6.0.0-rc.6

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 (386) hide show
  1. package/core/components/notification/notification-wrapper.component.d.ts +4 -4
  2. package/core/error/error.model.d.ts +4 -4
  3. package/core/helpers/notification.d.ts +2 -2
  4. package/core/provide.d.ts +3 -3
  5. package/core/styles/style-constants.d.ts +9 -8
  6. package/core/styles/style.model.d.ts +2 -1
  7. package/fesm2022/mediusinc-mng-commons-core.mjs +91 -104
  8. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  9. package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
  10. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  11. package/fesm2022/mediusinc-mng-commons-form.mjs +149 -49
  12. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  13. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs +31 -0
  14. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs.map +1 -0
  15. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs +2118 -0
  16. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map +1 -0
  17. package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
  18. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  19. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
  20. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  21. package/fesm2022/mediusinc-mng-commons-tableview.mjs +326 -290
  22. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  23. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  24. package/form/api/index.d.ts +1 -0
  25. package/form/api/models/empty-value.model.d.ts +7 -0
  26. package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
  27. package/form/components/date-range/date-range.component.d.ts +4 -3
  28. package/form/components/dropdown/dropdown.component.d.ts +3 -2
  29. package/form/components/number-range/number-range.component.d.ts +3 -2
  30. package/form/directives/input-empty-value.directive.d.ts +40 -0
  31. package/form/directives/input-trim.directive.d.ts +3 -5
  32. package/form/index.d.ts +1 -0
  33. package/i18n/en.json +57 -8
  34. package/i18n/sl.json +1 -3
  35. package/package.json +16 -42
  36. package/provide.d.ts +2 -2
  37. package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
  38. package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
  39. package/table/components/table/table.component.d.ts +0 -1
  40. package/table/helpers/filters.d.ts +3 -2
  41. package/table/helpers/notification.d.ts +2 -2
  42. package/table/services/table-metadata.service.d.ts +3 -3
  43. package/tableview/action/components/action/action.component.d.ts +1 -0
  44. package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
  45. package/tableview/action/components/table/action-table.component.d.ts +2 -1
  46. package/tableview/action/helpers/notification.d.ts +3 -3
  47. package/tableview/action/models/execution/action-context.model.d.ts +2 -2
  48. package/tableview/action/services/action-executor.service.d.ts +1 -1
  49. package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
  50. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
  51. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
  52. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
  53. package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
  54. package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
  55. package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
  56. package/tableview/api/editor/models/field.model.d.ts +1 -2
  57. package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
  58. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  59. package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
  60. package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
  61. package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
  62. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
  63. package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
  64. package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
  65. package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
  66. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
  67. package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
  68. package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
  69. package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
  70. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
  71. package/tableview/editor/helpers/formly-config.d.ts +1 -1
  72. package/tableview/editor/helpers/notification.d.ts +3 -3
  73. package/tableview/editor/models/formly-config.model.d.ts +10 -1
  74. package/tableview/editor/models/formly.model.d.ts +23 -0
  75. package/tableview/editor/services/form-editor.service.d.ts +2 -2
  76. package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
  77. package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
  78. package/version-info.json +3 -3
  79. package/esm2022/core/action/action-data.model.mjs +0 -2
  80. package/esm2022/core/action/action-parameters.model.mjs +0 -2
  81. package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
  82. package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
  83. package/esm2022/core/data-list/data-list.model.mjs +0 -2
  84. package/esm2022/core/data-list/filter-match.model.mjs +0 -105
  85. package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
  86. package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
  87. package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
  88. package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
  89. package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
  90. package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
  91. package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
  92. package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
  93. package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
  94. package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
  95. package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
  96. package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
  97. package/esm2022/core/directives/component.directive.mjs +0 -75
  98. package/esm2022/core/directives/rerender.directive.mjs +0 -25
  99. package/esm2022/core/directives/template.directive.mjs +0 -29
  100. package/esm2022/core/enum/enum-helpers.mjs +0 -90
  101. package/esm2022/core/enum/enum.model.mjs +0 -2
  102. package/esm2022/core/error/error-handler.mjs +0 -20
  103. package/esm2022/core/error/error-helpers.mjs +0 -273
  104. package/esm2022/core/error/error.model.mjs +0 -33
  105. package/esm2022/core/helpers/coercion.mjs +0 -55
  106. package/esm2022/core/helpers/date.mjs +0 -119
  107. package/esm2022/core/helpers/notification.mjs +0 -21
  108. package/esm2022/core/helpers/number.mjs +0 -19
  109. package/esm2022/core/helpers/object.mjs +0 -152
  110. package/esm2022/core/helpers/route.mjs +0 -58
  111. package/esm2022/core/helpers/string.mjs +0 -57
  112. package/esm2022/core/helpers/templates.mjs +0 -4
  113. package/esm2022/core/helpers/type-helpers.mjs +0 -2
  114. package/esm2022/core/i18n/i18n-common.mjs +0 -24
  115. package/esm2022/core/i18n/i18n-error.mjs +0 -29
  116. package/esm2022/core/i18n/i18n-type.mjs +0 -46
  117. package/esm2022/core/index.mjs +0 -107
  118. package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
  119. package/esm2022/core/log/log.model.mjs +0 -10
  120. package/esm2022/core/log/logger.service.mjs +0 -131
  121. package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
  122. package/esm2022/core/models/class-attribute.model.mjs +0 -2
  123. package/esm2022/core/models/class-service.model.mjs +0 -2
  124. package/esm2022/core/models/getter.model.mjs +0 -2
  125. package/esm2022/core/models/i18n.model.mjs +0 -2
  126. package/esm2022/core/models/menu.model.mjs +0 -2
  127. package/esm2022/core/models/user.model.mjs +0 -2
  128. package/esm2022/core/models/version.model.mjs +0 -2
  129. package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
  130. package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
  131. package/esm2022/core/pipes/enum.pipe.mjs +0 -38
  132. package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
  133. package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
  134. package/esm2022/core/pipes/getter.pipe.mjs +0 -21
  135. package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
  136. package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
  137. package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
  138. package/esm2022/core/pipes/template.pipe.mjs +0 -25
  139. package/esm2022/core/provide.mjs +0 -79
  140. package/esm2022/core/reactivity/effect.mjs +0 -22
  141. package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
  142. package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
  143. package/esm2022/core/registry/registry.model.mjs +0 -2
  144. package/esm2022/core/registry/type-registry.mjs +0 -106
  145. package/esm2022/core/router/route-builder.mjs +0 -431
  146. package/esm2022/core/router/router.model.mjs +0 -2
  147. package/esm2022/core/router/routes-builder.mjs +0 -52
  148. package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
  149. package/esm2022/core/security/permission-helpers.mjs +0 -14
  150. package/esm2022/core/security/permission.guard.mjs +0 -15
  151. package/esm2022/core/security/permission.service.mjs +0 -101
  152. package/esm2022/core/security/permissions.model.mjs +0 -93
  153. package/esm2022/core/services/commons-configuration.service.mjs +0 -189
  154. package/esm2022/core/services/commons-init.service.mjs +0 -111
  155. package/esm2022/core/services/commons-router.service.mjs +0 -181
  156. package/esm2022/core/services/commons-storage.service.mjs +0 -31
  157. package/esm2022/core/services/commons.service.mjs +0 -324
  158. package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
  159. package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
  160. package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
  161. package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
  162. package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
  163. package/esm2022/core/styles/style-constants.mjs +0 -11
  164. package/esm2022/core/styles/style.model.mjs +0 -20
  165. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
  166. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
  167. package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
  168. package/esm2022/filter/index.mjs +0 -8
  169. package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
  170. package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
  171. package/esm2022/filter/models/filter.model.mjs +0 -20
  172. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
  173. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
  174. package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
  175. package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
  176. package/esm2022/form/api/index.mjs +0 -10
  177. package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
  178. package/esm2022/form/api/models/button.model.mjs +0 -2
  179. package/esm2022/form/api/models/trim.model.mjs +0 -2
  180. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
  181. package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
  182. package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
  183. package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
  184. package/esm2022/form/directives/input-trim.directive.mjs +0 -50
  185. package/esm2022/form/index.mjs +0 -8
  186. package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
  187. package/esm2022/index.mjs +0 -2
  188. package/esm2022/mediusinc-mng-commons.mjs +0 -5
  189. package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
  190. package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
  191. package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
  192. package/esm2022/model/class/helpers/model.mjs +0 -53
  193. package/esm2022/model/class/index.mjs +0 -8
  194. package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
  195. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
  196. package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
  197. package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
  198. package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
  199. package/esm2022/model/helpers/i18n.mjs +0 -47
  200. package/esm2022/model/index.mjs +0 -9
  201. package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
  202. package/esm2022/provide.mjs +0 -6
  203. package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
  204. package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
  205. package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
  206. package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
  207. package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
  208. package/esm2022/table/api/class/index.mjs +0 -6
  209. package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
  210. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
  211. package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
  212. package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
  213. package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
  214. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
  215. package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
  216. package/esm2022/table/api/helpers/column-converter.mjs +0 -25
  217. package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
  218. package/esm2022/table/api/index.mjs +0 -19
  219. package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
  220. package/esm2022/table/api/models/column-value.model.mjs +0 -2
  221. package/esm2022/table/api/models/column.model.mjs +0 -21
  222. package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
  223. package/esm2022/table/api/models/table-columns.model.mjs +0 -2
  224. package/esm2022/table/api/models/table-event.model.mjs +0 -2
  225. package/esm2022/table/api/models/table.model.mjs +0 -21
  226. package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
  227. package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
  228. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
  229. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
  230. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
  231. package/esm2022/table/components/table/table.component.mjs +0 -319
  232. package/esm2022/table/helpers/filters.mjs +0 -312
  233. package/esm2022/table/helpers/notification.mjs +0 -21
  234. package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
  235. package/esm2022/table/helpers/table.mjs +0 -24
  236. package/esm2022/table/index.mjs +0 -24
  237. package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
  238. package/esm2022/table/models/column-preferences.model.mjs +0 -2
  239. package/esm2022/table/models/filter.model.mjs +0 -2
  240. package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
  241. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
  242. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
  243. package/esm2022/table/provide.mjs +0 -19
  244. package/esm2022/table/services/table-data.service.mjs +0 -194
  245. package/esm2022/table/services/table-feature-config.token.mjs +0 -3
  246. package/esm2022/table/services/table-metadata.service.mjs +0 -136
  247. package/esm2022/table/services/table-preferences.service.mjs +0 -142
  248. package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
  249. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
  250. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
  251. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
  252. package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
  253. package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
  254. package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
  255. package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
  256. package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
  257. package/esm2022/tableview/action/helpers/notification.mjs +0 -78
  258. package/esm2022/tableview/action/helpers/styles.mjs +0 -32
  259. package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
  260. package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
  261. package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
  262. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
  263. package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
  264. package/esm2022/tableview/action/services/action-executor.service.mjs +0 -772
  265. package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
  266. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
  267. package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
  268. package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
  269. package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
  270. package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
  271. package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
  272. package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
  273. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
  274. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
  275. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
  276. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
  277. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
  278. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
  279. package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
  280. package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
  281. package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
  282. package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
  283. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
  284. package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
  285. package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
  286. package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
  287. package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
  288. package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
  289. package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
  290. package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
  291. package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
  292. package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
  293. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
  294. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
  295. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
  296. package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
  297. package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
  298. package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
  299. package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
  300. package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
  301. package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
  302. package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
  303. package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
  304. package/esm2022/tableview/api/class/index.mjs +0 -13
  305. package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
  306. package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
  307. package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
  308. package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
  309. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
  310. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
  311. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
  312. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
  313. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
  314. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
  315. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
  316. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
  317. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
  318. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
  319. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
  320. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
  321. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
  322. package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
  323. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
  324. package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
  325. package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
  326. package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
  327. package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
  328. package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
  329. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
  330. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
  331. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
  332. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
  333. package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
  334. package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
  335. package/esm2022/tableview/api/index.mjs +0 -76
  336. package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
  337. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
  338. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
  339. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
  340. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
  341. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
  342. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
  343. package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
  344. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
  345. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
  346. package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
  347. package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
  348. package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
  349. package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
  350. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
  351. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
  352. package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
  353. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
  354. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
  355. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
  356. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
  357. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
  358. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
  359. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
  360. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
  361. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
  362. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
  363. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
  364. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
  365. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
  366. package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
  367. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
  368. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
  369. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
  370. package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
  371. package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
  372. package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
  373. package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
  374. package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
  375. package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
  376. package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
  377. package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
  378. package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
  379. package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
  380. package/esm2022/tableview/index.mjs +0 -67
  381. package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
  382. package/esm2022/tableview/provide.mjs +0 -105
  383. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
  384. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
  385. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
  386. package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
@@ -1,465 +0,0 @@
1
- import { CommonsInternalError } from '../error/error.model';
2
- import { dateToIsoString } from '../helpers/date';
3
- import { FilterMatchMode } from './filter-match.model';
4
- /**
5
- * Converts a TableLazyLoadEvent to DataListParams.
6
- *
7
- * @param {TableLazyLoadEvent} event - The event containing the data to convert.
8
- * @return {DataListParams} - The converted DataListParams object.
9
- */
10
- export function fromTableLoadToDataListParams(event) {
11
- const params = {};
12
- if (event.first != null) {
13
- params.offset = event.first;
14
- }
15
- if (event.rows != null) {
16
- params.limit = event.rows;
17
- }
18
- if (typeof event.globalFilter === 'string') {
19
- params.search = event.globalFilter;
20
- }
21
- else if (Array.isArray(event.globalFilter) && event.globalFilter.length > 0) {
22
- params.search = event.globalFilter[0];
23
- }
24
- if (Array.isArray(event.multiSortMeta) && event.multiSortMeta.length > 0) {
25
- params.sort = event.multiSortMeta.map(m => ({ property: m.field, ascending: m.order >= 0 }));
26
- }
27
- if (event.filters) {
28
- params.filters = Object.keys(event.filters).reduce((acc, key) => {
29
- const filter = {};
30
- const eventFilter = event.filters?.[key];
31
- if (Array.isArray(eventFilter)) {
32
- filter.value = eventFilter[0].value;
33
- filter.matchMode = eventFilter[0].matchMode;
34
- filter.caseSensitive = eventFilter[0].caseSensitive;
35
- }
36
- else if (eventFilter !== undefined) {
37
- filter.value = eventFilter.value;
38
- filter.matchMode = eventFilter.matchMode;
39
- filter.caseSensitive = eventFilter.caseSensitive;
40
- }
41
- // handle search case sensitivity to be also written on searchCaseSensitive
42
- if (key === 'global' && typeof params.search === 'string' && filter.caseSensitive !== undefined) {
43
- params.searchCaseSensitive = filter.caseSensitive;
44
- return acc;
45
- }
46
- return { ...acc, [key]: filter };
47
- }, {});
48
- }
49
- return params;
50
- }
51
- /**
52
- * Converts the given parameters to URL query parameters.
53
- * Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
54
- * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
55
- *
56
- * @param {DataListParams} params - The parameters to convert.
57
- * @param {DataListParams|null} defaults - The default parameters used if no matching property in params is available. Defaults to { limit: 25, offset: 0 } if not provided.
58
- * @param opts - Options in converting to url query:
59
- * - prependFilterName Prepends filter key with provided string
60
- * @returns {Params} - The URL query parameters object.
61
- */
62
- export function dataListParamsToUrlQuery(params, defaults = {
63
- limit: 25,
64
- offset: 0
65
- }, opts) {
66
- const urlParams = {};
67
- if (params.limit && params.limit !== defaults?.limit) {
68
- urlParams['limit'] = params.limit;
69
- }
70
- if (params.offset && params.offset !== defaults?.offset) {
71
- urlParams['offset'] = params.offset;
72
- }
73
- if (params.search && params.search !== defaults?.search) {
74
- urlParams['q'] = `${params.searchCaseSensitive ? `cs:` : ''}${params.search}`;
75
- }
76
- if (params.sort && Array.isArray(params.sort) && params.sort.length > 0) {
77
- if (defaults?.sort == null ||
78
- !Array.isArray(defaults.sort) ||
79
- defaults.sort.length === 0 ||
80
- params.sort.length !== defaults.sort.length ||
81
- defaults.sort.some((ds, idx) => ds.property !== params.sort[idx].property || (ds.ascending ?? true) !== (params.sort[idx].ascending ?? true))) {
82
- urlParams['sort'] = dataListParamsSortToUrlQuery(params);
83
- }
84
- }
85
- if (params.filters) {
86
- Object.keys(params.filters).forEach(k => {
87
- // global search filter is already included in the 'q' parameter, no need to include it here
88
- if (k === 'global') {
89
- return;
90
- }
91
- const paramFilter = params.filters[k];
92
- const defaultFilter = defaults?.filters?.[k];
93
- if (defaultFilter &&
94
- ((Array.isArray(defaultFilter.value) &&
95
- Array.isArray(paramFilter.value) &&
96
- defaultFilter.value.length === paramFilter.value.length &&
97
- defaultFilter.value.every((v, idx) => {
98
- const value = paramFilter.value[idx];
99
- if (value instanceof Date && v instanceof Date)
100
- return value.getTime() === v.getTime();
101
- else
102
- return value === v;
103
- })) || // handle arrays
104
- defaultFilter.value === paramFilter.value) &&
105
- defaultFilter.matchMode === paramFilter.matchMode &&
106
- (defaultFilter.caseSensitive ?? false) === (paramFilter.caseSensitive ?? false)) {
107
- return;
108
- }
109
- if (paramFilter.value == null &&
110
- defaultFilter?.value == null &&
111
- paramFilter.matchMode !== FilterMatchMode.Exists &&
112
- paramFilter.matchMode !== FilterMatchMode.DoesNotExist) {
113
- return;
114
- }
115
- if (paramFilter.value == null &&
116
- defaultFilter?.value != null &&
117
- paramFilter.matchMode !== FilterMatchMode.Exists &&
118
- paramFilter.matchMode !== FilterMatchMode.DoesNotExist) {
119
- urlParams[`${opts?.prependFilterName ?? ''}${k}`] = 'null';
120
- return;
121
- }
122
- urlParams[`${opts?.prependFilterName ?? ''}${k}`] = dataListParamsFiltersToUrlQuery(params, k, true);
123
- });
124
- }
125
- if (defaults?.filters) {
126
- // add other defaults
127
- const paramFilterKeys = params.filters ? Object.keys(params.filters) : [];
128
- Object.keys(defaults.filters)
129
- .filter(k => paramFilterKeys.indexOf(k) < 0)
130
- .forEach(k => {
131
- urlParams[`${opts?.prependFilterName ?? ''}${k}`] = dataListParamsFiltersToUrlQuery(defaults, k);
132
- });
133
- }
134
- return urlParams;
135
- }
136
- /**
137
- * Merges the provided parameters with default values and returns the merged object.
138
- *
139
- * @param {DataListParams} params - The parameters to merge with defaults.
140
- * @param {DataListParams} defaults - The default values to merge with params (optional, default is { limit: 25, offset: 0 }).
141
- * @returns {DataListParams} - The merged parameters object.
142
- */
143
- export function mergeDataListParamsWithDefaults(params, defaults = {
144
- limit: 25,
145
- offset: 0
146
- }) {
147
- const merged = {
148
- limit: params.limit ?? defaults.limit,
149
- offset: params.offset ?? defaults.offset,
150
- search: params.search ?? defaults.search,
151
- sort: (params.sort ?? defaults.sort)?.map(s => ({ ...s }))
152
- };
153
- if (params.filters) {
154
- merged.filters = {};
155
- Object.entries(params.filters).forEach(([key, value]) => (merged.filters[key] = { ...value }));
156
- }
157
- if (defaults.filters) {
158
- if (!merged.filters)
159
- merged.filters = {};
160
- Object.entries(defaults.filters).forEach(([key, value]) => {
161
- if (merged.filters[key] === undefined) {
162
- merged.filters[key] = { ...value };
163
- }
164
- });
165
- }
166
- return merged;
167
- }
168
- /**
169
- * Converts an object of parameters to a URL query string for sorting.
170
- * Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
171
- *
172
- * @param {DataListParams} params - An optional object containing sort parameters.
173
- * @returns A string representing the URL query or undefined if no sort parameters are provided.
174
- */
175
- export function dataListParamsSortToUrlQuery(params) {
176
- return params && Array.isArray(params.sort)
177
- ? params.sort.map(s => `${s.ascending === true || s.ascending === undefined ? 'asc' : 'desc'}:${String(s.property)}`).join(',')
178
- : undefined;
179
- }
180
- /**
181
- * Converts a specific filter parameter (by key) from DataListParams object to a URL query string.
182
- * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
183
- *
184
- * @param {DataListParams<any, Filters> | undefined} params - The DataListParams object containing the filters.
185
- * @param {Filters} key - The key of the filter to convert.
186
- * @param {boolean} [allowNull=false] - Indicates whether to allow null values in the query string.
187
- * @return {string | undefined} - The URL query string representing the specified filter, or undefined if the filter is not found.
188
- */
189
- export function dataListParamsFiltersToUrlQuery(params, key, allowNull = false) {
190
- const paramFilter = params?.filters?.[key];
191
- return dataListParamsFilterToUrlQuery(paramFilter, allowNull);
192
- }
193
- /**
194
- * Converts a filter to a URL query string.
195
- * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
196
- *
197
- * @param {DataListFilter} paramFilter - The filter object to be converted.
198
- * @param {boolean} [allowNull=false] - Indicates whether to allow null values in the filter.
199
- * @returns {string|undefined} - The filter converted to a URL query string, or undefined if no filter is provided or the filter has empty or invalid values.
200
- * @throws {CommonsInternalError} - If the filter has invalid values.
201
- */
202
- export function dataListParamsFilterToUrlQuery(paramFilter, allowNull = false) {
203
- const filterValueAsArray = Array.isArray(paramFilter?.value) ? paramFilter.value.filter(v => v !== undefined && (allowNull || v !== null)) : undefined;
204
- const matchMode = paramFilter?.matchMode ?? FilterMatchMode.Equals;
205
- if (paramFilter === undefined ||
206
- (!allowNull && matchMode !== 'exists' && matchMode !== 'doesNotExist' && paramFilter.value == null) ||
207
- (typeof paramFilter.value === 'string' && paramFilter.value.length === 0) ||
208
- (Array.isArray(filterValueAsArray) && filterValueAsArray.length === 0)) {
209
- // no need to include filters for empty values
210
- return undefined;
211
- }
212
- if (matchMode === FilterMatchMode.Between && !(Array.isArray(filterValueAsArray) && filterValueAsArray.length === 2)) {
213
- throw new CommonsInternalError(`Filter match mode between requires exactly 2 values: ${paramFilter.value}`);
214
- }
215
- if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) && (!Array.isArray(filterValueAsArray) || filterValueAsArray.length === 0)) {
216
- throw new CommonsInternalError(`Filter match mode ${matchMode} requires non-empty array: ${paramFilter.value}`);
217
- }
218
- if ([FilterMatchMode.In, FilterMatchMode.NotIn, FilterMatchMode.Between].indexOf(matchMode) === -1 && Array.isArray(filterValueAsArray)) {
219
- throw new CommonsInternalError(`Filter match mode ${matchMode} must not be array: ${paramFilter.value}`);
220
- }
221
- const noVal = paramFilter.matchMode === FilterMatchMode.Exists || paramFilter.matchMode === FilterMatchMode.DoesNotExist;
222
- const urlValuePart = noVal ? '' : `:${dataListParamsFilterValueToUrlString(filterValueAsArray ?? paramFilter.value, allowNull)}`;
223
- return `${paramFilter.caseSensitive ? 'cs:' : paramFilter.caseSensitive === false ? 'ci:' : ''}${FilterMatchMode.getAbbreviation(matchMode) ?? matchMode}${urlValuePart}`;
224
- }
225
- /**
226
- * Converts URL query parameters to a DataListParams object.
227
- * Sorts are formatted from Medius data API sort query language: `asc:prop1,desc:prop2`, ...
228
- * Filter keys are all keys in Params object that are not matched elsewhere, values are formatted from Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
229
- *
230
- * @param {Params} urlParams - The URL query parameters.
231
- * @param opts Additional options for conversion:
232
- * - searchAsGlobal - The URL query parameters.
233
- * - prependFilterName - Filter names are prepended with provided string.
234
- * @return {DataListParams} - The converted DataListParams object.
235
- */
236
- export function fromUrlQueryToDataListParams(urlParams, opts) {
237
- const params = {};
238
- Object.entries(urlParams).forEach(([urlParamKey, urlParamValue]) => {
239
- if (urlParamKey === 'limit') {
240
- params.limit = +urlParamValue;
241
- if (isNaN(params.limit) || params.limit < 0) {
242
- delete params.limit;
243
- }
244
- }
245
- else if (urlParamKey === 'offset') {
246
- params.offset = +urlParamValue;
247
- if (isNaN(params.offset) || params.offset < 0) {
248
- delete params.offset;
249
- }
250
- }
251
- else if (urlParamKey === 'q') {
252
- if (typeof urlParamValue === 'string' && urlParamValue.length > 0) {
253
- const searchQuery = urlParamValue.startsWith('cs:') || urlParamValue.startsWith('ci:') ? urlParamValue.substring(3) : urlParamValue;
254
- const caseSensitive = urlParamValue.startsWith('cs:');
255
- params.search = searchQuery;
256
- params.searchCaseSensitive = caseSensitive;
257
- if (opts?.searchAsGlobal) {
258
- if (!params.filters) {
259
- params.filters = {};
260
- }
261
- params.filters['global'] = {
262
- value: searchQuery,
263
- matchMode: FilterMatchMode.Contains,
264
- caseSensitive: caseSensitive
265
- };
266
- }
267
- }
268
- }
269
- else if (urlParamKey === 'sort') {
270
- if (typeof urlParamValue === 'string') {
271
- params.sort = urlParamValue.split(',').map(s => {
272
- const [direction, property] = s.split(':');
273
- return { property: (property ?? direction), ascending: direction !== 'desc' };
274
- });
275
- }
276
- else {
277
- throw new CommonsInternalError(`String is expected as value for '${urlParamKey}' when converting from urlParams`);
278
- }
279
- }
280
- else if ((!opts?.prependFilterName || urlParamKey.startsWith(opts.prependFilterName)) && typeof urlParamValue === 'string') {
281
- if (urlParamValue.length === 0) {
282
- // empty string should be ignored
283
- return;
284
- }
285
- const filterKey = opts?.prependFilterName ? urlParamKey.substring(opts.prependFilterName.length) : urlParamKey;
286
- const filterParts = urlParamValue.split(':');
287
- let partIdx = 0;
288
- // removed default filter
289
- if (filterParts[partIdx] === 'null') {
290
- if (!params.filters) {
291
- params.filters = {};
292
- }
293
- params.filters[filterKey] = { value: null };
294
- return;
295
- }
296
- // case sensitive
297
- let caseSensitive = undefined;
298
- if (filterParts[partIdx] === 'cs' || filterParts[partIdx] === 'ci') {
299
- caseSensitive = filterParts[partIdx++] === 'cs';
300
- }
301
- // match mode
302
- const matchMode = filterParts[partIdx] ? (FilterMatchMode.fromAbbreviation(filterParts[partIdx]) ?? filterParts[partIdx]) : FilterMatchMode.Equals;
303
- partIdx++;
304
- const noVal = matchMode === FilterMatchMode.Exists || matchMode === FilterMatchMode.DoesNotExist;
305
- // value
306
- let value = undefined;
307
- if (!noVal) {
308
- if (filterParts.length < 2) {
309
- return;
310
- }
311
- if (partIdx === filterParts.length - 1) {
312
- value = filterParts[partIdx];
313
- }
314
- else if (partIdx < filterParts.length) {
315
- // array that should not be array, so join back together
316
- value = filterParts.slice(partIdx, filterParts.length).join(':');
317
- }
318
- if (value === undefined && matchMode !== FilterMatchMode.Exists && matchMode !== FilterMatchMode.DoesNotExist) {
319
- // if value undefined and match mode expects value, then skip
320
- return;
321
- }
322
- if (value === 'null') {
323
- value = null;
324
- }
325
- if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn || matchMode === FilterMatchMode.Between) && typeof value === 'string') {
326
- let arrayVal = [];
327
- // these match modes expect array
328
- if (value.indexOf('"') >= 0) {
329
- const tokens = [];
330
- let currentToken = '';
331
- let explicitQuotes = false; //token is quoted, e.g. in:1,2,"22""",",123"""
332
- let quotesOpened = false; //token has started processing
333
- let quotesExplicitlyClosed = false; //token processing has finished, after single " in quoted mode, or before , in not quoted
334
- for (let i = 0; i < value.length; i++) {
335
- const c = value[i];
336
- // reset the tokenizer when seeing the token separator
337
- // only if either:
338
- // the quotes have not been opened yet (when there are no characters between separators),
339
- // the token has been explicitly closed (when we actually have explicit opening i.e., quotes as the first character)
340
- // or we have implicit quotes (i.e., quotes are not the first character)
341
- if (c === ',' && (!quotesOpened || quotesExplicitlyClosed || !explicitQuotes)) {
342
- tokens.push(currentToken);
343
- currentToken = '';
344
- quotesOpened = false;
345
- quotesExplicitlyClosed = false;
346
- explicitQuotes = false;
347
- }
348
- else if (c == '"') {
349
- // escaped double-quotes
350
- if (explicitQuotes && i + 1 < value.length && value[i + 1] === '"') {
351
- currentToken += c; // Append one double-quote to the current token
352
- i++; // Skip the next double-quote
353
- }
354
- // we encounter quotes again after they were the first character => we close the token
355
- else if (explicitQuotes) {
356
- quotesExplicitlyClosed = true;
357
- }
358
- // implicit quotes
359
- else if (quotesOpened) {
360
- currentToken += c;
361
- }
362
- // quotes are the first character => explicitly open the token
363
- else {
364
- currentToken = '';
365
- quotesOpened = true;
366
- explicitQuotes = true;
367
- }
368
- }
369
- else {
370
- if (quotesExplicitlyClosed) {
371
- return;
372
- }
373
- quotesOpened = true;
374
- currentToken += c;
375
- }
376
- }
377
- if (quotesOpened && !quotesExplicitlyClosed && explicitQuotes) {
378
- return;
379
- }
380
- // Append the last token after the loop ends
381
- tokens.push(currentToken.toString());
382
- arrayVal = tokens;
383
- }
384
- else {
385
- arrayVal = value.split(',');
386
- }
387
- if (matchMode === FilterMatchMode.Between && arrayVal.length !== 2) {
388
- return;
389
- }
390
- value = arrayVal;
391
- }
392
- if ((typeof value === 'string' && value.length === 0) || (Array.isArray(value) && value.length === 0)) {
393
- // filter with empty value is to be ignored
394
- return;
395
- }
396
- }
397
- else {
398
- caseSensitive = undefined;
399
- }
400
- if (!params.filters) {
401
- params.filters = {};
402
- }
403
- params.filters[filterKey] = { value: value, matchMode: matchMode, caseSensitive: caseSensitive };
404
- }
405
- });
406
- return params;
407
- }
408
- /**
409
- * Makes a copy of the given DataListParams object.
410
- *
411
- * @param {DataListParams<Sorts, Filters>} params - The DataListParams object to be copied.
412
- * @returns {DataListParams<Sorts, Filters>} - Returns a new copy of the DataListParams object.
413
- */
414
- export function copyDataListParams(params) {
415
- const copy = {
416
- offset: params.offset,
417
- limit: params.limit,
418
- search: params.search
419
- };
420
- if (params.sort) {
421
- copy.sort = params.sort?.map(s => ({ ...s }));
422
- }
423
- if (params.filters) {
424
- copy.filters = Object.entries(params.filters).reduce((acc, [key, value]) => {
425
- const filterValue = value;
426
- return {
427
- ...acc,
428
- [key]: {
429
- ...filterValue,
430
- value: Array.isArray(filterValue.value) ? [...filterValue.value] : filterValue.value
431
- }
432
- };
433
- }, {});
434
- }
435
- return copy;
436
- }
437
- /**
438
- * Converts a value to a URL query param string representation.
439
- *
440
- * @param {unknown} value - The value to be converted.
441
- * @param {boolean} [allowNull=false] - Indicates whether null values are allowed.
442
- * @returns {string} The URL parameter representation of the value.
443
- * @throws {CommonsInternalError} If an undefined value is passed without allowNull set to true.
444
- * @throws {CommonsInternalError} If the value is an object (excluding Date).
445
- */
446
- export function dataListParamsFilterValueToUrlString(value, allowNull = false) {
447
- if (value === null && allowNull)
448
- return 'null';
449
- if (value == null)
450
- throw new CommonsInternalError('Undefined value cannot be converted to url param.'); // this should not happen, should be filtered out earlier
451
- if (Array.isArray(value))
452
- return value
453
- .map(v => dataListParamsFilterValueToUrlString(v, allowNull))
454
- .map(v => (v.indexOf(',') >= 0 || v.indexOf('"') >= 0 ? `"${v.replaceAll('"', '""')}"` : v))
455
- .join(',');
456
- if (typeof value === 'object') {
457
- if (value instanceof Date)
458
- return dateToIsoString(value, 'dateTime', { utc: true });
459
- else {
460
- throw new CommonsInternalError('Filter value cannot be object');
461
- }
462
- }
463
- return String(value);
464
- }
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXBhcmFtcy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvZGF0YS1saXN0L2RhdGEtbGlzdC1wYXJhbXMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBR3JEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLEtBQXlCO0lBQ25FLE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7SUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ3ZDLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFh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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLEtBQUssWUFBWSxJQUFJO1lBQUUsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzdFLENBQUM7WUFDRixNQUFNLElBQUksb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUYWJsZUxhenlMb2FkRXZlbnR9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuXG5pbXBvcnQge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBmcm9tICcuLi9lcnJvci9lcnJvci5tb2RlbCc7XG5pbXBvcnQge2RhdGVUb0lzb1N0cmluZ30gZnJvbSAnLi4vaGVscGVycy9kYXRlJztcbmltcG9ydCB7RGF0YUxpc3RGaWx0ZXIsIERhdGFMaXN0RmlsdGVyVmFsdWVUeXBlLCBEYXRhTGlzdEZpbHRlcnNUeXBlLCBEYXRhTGlzdFBhcmFtc30gZnJvbSAnLi9kYXRhLWxpc3QubW9kZWwnO1xuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGV9IGZyb20gJy4vZmlsdGVyLW1hdGNoLm1vZGVsJztcbmltcG9ydCB7Q29tbW9uc0ZpbHRlck1ldGFkYXRhfSBmcm9tICcuL2ZpbHRlci1tZXRhZGF0YS5tb2RlbCc7XG5cbi8qKlxuICogQ29udmVydHMgYSBUYWJsZUxhenlMb2FkRXZlbnQgdG8gRGF0YUxpc3RQYXJhbXMuXG4gKlxuICogQHBhcmFtIHtUYWJsZUxhenlMb2FkRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRhYmxlTG9hZFRvRGF0YUxpc3RQYXJhbXMoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IERhdGFMaXN0UGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICBpZiAoZXZlbnQuZmlyc3QgIT0gbnVsbCkge1xuICAgICAgICBwYXJhbXMub2Zmc2V0ID0gZXZlbnQuZmlyc3Q7XG4gICAgfVxuICAgIGlmIChldmVudC5yb3dzICE9IG51bGwpIHtcbiAgICAgICAgcGFyYW1zLmxpbWl0ID0gZXZlbnQucm93cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50Lmdsb2JhbEZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1zLnNlYXJjaCA9IGV2ZW50Lmdsb2JhbEZpbHRlcjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZ2xvYmFsRmlsdGVyKSAmJiBldmVudC5nbG9iYWxGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBwYXJhbXMuc2VhcmNoID0gZXZlbnQuZ2xvYmFsRmlsdGVyWzBdO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50Lm11bHRpU29ydE1ldGEpICYmIGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xuICAgICAgICBwYXJhbXMuc29ydCA9IGV2ZW50Lm11bHRpU29ydE1ldGEubWFwKG0gPT4gKHtwcm9wZXJ0eTogbS5maWVsZCwgYXNjZW5kaW5nOiBtLm9yZGVyID49IDB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmZpbHRlcnMpIHtcbiAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSBPYmplY3Qua2V5cyhldmVudC5maWx0ZXJzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXI6IERhdGFMaXN0RmlsdGVyID0ge307XG4gICAgICAgICAgICBjb25zdCBldmVudEZpbHRlcjogQ29tbW9uc0ZpbHRlck1ldGFkYXRhIHwgQ29tbW9uc0ZpbHRlck1ldGFkYXRhW10gfCB1bmRlZmluZWQgPSBldmVudC5maWx0ZXJzPy5ba2V5IGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudEZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBldmVudEZpbHRlclswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlID0gZXZlbnRGaWx0ZXJbMF0ubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIGZpbHRlci5jYXNlU2Vuc2l0aXZlID0gZXZlbnRGaWx0ZXJbMF0uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGV2ZW50RmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgIGZpbHRlci5tYXRjaE1vZGUgPSBldmVudEZpbHRlci5tYXRjaE1vZGU7XG4gICAgICAgICAgICAgICAgZmlsdGVyLmNhc2VTZW5zaXRpdmUgPSBldmVudEZpbHRlci5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHNlYXJjaCBjYXNlIHNlbnNpdGl2aXR5IHRvIGJlIGFsc28gd3JpdHRlbiBvbiBzZWFyY2hDYXNlU2Vuc2l0aXZlXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJyAmJiB0eXBlb2YgcGFyYW1zLnNlYXJjaCA9PT0gJ3N0cmluZycgJiYgZmlsdGVyLmNhc2VTZW5zaXRpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2hDYXNlU2Vuc2l0aXZlID0gZmlsdGVyLmNhc2VTZW5zaXRpdmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7Li4uYWNjLCBba2V5XTogZmlsdGVyfTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdG8gVVJMIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAqIEZpbHRlciBrZXlzIGFyZSBcImZsYXR0ZW5lZFwiIGluIHRoZSBuZXcgb2JqZWN0LCB2YWx1ZXMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgZmlsdGVyIHF1ZXJ5IGxhbmd1YWdlOiBgY3M6ZXE6YXNkYCwgYGluOmFzZCxxd2VgLCBgZXhgLCAuLi5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc3xudWxsfSBkZWZhdWx0cyAtIFRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgdXNlZCBpZiBubyBtYXRjaGluZyBwcm9wZXJ0eSBpbiBwYXJhbXMgaXMgYXZhaWxhYmxlLiBEZWZhdWx0cyB0byB7IGxpbWl0OiAyNSwgb2Zmc2V0OiAwIH0gaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIG9wdHMgLSBPcHRpb25zIGluIGNvbnZlcnRpbmcgdG8gdXJsIHF1ZXJ5OlxuICogICAtIHByZXBlbmRGaWx0ZXJOYW1lIFByZXBlbmRzIGZpbHRlciBrZXkgd2l0aCBwcm92aWRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHtQYXJhbXN9IC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zVG9VcmxRdWVyeShcbiAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PixcbiAgICBkZWZhdWx0czogRGF0YUxpc3RQYXJhbXM8YW55LCBhbnk+IHwgbnVsbCA9IHtcbiAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICBvZmZzZXQ6IDBcbiAgICB9LFxuICAgIG9wdHM/OiB7XG4gICAgICAgIHByZXBlbmRGaWx0ZXJOYW1lPzogc3RyaW5nO1xuICAgIH1cbik6IFBhcmFtcyB7XG4gICAgY29uc3QgdXJsUGFyYW1zOiBQYXJhbXMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMubGltaXQgJiYgcGFyYW1zLmxpbWl0ICE9PSBkZWZhdWx0cz8ubGltaXQpIHtcbiAgICAgICAgdXJsUGFyYW1zWydsaW1pdCddID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm9mZnNldCAmJiBwYXJhbXMub2Zmc2V0ICE9PSBkZWZhdWx0cz8ub2Zmc2V0KSB7XG4gICAgICAgIHVybFBhcmFtc1snb2Zmc2V0J10gPSBwYXJhbXMub2Zmc2V0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMuc2VhcmNoICE9PSBkZWZhdWx0cz8uc2VhcmNoKSB7XG4gICAgICAgIHVybFBhcmFtc1sncSddID0gYCR7cGFyYW1zLnNlYXJjaENhc2VTZW5zaXRpdmUgPyBgY3M6YCA6ICcnfSR7cGFyYW1zLnNlYXJjaH1gO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNvcnQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydCkgJiYgcGFyYW1zLnNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWZhdWx0cz8uc29ydCA9PSBudWxsIHx8XG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShkZWZhdWx0cy5zb3J0KSB8fFxuICAgICAgICAgICAgZGVmYXVsdHMuc29ydC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0Lmxlbmd0aCAhPT0gZGVmYXVsdHMuc29ydC5sZW5ndGggfHxcbiAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQuc29tZSgoZHMsIGlkeCkgPT4gZHMucHJvcGVydHkgIT09IHBhcmFtcy5zb3J0IVtpZHhdLnByb3BlcnR5IHx8IChkcy5hc2NlbmRpbmcgPz8gdHJ1ZSkgIT09IChwYXJhbXMuc29ydCFbaWR4XS5hc2NlbmRpbmcgPz8gdHJ1ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdXJsUGFyYW1zWydzb3J0J10gPSBkYXRhTGlzdFBhcmFtc1NvcnRUb1VybFF1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgLy8gZ2xvYmFsIHNlYXJjaCBmaWx0ZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgJ3EnIHBhcmFtZXRlciwgbm8gbmVlZCB0byBpbmNsdWRlIGl0IGhlcmVcbiAgICAgICAgICAgIGlmIChrID09PSAnZ2xvYmFsJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtRmlsdGVyID0gcGFyYW1zLmZpbHRlcnMhW2sgYXMga2V5b2Ygb2JqZWN0XSE7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZGVmYXVsdHM/LmZpbHRlcnM/LltrIGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlciAmJlxuICAgICAgICAgICAgICAgICgoQXJyYXkuaXNBcnJheShkZWZhdWx0RmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyLnZhbHVlLmxlbmd0aCA9PT0gcGFyYW1GaWx0ZXIudmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIudmFsdWUuZXZlcnkoKHYsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAocGFyYW1GaWx0ZXIudmFsdWUgYXMgQXJyYXk8RGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGU+KVtpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiB2IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLmdldFRpbWUoKSA9PT0gdi5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiB2YWx1ZSA9PT0gdjtcbiAgICAgICAgICAgICAgICAgICAgfSkpIHx8IC8vIGhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZSA9PT0gcGFyYW1GaWx0ZXIudmFsdWUpICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci5tYXRjaE1vZGUgPT09IHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAmJlxuICAgICAgICAgICAgICAgIChkZWZhdWx0RmlsdGVyLmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpID09PSAocGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLnZhbHVlID09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyPy52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmXG4gICAgICAgICAgICAgICAgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXJhbUZpbHRlci52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcj8udmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyAmJlxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zW2Ake29wdHM/LnByZXBlbmRGaWx0ZXJOYW1lID8/ICcnfSR7a31gXSA9ICdudWxsJztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVybFBhcmFtc1tgJHtvcHRzPy5wcmVwZW5kRmlsdGVyTmFtZSA/PyAnJ30ke2t9YF0gPSBkYXRhTGlzdFBhcmFtc0ZpbHRlcnNUb1VybFF1ZXJ5KHBhcmFtcywgaywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgLy8gYWRkIG90aGVyIGRlZmF1bHRzXG4gICAgICAgIGNvbnN0IHBhcmFtRmlsdGVyS2V5cyA9IHBhcmFtcy5maWx0ZXJzID8gT2JqZWN0LmtleXMocGFyYW1zLmZpbHRlcnMpIDogW107XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmZpbHRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gcGFyYW1GaWx0ZXJLZXlzLmluZGV4T2YoaykgPCAwKVxuICAgICAgICAgICAgLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zW2Ake29wdHM/LnByZXBlbmRGaWx0ZXJOYW1lID8/ICcnfSR7a31gXSA9IGRhdGFMaXN0UGFyYW1zRmlsdGVyc1RvVXJsUXVlcnkoZGVmYXVsdHMsIGspO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFBhcmFtcztcbn1cblxuLyoqXG4gKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzLlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCB2YWx1ZXMgdG8gbWVyZ2Ugd2l0aCBwYXJhbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIHsgbGltaXQ6IDI1LCBvZmZzZXQ6IDAgfSkuXG4gKiBAcmV0dXJucyB7RGF0YUxpc3RQYXJhbXN9IC0gVGhlIG1lcmdlZCBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHM8U29ydHMgPSBhbnksIEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBhbnk+KFxuICAgIHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+LFxuICAgIGRlZmF1bHRzOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4gPSB7XG4gICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgb2Zmc2V0OiAwXG4gICAgfVxuKTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+IHtcbiAgICBjb25zdCBtZXJnZWQ6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5saW1pdCA/PyBkZWZhdWx0cy5saW1pdCxcbiAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0ID8/IGRlZmF1bHRzLm9mZnNldCxcbiAgICAgICAgc2VhcmNoOiBwYXJhbXMuc2VhcmNoID8/IGRlZmF1bHRzLnNlYXJjaCxcbiAgICAgICAgc29ydDogKHBhcmFtcy5zb3J0ID8/IGRlZmF1bHRzLnNvcnQpPy5tYXAocyA9PiAoey4uLnN9KSlcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgIG1lcmdlZC5maWx0ZXJzID0ge30gYXMgRGF0YUxpc3RGaWx0ZXJzVHlwZTxGaWx0ZXJzPjtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyYW1zLmZpbHRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPSB7Li4uKHZhbHVlIGFzIERhdGFMaXN0RmlsdGVyKX0pKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRzLmZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFtZXJnZWQuZmlsdGVycykgbWVyZ2VkLmZpbHRlcnMgPSB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+O1xuICAgICAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cy5maWx0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChtZXJnZWQuZmlsdGVycyFba2V5IGFzIEZpbHRlcnNdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWQuZmlsdGVycyFba2V5IGFzIEZpbHRlcnNdID0gey4uLih2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcil9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiBwYXJhbWV0ZXJzIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZyBmb3Igc29ydGluZy5cbiAqIFNvcnRzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIHNvcnQgcXVlcnkgbGFuZ3VhZ2U6IGBhc2M6cHJvcDEsZGVzYzpwcm9wMmAsIC4uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIHNvcnQgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIHF1ZXJ5IG9yIHVuZGVmaW5lZCBpZiBubyBzb3J0IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YUxpc3RQYXJhbXNTb3J0VG9VcmxRdWVyeShwYXJhbXM/OiBEYXRhTGlzdFBhcmFtczxhbnksIGFueT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBwYXJhbXMgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydClcbiAgICAgICAgPyBwYXJhbXMuc29ydC5tYXAocyA9PiBgJHtzLmFzY2VuZGluZyA9PT0gdHJ1ZSB8fCBzLmFzY2VuZGluZyA9PT0gdW5kZWZpbmVkID8gJ2FzYycgOiAnZGVzYyd9OiR7U3RyaW5nKHMucHJvcGVydHkpfWApLmpvaW4oJywnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNwZWNpZmljIGZpbHRlciBwYXJhbWV0ZXIgKGJ5IGtleSkgZnJvbSBEYXRhTGlzdFBhcmFtcyBvYmplY3QgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLlxuICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXM8YW55LCBGaWx0ZXJzPiB8IHVuZGVmaW5lZH0gcGFyYW1zIC0gVGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWx0ZXJzLlxuICogQHBhcmFtIHtGaWx0ZXJzfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBmaWx0ZXIgdG8gY29udmVydC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciB0byBhbGxvdyBudWxsIHZhbHVlcyBpbiB0aGUgcXVlcnkgc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBVUkwgcXVlcnkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIGZpbHRlciwgb3IgdW5kZWZpbmVkIGlmIHRoZSBmaWx0ZXIgaXMgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YUxpc3RQYXJhbXNGaWx0ZXJzVG9VcmxRdWVyeTxGaWx0ZXJzIGV4dGVuZHMga2V5b2YgYW55ID0gc3RyaW5nPihcbiAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgRmlsdGVycz4gfCB1bmRlZmluZWQsXG4gICAga2V5OiBGaWx0ZXJzLFxuICAgIGFsbG93TnVsbCA9IGZhbHNlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmFtRmlsdGVyID0gcGFyYW1zPy5maWx0ZXJzPy5ba2V5XTtcbiAgICByZXR1cm4gZGF0YUxpc3RQYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtRmlsdGVyLCBhbGxvd051bGwpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZmlsdGVyIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZy5cbiAqIEZpbHRlciBrZXlzIGFyZSBcImZsYXR0ZW5lZFwiIGluIHRoZSBuZXcgb2JqZWN0LCB2YWx1ZXMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgZmlsdGVyIHF1ZXJ5IGxhbmd1YWdlOiBgY3M6ZXE6YXNkYCwgYGluOmFzZCxxd2VgLCBgZXhgLCAuLi5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0RmlsdGVyfSBwYXJhbUZpbHRlciAtIFRoZSBmaWx0ZXIgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciB0byBhbGxvdyBudWxsIHZhbHVlcyBpbiB0aGUgZmlsdGVyLlxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IC0gVGhlIGZpbHRlciBjb252ZXJ0ZWQgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkIG9yIHRoZSBmaWx0ZXIgaGFzIGVtcHR5IG9yIGludmFsaWQgdmFsdWVzLlxuICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgdGhlIGZpbHRlciBoYXMgaW52YWxpZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGlzdFBhcmFtc0ZpbHRlclRvVXJsUXVlcnkocGFyYW1GaWx0ZXI/OiBEYXRhTGlzdEZpbHRlciwgYWxsb3dOdWxsID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlQXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGFyYW1GaWx0ZXI/LnZhbHVlKSA/IHBhcmFtRmlsdGVyIS52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93TnVsbCB8fCB2ICE9PSBudWxsKSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF0Y2hNb2RlID0gcGFyYW1GaWx0ZXI/Lm1hdGNoTW9kZSA/PyBGaWx0ZXJNYXRjaE1vZGUuRXF1YWxzO1xuICAgIGlmIChcbiAgICAgICAgcGFyYW1GaWx0ZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoIWFsbG93TnVsbCAmJiBtYXRjaE1vZGUgIT09ICdleGlzdHMnICYmIG1hdGNoTW9kZSAhPT0gJ2RvZXNOb3RFeGlzdCcgJiYgcGFyYW1GaWx0ZXIudmFsdWUgPT0gbnVsbCkgfHxcbiAgICAgICAgKHR5cGVvZiBwYXJhbUZpbHRlci52YWx1ZSA9PT0gJ3N0cmluZycgJiYgcGFyYW1GaWx0ZXIudmFsdWUubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZUFzQXJyYXkpICYmIGZpbHRlclZhbHVlQXNBcnJheS5sZW5ndGggPT09IDApXG4gICAgKSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gaW5jbHVkZSBmaWx0ZXJzIGZvciBlbXB0eSB2YWx1ZXNcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiAhKEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSAmJiBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAyKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlIGJldHdlZW4gcmVxdWlyZXMgZXhhY3RseSAyIHZhbHVlczogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluKSAmJiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSB8fCBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSByZXF1aXJlcyBub24tZW1wdHkgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKChbRmlsdGVyTWF0Y2hNb2RlLkluLCBGaWx0ZXJNYXRjaE1vZGUuTm90SW4sIEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuXSBhcyBzdHJpbmdbXSkuaW5kZXhPZihtYXRjaE1vZGUpID09PSAtMSAmJiBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBGaWx0ZXIgbWF0Y2ggbW9kZSAke21hdGNoTW9kZX0gbXVzdCBub3QgYmUgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9WYWwgPSBwYXJhbUZpbHRlci5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0O1xuICAgIGNvbnN0IHVybFZhbHVlUGFydCA9IG5vVmFsID8gJycgOiBgOiR7ZGF0YUxpc3RQYXJhbXNGaWx0ZXJWYWx1ZVRvVXJsU3RyaW5nKGZpbHRlclZhbHVlQXNBcnJheSA/PyBwYXJhbUZpbHRlci52YWx1ZSwgYWxsb3dOdWxsKX1gO1xuXG4gICAgcmV0dXJuIGAke3BhcmFtRmlsdGVyLmNhc2VTZW5zaXRpdmUgPyAnY3M6JyA6IHBhcmFtRmlsdGVyLmNhc2VTZW5zaXRpdmUgPT09IGZhbHNlID8gJ2NpOicgOiAnJ30ke0ZpbHRlck1hdGNoTW9kZS5nZXRBYmJyZXZpYXRpb24obWF0Y2hNb2RlKSA/PyBtYXRjaE1vZGV9JHt1cmxWYWx1ZVBhcnR9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBVUkwgcXVlcnkgcGFyYW1ldGVycyB0byBhIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqIFNvcnRzIGFyZSBmb3JtYXR0ZWQgZnJvbSBNZWRpdXMgZGF0YSBBUEkgc29ydCBxdWVyeSBsYW5ndWFnZTogYGFzYzpwcm9wMSxkZXNjOnByb3AyYCwgLi4uXG4gKiBGaWx0ZXIga2V5cyBhcmUgYWxsIGtleXMgaW4gUGFyYW1zIG9iamVjdCB0aGF0IGFyZSBub3QgbWF0Y2hlZCBlbHNld2hlcmUsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGZyb20gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gKlxuICogQHBhcmFtIHtQYXJhbXN9IHVybFBhcmFtcyAtIFRoZSBVUkwgcXVlcnkgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY29udmVyc2lvbjpcbiAqICAtIHNlYXJjaEFzR2xvYmFsIC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICogIC0gcHJlcGVuZEZpbHRlck5hbWUgLSBGaWx0ZXIgbmFtZXMgYXJlIHByZXBlbmRlZCB3aXRoIHByb3ZpZGVkIHN0cmluZy5cbiAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVVybFF1ZXJ5VG9EYXRhTGlzdFBhcmFtcyhcbiAgICB1cmxQYXJhbXM6IFBhcmFtcyxcbiAgICBvcHRzPzoge1xuICAgICAgICBzZWFyY2hBc0dsb2JhbD86IGJvb2xlYW47XG4gICAgICAgIHByZXBlbmRGaWx0ZXJOYW1lPzogc3RyaW5nO1xuICAgIH1cbik6IERhdGFMaXN0UGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICBPYmplY3QuZW50cmllcyh1cmxQYXJhbXMpLmZvckVhY2goKFt1cmxQYXJhbUtleSwgdXJsUGFyYW1WYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHVybFBhcmFtS2V5ID09PSAnbGltaXQnKSB7XG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPSArdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgIGlmIChpc05hTihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1zLmxpbWl0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHVybFBhcmFtS2V5ID09PSAnb2Zmc2V0Jykge1xuICAgICAgICAgICAgcGFyYW1zLm9mZnNldCA9ICt1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHBhcmFtcy5vZmZzZXQpIHx8IHBhcmFtcy5vZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5vZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdxJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJyAmJiB1cmxQYXJhbVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHVybFBhcmFtVmFsdWUuc3RhcnRzV2l0aCgnY3M6JykgfHwgdXJsUGFyYW1WYWx1ZS5zdGFydHNXaXRoKCdjaTonKSA/IHVybFBhcmFtVmFsdWUuc3Vic3RyaW5nKDMpIDogdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdXJsUGFyYW1WYWx1ZS5zdGFydHNXaXRoKCdjczonKTtcblxuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBzZWFyY2hRdWVyeTtcbiAgICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoQ2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0cz8uc2VhcmNoQXNHbG9iYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyc1snZ2xvYmFsJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VhcmNoUXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IEZpbHRlck1hdGNoTW9kZS5Db250YWlucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdzb3J0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gdXJsUGFyYW1WYWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2RpcmVjdGlvbiwgcHJvcGVydHldID0gcy5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Byb3BlcnR5OiAocHJvcGVydHkgPz8gZGlyZWN0aW9uKSBhcyBrZXlvZiBvYmplY3QsIGFzY2VuZGluZzogZGlyZWN0aW9uICE9PSAnZGVzYyd9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYFN0cmluZyBpcyBleHBlY3RlZCBhcyB2YWx1ZSBmb3IgJyR7dXJsUGFyYW1LZXl9JyB3aGVuIGNvbnZlcnRpbmcgZnJvbSB1cmxQYXJhbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgoIW9wdHM/LnByZXBlbmRGaWx0ZXJOYW1lIHx8IHVybFBhcmFtS2V5LnN0YXJ0c1dpdGgob3B0cy5wcmVwZW5kRmlsdGVyTmFtZSkpICYmIHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHVybFBhcmFtVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJLZXkgPSBvcHRzPy5wcmVwZW5kRmlsdGVyTmFtZSA/IHVybFBhcmFtS2V5LnN1YnN0cmluZyhvcHRzLnByZXBlbmRGaWx0ZXJOYW1lLmxlbmd0aCkgOiB1cmxQYXJhbUtleTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclBhcnRzID0gdXJsUGFyYW1WYWx1ZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgbGV0IHBhcnRJZHggPSAwO1xuXG4gICAgICAgICAgICAvLyByZW1vdmVkIGRlZmF1bHQgZmlsdGVyXG4gICAgICAgICAgICBpZiAoZmlsdGVyUGFydHNbcGFydElkeF0gPT09ICdudWxsJykge1xuICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnNbZmlsdGVyS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IG51bGx9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgIGxldCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY3MnIHx8IGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY2knKSB7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHgrK10gPT09ICdjcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hdGNoIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdID8gKEZpbHRlck1hdGNoTW9kZS5mcm9tQWJicmV2aWF0aW9uKGZpbHRlclBhcnRzW3BhcnRJZHhdKSA/PyBmaWx0ZXJQYXJ0c1twYXJ0SWR4XSkgOiBGaWx0ZXJNYXRjaE1vZGUuRXF1YWxzO1xuICAgICAgICAgICAgcGFydElkeCsrO1xuXG4gICAgICAgICAgICBjb25zdCBub1ZhbCA9IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3Q7XG5cbiAgICAgICAgICAgIC8vIHZhbHVlXG4gICAgICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghbm9WYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyUGFydHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRJZHggPT09IGZpbHRlclBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWx0ZXJQYXJ0c1twYXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRJZHggPCBmaWx0ZXJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgdGhhdCBzaG91bGQgbm90IGJlIGFycmF5LCBzbyBqb2luIGJhY2sgdG9nZXRoZXJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWx0ZXJQYXJ0cy5zbGljZShwYXJ0SWR4LCBmaWx0ZXJQYXJ0cy5sZW5ndGgpLmpvaW4oJzonKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtYXRjaE1vZGUgIT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgJiYgbWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlIHVuZGVmaW5lZCBhbmQgbWF0Y2ggbW9kZSBleHBlY3RzIHZhbHVlLCB0aGVuIHNraXBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4pICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5VmFsOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBtYXRjaCBtb2RlcyBleHBlY3QgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ1wiJykgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRUb2tlbiA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGxpY2l0UXVvdGVzID0gZmFsc2U7IC8vdG9rZW4gaXMgcXVvdGVkLCBlLmcuIGluOjEsMixcIjIyXCJcIlwiLFwiLDEyM1wiXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1b3Rlc09wZW5lZCA9IGZhbHNlOyAvL3Rva2VuIGhhcyBzdGFydGVkIHByb2Nlc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdW90ZXNFeHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7IC8vdG9rZW4gcHJvY2Vzc2luZyBoYXMgZmluaXNoZWQsIGFmdGVyIHNpbmdsZSBcIiBpbiBxdW90ZWQgbW9kZSwgb3IgYmVmb3JlICwgaW4gbm90IHF1b3RlZFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IHZhbHVlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHRva2VuaXplciB3aGVuIHNlZWluZyB0aGUgdG9rZW4gc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBpZiBlaXRoZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1b3RlcyBoYXZlIG5vdCBiZWVuIG9wZW5lZCB5ZXQgKHdoZW4gdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgYmV0d2VlbiBzZXBhcmF0b3JzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdG9rZW4gaGFzIGJlZW4gZXhwbGljaXRseSBjbG9zZWQgKHdoZW4gd2UgYWN0dWFsbHkgaGF2ZSBleHBsaWNpdCBvcGVuaW5nIGkuZS4sIHF1b3RlcyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdlIGhhdmUgaW1wbGljaXQgcXVvdGVzIChpLmUuLCBxdW90ZXMgYXJlIG5vdCB0aGUgZmlyc3QgY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnLCcgJiYgKCFxdW90ZXNPcGVuZWQgfHwgcXVvdGVzRXhwbGljaXRseUNsb3NlZCB8fCAhZXhwbGljaXRRdW90ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnRUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFF1b3RlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQgZG91YmxlLXF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwbGljaXRRdW90ZXMgJiYgaSArIDEgPCB2YWx1ZS5sZW5ndGggJiYgdmFsdWVbaSArIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gKz0gYzsgLy8gQXBwZW5kIG9uZSBkb3VibGUtcXVvdGUgdG8gdGhlIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsgLy8gU2tpcCB0aGUgbmV4dCBkb3VibGUtcXVvdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBlbmNvdW50ZXIgcXVvdGVzIGFnYWluIGFmdGVyIHRoZXkgd2VyZSB0aGUgZmlyc3QgY2hhcmFjdGVyID0+IHdlIGNsb3NlIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBsaWNpdFF1b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgcXVvdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1b3Rlc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVvdGVzIGFyZSB0aGUgZmlyc3QgY2hhcmFjdGVyID0+IGV4cGxpY2l0bHkgb3BlbiB0aGUgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc09wZW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFF1b3RlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVvdGVzRXhwbGljaXRseUNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVvdGVzT3BlbmVkICYmICFxdW90ZXNFeHBsaWNpdGx5Q2xvc2VkICYmIGV4cGxpY2l0UXVvdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIGxhc3QgdG9rZW4gYWZ0ZXIgdGhlIGxvb3AgZW5kc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goY3VycmVudFRva2VuLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbCA9IHRva2VucztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VmFsID0gdmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuICYmIGFycmF5VmFsLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheVZhbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyIHdpdGggZW1wdHkgdmFsdWUgaXMgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnNbZmlsdGVyS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSwgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogTWFrZXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz59IHBhcmFtcyAtIFRoZSBEYXRhTGlzdFBhcmFtcyBvYmplY3QgdG8gYmUgY29waWVkLlxuICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gLSBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlEYXRhTGlzdFBhcmFtczxTb3J0cyA9IHN0cmluZywgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IHN0cmluZz4ocGFyYW1zOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4pOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgIGNvbnN0IGNvcHk6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgICBsaW1pdDogcGFyYW1zLmxpbWl0LFxuICAgICAgICBzZWFyY2g6IHBhcmFtcy5zZWFyY2hcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICAgIGNvcHkuc29ydCA9IHBhcmFtcy5zb3J0Py5tYXAocyA9PiAoey4uLnN9KSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICBjb3B5LmZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZS52YWx1ZSkgPyBbLi4uZmlsdGVyVmFsdWUudmFsdWVdIDogZmlsdGVyVmFsdWUudmFsdWVcbiAgICAgICAgICAgICAgICB9IGFzIERhdGFMaXN0RmlsdGVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEgVVJMIHF1ZXJ5IHBhcmFtIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciBudWxsIHZhbHVlcyBhcmUgYWxsb3dlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBVUkwgcGFyYW1ldGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS5cbiAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcGFzc2VkIHdpdGhvdXQgYWxsb3dOdWxsIHNldCB0byB0cnVlLlxuICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBEYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2YWx1ZTogdW5rbm93biwgYWxsb3dOdWxsID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignVW5kZWZpbmVkIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdXJsIHBhcmFtLicpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGVhcmxpZXJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgLm1hcCh2ID0+IGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2LCBhbGxvd051bGwpKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh2LmluZGV4T2YoJywnKSA+PSAwIHx8IHYuaW5kZXhPZignXCInKSA+PSAwID8gYFwiJHt2LnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiB2KSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGRhdGVUb0lzb1N0cmluZyh2YWx1ZSwgJ2RhdGVUaW1lJywge3V0YzogdHJ1ZX0pO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignRmlsdGVyIHZhbHVlIGNhbm5vdCBiZSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvZGF0YS1saXN0L2RhdGEtbGlzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGV9IGZyb20gJy4vZmlsdGVyLW1hdGNoLm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhTGlzdFBhcmFtczxTb3J0cyA9IHN0cmluZywgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IHN0cmluZz4ge1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBzb3J0PzogRGF0YUxpc3RTb3J0PFNvcnRzPltdO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICBzZWFyY2hDYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUGFydGlhbDxEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhTGlzdFNvcnQ8UHJvcGVydHkgPSBzdHJpbmc+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk7XG4gICAgYXNjZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YUxpc3RGaWx0ZXJCYXNlVmFsdWVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUgfCB1bmRlZmluZWQgfCBudWxsO1xuZXhwb3J0IHR5cGUgRGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGUgPSBEYXRhTGlzdEZpbHRlckJhc2VWYWx1ZVR5cGUgfCBEYXRhTGlzdEZpbHRlckJhc2VWYWx1ZVR5cGVbXSB8IHVuZGVmaW5lZCB8IG51bGw7XG5leHBvcnQgdHlwZSBEYXRhTGlzdEZpbHRlckZyb21VcmxWYWx1ZVR5cGUgPSBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IHN0cmluZz4gPSB7XG4gICAgW1Byb3AgaW4gRmlsdGVyc106IERhdGFMaXN0RmlsdGVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhTGlzdEZpbHRlcjxWYWx1ZSA9IERhdGFMaXN0RmlsdGVyVmFsdWVUeXBlPiB7XG4gICAgdmFsdWU/OiBWYWx1ZTtcbiAgICBtYXRjaE1vZGU/OiBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGU7XG4gICAgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUxpc3RSZXN1bHQ8SXRlbSA9IGFueT4ge1xuICAgIGRhdGE6IEl0ZW1bXTtcbiAgICB0b3RhbENvdW50PzogbnVtYmVyO1xufVxuIl19