@mediusinc/mng-commons 0.17.6 → 0.18.0-rc.1

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 (376) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  3. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  4. package/esm2020/lib/api/models/index.mjs +8 -8
  5. package/esm2020/lib/api/models/mappers.mjs +12 -12
  6. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  7. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  8. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  9. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  10. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  11. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +67 -67
  12. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  13. package/esm2020/lib/api/services/index.mjs +3 -3
  14. package/esm2020/lib/api/utils/index.mjs +2 -2
  15. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  16. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  17. package/esm2020/lib/components/action/action.component.mjs +213 -213
  18. package/esm2020/lib/components/action/editor/action-editor.component.mjs +271 -271
  19. package/esm2020/lib/components/action/index.mjs +3 -3
  20. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  21. package/esm2020/lib/components/action/models/action-execution.model.mjs +240 -240
  22. package/esm2020/lib/components/action/models/index.mjs +3 -3
  23. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  26. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  27. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  28. package/esm2020/lib/components/form/editor/form-editor.component.mjs +219 -213
  29. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +39 -0
  30. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +50 -49
  31. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +45 -44
  32. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +26 -25
  33. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +103 -102
  34. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +24 -23
  35. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +181 -180
  36. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +168 -167
  37. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +149 -148
  38. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -17
  39. package/esm2020/lib/components/form/formly/fields/index.mjs +11 -10
  40. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +15 -0
  41. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +15 -15
  42. package/esm2020/lib/components/form/formly/wrappers/index.mjs +3 -3
  43. package/esm2020/lib/components/form/index.mjs +4 -4
  44. package/esm2020/lib/components/form/models/field-action-context.model.mjs +2 -0
  45. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  46. package/esm2020/lib/components/form/models/form-editor.interface.mjs +2 -0
  47. package/esm2020/lib/components/form/models/index.mjs +3 -2
  48. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  49. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  50. package/esm2020/lib/components/layout/index.mjs +7 -7
  51. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  52. package/esm2020/lib/components/layout/menu-item.component.mjs +267 -267
  53. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  54. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  55. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  56. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  57. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  58. package/esm2020/lib/components/tableview/index.mjs +6 -6
  59. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  60. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  61. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +81 -81
  62. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  63. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  64. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +73 -73
  65. package/esm2020/lib/components/tableview/table/table.component.mjs +559 -559
  66. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  67. package/esm2020/lib/config/formly.config.mjs +186 -181
  68. package/esm2020/lib/config/index.mjs +1 -1
  69. package/esm2020/lib/config/models/config.model.mjs +2 -0
  70. package/esm2020/lib/config/models/formly-config.model.mjs +2 -0
  71. package/esm2020/lib/config/models/index.mjs +3 -3
  72. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  73. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  74. package/esm2020/lib/data-providers/index.mjs +6 -6
  75. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  76. package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
  77. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
  78. package/esm2020/lib/data-providers/tableview.data-provider.mjs +58 -58
  79. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  80. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  81. package/esm2020/lib/descriptors/action.descriptor.mjs +548 -548
  82. package/esm2020/lib/descriptors/column.descriptor.mjs +380 -380
  83. package/esm2020/lib/descriptors/editor.descriptor.mjs +251 -246
  84. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  85. package/esm2020/lib/descriptors/field.descriptor.mjs +902 -864
  86. package/esm2020/lib/descriptors/filter.descriptor.mjs +320 -320
  87. package/esm2020/lib/descriptors/index.mjs +11 -11
  88. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  89. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  90. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  91. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  92. package/esm2020/lib/descriptors/table.descriptor.mjs +463 -463
  93. package/esm2020/lib/descriptors/tableview.descriptor.mjs +323 -323
  94. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  95. package/esm2020/lib/descriptors/types/column.type.mjs +11 -11
  96. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  97. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  98. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  99. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  100. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  101. package/esm2020/lib/directives/component.directive.mjs +43 -43
  102. package/esm2020/lib/directives/index.mjs +2 -2
  103. package/esm2020/lib/directives/template.directive.mjs +27 -27
  104. package/esm2020/lib/mng-commons.module.mjs +466 -463
  105. package/esm2020/lib/models/column-value.model.mjs +1 -1
  106. package/esm2020/lib/models/enum.model.mjs +1 -1
  107. package/esm2020/lib/models/error.model.mjs +1 -1
  108. package/esm2020/lib/models/formly-field.model.mjs +2 -2
  109. package/esm2020/lib/models/index.mjs +9 -9
  110. package/esm2020/lib/models/menu.model.mjs +1 -1
  111. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  112. package/esm2020/lib/models/user.model.mjs +1 -1
  113. package/esm2020/lib/models/version.model.mjs +1 -1
  114. package/esm2020/lib/models/view-container.model.mjs +1 -1
  115. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  116. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  117. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  118. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  119. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  120. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  121. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  122. package/esm2020/lib/pipes/index.mjs +10 -10
  123. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  124. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  125. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  126. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  127. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  128. package/esm2020/lib/router/index.mjs +2 -2
  129. package/esm2020/lib/router/models/index.mjs +1 -1
  130. package/esm2020/lib/router/models/router.model.mjs +1 -1
  131. package/esm2020/lib/router/route-builder.mjs +425 -425
  132. package/esm2020/lib/router/tableview-route-builder.mjs +183 -183
  133. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  134. package/esm2020/lib/security/authorization.service.mjs +46 -46
  135. package/esm2020/lib/security/authorization.util.mjs +15 -15
  136. package/esm2020/lib/security/index.mjs +3 -3
  137. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  138. package/esm2020/lib/security/model/index.mjs +3 -3
  139. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  140. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  141. package/esm2020/lib/services/action-executor.service.mjs +547 -547
  142. package/esm2020/lib/services/commons.service.mjs +354 -354
  143. package/esm2020/lib/services/configuration.service.mjs +119 -119
  144. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  145. package/esm2020/lib/services/index.mjs +6 -6
  146. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  147. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  148. package/esm2020/lib/services/internal/index.mjs +2 -2
  149. package/esm2020/lib/services/navigation.service.mjs +47 -47
  150. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  151. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  152. package/esm2020/lib/services/providers/index.mjs +2 -2
  153. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  154. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  155. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  156. package/esm2020/lib/services/tokens/index.mjs +4 -4
  157. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  158. package/esm2020/lib/services/version.service.mjs +38 -38
  159. package/esm2020/lib/services/view-container.component.service.mjs +47 -47
  160. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  161. package/esm2020/lib/styles/index.mjs +2 -2
  162. package/esm2020/lib/styles/models/index.mjs +2 -2
  163. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  164. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  165. package/esm2020/lib/styles/styles.util.mjs +41 -41
  166. package/esm2020/lib/types/index.mjs +2 -2
  167. package/esm2020/lib/types/type.decorator.mjs +21 -21
  168. package/esm2020/lib/types/type.model.mjs +1 -1
  169. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  170. package/esm2020/lib/utils/date.util.mjs +117 -117
  171. package/esm2020/lib/utils/editor-formly.util.mjs +263 -251
  172. package/esm2020/lib/utils/enum.util.mjs +81 -81
  173. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  174. package/esm2020/lib/utils/index.mjs +9 -9
  175. package/esm2020/lib/utils/model.util.mjs +68 -68
  176. package/esm2020/lib/utils/notification.util.mjs +45 -45
  177. package/esm2020/lib/utils/route.util.mjs +23 -23
  178. package/esm2020/lib/utils/string.util.mjs +26 -26
  179. package/esm2020/lib/utils/tableview.util.mjs +143 -143
  180. package/esm2020/lib/utils/type.util.mjs +92 -92
  181. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  182. package/esm2020/public-api.mjs +54 -54
  183. package/fesm2015/mediusinc-mng-commons.mjs +12803 -12694
  184. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  185. package/fesm2020/mediusinc-mng-commons.mjs +12647 -12540
  186. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  187. package/index.d.ts +5 -5
  188. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  189. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  190. package/lib/api/models/filter-param.model.d.ts +23 -23
  191. package/lib/api/models/index.d.ts +8 -8
  192. package/lib/api/models/mappers.d.ts +6 -6
  193. package/lib/api/models/query-mode.model.d.ts +16 -16
  194. package/lib/api/models/query-param.model.d.ts +31 -31
  195. package/lib/api/models/query-result.model.d.ts +24 -24
  196. package/lib/api/models/serialization.model.d.ts +8 -8
  197. package/lib/api/services/api.abstract.service.d.ts +24 -24
  198. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  199. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  200. package/lib/api/services/index.d.ts +3 -3
  201. package/lib/api/utils/index.d.ts +2 -2
  202. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  203. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  204. package/lib/components/action/action.component.d.ts +69 -69
  205. package/lib/components/action/editor/action-editor.component.d.ts +63 -63
  206. package/lib/components/action/index.d.ts +3 -3
  207. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  208. package/lib/components/action/models/action-execution.model.d.ts +131 -131
  209. package/lib/components/action/models/index.d.ts +3 -3
  210. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  211. package/lib/components/action/route/action-route.component.d.ts +31 -31
  212. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  213. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  214. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  215. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  216. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -0
  217. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -15
  218. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -14
  219. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -13
  220. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +24 -23
  221. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -10
  222. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -45
  223. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +21 -20
  224. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -36
  225. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -6
  226. package/lib/components/form/formly/fields/index.d.ts +10 -9
  227. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -0
  228. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  229. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  230. package/lib/components/form/index.d.ts +4 -4
  231. package/lib/components/form/models/field-action-context.model.d.ts +17 -0
  232. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  233. package/lib/components/form/models/form-editor.interface.d.ts +10 -0
  234. package/lib/components/form/models/index.d.ts +2 -1
  235. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  236. package/lib/components/layout/footer.component.d.ts +9 -9
  237. package/lib/components/layout/index.d.ts +7 -7
  238. package/lib/components/layout/main-layout.component.d.ts +20 -20
  239. package/lib/components/layout/menu-item.component.d.ts +52 -52
  240. package/lib/components/layout/menu.component.d.ts +10 -10
  241. package/lib/components/layout/services/index.d.ts +1 -1
  242. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  243. package/lib/components/layout/topbar.component.d.ts +28 -28
  244. package/lib/components/layout/version.component.d.ts +19 -19
  245. package/lib/components/tableview/index.d.ts +6 -6
  246. package/lib/components/tableview/models/index.d.ts +1 -1
  247. package/lib/components/tableview/models/table.event.d.ts +17 -17
  248. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +26 -26
  249. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  250. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  251. package/lib/components/tableview/table/column-value/column-value.component.d.ts +30 -30
  252. package/lib/components/tableview/table/table.component.d.ts +113 -113
  253. package/lib/components/tableview/tableview.component.d.ts +48 -48
  254. package/lib/config/formly.config.d.ts +16 -16
  255. package/lib/config/index.d.ts +1 -1
  256. package/lib/config/models/{mng-config.model.d.ts → config.model.d.ts} +36 -36
  257. package/lib/config/models/formly-config.model.d.ts +11 -0
  258. package/lib/config/models/index.d.ts +2 -2
  259. package/lib/data-providers/base.data-provider.d.ts +14 -14
  260. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  261. package/lib/data-providers/index.d.ts +6 -6
  262. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  263. package/lib/data-providers/table.data-provider.d.ts +27 -27
  264. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  265. package/lib/data-providers/tableview.data-provider.d.ts +37 -37
  266. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  267. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  268. package/lib/descriptors/action.descriptor.d.ts +212 -212
  269. package/lib/descriptors/column.descriptor.d.ts +123 -123
  270. package/lib/descriptors/editor.descriptor.d.ts +95 -94
  271. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  272. package/lib/descriptors/field.descriptor.d.ts +324 -309
  273. package/lib/descriptors/filter.descriptor.d.ts +112 -112
  274. package/lib/descriptors/index.d.ts +11 -11
  275. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  276. package/lib/descriptors/interfaces/index.d.ts +2 -2
  277. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  278. package/lib/descriptors/model.descriptor.d.ts +18 -18
  279. package/lib/descriptors/table.descriptor.d.ts +182 -182
  280. package/lib/descriptors/tableview.descriptor.d.ts +122 -122
  281. package/lib/descriptors/types/action.type.d.ts +21 -21
  282. package/lib/descriptors/types/column.type.d.ts +10 -10
  283. package/lib/descriptors/types/editor.type.d.ts +6 -6
  284. package/lib/descriptors/types/field.type.d.ts +44 -44
  285. package/lib/descriptors/types/filter.type.d.ts +27 -27
  286. package/lib/descriptors/types/index.d.ts +6 -6
  287. package/lib/descriptors/types/table.type.d.ts +22 -22
  288. package/lib/directives/component.directive.d.ts +16 -16
  289. package/lib/directives/index.d.ts +2 -2
  290. package/lib/directives/template.directive.d.ts +13 -13
  291. package/lib/mng-commons.module.d.ts +94 -93
  292. package/lib/models/column-value.model.d.ts +4 -4
  293. package/lib/models/enum.model.d.ts +6 -6
  294. package/lib/models/error.model.d.ts +14 -14
  295. package/lib/models/formly-field.model.d.ts +16 -16
  296. package/lib/models/index.d.ts +9 -9
  297. package/lib/models/menu.model.d.ts +27 -27
  298. package/lib/models/tableview-attr.model.d.ts +9 -9
  299. package/lib/models/user.model.d.ts +8 -8
  300. package/lib/models/version.model.d.ts +18 -18
  301. package/lib/models/view-container.model.d.ts +37 -37
  302. package/lib/pipes/boolean.pipe.d.ts +7 -7
  303. package/lib/pipes/class-map.pipe.d.ts +7 -7
  304. package/lib/pipes/enum.pipe.d.ts +8 -8
  305. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  306. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  307. package/lib/pipes/getter.pipe.d.ts +7 -7
  308. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  309. package/lib/pipes/index.d.ts +10 -10
  310. package/lib/pipes/json-path.pipe.d.ts +13 -13
  311. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  312. package/lib/pipes/models/internal/index.d.ts +1 -1
  313. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  314. package/lib/pipes/template.pipe.d.ts +10 -10
  315. package/lib/router/index.d.ts +2 -2
  316. package/lib/router/models/index.d.ts +1 -1
  317. package/lib/router/models/router.model.d.ts +33 -33
  318. package/lib/router/route-builder.d.ts +98 -98
  319. package/lib/router/tableview-route-builder.d.ts +37 -37
  320. package/lib/security/authorization.guard.d.ts +11 -11
  321. package/lib/security/authorization.service.d.ts +19 -19
  322. package/lib/security/authorization.util.d.ts +5 -5
  323. package/lib/security/index.d.ts +3 -3
  324. package/lib/security/model/authorization.type.d.ts +6 -6
  325. package/lib/security/model/index.d.ts +3 -3
  326. package/lib/security/model/permission-service.interface.d.ts +6 -6
  327. package/lib/security/model/permissions.model.d.ts +37 -37
  328. package/lib/services/action-executor.service.d.ts +149 -149
  329. package/lib/services/commons.service.d.ts +81 -81
  330. package/lib/services/configuration.service.d.ts +45 -45
  331. package/lib/services/error-mapper.service.d.ts +7 -7
  332. package/lib/services/index.d.ts +6 -6
  333. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  334. package/lib/services/internal/commons-init.service.d.ts +16 -16
  335. package/lib/services/internal/index.d.ts +2 -2
  336. package/lib/services/navigation.service.d.ts +14 -14
  337. package/lib/services/providers/config-service.provider.d.ts +6 -6
  338. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  339. package/lib/services/providers/index.d.ts +2 -2
  340. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  341. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  342. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  343. package/lib/services/tokens/index.d.ts +4 -4
  344. package/lib/services/tokens/module-config.token.d.ts +3 -3
  345. package/lib/services/version.service.d.ts +13 -13
  346. package/lib/services/view-container.component.service.d.ts +28 -28
  347. package/lib/styles/button-style.builder.d.ts +67 -67
  348. package/lib/styles/index.d.ts +2 -2
  349. package/lib/styles/models/index.d.ts +2 -2
  350. package/lib/styles/models/style-level.enum.d.ts +10 -10
  351. package/lib/styles/models/style-size.enum.d.ts +7 -7
  352. package/lib/styles/styles.util.d.ts +14 -14
  353. package/lib/types/index.d.ts +2 -2
  354. package/lib/types/type.decorator.d.ts +4 -4
  355. package/lib/types/type.model.d.ts +23 -23
  356. package/lib/utils/action-data-provider.util.d.ts +20 -20
  357. package/lib/utils/date.util.d.ts +7 -7
  358. package/lib/utils/editor-formly.util.d.ts +12 -11
  359. package/lib/utils/enum.util.d.ts +50 -50
  360. package/lib/utils/i18n.util.d.ts +56 -56
  361. package/lib/utils/index.d.ts +9 -9
  362. package/lib/utils/model.util.d.ts +8 -8
  363. package/lib/utils/notification.util.d.ts +11 -11
  364. package/lib/utils/route.util.d.ts +4 -4
  365. package/lib/utils/string.util.d.ts +4 -4
  366. package/lib/utils/tableview.util.d.ts +39 -39
  367. package/lib/utils/type.util.d.ts +57 -57
  368. package/mediusinc-mng-commons-0.18.0-rc.1.tgz +0 -0
  369. package/package.json +1 -1
  370. package/public-api.d.ts +34 -34
  371. package/version-info.json +6 -6
  372. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +0 -15
  373. package/esm2020/lib/config/models/mng-config.model.mjs +0 -2
  374. package/esm2020/lib/config/models/mng-formly-config-model.mjs +0 -2
  375. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +0 -6
  376. package/lib/config/models/mng-formly-config-model.d.ts +0 -17
@@ -1,464 +1,464 @@
1
- import { ObjectSerializer } from '../api/utils';
2
- import { ModelUtil } from '../utils';
3
- import { TableviewUtil } from '../utils/tableview.util';
4
- import { ColumnDescriptor, ColumnDynamicDescriptor } from './column.descriptor';
5
- import { FilterLookupDescriptor } from './filter.descriptor';
6
- import { ModelDescriptor } from './model.descriptor';
7
- import { ColumnTypeEnum, TableDynamicColumnsModeEnum, TableFilterDisplayEnum, TablePaginationModeEnum, TableSizeEnum } from './types';
8
- export class TableDescriptor {
9
- constructor(modelType, idProperty, titleProperty, i18nBaseKey) {
10
- this._filterDisplay = TableFilterDisplayEnum.Menu;
11
- this._paginationMode = TablePaginationModeEnum.Pagination;
12
- this._rowsPerPageOptions = [25, 50, 100];
13
- this._defaultNumRows = this._rowsPerPageOptions[0];
14
- this._columns = [];
15
- this._hideHeader = false;
16
- this._hasDefaultSort = false;
17
- this._defaultSortProperty = [];
18
- this._defaultSortAsc = [];
19
- // visual
20
- this._className = '';
21
- this._size = TableSizeEnum.Large;
22
- this._hasHover = true;
23
- this._hasGridlines = false;
24
- this._autoGenerated = false;
25
- this._modelType = modelType;
26
- this._model = new ModelDescriptor(modelType, idProperty, titleProperty, i18nBaseKey);
27
- this._dataKeyProperty = idProperty ?? ModelUtil.findIdAttribute(modelType) ?? undefined;
28
- }
29
- /**
30
- * generates descriptor based on modelType attribute definition
31
- * @param modelType class type
32
- * @param idProperty
33
- * @param titleProperty
34
- */
35
- static from(modelType, idProperty, titleProperty) {
36
- return TableDescriptor.fromModelWithAttributes(modelType, TableviewUtil.getAttributeDefMap(modelType), idProperty, titleProperty);
37
- }
38
- /**
39
- * generates descriptor base on given attribute definition
40
- * @param modelType class type
41
- * @param attributes attributes from which descriptor is generated
42
- * @param idProperty
43
- * @param titleProperty
44
- */
45
- static fromModelWithAttributes(modelType, attributes, idProperty, titleProperty) {
46
- const descriptor = new TableDescriptor(modelType, idProperty, titleProperty);
47
- descriptor._autoGenerated = true;
48
- attributes.filter(attr => !attr.type.includes('Set') && !attr.type.includes('Array')).forEach(attr => descriptor.upsertColumnFromAttributeDef(attr));
49
- return descriptor;
50
- }
51
- get filterDisplay() {
52
- return this._filterDisplay;
53
- }
54
- get paginationMode() {
55
- return this._paginationMode;
56
- }
57
- get rowsPerPageOptions() {
58
- return this._rowsPerPageOptions;
59
- }
60
- get defaultNumRows() {
61
- return this._defaultNumRows;
62
- }
63
- get columns() {
64
- return this._columns;
65
- }
66
- get title() {
67
- return this._title;
68
- }
69
- get hideHeader() {
70
- return this._hideHeader;
71
- }
72
- get dataKeyProperty() {
73
- return this._dataKeyProperty;
74
- }
75
- get hasDefaultSort() {
76
- return this._hasDefaultSort;
77
- }
78
- get defaultSortProperty() {
79
- return this._defaultSortProperty;
80
- }
81
- get defaultSortAsc() {
82
- return this._defaultSortAsc;
83
- }
84
- get model() {
85
- return this._model;
86
- }
87
- get className() {
88
- return this._className;
89
- }
90
- get size() {
91
- return this._size;
92
- }
93
- get tableFullHeightOffset() {
94
- return this._tableFullHeightOffset;
95
- }
96
- get rowHeight() {
97
- return this._rowHeight;
98
- }
99
- get hasHover() {
100
- return this._hasHover;
101
- }
102
- get hasGridlines() {
103
- return this._hasGridlines;
104
- }
105
- get rowClassName() {
106
- return this._rowClassName;
107
- }
108
- get rowClassNameMapFn() {
109
- return this._rowClassNameMapFn;
110
- }
111
- get headerClassName() {
112
- return this._headerClassName;
113
- }
114
- getColumn(property) {
115
- return this._columns.find(col => col.property === property);
116
- }
117
- addColumnDescriptor(column) {
118
- this._columns.push(column);
119
- return this;
120
- }
121
- addColumn(property) {
122
- const column = new ColumnDescriptor(this, property);
123
- this._columns.push(column);
124
- return column;
125
- }
126
- addColumnNumber(property, displayFormat) {
127
- const column = new ColumnDescriptor(this, property);
128
- column.asNumber(displayFormat);
129
- this._columns.push(column);
130
- return column;
131
- }
132
- addColumnDate(property, displayFormat) {
133
- const column = new ColumnDescriptor(this, property);
134
- column.asDate(displayFormat);
135
- this._columns.push(column);
136
- return column;
137
- }
138
- addColumnBoolean(property, yes, no, asIcon = false) {
139
- const column = new ColumnDescriptor(this, property);
140
- column.asBoolean(yes, no, asIcon);
141
- this._columns.push(column);
142
- return column;
143
- }
144
- addColumnEnum(property, enumType, nameAsValue = false, titlePath) {
145
- const column = new ColumnDescriptor(this, property);
146
- column.asEnum(enumType, nameAsValue, titlePath);
147
- this._columns.push(column);
148
- return column;
149
- }
150
- addColumnCustomComponent(property, customComponentType) {
151
- const column = new ColumnDescriptor(this, property);
152
- column.asCustomComponent(customComponentType);
153
- this._columns.push(column);
154
- return column;
155
- }
156
- removeColumn(property) {
157
- const columndIdx = this._columns.findIndex(c => c.property === property);
158
- this._columns.splice(columndIdx, 1);
159
- }
160
- withFilterDisplay(filterDisplayType) {
161
- this._filterDisplay = filterDisplayType;
162
- return this;
163
- }
164
- withPaginationMode(paginationMode) {
165
- this._paginationMode = paginationMode;
166
- return this;
167
- }
168
- withRowsPerPage(rows, options) {
169
- if (options) {
170
- this._rowsPerPageOptions = options;
171
- }
172
- if (!this._rowsPerPageOptions.includes(rows)) {
173
- this._defaultNumRows = this._rowsPerPageOptions[0];
174
- }
175
- else {
176
- this._defaultNumRows = rows;
177
- }
178
- return this;
179
- }
180
- withTitle(title) {
181
- this._title = title;
182
- return this;
183
- }
184
- withHideHeader(hideHeader = true) {
185
- this._hideHeader = hideHeader;
186
- return this;
187
- }
188
- withDataKeyProperty(property) {
189
- this._dataKeyProperty = property;
190
- return this;
191
- }
192
- withDefaultSort(property, asc = true) {
193
- this._hasDefaultSort = true;
194
- this._defaultSortProperty.push(property);
195
- this._defaultSortAsc.push(asc);
196
- return this;
197
- }
198
- withClassName(className) {
199
- this._className = className;
200
- return this;
201
- }
202
- withSize(size = TableSizeEnum.Normal) {
203
- this._size = size;
204
- return this;
205
- }
206
- withTableFullHeightOffset(tableFullHeightOffset) {
207
- this._tableFullHeightOffset = tableFullHeightOffset;
208
- return this;
209
- }
210
- withRowHeight(rowHeight) {
211
- this._rowHeight = rowHeight;
212
- return this;
213
- }
214
- withHover(hover) {
215
- this._hasHover = hover;
216
- return this;
217
- }
218
- withGridlines(gridlines) {
219
- this._hasGridlines = gridlines;
220
- return this;
221
- }
222
- withRowClassName(rowClassName, classNameMapFn) {
223
- this._rowClassName = rowClassName;
224
- this._rowClassNameMapFn = classNameMapFn;
225
- return this;
226
- }
227
- withHeaderClassName(headerClassName) {
228
- this._headerClassName = headerClassName;
229
- return this;
230
- }
231
- copyFieldsTo(obj) {
232
- obj._title = this._title;
233
- obj._hideHeader = this._hideHeader;
234
- obj._dataKeyProperty = this._dataKeyProperty;
235
- obj._hasDefaultSort = this._hasDefaultSort;
236
- obj._defaultSortProperty = this._defaultSortProperty.map(p => p);
237
- obj._defaultSortAsc = this._defaultSortAsc.map(p => p);
238
- obj._filterDisplay = this._filterDisplay;
239
- obj._className = this._className;
240
- obj._size = this._size;
241
- obj._tableFullHeightOffset = this._tableFullHeightOffset;
242
- obj._rowHeight = this._rowHeight;
243
- obj._hasHover = this._hasHover;
244
- obj._hasGridlines = this._hasGridlines;
245
- }
246
- copy() {
247
- const descriptor = new TableDescriptor(this.model.type, this.model.idPropertyName, this.model.titlePropertyName);
248
- this.copyFieldsTo(descriptor);
249
- descriptor._columns = this.columns.map(c => c.copy());
250
- return descriptor;
251
- }
252
- /**
253
- * generates column based on attributes
254
- * @param attribute attribute map
255
- * @param column if provided, replaced by new, otherwise new is created
256
- * @param args additional parameters
257
- */
258
- upsertColumnFromAttributeDef(attribute, column, ...args) {
259
- if (column == null) {
260
- column = this.addColumn(attribute.name);
261
- }
262
- if (attribute.columnType === ColumnTypeEnum.Enum && args.length === 0) {
263
- args = [attribute.enumType];
264
- }
265
- column = column.asType(attribute.columnType, ...args);
266
- if (attribute.classType) {
267
- column.withObjectProperty(attribute.classType).withSort();
268
- }
269
- else {
270
- column.withSort().withFilter();
271
- }
272
- return column;
273
- }
274
- /**
275
- * defines modified type of column
276
- * DO NOT USE with enum (use withCustomEnumType)
277
- * @param property column name
278
- * @param columnType modified type
279
- * @param args additional attributes
280
- */
281
- withColumnModifiedType(property, columnType, ...args) {
282
- const attributeDef = TableviewUtil.getAttributeDefMap(this._modelType).find(atribute => atribute.name === property);
283
- if (attributeDef != null) {
284
- attributeDef.columnType = columnType ?? attributeDef.columnType;
285
- this.upsertColumnFromAttributeDef(attributeDef, this.columns.find(col => col.property === attributeDef.name), ...args);
286
- }
287
- return this;
288
- }
289
- /**
290
- * defines custom enum type for column
291
- * @param property column name
292
- * @param enumType
293
- */
294
- withColumnModifiedEnum(property, enumType) {
295
- const attributeDef = TableviewUtil.getAttributeDefMap(this._modelType).find(atribute => atribute.name === property);
296
- if (attributeDef != null) {
297
- attributeDef.columnType = ColumnTypeEnum.Enum;
298
- this.upsertColumnFromAttributeDef(attributeDef, this.columns.find(col => col.property === property), enumType ?? ObjectSerializer.get().findEnum(attributeDef.type));
299
- }
300
- return this;
301
- }
302
- /**
303
- * modifies column with class and lookup provider
304
- * @param property column name
305
- * @param lookupProvider lookupProvider for class
306
- * @param itemsLabelProperty
307
- * @param filterProperty
308
- */
309
- withColumnModifiedLookup(property, lookupProvider, itemsLabelProperty, filterProperty) {
310
- const column = this.columns.find(col => col.property === property);
311
- if (column) {
312
- column.withFilterLookup().withLookupDataProvider(lookupProvider);
313
- if (column instanceof FilterLookupDescriptor) {
314
- if (itemsLabelProperty) {
315
- column.withItemsLabelProperty(itemsLabelProperty);
316
- }
317
- if (filterProperty) {
318
- column.withFilterProperty(filterProperty);
319
- }
320
- }
321
- }
322
- return this;
323
- }
324
- }
325
- export class TableDynamicDescriptor extends TableDescriptor {
326
- constructor(idProperty, titleProperty) {
327
- super({}, idProperty, titleProperty);
328
- this._excludedColumns = [];
329
- this._filterColumns = [];
330
- this._sortColumns = [];
331
- this._sortColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
332
- this._filterColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
333
- this._columns = [];
334
- this.withTitle('Dynamic table');
335
- }
336
- get columns() {
337
- return this._columns;
338
- }
339
- /**
340
- * defines excluded columns when generating descriptor
341
- * @param excludedColumn names of excluded columns
342
- */
343
- withColumnsExcluded(excludedColumn) {
344
- this._excludedColumns = excludedColumn;
345
- return this;
346
- }
347
- /**
348
- * defines column properties on which sort is defined or not depending on sortColumnMode
349
- * @param sortOnColumns column names
350
- * @param sortColumnMode INCLUDE_ONLY (default) only given columns will have sort, EXCLUDE given columns will NOT have sort
351
- */
352
- withColumnsSort(sortOnColumns, sortColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
353
- this._sortColumnMode = sortColumnMode;
354
- this._sortColumns = sortOnColumns;
355
- return this;
356
- }
357
- /**
358
- * defines column properties on which filter is defined or not depending on filterColumnMode
359
- * @param filterOnColumn column names
360
- * @param filterColumnMode INCLUDE_ONLY (default) only given columns will have filter, EXCLUDE given columns will NOT have filter
361
- */
362
- withColumnsFilter(filterOnColumn, filterColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
363
- this._filterColumnMode = filterColumnMode;
364
- this._filterColumns = filterOnColumn;
365
- return this;
366
- }
367
- /**
368
- * sets given type to column with given property and returns this table
369
- * @param property column's property
370
- * @param type custom type for column
371
- * @param args addition arguments for column
372
- */
373
- withColumnModifiedType(property, type, ...args) {
374
- const column = this._columns.find(col => property === col.property) ?? this.addColumn(property).withTitle(property);
375
- if (column) {
376
- column.asType(type, ...args);
377
- }
378
- return this;
379
- }
380
- /**
381
- * sets title to column with given property and returns this table
382
- * @param property column's property
383
- * @param title column's title
384
- */
385
- withColumnTitle(property, title) {
386
- const column = this._columns.find(col => property === col.property) ?? this.addColumn(property);
387
- column.withTitle(title, true);
388
- return this;
389
- }
390
- /**
391
- * generates columns defined on table based on data fetched from api
392
- * @param data data from api
393
- */
394
- toTableDescriptorFromData(data) {
395
- const tableDescriptor = this.toTableDescriptor();
396
- if (data.pageData == null || data.pageData.length == 0) {
397
- return tableDescriptor;
398
- }
399
- const objectModel = data.pageData[0];
400
- const entries = Object.entries(objectModel)
401
- .filter(([key]) => !this._excludedColumns.includes(key))
402
- .filter(([, value]) => !Array.isArray(value)); //exclude arrays and sets
403
- for (const [key, value] of entries) {
404
- const metaColumn = this._columns.find(col => col.property === key);
405
- let column;
406
- if (metaColumn) {
407
- if (!metaColumn.visibility) {
408
- continue;
409
- }
410
- column = metaColumn.toColumnDescriptor(tableDescriptor);
411
- tableDescriptor.addColumnDescriptor(column);
412
- }
413
- else {
414
- column = tableDescriptor.addColumn(key).withTitle(key);
415
- TableviewUtil.stringColumnConverter(column, value);
416
- }
417
- const elementOfSortColumns = this._sortColumns.includes(column.property);
418
- if ((this._sortColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfSortColumns) ||
419
- (this._sortColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfSortColumns)) {
420
- column.withSort();
421
- }
422
- const elementOfFilterColumns = this._filterColumns.includes(column.property);
423
- if ((this._filterColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfFilterColumns) ||
424
- (this._filterColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfFilterColumns)) {
425
- column.withFilter();
426
- }
427
- }
428
- return tableDescriptor;
429
- }
430
- /**
431
- * adds ColumnDynamicDescriptor to this table
432
- * @param property column's property
433
- */
434
- addColumn(property) {
435
- const column = new ColumnDynamicDescriptor(this, property);
436
- this._columns.push(column);
437
- return column;
438
- }
439
- removeColumn(property) {
440
- const column = this.columns.find(col => col.property === property) ?? this.addColumn(property);
441
- column.withVisibility(false);
442
- return this;
443
- }
444
- /**
445
- * creates deep copy of table dynamic descriptor
446
- */
447
- copy() {
448
- const descriptor = new TableDynamicDescriptor(this.model.idPropertyName, this.model.titlePropertyName);
449
- this.copyFieldsTo(descriptor);
450
- descriptor._columns = this.columns.map(c => c.copy());
451
- descriptor._excludedColumns = [...this._excludedColumns];
452
- descriptor._filterColumns = [...this._filterColumns];
453
- descriptor._sortColumns = [...this._sortColumns];
454
- descriptor._filterColumnMode = this._filterColumnMode;
455
- descriptor._sortColumnMode = this._sortColumnMode;
456
- return descriptor;
457
- }
458
- toTableDescriptor() {
459
- const descriptor = new TableDescriptor({}, this.model.idPropertyName, this.model.titlePropertyName);
460
- this.copyFieldsTo(descriptor);
461
- return descriptor;
462
- }
463
- }
1
+ import { ObjectSerializer } from '../api/utils';
2
+ import { ModelUtil } from '../utils';
3
+ import { TableviewUtil } from '../utils/tableview.util';
4
+ import { ColumnDescriptor, ColumnDynamicDescriptor } from './column.descriptor';
5
+ import { FilterLookupDescriptor } from './filter.descriptor';
6
+ import { ModelDescriptor } from './model.descriptor';
7
+ import { ColumnTypeEnum, TableDynamicColumnsModeEnum, TableFilterDisplayEnum, TablePaginationModeEnum, TableSizeEnum } from './types';
8
+ export class TableDescriptor {
9
+ constructor(modelType, idProperty, titleProperty, i18nBaseKey) {
10
+ this._filterDisplay = TableFilterDisplayEnum.Menu;
11
+ this._paginationMode = TablePaginationModeEnum.Pagination;
12
+ this._rowsPerPageOptions = [25, 50, 100];
13
+ this._defaultNumRows = this._rowsPerPageOptions[0];
14
+ this._columns = [];
15
+ this._hideHeader = false;
16
+ this._hasDefaultSort = false;
17
+ this._defaultSortProperty = [];
18
+ this._defaultSortAsc = [];
19
+ // visual
20
+ this._className = '';
21
+ this._size = TableSizeEnum.Large;
22
+ this._hasHover = true;
23
+ this._hasGridlines = false;
24
+ this._autoGenerated = false;
25
+ this._modelType = modelType;
26
+ this._model = new ModelDescriptor(modelType, idProperty, titleProperty, i18nBaseKey);
27
+ this._dataKeyProperty = idProperty ?? ModelUtil.findIdAttribute(modelType) ?? undefined;
28
+ }
29
+ /**
30
+ * generates descriptor based on modelType attribute definition
31
+ * @param modelType class type
32
+ * @param idProperty
33
+ * @param titleProperty
34
+ */
35
+ static from(modelType, idProperty, titleProperty) {
36
+ return TableDescriptor.fromModelWithAttributes(modelType, TableviewUtil.getAttributeDefMap(modelType), idProperty, titleProperty);
37
+ }
38
+ /**
39
+ * generates descriptor base on given attribute definition
40
+ * @param modelType class type
41
+ * @param attributes attributes from which descriptor is generated
42
+ * @param idProperty
43
+ * @param titleProperty
44
+ */
45
+ static fromModelWithAttributes(modelType, attributes, idProperty, titleProperty) {
46
+ const descriptor = new TableDescriptor(modelType, idProperty, titleProperty);
47
+ descriptor._autoGenerated = true;
48
+ attributes.filter(attr => !attr.type.includes('Set') && !attr.type.includes('Array')).forEach(attr => descriptor.upsertColumnFromAttributeDef(attr));
49
+ return descriptor;
50
+ }
51
+ get filterDisplay() {
52
+ return this._filterDisplay;
53
+ }
54
+ get paginationMode() {
55
+ return this._paginationMode;
56
+ }
57
+ get rowsPerPageOptions() {
58
+ return this._rowsPerPageOptions;
59
+ }
60
+ get defaultNumRows() {
61
+ return this._defaultNumRows;
62
+ }
63
+ get columns() {
64
+ return this._columns;
65
+ }
66
+ get title() {
67
+ return this._title;
68
+ }
69
+ get hideHeader() {
70
+ return this._hideHeader;
71
+ }
72
+ get dataKeyProperty() {
73
+ return this._dataKeyProperty;
74
+ }
75
+ get hasDefaultSort() {
76
+ return this._hasDefaultSort;
77
+ }
78
+ get defaultSortProperty() {
79
+ return this._defaultSortProperty;
80
+ }
81
+ get defaultSortAsc() {
82
+ return this._defaultSortAsc;
83
+ }
84
+ get model() {
85
+ return this._model;
86
+ }
87
+ get className() {
88
+ return this._className;
89
+ }
90
+ get size() {
91
+ return this._size;
92
+ }
93
+ get tableFullHeightOffset() {
94
+ return this._tableFullHeightOffset;
95
+ }
96
+ get rowHeight() {
97
+ return this._rowHeight;
98
+ }
99
+ get hasHover() {
100
+ return this._hasHover;
101
+ }
102
+ get hasGridlines() {
103
+ return this._hasGridlines;
104
+ }
105
+ get rowClassName() {
106
+ return this._rowClassName;
107
+ }
108
+ get rowClassNameMapFn() {
109
+ return this._rowClassNameMapFn;
110
+ }
111
+ get headerClassName() {
112
+ return this._headerClassName;
113
+ }
114
+ getColumn(property) {
115
+ return this._columns.find(col => col.property === property);
116
+ }
117
+ addColumnDescriptor(column) {
118
+ this._columns.push(column);
119
+ return this;
120
+ }
121
+ addColumn(property) {
122
+ const column = new ColumnDescriptor(this, property);
123
+ this._columns.push(column);
124
+ return column;
125
+ }
126
+ addColumnNumber(property, displayFormat) {
127
+ const column = new ColumnDescriptor(this, property);
128
+ column.asNumber(displayFormat);
129
+ this._columns.push(column);
130
+ return column;
131
+ }
132
+ addColumnDate(property, displayFormat) {
133
+ const column = new ColumnDescriptor(this, property);
134
+ column.asDate(displayFormat);
135
+ this._columns.push(column);
136
+ return column;
137
+ }
138
+ addColumnBoolean(property, yes, no, asIcon = false) {
139
+ const column = new ColumnDescriptor(this, property);
140
+ column.asBoolean(yes, no, asIcon);
141
+ this._columns.push(column);
142
+ return column;
143
+ }
144
+ addColumnEnum(property, enumType, nameAsValue = false, titlePath) {
145
+ const column = new ColumnDescriptor(this, property);
146
+ column.asEnum(enumType, nameAsValue, titlePath);
147
+ this._columns.push(column);
148
+ return column;
149
+ }
150
+ addColumnCustomComponent(property, customComponentType) {
151
+ const column = new ColumnDescriptor(this, property);
152
+ column.asCustomComponent(customComponentType);
153
+ this._columns.push(column);
154
+ return column;
155
+ }
156
+ removeColumn(property) {
157
+ const columndIdx = this._columns.findIndex(c => c.property === property);
158
+ this._columns.splice(columndIdx, 1);
159
+ }
160
+ withFilterDisplay(filterDisplayType) {
161
+ this._filterDisplay = filterDisplayType;
162
+ return this;
163
+ }
164
+ withPaginationMode(paginationMode) {
165
+ this._paginationMode = paginationMode;
166
+ return this;
167
+ }
168
+ withRowsPerPage(rows, options) {
169
+ if (options) {
170
+ this._rowsPerPageOptions = options;
171
+ }
172
+ if (!this._rowsPerPageOptions.includes(rows)) {
173
+ this._defaultNumRows = this._rowsPerPageOptions[0];
174
+ }
175
+ else {
176
+ this._defaultNumRows = rows;
177
+ }
178
+ return this;
179
+ }
180
+ withTitle(title) {
181
+ this._title = title;
182
+ return this;
183
+ }
184
+ withHideHeader(hideHeader = true) {
185
+ this._hideHeader = hideHeader;
186
+ return this;
187
+ }
188
+ withDataKeyProperty(property) {
189
+ this._dataKeyProperty = property;
190
+ return this;
191
+ }
192
+ withDefaultSort(property, asc = true) {
193
+ this._hasDefaultSort = true;
194
+ this._defaultSortProperty.push(property);
195
+ this._defaultSortAsc.push(asc);
196
+ return this;
197
+ }
198
+ withClassName(className) {
199
+ this._className = className;
200
+ return this;
201
+ }
202
+ withSize(size = TableSizeEnum.Normal) {
203
+ this._size = size;
204
+ return this;
205
+ }
206
+ withTableFullHeightOffset(tableFullHeightOffset) {
207
+ this._tableFullHeightOffset = tableFullHeightOffset;
208
+ return this;
209
+ }
210
+ withRowHeight(rowHeight) {
211
+ this._rowHeight = rowHeight;
212
+ return this;
213
+ }
214
+ withHover(hover) {
215
+ this._hasHover = hover;
216
+ return this;
217
+ }
218
+ withGridlines(gridlines) {
219
+ this._hasGridlines = gridlines;
220
+ return this;
221
+ }
222
+ withRowClassName(rowClassName, classNameMapFn) {
223
+ this._rowClassName = rowClassName;
224
+ this._rowClassNameMapFn = classNameMapFn;
225
+ return this;
226
+ }
227
+ withHeaderClassName(headerClassName) {
228
+ this._headerClassName = headerClassName;
229
+ return this;
230
+ }
231
+ copyFieldsTo(obj) {
232
+ obj._title = this._title;
233
+ obj._hideHeader = this._hideHeader;
234
+ obj._dataKeyProperty = this._dataKeyProperty;
235
+ obj._hasDefaultSort = this._hasDefaultSort;
236
+ obj._defaultSortProperty = this._defaultSortProperty.map(p => p);
237
+ obj._defaultSortAsc = this._defaultSortAsc.map(p => p);
238
+ obj._filterDisplay = this._filterDisplay;
239
+ obj._className = this._className;
240
+ obj._size = this._size;
241
+ obj._tableFullHeightOffset = this._tableFullHeightOffset;
242
+ obj._rowHeight = this._rowHeight;
243
+ obj._hasHover = this._hasHover;
244
+ obj._hasGridlines = this._hasGridlines;
245
+ }
246
+ copy() {
247
+ const descriptor = new TableDescriptor(this.model.type, this.model.idPropertyName, this.model.titlePropertyName);
248
+ this.copyFieldsTo(descriptor);
249
+ descriptor._columns = this.columns.map(c => c.copy());
250
+ return descriptor;
251
+ }
252
+ /**
253
+ * generates column based on attributes
254
+ * @param attribute attribute map
255
+ * @param column if provided, replaced by new, otherwise new is created
256
+ * @param args additional parameters
257
+ */
258
+ upsertColumnFromAttributeDef(attribute, column, ...args) {
259
+ if (column == null) {
260
+ column = this.addColumn(attribute.name);
261
+ }
262
+ if (attribute.columnType === ColumnTypeEnum.Enum && args.length === 0) {
263
+ args = [attribute.enumType];
264
+ }
265
+ column = column.asType(attribute.columnType, ...args);
266
+ if (attribute.classType) {
267
+ column.withObjectProperty(attribute.classType).withSort();
268
+ }
269
+ else {
270
+ column.withSort().withFilter();
271
+ }
272
+ return column;
273
+ }
274
+ /**
275
+ * defines modified type of column
276
+ * DO NOT USE with enum (use withCustomEnumType)
277
+ * @param property column name
278
+ * @param columnType modified type
279
+ * @param args additional attributes
280
+ */
281
+ withColumnModifiedType(property, columnType, ...args) {
282
+ const attributeDef = TableviewUtil.getAttributeDefMap(this._modelType).find(atribute => atribute.name === property);
283
+ if (attributeDef != null) {
284
+ attributeDef.columnType = columnType ?? attributeDef.columnType;
285
+ this.upsertColumnFromAttributeDef(attributeDef, this.columns.find(col => col.property === attributeDef.name), ...args);
286
+ }
287
+ return this;
288
+ }
289
+ /**
290
+ * defines custom enum type for column
291
+ * @param property column name
292
+ * @param enumType
293
+ */
294
+ withColumnModifiedEnum(property, enumType) {
295
+ const attributeDef = TableviewUtil.getAttributeDefMap(this._modelType).find(atribute => atribute.name === property);
296
+ if (attributeDef != null) {
297
+ attributeDef.columnType = ColumnTypeEnum.Enum;
298
+ this.upsertColumnFromAttributeDef(attributeDef, this.columns.find(col => col.property === property), enumType ?? ObjectSerializer.get().findEnum(attributeDef.type));
299
+ }
300
+ return this;
301
+ }
302
+ /**
303
+ * modifies column with class and lookup provider
304
+ * @param property column name
305
+ * @param lookupProvider lookupProvider for class
306
+ * @param itemsLabelProperty
307
+ * @param filterProperty
308
+ */
309
+ withColumnModifiedLookup(property, lookupProvider, itemsLabelProperty, filterProperty) {
310
+ const column = this.columns.find(col => col.property === property);
311
+ if (column) {
312
+ column.withFilterLookup().withLookupDataProvider(lookupProvider);
313
+ if (column instanceof FilterLookupDescriptor) {
314
+ if (itemsLabelProperty) {
315
+ column.withItemsLabelProperty(itemsLabelProperty);
316
+ }
317
+ if (filterProperty) {
318
+ column.withFilterProperty(filterProperty);
319
+ }
320
+ }
321
+ }
322
+ return this;
323
+ }
324
+ }
325
+ export class TableDynamicDescriptor extends TableDescriptor {
326
+ constructor(idProperty, titleProperty) {
327
+ super({}, idProperty, titleProperty);
328
+ this._excludedColumns = [];
329
+ this._filterColumns = [];
330
+ this._sortColumns = [];
331
+ this._sortColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
332
+ this._filterColumnMode = TableDynamicColumnsModeEnum.EXCLUDE;
333
+ this._columns = [];
334
+ this.withTitle('Dynamic table');
335
+ }
336
+ get columns() {
337
+ return this._columns;
338
+ }
339
+ /**
340
+ * defines excluded columns when generating descriptor
341
+ * @param excludedColumn names of excluded columns
342
+ */
343
+ withColumnsExcluded(excludedColumn) {
344
+ this._excludedColumns = excludedColumn;
345
+ return this;
346
+ }
347
+ /**
348
+ * defines column properties on which sort is defined or not depending on sortColumnMode
349
+ * @param sortOnColumns column names
350
+ * @param sortColumnMode INCLUDE_ONLY (default) only given columns will have sort, EXCLUDE given columns will NOT have sort
351
+ */
352
+ withColumnsSort(sortOnColumns, sortColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
353
+ this._sortColumnMode = sortColumnMode;
354
+ this._sortColumns = sortOnColumns;
355
+ return this;
356
+ }
357
+ /**
358
+ * defines column properties on which filter is defined or not depending on filterColumnMode
359
+ * @param filterOnColumn column names
360
+ * @param filterColumnMode INCLUDE_ONLY (default) only given columns will have filter, EXCLUDE given columns will NOT have filter
361
+ */
362
+ withColumnsFilter(filterOnColumn, filterColumnMode = TableDynamicColumnsModeEnum.INCLUDE_ONLY) {
363
+ this._filterColumnMode = filterColumnMode;
364
+ this._filterColumns = filterOnColumn;
365
+ return this;
366
+ }
367
+ /**
368
+ * sets given type to column with given property and returns this table
369
+ * @param property column's property
370
+ * @param type custom type for column
371
+ * @param args addition arguments for column
372
+ */
373
+ withColumnModifiedType(property, type, ...args) {
374
+ const column = this._columns.find(col => property === col.property) ?? this.addColumn(property).withTitle(property);
375
+ if (column) {
376
+ column.asType(type, ...args);
377
+ }
378
+ return this;
379
+ }
380
+ /**
381
+ * sets title to column with given property and returns this table
382
+ * @param property column's property
383
+ * @param title column's title
384
+ */
385
+ withColumnTitle(property, title) {
386
+ const column = this._columns.find(col => property === col.property) ?? this.addColumn(property);
387
+ column.withTitle(title, true);
388
+ return this;
389
+ }
390
+ /**
391
+ * generates columns defined on table based on data fetched from api
392
+ * @param data data from api
393
+ */
394
+ toTableDescriptorFromData(data) {
395
+ const tableDescriptor = this.toTableDescriptor();
396
+ if (data.pageData == null || data.pageData.length == 0) {
397
+ return tableDescriptor;
398
+ }
399
+ const objectModel = data.pageData[0];
400
+ const entries = Object.entries(objectModel)
401
+ .filter(([key]) => !this._excludedColumns.includes(key))
402
+ .filter(([, value]) => !Array.isArray(value)); //exclude arrays and sets
403
+ for (const [key, value] of entries) {
404
+ const metaColumn = this._columns.find(col => col.property === key);
405
+ let column;
406
+ if (metaColumn) {
407
+ if (!metaColumn.visibility) {
408
+ continue;
409
+ }
410
+ column = metaColumn.toColumnDescriptor(tableDescriptor);
411
+ tableDescriptor.addColumnDescriptor(column);
412
+ }
413
+ else {
414
+ column = tableDescriptor.addColumn(key).withTitle(key);
415
+ TableviewUtil.stringColumnConverter(column, value);
416
+ }
417
+ const elementOfSortColumns = this._sortColumns.includes(column.property);
418
+ if ((this._sortColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfSortColumns) ||
419
+ (this._sortColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfSortColumns)) {
420
+ column.withSort();
421
+ }
422
+ const elementOfFilterColumns = this._filterColumns.includes(column.property);
423
+ if ((this._filterColumnMode === TableDynamicColumnsModeEnum.EXCLUDE && !elementOfFilterColumns) ||
424
+ (this._filterColumnMode === TableDynamicColumnsModeEnum.INCLUDE_ONLY && elementOfFilterColumns)) {
425
+ column.withFilter();
426
+ }
427
+ }
428
+ return tableDescriptor;
429
+ }
430
+ /**
431
+ * adds ColumnDynamicDescriptor to this table
432
+ * @param property column's property
433
+ */
434
+ addColumn(property) {
435
+ const column = new ColumnDynamicDescriptor(this, property);
436
+ this._columns.push(column);
437
+ return column;
438
+ }
439
+ removeColumn(property) {
440
+ const column = this.columns.find(col => col.property === property) ?? this.addColumn(property);
441
+ column.withVisibility(false);
442
+ return this;
443
+ }
444
+ /**
445
+ * creates deep copy of table dynamic descriptor
446
+ */
447
+ copy() {
448
+ const descriptor = new TableDynamicDescriptor(this.model.idPropertyName, this.model.titlePropertyName);
449
+ this.copyFieldsTo(descriptor);
450
+ descriptor._columns = this.columns.map(c => c.copy());
451
+ descriptor._excludedColumns = [...this._excludedColumns];
452
+ descriptor._filterColumns = [...this._filterColumns];
453
+ descriptor._sortColumns = [...this._sortColumns];
454
+ descriptor._filterColumnMode = this._filterColumnMode;
455
+ descriptor._sortColumnMode = this._sortColumnMode;
456
+ return descriptor;
457
+ }
458
+ toTableDescriptor() {
459
+ const descriptor = new TableDescriptor({}, this.model.idPropertyName, this.model.titlePropertyName);
460
+ this.copyFieldsTo(descriptor);
461
+ return descriptor;
462
+ }
463
+ }
464
464
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvdGFibGUuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFLOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHVCQUF1QixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXBJLE1BQU0sT0FBTyxlQUFlO0lBOEJ4QixZQUFZLFNBQXVCLEVBQUUsVUFBbUIsRUFBRSxhQUFzQixFQUFFLFdBQXlDO1FBM0JuSCxtQkFBYyxHQUEyQixzQkFBc0IsQ0FBQyxJQUFJLENBQUM7UUFDckUsb0JBQWUsR0FBNEIsdUJBQXVCLENBQUMsVUFBVSxDQUFDO1FBQzlFLHdCQUFtQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxvQkFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxhQUFRLEdBQW9DLEVBQUUsQ0FBQztRQUVqRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4Qix5QkFBb0IsR0FBYSxFQUFFLENBQUM7UUFDcEMsb0JBQWUsR0FBYyxFQUFF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QUN0RCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELFVBQVUsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxVQUFVLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsVUFBVSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFvQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzSCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtPYmplY3RTZXJpYWxpemVyfSBmcm9tICcuLi9hcGkvdXRpbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0lDb2x1bW5WYWx1ZUNvbXBvbmVudH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7VGFibGV2aWV3QXR0cmlidXRlRGVmfSBmcm9tICcuLi9tb2RlbHMvdGFibGV2aWV3LWF0dHIubW9kZWwnO1xuaW1wb3J0IHtDbGFzc1R5cGUsIEVudW1UeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge01vZGVsVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtUYWJsZXZpZXdVdGlsfSBmcm9tICcuLi91dGlscy90YWJsZXZpZXcudXRpbCc7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yfSBmcm9tICcuL2NvbHVtbi5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmlsdGVyTG9va3VwRGVzY3JpcHRvcn0gZnJvbSAnLi9maWx0ZXIuZGVzY3JpcHRvcic7XG5pbXBvcnQge01vZGVsRGVzY3JpcHRvcn0gZnJvbSAnLi9tb2RlbC5kZXNjcmlwdG9yJztcbmltcG9ydCB7Q29sdW1uVHlwZUVudW0sIFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bSwgVGFibGVGaWx0ZXJEaXNwbGF5RW51bSwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW0sIFRhYmxlU2l6ZUVudW19IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+O1xuICAgIHByaXZhdGUgX2ZpbHRlckRpc3BsYXk6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLk1lbnU7XG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvbk1vZGU6IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtID0gVGFibGVQYWdpbmF0aW9uTW9kZUVudW0uUGFnaW5hdGlvbjtcbiAgICBwcml2YXRlIF9yb3dzUGVyUGFnZU9wdGlvbnMgPSBbMjUsIDUwLCAxMDBdO1xuICAgIHByaXZhdGUgX2RlZmF1bHROdW1Sb3dzID0gdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zWzBdO1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogQXJyYXk8Q29sdW1uRGVzY3JpcHRvcjxhbnksIFQ+PiA9IFtdO1xuICAgIHByaXZhdGUgX3RpdGxlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2hpZGVIZWFkZXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9kYXRhS2V5UHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9oYXNEZWZhdWx0U29ydCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2RlZmF1bHRTb3J0UHJvcGVydHk6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfZGVmYXVsdFNvcnRBc2M6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgcHJpdmF0ZSBfY2xhc3NOYW1lID0gJyc7XG4gICAgcHJpdmF0ZSBfc2l6ZTogVGFibGVTaXplRW51bSA9IFRhYmxlU2l6ZUVudW0uTGFyZ2U7XG4gICAgcHJpdmF0ZSBfdGFibGVGdWxsSGVpZ2h0T2Zmc2V0PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3Jvd0hlaWdodD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9oYXNIb3ZlciA9IHRydWU7XG4gICAgcHJpdmF0ZSBfaGFzR3JpZGxpbmVzID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9oZWFkZXJDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcm93Q2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3Jvd0NsYXNzTmFtZU1hcEZuPzogKGNsYXNzTmFtZT86IHN0cmluZywgaXRlbT86IFQpID0+IHN0cmluZztcblxuICAgIHByaXZhdGUgX2F1dG9HZW5lcmF0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCBpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nLCBpMThuQmFzZUtleT86IHN0cmluZyB8IENsYXNzVHlwZTx1bmtub3duPikge1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbmV3IE1vZGVsRGVzY3JpcHRvcjxUPihtb2RlbFR5cGUsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHksIGkxOG5CYXNlS2V5KTtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gaWRQcm9wZXJ0eSA/PyBNb2RlbFV0aWwuZmluZElkQXR0cmlidXRlKG1vZGVsVHlwZSkgPz8gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlcyBkZXNjcmlwdG9yIGJhc2VkIG9uIG1vZGVsVHlwZSBhdHRyaWJ1dGUgZGVmaW5pdGlvblxuICAgICAqIEBwYXJhbSBtb2RlbFR5cGUgY2xhc3MgdHlwZVxuICAgICAqIEBwYXJhbSBpZFByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlUHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VD4obW9kZWxUeXBlOiBDbGFzc1R5cGU8VD4sIGlkUHJvcGVydHk/OiBzdHJpbmcsIHRpdGxlUHJvcGVydHk/OiBzdHJpbmcpOiBUYWJsZURlc2NyaXB0b3I8VD4ge1xuICAgICAgICByZXR1cm4gVGFibGVEZXNjcmlwdG9yLmZyb21Nb2RlbFdpdGhBdHRyaWJ1dGVzKG1vZGVsVHlwZSwgVGFibGV2aWV3VXRpbC5nZXRBdHRyaWJ1dGVEZWZNYXAobW9kZWxUeXBlKSwgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGRlc2NyaXB0b3IgYmFzZSBvbiBnaXZlbiBhdHRyaWJ1dGUgZGVmaW5pdGlvblxuICAgICAqIEBwYXJhbSBtb2RlbFR5cGUgY2xhc3MgdHlwZVxuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgZnJvbSB3aGljaCBkZXNjcmlwdG9yIGlzIGdlbmVyYXRlZFxuICAgICAqIEBwYXJhbSBpZFByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlUHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Nb2RlbFdpdGhBdHRyaWJ1dGVzPFQ+KG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCBhdHRyaWJ1dGVzOiBUYWJsZXZpZXdBdHRyaWJ1dGVEZWZbXSwgaWRQcm9wZXJ0eT86IHN0cmluZywgdGl0bGVQcm9wZXJ0eT86IHN0cmluZyk6IFRhYmxlRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGVEZXNjcmlwdG9yKG1vZGVsVHlwZSwgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2F1dG9HZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICBhdHRyaWJ1dGVzLmZpbHRlcihhdHRyID0+ICFhdHRyLnR5cGUuaW5jbHVkZXMoJ1NldCcpICYmICFhdHRyLnR5cGUuaW5jbHVkZXMoJ0FycmF5JykpLmZvckVhY2goYXR0ciA9PiBkZXNjcmlwdG9yLnVwc2VydENvbHVtbkZyb21BdHRyaWJ1dGVEZWYoYXR0cikpO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlckRpc3BsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJEaXNwbGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnaW5hdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBnZXQgcm93c1BlclBhZ2VPcHRpb25zKCk6IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdE51bVJvd3MoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHROdW1Sb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlkZUhlYWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVIZWFkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWZhdWx0U29ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0RlZmF1bHRTb3J0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFNvcnRQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRTb3J0UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0U29ydEFzYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRTb3J0QXNjO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGVGdWxsSGVpZ2h0T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGVGdWxsSGVpZ2h0T2Zmc2V0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNIb3ZlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0dyaWRsaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0dyaWRsaW5lcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0NsYXNzTmFtZU1hcEZuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93Q2xhc3NOYW1lTWFwRm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogQ29sdW1uRGVzY3JpcHRvcjxzdHJpbmcsIFQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbkRlc2NyaXB0b3I8Q1Q+KGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxDVCwgVD4pOiBUYWJsZURlc2NyaXB0b3I8VD4ge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogQ29sdW1uRGVzY3JpcHRvcjxzdHJpbmcsIFQ+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkRlc2NyaXB0b3I8c3RyaW5nLCBUPih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb2x1bW5OdW1iZXIocHJvcGVydHk6IHN0cmluZywgZGlzcGxheUZvcm1hdD86IHN0cmluZyk6IENvbHVtbkRlc2NyaXB0b3I8bnVtYmVyLCBUPiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yPG51bWJlciwgVD4odGhpcywgcHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4uYXNOdW1iZXIoZGlzcGxheUZvcm1hdCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb2x1bW5EYXRlKHByb3BlcnR5OiBzdHJpbmcsIGRpc3BsYXlGb3JtYXQ/OiBzdHJpbmcpOiBDb2x1bW5EZXNjcmlwdG9yPERhdGUsIFQ+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbmV3IENvbHVtbkRlc2NyaXB0b3I8RGF0ZSwgVD4odGhpcywgcHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4uYXNEYXRlKGRpc3BsYXlGb3JtYXQpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29sdW1uQm9vbGVhbihwcm9wZXJ0eTogc3RyaW5nLCB5ZXM/OiBzdHJpbmcsIG5vPzogc3RyaW5nLCBhc0ljb24gPSBmYWxzZSk6IENvbHVtbkRlc2NyaXB0b3I8Ym9vbGVhbiwgVD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxib29sZWFuLCBUPih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIGNvbHVtbi5hc0Jvb2xlYW4oeWVzLCBubywgYXNJY29uKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbkVudW0ocHJvcGVydHk6IHN0cmluZywgZW51bVR5cGU6IEVudW1UeXBlLCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCB0aXRsZVBhdGg/OiBzdHJpbmcgfCBudWxsKTogQ29sdW1uRGVzY3JpcHRvcjxFbnVtVHlwZSwgVD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxFbnVtVHlwZSwgVD4odGhpcywgcHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4uYXNFbnVtKGVudW1UeXBlLCBuYW1lQXNWYWx1ZSwgdGl0bGVQYXRoKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbkN1c3RvbUNvbXBvbmVudChwcm9wZXJ0eTogc3RyaW5nLCBjdXN0b21Db21wb25lbnRUeXBlOiBUeXBlPElDb2x1bW5WYWx1ZUNvbXBvbmVudDxUPj4pOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcjxhbnksIFQ+KHRoaXMsIHByb3BlcnR5KTtcbiAgICAgICAgY29sdW1uLmFzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uKHByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sdW1uZElkeCA9IHRoaXMuX2NvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zLnNwbGljZShjb2x1bW5kSWR4LCAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpbHRlckRpc3BsYXkoZmlsdGVyRGlzcGxheVR5cGU6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyRGlzcGxheSA9IGZpbHRlckRpc3BsYXlUeXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb25Nb2RlOiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uTW9kZSA9IHBhZ2luYXRpb25Nb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvd3NQZXJQYWdlKHJvd3M6IG51bWJlciwgb3B0aW9ucz86IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd3NQZXJQYWdlT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9yb3dzUGVyUGFnZU9wdGlvbnMuaW5jbHVkZXMocm93cykpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHROdW1Sb3dzID0gdGhpcy5fcm93c1BlclBhZ2VPcHRpb25zWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdE51bVJvd3MgPSByb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGl0bGUodGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhpZGVIZWFkZXIoaGlkZUhlYWRlciA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5faGlkZUhlYWRlciA9IGhpZGVIZWFkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YUtleVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnQocHJvcGVydHk6IHN0cmluZywgYXNjID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNEZWZhdWx0U29ydCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRTb3J0UHJvcGVydHkucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRTb3J0QXNjLnB1c2goYXNjKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNpemUoc2l6ZTogVGFibGVTaXplRW51bSA9IFRhYmxlU2l6ZUVudW0uTm9ybWFsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhYmxlRnVsbEhlaWdodE9mZnNldCh0YWJsZUZ1bGxIZWlnaHRPZmZzZXQ6IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPSB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUm93SGVpZ2h0KHJvd0hlaWdodDogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIb3Zlcihob3ZlcjogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNIb3ZlciA9IGhvdmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdyaWRsaW5lcyhncmlkbGluZXM6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzR3JpZGxpbmVzID0gZ3JpZGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvd0NsYXNzTmFtZShyb3dDbGFzc05hbWU/OiBzdHJpbmcsIGNsYXNzTmFtZU1hcEZuPzogKGNsYXNzTmFtZT86IHN0cmluZywgaXRlbT86IFQpID0+IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9yb3dDbGFzc05hbWUgPSByb3dDbGFzc05hbWU7XG4gICAgICAgIHRoaXMuX3Jvd0NsYXNzTmFtZU1hcEZuID0gY2xhc3NOYW1lTWFwRm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSGVhZGVyQ2xhc3NOYW1lKGhlYWRlckNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hlYWRlckNsYXNzTmFtZSA9IGhlYWRlckNsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcHlGaWVsZHNUbyhvYmo6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBvYmouX3RpdGxlID0gdGhpcy5fdGl0bGU7XG4gICAgICAgIG9iai5faGlkZUhlYWRlciA9IHRoaXMuX2hpZGVIZWFkZXI7XG4gICAgICAgIG9iai5fZGF0YUtleVByb3BlcnR5ID0gdGhpcy5fZGF0YUtleVByb3BlcnR5O1xuICAgICAgICBvYmouX2hhc0RlZmF1bHRTb3J0ID0gdGhpcy5faGFzRGVmYXVsdFNvcnQ7XG4gICAgICAgIG9iai5fZGVmYXVsdFNvcnRQcm9wZXJ0eSA9IHRoaXMuX2RlZmF1bHRTb3J0UHJvcGVydHkubWFwKHAgPT4gcCk7XG4gICAgICAgIG9iai5fZGVmYXVsdFNvcnRBc2MgPSB0aGlzLl9kZWZhdWx0U29ydEFzYy5tYXAocCA9PiBwKTtcbiAgICAgICAgb2JqLl9maWx0ZXJEaXNwbGF5ID0gdGhpcy5fZmlsdGVyRGlzcGxheTtcbiAgICAgICAgb2JqLl9jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XG4gICAgICAgIG9iai5fc2l6ZSA9IHRoaXMuX3NpemU7XG4gICAgICAgIG9iai5fdGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gdGhpcy5fdGFibGVGdWxsSGVpZ2h0T2Zmc2V0O1xuICAgICAgICBvYmouX3Jvd0hlaWdodCA9IHRoaXMuX3Jvd0hlaWdodDtcbiAgICAgICAgb2JqLl9oYXNIb3ZlciA9IHRoaXMuX2hhc0hvdmVyO1xuICAgICAgICBvYmouX2hhc0dyaWRsaW5lcyA9IHRoaXMuX2hhc0dyaWRsaW5lcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBUYWJsZURlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvcih0aGlzLm1vZGVsLnR5cGUsIHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlcyBjb2x1bW4gYmFzZWQgb24gYXR0cmlidXRlc1xuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgYXR0cmlidXRlIG1hcFxuICAgICAqIEBwYXJhbSBjb2x1bW4gaWYgcHJvdmlkZWQsIHJlcGxhY2VkIGJ5IG5ldywgb3RoZXJ3aXNlIG5ldyBpcyBjcmVhdGVkXG4gICAgICogQHBhcmFtIGFyZ3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cHNlcnRDb2x1bW5Gcm9tQXR0cmlidXRlRGVmKGF0dHJpYnV0ZTogVGFibGV2aWV3QXR0cmlidXRlRGVmLCBjb2x1bW4/OiBDb2x1bW5EZXNjcmlwdG9yPHN0cmluZywgVD4sIC4uLmFyZ3M6IGFueVtdKTogQ29sdW1uRGVzY3JpcHRvcjxzdHJpbmcsIFQ+IHtcbiAgICAgICAgaWYgKGNvbHVtbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb2x1bW4gPSB0aGlzLmFkZENvbHVtbihhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0cmlidXRlLmNvbHVtblR5cGUgPT09IENvbHVtblR5cGVFbnVtLkVudW0gJiYgYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBbYXR0cmlidXRlLmVudW1UeXBlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbHVtbiA9IGNvbHVtbi5hc1R5cGUoYXR0cmlidXRlLmNvbHVtblR5cGUsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoYXR0cmlidXRlLmNsYXNzVHlwZSkge1xuICAgICAgICAgICAgY29sdW1uLndpdGhPYmplY3RQcm9wZXJ0eShhdHRyaWJ1dGUuY2xhc3NUeXBlKS53aXRoU29ydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sdW1uLndpdGhTb3J0KCkud2l0aEZpbHRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIG1vZGlmaWVkIHR5cGUgb2YgY29sdW1uXG4gICAgICogRE8gTk9UIFVTRSB3aXRoIGVudW0gKHVzZSB3aXRoQ3VzdG9tRW51bVR5cGUpXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbiBuYW1lXG4gICAgICogQHBhcmFtIGNvbHVtblR5cGUgbW9kaWZpZWQgdHlwZVxuICAgICAqIEBwYXJhbSBhcmdzIGFkZGl0aW9uYWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uTW9kaWZpZWRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIGNvbHVtblR5cGU/OiBDb2x1bW5UeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlRGVmID0gVGFibGV2aWV3VXRpbC5nZXRBdHRyaWJ1dGVEZWZNYXAodGhpcy5fbW9kZWxUeXBlKS5maW5kKGF0cmlidXRlID0+IGF0cmlidXRlLm5hbWUgPT09IHByb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlRGVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZURlZi5jb2x1bW5UeXBlID0gY29sdW1uVHlwZSA/PyBhdHRyaWJ1dGVEZWYuY29sdW1uVHlwZTtcbiAgICAgICAgICAgIHRoaXMudXBzZXJ0Q29sdW1uRnJvbUF0dHJpYnV0ZURlZihcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVEZWYsXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5wcm9wZXJ0eSA9PT0gYXR0cmlidXRlRGVmLm5hbWUpLFxuICAgICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGN1c3RvbSBlbnVtIHR5cGUgZm9yIGNvbHVtblxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4gbmFtZVxuICAgICAqIEBwYXJhbSBlbnVtVHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uTW9kaWZpZWRFbnVtKHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlPzogRW51bVR5cGUpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlRGVmID0gVGFibGV2aWV3VXRpbC5nZXRBdHRyaWJ1dGVEZWZNYXAodGhpcy5fbW9kZWxUeXBlKS5maW5kKGF0cmlidXRlID0+IGF0cmlidXRlLm5hbWUgPT09IHByb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlRGVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZURlZi5jb2x1bW5UeXBlID0gQ29sdW1uVHlwZUVudW0uRW51bTtcbiAgICAgICAgICAgIHRoaXMudXBzZXJ0Q29sdW1uRnJvbUF0dHJpYnV0ZURlZihcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVEZWYsXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpLFxuICAgICAgICAgICAgICAgIGVudW1UeXBlID8/IChPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKGF0dHJpYnV0ZURlZi50eXBlKSBhcyBFbnVtVHlwZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBtb2RpZmllcyBjb2x1bW4gd2l0aCBjbGFzcyBhbmQgbG9va3VwIHByb3ZpZGVyXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbiBuYW1lXG4gICAgICogQHBhcmFtIGxvb2t1cFByb3ZpZGVyIGxvb2t1cFByb3ZpZGVyIGZvciBjbGFzc1xuICAgICAqIEBwYXJhbSBpdGVtc0xhYmVsUHJvcGVydHlcbiAgICAgKiBAcGFyYW0gZmlsdGVyUHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbk1vZGlmaWVkTG9va3VwKHByb3BlcnR5OiBzdHJpbmcsIGxvb2t1cFByb3ZpZGVyOiBJTG9va3VwRGF0YVByb3ZpZGVyPGFueSwgYW55PiwgaXRlbXNMYWJlbFByb3BlcnR5Pzogc3RyaW5nLCBmaWx0ZXJQcm9wZXJ0eT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbHVtbi53aXRoRmlsdGVyTG9va3VwKCkud2l0aExvb2t1cERhdGFQcm92aWRlcihsb29rdXBQcm92aWRlcik7XG4gICAgICAgICAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgRmlsdGVyTG9va3VwRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtc0xhYmVsUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgKGNvbHVtbiBhcyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPFQ+KS53aXRoSXRlbXNMYWJlbFByb3BlcnR5KGl0ZW1zTGFiZWxQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIChjb2x1bW4gYXMgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxUPikud2l0aEZpbHRlclByb3BlcnR5KGZpbHRlclByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2FsbGVkIG9uIGRhdGEgcmVjZWl2ZWQgdG8gY3VzdG9taXplIFN0cmluZyBwcm9wZXJ0aWVzIHdpdGggZWl0aGVyIERhdGEgb3IgTnVtYmVyIHR5cGVcbiAgICAgKiBAcGFyYW0gZGF0YSBhcGkgcmVzcG9uc2VcbiAgICAgKi9cbiAgICAvLyBwdWJsaWMgb25EYXRhUmVjZWl2ZWRUeXBlQnVpbGRpbmcoZGF0YTogTWVkaXVzUXVlcnlSZXN1bHQ8VD4pOiB0aGlzIHtcbiAgICAvLyAgICAgaWYgKCF0aGlzLl9hdXRvR2VuZXJhdGVkKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcztcbiAgICAvLyAgICAgfSBlbHNlIGlmIChkYXRhLnBhZ2VEYXRhID09IG51bGwgfHwgZGF0YS5wYWdlRGF0YS5sZW5ndGggPT0gMCkge1xuICAgIC8vICAgICAgICAgdGhyb3cgRXJyb3IoJ1BhZ2VEYXRhIGlzIGVtcHR5LCBjYW5ub3QgZ2VuZXJhdGUgZGVzY3JpcHRvcicpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IG9iamVjdE1vZGVsID0gZGF0YS5wYWdlRGF0YVswXTtcbiAgICAvLyAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdE1vZGVsKTtcbiAgICAvL1xuICAgIC8vICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgLy8gICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBUYWJsZXZpZXdVdGlsLmdldEF0dHJpYnV0ZURlZk1hcCh0aGlzLl9tb2RlbFR5cGUpLmZpbmQoYSA9PiBhLm5hbWUgPT09IGtleSk7XG4gICAgLy8gICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5jb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlRW51bS5TdHJpbmcpIHtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBhdHRyaWJ1dGUubmFtZSk7XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIFRhYmxldmlld1V0aWwuc3RyaW5nQ29sdW1uQ29udmVydGVyKGNvbHVtbiwgdmFsdWUpO1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vXG4gICAgLy8gICAgIHJldHVybiB0aGlzO1xuICAgIC8vIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3IgZXh0ZW5kcyBUYWJsZURlc2NyaXB0b3I8YW55PiB7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZWRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgX3NvcnRDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBfc29ydENvbHVtbk1vZGUgPSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERTtcbiAgICBwcml2YXRlIF9maWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLkVYQ0xVREU7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2NvbHVtbnM6IENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGlkUHJvcGVydHk/OiBzdHJpbmcsIHRpdGxlUHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoe30gYXMgQ2xhc3NUeXBlPGFueT4sIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHkpO1xuICAgICAgICB0aGlzLndpdGhUaXRsZSgnRHluYW1pYyB0YWJsZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgY29sdW1ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGVmaW5lcyBleGNsdWRlZCBjb2x1bW5zIHdoZW4gZ2VuZXJhdGluZyBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIGV4Y2x1ZGVkQ29sdW1uIG5hbWVzIG9mIGV4Y2x1ZGVkIGNvbHVtbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnNFeGNsdWRlZChleGNsdWRlZENvbHVtbjogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZXhjbHVkZWRDb2x1bW5zID0gZXhjbHVkZWRDb2x1bW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlZmluZXMgY29sdW1uIHByb3BlcnRpZXMgb24gd2hpY2ggc29ydCBpcyBkZWZpbmVkIG9yIG5vdCBkZXBlbmRpbmcgb24gc29ydENvbHVtbk1vZGVcbiAgICAgKiBAcGFyYW0gc29ydE9uQ29sdW1ucyBjb2x1bW4gbmFtZXNcbiAgICAgKiBAcGFyYW0gc29ydENvbHVtbk1vZGUgSU5DTFVERV9PTkxZIChkZWZhdWx0KSBvbmx5IGdpdmVuIGNvbHVtbnMgd2lsbCBoYXZlIHNvcnQsIEVYQ0xVREUgZ2l2ZW4gY29sdW1ucyB3aWxsIE5PVCBoYXZlIHNvcnRcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnNTb3J0KHNvcnRPbkNvbHVtbnM6IHN0cmluZ1tdLCBzb3J0Q29sdW1uTW9kZSA9IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5JTkNMVURFX09OTFkpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc29ydENvbHVtbk1vZGUgPSBzb3J0Q29sdW1uTW9kZTtcbiAgICAgICAgdGhpcy5fc29ydENvbHVtbnMgPSBzb3J0T25Db2x1bW5zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZWZpbmVzIGNvbHVtbiBwcm9wZXJ0aWVzIG9uIHdoaWNoIGZpbHRlciBpcyBkZWZpbmVkIG9yIG5vdCBkZXBlbmRpbmcgb24gZmlsdGVyQ29sdW1uTW9kZVxuICAgICAqIEBwYXJhbSBmaWx0ZXJPbkNvbHVtbiBjb2x1bW4gbmFtZXNcbiAgICAgKiBAcGFyYW0gZmlsdGVyQ29sdW1uTW9kZSBJTkNMVURFX09OTFkgKGRlZmF1bHQpIG9ubHkgZ2l2ZW4gY29sdW1ucyB3aWxsIGhhdmUgZmlsdGVyLCBFWENMVURFIGdpdmVuIGNvbHVtbnMgd2lsbCBOT1QgaGF2ZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbHVtbnNGaWx0ZXIoZmlsdGVyT25Db2x1bW46IHN0cmluZ1tdLCBmaWx0ZXJDb2x1bW5Nb2RlID0gVGFibGVEeW5hbWljQ29sdW1uc01vZGVFbnVtLklOQ0xVREVfT05MWSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID0gZmlsdGVyQ29sdW1uTW9kZTtcbiAgICAgICAgdGhpcy5fZmlsdGVyQ29sdW1ucyA9IGZpbHRlck9uQ29sdW1uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXRzIGdpdmVuIHR5cGUgdG8gY29sdW1uIHdpdGggZ2l2ZW4gcHJvcGVydHkgYW5kIHJldHVybnMgdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0eXBlIGN1c3RvbSB0eXBlIGZvciBjb2x1bW5cbiAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbiBhcmd1bWVudHMgZm9yIGNvbHVtblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoQ29sdW1uTW9kaWZpZWRUeXBlKHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENvbHVtblR5cGVFbnVtLCAuLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IHByb3BlcnR5ID09PSBjb2wucHJvcGVydHkpID8/IHRoaXMuYWRkQ29sdW1uKHByb3BlcnR5KS53aXRoVGl0bGUocHJvcGVydHkpO1xuICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4uYXNUeXBlKHR5cGUsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgdGl0bGUgdG8gY29sdW1uIHdpdGggZ2l2ZW4gcHJvcGVydHkgYW5kIHJldHVybnMgdGhpcyB0YWJsZVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBjb2x1bW4ncyBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0aXRsZSBjb2x1bW4ncyB0aXRsZVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29sdW1uVGl0bGUocHJvcGVydHk6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IHByb3BlcnR5ID09PSBjb2wucHJvcGVydHkpID8/IHRoaXMuYWRkQ29sdW1uKHByb3BlcnR5KTtcbiAgICAgICAgY29sdW1uLndpdGhUaXRsZSh0aXRsZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlcyBjb2x1bW5zIGRlZmluZWQgb24gdGFibGUgYmFzZWQgb24gZGF0YSBmZXRjaGVkIGZyb20gYXBpXG4gICAgICogQHBhcmFtIGRhdGEgZGF0YSBmcm9tIGFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0b1RhYmxlRGVzY3JpcHRvckZyb21EYXRhKGRhdGE6IE1lZGl1c1F1ZXJ5UmVzdWx0PGFueT4pOiBUYWJsZURlc2NyaXB0b3I8YW55PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGVzY3JpcHRvciA9IHRoaXMudG9UYWJsZURlc2NyaXB0b3IoKTtcblxuICAgICAgICBpZiAoZGF0YS5wYWdlRGF0YSA9PSBudWxsIHx8IGRhdGEucGFnZURhdGEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZURlc2NyaXB0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RNb2RlbCA9IGRhdGEucGFnZURhdGFbMF07XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3RNb2RlbClcbiAgICAgICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhdGhpcy5fZXhjbHVkZWRDb2x1bW5zLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICFBcnJheS5pc0FycmF5KHZhbHVlKSk7IC8vZXhjbHVkZSBhcnJheXMgYW5kIHNldHNcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhQ29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBjb2wucHJvcGVydHkgPT09IGtleSk7XG4gICAgICAgICAgICBsZXQgY29sdW1uOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgYW55PjtcbiAgICAgICAgICAgIGlmIChtZXRhQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhQ29sdW1uLnZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbHVtbiA9IG1ldGFDb2x1bW4udG9Db2x1bW5EZXNjcmlwdG9yKHRhYmxlRGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgdGFibGVEZXNjcmlwdG9yLmFkZENvbHVtbkRlc2NyaXB0b3IoY29sdW1uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gdGFibGVEZXNjcmlwdG9yLmFkZENvbHVtbihrZXkpLndpdGhUaXRsZShrZXkpO1xuICAgICAgICAgICAgICAgIFRhYmxldmlld1V0aWwuc3RyaW5nQ29sdW1uQ29udmVydGVyKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZTb3J0Q29sdW1ucyA9IHRoaXMuX3NvcnRDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uRVhDTFVERSAmJiAhZWxlbWVudE9mU29ydENvbHVtbnMpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX3NvcnRDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZlNvcnRDb2x1bW5zKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndpdGhTb3J0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRPZkZpbHRlckNvbHVtbnMgPSB0aGlzLl9maWx0ZXJDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX2ZpbHRlckNvbHVtbk1vZGUgPT09IFRhYmxlRHluYW1pY0NvbHVtbnNNb2RlRW51bS5FWENMVURFICYmICFlbGVtZW50T2ZGaWx0ZXJDb2x1bW5zKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlID09PSBUYWJsZUR5bmFtaWNDb2x1bW5zTW9kZUVudW0uSU5DTFVERV9PTkxZICYmIGVsZW1lbnRPZkZpbHRlckNvbHVtbnMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4ud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhZGRzIENvbHVtbkR5bmFtaWNEZXNjcmlwdG9yIHRvIHRoaXMgdGFibGVcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgY29sdW1uJ3MgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWRkQ29sdW1uKHByb3BlcnR5OiBzdHJpbmcpOiBDb2x1bW5EeW5hbWljRGVzY3JpcHRvciB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5EeW5hbWljRGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDb2x1bW4ocHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgICAgICBjb2x1bW4ud2l0aFZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZSBkeW5hbWljIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBUYWJsZUR5bmFtaWNEZXNjcmlwdG9yKHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhkZXNjcmlwdG9yKTtcbiAgICAgICAgZGVzY3JpcHRvci5fY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoYyA9PiBjLmNvcHkoKSk7XG4gICAgICAgIGRlc2NyaXB0b3IuX2V4Y2x1ZGVkQ29sdW1ucyA9IFsuLi50aGlzLl9leGNsdWRlZENvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9maWx0ZXJDb2x1bW5zID0gWy4uLnRoaXMuX2ZpbHRlckNvbHVtbnNdO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1ucyA9IFsuLi50aGlzLl9zb3J0Q29sdW1uc107XG4gICAgICAgIGRlc2NyaXB0b3IuX2ZpbHRlckNvbHVtbk1vZGUgPSB0aGlzLl9maWx0ZXJDb2x1bW5Nb2RlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zb3J0Q29sdW1uTW9kZSA9IHRoaXMuX3NvcnRDb2x1bW5Nb2RlO1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UYWJsZURlc2NyaXB0b3IoKTogVGFibGVEZXNjcmlwdG9yPGFueT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbmV3IFRhYmxlRGVzY3JpcHRvcjxhbnk+KHt9IGFzIENsYXNzVHlwZTxhbnk+LCB0aGlzLm1vZGVsLmlkUHJvcGVydHlOYW1lLCB0aGlzLm1vZGVsLnRpdGxlUHJvcGVydHlOYW1lKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZGVzY3JpcHRvcik7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cbiJdfQ==