@mediusinc/mng-commons 0.12.2 → 0.12.3-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 (339) 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 +17 -17
  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 +151 -151
  16. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  17. package/esm2020/lib/components/action/action.component.mjs +201 -201
  18. package/esm2020/lib/components/action/editor/action-editor.component.mjs +247 -247
  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 +235 -235
  22. package/esm2020/lib/components/action/models/index.mjs +4 -3
  23. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +11 -0
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +281 -281
  26. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +194 -189
  27. package/esm2020/lib/components/form/editor/form-editor.component.mjs +211 -211
  28. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +48 -48
  29. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +43 -43
  30. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  31. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +101 -101
  32. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +22 -22
  33. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +179 -179
  34. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +173 -173
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +149 -149
  36. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  37. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  38. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  39. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  41. package/esm2020/lib/components/form/index.mjs +3 -3
  42. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  43. package/esm2020/lib/components/form/models/index.mjs +1 -1
  44. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  45. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/index.mjs +7 -7
  47. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  48. package/esm2020/lib/components/layout/menu-item.component.mjs +238 -238
  49. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  50. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  51. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  52. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  53. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  54. package/esm2020/lib/components/tableview/index.mjs +6 -6
  55. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  56. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  57. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +80 -58
  58. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +53 -61
  59. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +104 -104
  60. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  61. package/esm2020/lib/components/tableview/table/table.component.mjs +531 -509
  62. package/esm2020/lib/components/tableview/tableview.component.mjs +92 -92
  63. package/esm2020/lib/config/formly.config.mjs +180 -180
  64. package/esm2020/lib/config/index.mjs +1 -1
  65. package/esm2020/lib/config/models/index.mjs +2 -2
  66. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  67. package/esm2020/lib/config/models/mng-formly-config-model.mjs +1 -1
  68. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  69. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  70. package/esm2020/lib/data-providers/index.mjs +5 -5
  71. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  72. package/esm2020/lib/data-providers/table.data-provider.mjs +24 -17
  73. package/esm2020/lib/data-providers/tableview.data-provider.mjs +46 -17
  74. package/esm2020/lib/descriptors/action.descriptor.mjs +620 -616
  75. package/esm2020/lib/descriptors/column.descriptor.mjs +342 -265
  76. package/esm2020/lib/descriptors/editor.descriptor.mjs +285 -147
  77. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  78. package/esm2020/lib/descriptors/field.descriptor.mjs +854 -820
  79. package/esm2020/lib/descriptors/filter.descriptor.mjs +290 -290
  80. package/esm2020/lib/descriptors/index.mjs +9 -9
  81. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  82. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  83. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  84. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  85. package/esm2020/lib/descriptors/table.descriptor.mjs +522 -198
  86. package/esm2020/lib/descriptors/tableview.descriptor.mjs +355 -135
  87. package/esm2020/lib/descriptors/types/action.type.mjs +52 -52
  88. package/esm2020/lib/descriptors/types/column.type.mjs +10 -10
  89. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  90. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  91. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  92. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  93. package/esm2020/lib/descriptors/types/table.type.mjs +16 -16
  94. package/esm2020/lib/descriptors/types/tableview-attr.model.mjs +2 -0
  95. package/esm2020/lib/directives/component.directive.mjs +43 -43
  96. package/esm2020/lib/directives/index.mjs +2 -2
  97. package/esm2020/lib/directives/template.directive.mjs +27 -27
  98. package/esm2020/lib/mng-commons.module.mjs +439 -439
  99. package/esm2020/lib/models/column-value.model.mjs +1 -1
  100. package/esm2020/lib/models/enum.model.mjs +1 -1
  101. package/esm2020/lib/models/error.model.mjs +1 -1
  102. package/esm2020/lib/models/formly-field.model.mjs +1 -1
  103. package/esm2020/lib/models/index.mjs +8 -8
  104. package/esm2020/lib/models/menu.model.mjs +1 -1
  105. package/esm2020/lib/models/user.model.mjs +1 -1
  106. package/esm2020/lib/models/version.model.mjs +1 -1
  107. package/esm2020/lib/models/view-container.model.mjs +1 -1
  108. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  109. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  110. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  111. package/esm2020/lib/pipes/index.mjs +5 -5
  112. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  113. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  114. package/esm2020/lib/router/index.mjs +2 -2
  115. package/esm2020/lib/router/models/index.mjs +1 -1
  116. package/esm2020/lib/router/models/router.model.mjs +2 -2
  117. package/esm2020/lib/router/route-builder.mjs +425 -425
  118. package/esm2020/lib/router/tableview-route-builder.mjs +184 -160
  119. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  120. package/esm2020/lib/security/authorization.service.mjs +46 -46
  121. package/esm2020/lib/security/authorization.util.mjs +15 -15
  122. package/esm2020/lib/security/index.mjs +3 -3
  123. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  124. package/esm2020/lib/security/model/index.mjs +3 -3
  125. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  126. package/esm2020/lib/security/model/permissions.model.mjs +87 -95
  127. package/esm2020/lib/services/action-executor.service.mjs +537 -537
  128. package/esm2020/lib/services/commons.service.mjs +342 -342
  129. package/esm2020/lib/services/configuration.service.mjs +119 -119
  130. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  131. package/esm2020/lib/services/index.mjs +6 -6
  132. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  133. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  134. package/esm2020/lib/services/internal/index.mjs +2 -2
  135. package/esm2020/lib/services/navigation.service.mjs +47 -47
  136. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  137. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  138. package/esm2020/lib/services/providers/index.mjs +2 -2
  139. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  140. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  141. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  142. package/esm2020/lib/services/tokens/index.mjs +4 -4
  143. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  144. package/esm2020/lib/services/version.service.mjs +38 -38
  145. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  146. package/esm2020/lib/styles/button-style.builder.mjs +111 -111
  147. package/esm2020/lib/styles/index.mjs +2 -2
  148. package/esm2020/lib/styles/styles.util.mjs +40 -40
  149. package/esm2020/lib/types/index.mjs +2 -2
  150. package/esm2020/lib/types/type.decorator.mjs +12 -12
  151. package/esm2020/lib/types/type.model.mjs +1 -1
  152. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  153. package/esm2020/lib/utils/column.util.mjs +37 -0
  154. package/esm2020/lib/utils/editor-formly.util.mjs +250 -250
  155. package/esm2020/lib/utils/enum.util.mjs +81 -81
  156. package/esm2020/lib/utils/field.util.mjs +60 -0
  157. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  158. package/esm2020/lib/utils/index.mjs +11 -9
  159. package/esm2020/lib/utils/model.util.mjs +61 -60
  160. package/esm2020/lib/utils/notification.util.mjs +45 -45
  161. package/esm2020/lib/utils/route.util.mjs +23 -23
  162. package/esm2020/lib/utils/string.util.mjs +23 -23
  163. package/esm2020/lib/utils/tableview.util.mjs +58 -0
  164. package/esm2020/lib/utils/type.util.mjs +76 -76
  165. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  166. package/esm2020/public-api.mjs +53 -53
  167. package/fesm2015/mediusinc-mng-commons.mjs +11898 -10853
  168. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  169. package/fesm2020/mediusinc-mng-commons.mjs +11746 -10706
  170. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  171. package/index.d.ts +5 -5
  172. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  173. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  174. package/lib/api/models/filter-param.model.d.ts +23 -23
  175. package/lib/api/models/index.d.ts +8 -8
  176. package/lib/api/models/mappers.d.ts +6 -6
  177. package/lib/api/models/query-mode.model.d.ts +16 -16
  178. package/lib/api/models/query-param.model.d.ts +31 -31
  179. package/lib/api/models/query-result.model.d.ts +23 -23
  180. package/lib/api/models/serialization.model.d.ts +8 -8
  181. package/lib/api/services/api.abstract.service.d.ts +24 -24
  182. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  183. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  184. package/lib/api/services/index.d.ts +3 -3
  185. package/lib/api/utils/index.d.ts +2 -2
  186. package/lib/api/utils/medius-rest.util.d.ts +15 -15
  187. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  188. package/lib/components/action/action.component.d.ts +68 -68
  189. package/lib/components/action/editor/action-editor.component.d.ts +64 -64
  190. package/lib/components/action/index.d.ts +3 -3
  191. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  192. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  193. package/lib/components/action/models/index.d.ts +3 -2
  194. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -0
  195. package/lib/components/action/route/action-route.component.d.ts +31 -31
  196. package/lib/components/form/autocomplete/autocomplete.component.d.ts +56 -56
  197. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -50
  198. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  199. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +15 -15
  200. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  201. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +13 -13
  202. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +23 -23
  203. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +10 -10
  204. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +45 -45
  205. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +23 -23
  206. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +38 -38
  207. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  208. package/lib/components/form/formly/fields/index.d.ts +9 -9
  209. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  210. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  211. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  212. package/lib/components/form/index.d.ts +3 -3
  213. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  214. package/lib/components/form/models/index.d.ts +1 -1
  215. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  216. package/lib/components/layout/footer.component.d.ts +9 -9
  217. package/lib/components/layout/index.d.ts +7 -7
  218. package/lib/components/layout/main-layout.component.d.ts +20 -20
  219. package/lib/components/layout/menu-item.component.d.ts +44 -44
  220. package/lib/components/layout/menu.component.d.ts +10 -10
  221. package/lib/components/layout/services/index.d.ts +1 -1
  222. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  223. package/lib/components/layout/topbar.component.d.ts +24 -24
  224. package/lib/components/layout/version.component.d.ts +19 -19
  225. package/lib/components/tableview/index.d.ts +6 -6
  226. package/lib/components/tableview/models/index.d.ts +1 -1
  227. package/lib/components/tableview/models/table.event.d.ts +17 -17
  228. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +25 -20
  229. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -23
  230. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +32 -32
  231. package/lib/components/tableview/table/column-value/column-value.component.d.ts +29 -29
  232. package/lib/components/tableview/table/table.component.d.ts +110 -108
  233. package/lib/components/tableview/tableview.component.d.ts +41 -41
  234. package/lib/config/formly.config.d.ts +16 -16
  235. package/lib/config/index.d.ts +1 -1
  236. package/lib/config/models/index.d.ts +2 -2
  237. package/lib/config/models/mng-config.model.d.ts +36 -36
  238. package/lib/config/models/mng-formly-config-model.d.ts +17 -17
  239. package/lib/data-providers/base.data-provider.d.ts +14 -14
  240. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  241. package/lib/data-providers/index.d.ts +5 -5
  242. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  243. package/lib/data-providers/table.data-provider.d.ts +19 -14
  244. package/lib/data-providers/tableview.data-provider.d.ts +29 -15
  245. package/lib/descriptors/action.descriptor.d.ts +263 -259
  246. package/lib/descriptors/column.descriptor.d.ts +116 -82
  247. package/lib/descriptors/editor.descriptor.d.ts +102 -37
  248. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  249. package/lib/descriptors/field.descriptor.d.ts +305 -300
  250. package/lib/descriptors/filter.descriptor.d.ts +106 -106
  251. package/lib/descriptors/index.d.ts +9 -9
  252. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  253. package/lib/descriptors/interfaces/index.d.ts +2 -2
  254. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  255. package/lib/descriptors/model.descriptor.d.ts +15 -15
  256. package/lib/descriptors/table.descriptor.d.ts +208 -66
  257. package/lib/descriptors/tableview.descriptor.d.ts +141 -42
  258. package/lib/descriptors/types/action.type.d.ts +45 -45
  259. package/lib/descriptors/types/column.type.d.ts +9 -9
  260. package/lib/descriptors/types/editor.type.d.ts +6 -6
  261. package/lib/descriptors/types/field.type.d.ts +44 -44
  262. package/lib/descriptors/types/filter.type.d.ts +27 -27
  263. package/lib/descriptors/types/index.d.ts +6 -6
  264. package/lib/descriptors/types/table.type.d.ts +13 -13
  265. package/lib/descriptors/types/tableview-attr.model.d.ts +9 -0
  266. package/lib/directives/component.directive.d.ts +16 -16
  267. package/lib/directives/index.d.ts +2 -2
  268. package/lib/directives/template.directive.d.ts +13 -13
  269. package/lib/mng-commons.module.d.ts +87 -87
  270. package/lib/models/column-value.model.d.ts +4 -4
  271. package/lib/models/enum.model.d.ts +6 -6
  272. package/lib/models/error.model.d.ts +14 -14
  273. package/lib/models/formly-field.model.d.ts +16 -16
  274. package/lib/models/index.d.ts +8 -8
  275. package/lib/models/menu.model.d.ts +27 -27
  276. package/lib/models/user.model.d.ts +8 -8
  277. package/lib/models/version.model.d.ts +18 -18
  278. package/lib/models/view-container.model.d.ts +6 -6
  279. package/lib/pipes/boolean.pipe.d.ts +7 -7
  280. package/lib/pipes/enum.pipe.d.ts +8 -8
  281. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  282. package/lib/pipes/index.d.ts +5 -5
  283. package/lib/pipes/json-path.pipe.d.ts +13 -13
  284. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  285. package/lib/router/index.d.ts +2 -2
  286. package/lib/router/models/index.d.ts +1 -1
  287. package/lib/router/models/router.model.d.ts +33 -27
  288. package/lib/router/route-builder.d.ts +98 -98
  289. package/lib/router/tableview-route-builder.d.ts +37 -34
  290. package/lib/security/authorization.guard.d.ts +11 -11
  291. package/lib/security/authorization.service.d.ts +19 -19
  292. package/lib/security/authorization.util.d.ts +5 -5
  293. package/lib/security/index.d.ts +3 -3
  294. package/lib/security/model/authorization.type.d.ts +6 -6
  295. package/lib/security/model/index.d.ts +3 -3
  296. package/lib/security/model/permission-service.interface.d.ts +6 -6
  297. package/lib/security/model/permissions.model.d.ts +37 -44
  298. package/lib/services/action-executor.service.d.ts +149 -149
  299. package/lib/services/commons.service.d.ts +78 -78
  300. package/lib/services/configuration.service.d.ts +45 -45
  301. package/lib/services/error-mapper.service.d.ts +7 -7
  302. package/lib/services/index.d.ts +6 -6
  303. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  304. package/lib/services/internal/commons-init.service.d.ts +16 -16
  305. package/lib/services/internal/index.d.ts +2 -2
  306. package/lib/services/navigation.service.d.ts +14 -14
  307. package/lib/services/providers/config-service.provider.d.ts +6 -6
  308. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  309. package/lib/services/providers/index.d.ts +2 -2
  310. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  311. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  312. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  313. package/lib/services/tokens/index.d.ts +4 -4
  314. package/lib/services/tokens/module-config.token.d.ts +3 -3
  315. package/lib/services/version.service.d.ts +13 -13
  316. package/lib/services/view-container.component.service.d.ts +22 -22
  317. package/lib/styles/button-style.builder.d.ts +26 -26
  318. package/lib/styles/index.d.ts +2 -2
  319. package/lib/styles/styles.util.d.ts +14 -14
  320. package/lib/types/index.d.ts +2 -2
  321. package/lib/types/type.decorator.d.ts +4 -4
  322. package/lib/types/type.model.d.ts +23 -23
  323. package/lib/utils/action-data-provider.util.d.ts +20 -20
  324. package/lib/utils/column.util.d.ts +8 -0
  325. package/lib/utils/editor-formly.util.d.ts +11 -11
  326. package/lib/utils/enum.util.d.ts +50 -50
  327. package/lib/utils/field.util.d.ts +13 -0
  328. package/lib/utils/i18n.util.d.ts +56 -56
  329. package/lib/utils/index.d.ts +10 -8
  330. package/lib/utils/model.util.d.ts +8 -8
  331. package/lib/utils/notification.util.d.ts +11 -11
  332. package/lib/utils/route.util.d.ts +4 -4
  333. package/lib/utils/string.util.d.ts +4 -4
  334. package/lib/utils/tableview.util.d.ts +23 -0
  335. package/lib/utils/type.util.d.ts +36 -36
  336. package/mediusinc-mng-commons-0.12.3-rc.1.tgz +0 -0
  337. package/package.json +1 -1
  338. package/public-api.d.ts +33 -33
  339. package/version-info.json +6 -6
@@ -1,282 +1,282 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
2
- import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { AutoComplete } from 'primeng/autocomplete';
4
- import { BehaviorSubject, of, switchMap } from 'rxjs';
5
- import { first, map } from 'rxjs/operators';
6
- import { MediusFilterMatchType, MediusQueryParamBuilder } from '../../../api/models';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@ngx-translate/core";
9
- import * as i2 from "../formly/wrappers";
10
- import * as i3 from "@angular/forms";
11
- import * as i4 from "primeng/autocomplete";
12
- import * as i5 from "@angular/common";
13
- export const MNG_AUTOCOMPLETE_VALUE_ACCESSOR = {
14
- provide: NG_VALUE_ACCESSOR,
15
- useExisting: forwardRef(() => MngAutocompleteComponent),
16
- multi: true
17
- };
18
- export class MngAutocompleteComponent {
19
- constructor(injector, translate, formlyWrapper) {
20
- this.injector = injector;
21
- this.translate = translate;
22
- this.formlyWrapper = formlyWrapper;
23
- this.itemsLabelTranslate = false;
24
- this.inlineSearch = false;
25
- this.openOnFocus = false;
26
- this.multiselect = false;
27
- this.className = null;
28
- this.dropdownClassName = null;
29
- this.valueChangeEventEmitter = new EventEmitter();
30
- this.isInited = false;
31
- this.suggestionsSubject = new BehaviorSubject([]);
32
- this.searchSubscription = null;
33
- this.dataProviderService = null;
34
- // eslint-disable-next-line @typescript-eslint/no-empty-function
35
- this.onChangeFn = () => { };
36
- // eslint-disable-next-line @typescript-eslint/no-empty-function
37
- this.onTouchedFn = () => { };
38
- this.autocompleteFormControl = new FormControl();
39
- this.suggestions$ = this.suggestionsSubject.asObservable();
40
- }
41
- ngOnInit() {
42
- this.setItemsAndDataProvider();
43
- }
44
- ngOnDestroy() {
45
- this.searchSubscription?.unsubscribe();
46
- }
47
- onSearch(event) {
48
- this.searchSubscription?.unsubscribe();
49
- if (this.dataProvider) {
50
- const queryParamBuilder = MediusQueryParamBuilder.create();
51
- if (this.itemsLabelProperty) {
52
- queryParamBuilder.withSort(this.itemsLabelProperty);
53
- }
54
- if (event.query && event.query.length > 0 && this.itemsLabelProperty) {
55
- queryParamBuilder.withFilter(this.itemsLabelProperty, event.query, undefined, MediusFilterMatchType.StartsWith);
56
- }
57
- this.searchSubscription = this.getLookup(queryParamBuilder.build(), event.query).subscribe({
58
- next: items => {
59
- this.setSuggestionsFromItems(items, event.query);
60
- }
61
- });
62
- }
63
- }
64
- onSelect(value) {
65
- let outputValue = value;
66
- if (this.itemsValueProperty && typeof value === 'object') {
67
- outputValue = value[this.itemsValueProperty];
68
- }
69
- this.onChangeFn(outputValue);
70
- this.valueChangeEventEmitter.next(outputValue);
71
- }
72
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
73
- onFocus(event) {
74
- if (this.openOnFocus) {
75
- this.primeAutocomplete?.show();
76
- }
77
- }
78
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
79
- onBlur(event) {
80
- this.formlyWrapper?.formControl?.markAsTouched();
81
- }
82
- registerOnChange(fn) {
83
- this.onChangeFn = fn;
84
- }
85
- registerOnTouched(fn) {
86
- this.onTouchedFn = fn;
87
- }
88
- setDisabledState(isDisabled) {
89
- if (isDisabled) {
90
- this.autocompleteFormControl.disable();
91
- }
92
- else {
93
- this.autocompleteFormControl.enable();
94
- }
95
- }
96
- writeValue(value) {
97
- this.setItemsAndDataProvider();
98
- if (this.itemsValuePropertyInit && value != null && typeof value !== 'object') {
99
- const defaultItem = { [this.itemsValuePropertyInit]: value };
100
- if (this.itemsLabelProperty) {
101
- defaultItem[this.itemsLabelProperty] = value;
102
- }
103
- const matchedItem = this.suggestionsSubject.value.find(i => i[this.itemsValuePropertyInit] === value);
104
- if (matchedItem) {
105
- this.autocompleteFormControl.setValue(matchedItem, { emitEvent: false });
106
- }
107
- else if (this.dataProvider) {
108
- const queryParamBuilder = MediusQueryParamBuilder.create();
109
- queryParamBuilder.withFilter(this.itemsValuePropertyInit, value, undefined, MediusFilterMatchType.Equals);
110
- this.getLookup(queryParamBuilder.build())
111
- .pipe(first())
112
- .subscribe({
113
- next: items => {
114
- let isMatch = false;
115
- if (items.length === 1) {
116
- this.autocompleteFormControl.setValue(items[0]);
117
- isMatch = true;
118
- }
119
- else if (items.length > 1) {
120
- // for lookup data providers not using query params
121
- const matchedItem = items.find(i => i[this.itemsValuePropertyInit] === value);
122
- if (matchedItem) {
123
- this.setAutocompleteValueFromWrite(matchedItem);
124
- isMatch = true;
125
- }
126
- }
127
- if (!isMatch) {
128
- this.setAutocompleteValueFromWrite(defaultItem);
129
- }
130
- },
131
- error: () => {
132
- this.setAutocompleteValueFromWrite(defaultItem);
133
- }
134
- });
135
- }
136
- else {
137
- this.setAutocompleteValueFromWrite(defaultItem);
138
- }
139
- }
140
- else {
141
- this.setAutocompleteValueFromWrite(value);
142
- }
143
- }
144
- setItemsAndDataProvider() {
145
- if (this.isInited) {
146
- return;
147
- }
148
- this.itemsLabelProperty = this.itemsLabelPropertyInit;
149
- this.itemsValueProperty = this.itemsValuePropertyInit;
150
- if (this.dataProvider) {
151
- this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
152
- if (this.itemsLabelTranslate) {
153
- // setup translation properties
154
- if (this.itemsLabelPropertyInit) {
155
- this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
156
- }
157
- else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
158
- this.itemsLabelProperty = 'title_i18n';
159
- this.itemsValueProperty = 'value';
160
- }
161
- else {
162
- throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
163
- }
164
- }
165
- }
166
- else {
167
- console.warn(`Data provider should be provided for MngAutocompleteComponent.`);
168
- }
169
- if (this.openOnFocus) {
170
- this.onSearch({ query: '' });
171
- }
172
- this.isInited = true;
173
- }
174
- setAutocompleteValueFromWrite(value) {
175
- if (value && this.itemsLabelTranslate) {
176
- value = this.i18nPopulateItems([value], this.translate.instant(this.i18nGetItemsKeys([value])))[0];
177
- }
178
- this.autocompleteFormControl.setValue(value, { emitEvent: false });
179
- }
180
- getLookup(qp, query) {
181
- if (this.dataProvider) {
182
- return this.dataProvider.lookup(qp, this.dataProviderService, query).pipe(switchMap(items => {
183
- if (this.itemsLabelTranslate) {
184
- const translatedItems = this.i18nGetItemsKeys(items);
185
- if (translatedItems.length === 0) {
186
- return of([]);
187
- }
188
- return this.translate.stream(translatedItems).pipe(map(translations => this.i18nPopulateItems(items, translations)));
189
- }
190
- else {
191
- return of(items);
192
- }
193
- }));
194
- }
195
- else {
196
- return of([]);
197
- }
198
- }
199
- i18nGetItemsKeys(items) {
200
- return items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
201
- }
202
- i18nPopulateItems(items, i18nMap) {
203
- return items.map(item => {
204
- if (typeof item === 'object' && this.itemsLabelPropertyInit) {
205
- const label = item[this.itemsLabelPropertyInit];
206
- const translation = i18nMap[label];
207
- if (translation) {
208
- return { ...item, [this.itemsLabelProperty]: translation };
209
- }
210
- return { ...item };
211
- }
212
- else {
213
- const translation = i18nMap[item];
214
- return {
215
- [this.itemsLabelProperty]: translation ?? item,
216
- [this.itemsValueProperty]: item
217
- };
218
- }
219
- });
220
- }
221
- setSuggestionsFromItems(items, query) {
222
- if (this.inlineSearch) {
223
- const queryLowerCase = query?.toLowerCase() ?? '';
224
- const filteredItems = items.filter(i => {
225
- let itemLabel = i;
226
- if (this.itemsLabelProperty && typeof i === 'object') {
227
- itemLabel = i[this.itemsLabelProperty];
228
- }
229
- if (itemLabel == null) {
230
- return queryLowerCase == null || !queryLowerCase.length;
231
- }
232
- if (typeof itemLabel !== 'string') {
233
- itemLabel = itemLabel.toString();
234
- }
235
- return itemLabel.toLowerCase().startsWith(queryLowerCase);
236
- });
237
- this.suggestionsSubject.next([...filteredItems]);
238
- }
239
- else {
240
- this.suggestionsSubject.next([...items]);
241
- }
242
- }
243
- }
244
- MngAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
245
- MngAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngAutocompleteComponent, selector: "mng-autocomplete", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", inlineSearch: "inlineSearch", openOnFocus: "openOnFocus", multiselect: "multiselect", placeholder: "placeholder", className: "className", dropdownClassName: "dropdownClassName" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeAutocomplete", first: true, predicate: AutoComplete, descendants: true }], ngImport: i0, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n", dependencies: [{ kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, decorators: [{
247
- type: Component,
248
- args: [{ selector: 'mng-autocomplete', providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n" }]
249
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
250
- type: Optional
251
- }] }]; }, propDecorators: { dataProvider: [{
252
- type: Input
253
- }], dataKeyProperty: [{
254
- type: Input
255
- }], itemsValuePropertyInit: [{
256
- type: Input,
257
- args: ['itemsValueProperty']
258
- }], itemsLabelPropertyInit: [{
259
- type: Input,
260
- args: ['itemsLabelProperty']
261
- }], itemsLabelTranslate: [{
262
- type: Input
263
- }], inlineSearch: [{
264
- type: Input
265
- }], openOnFocus: [{
266
- type: Input
267
- }], multiselect: [{
268
- type: Input
269
- }], placeholder: [{
270
- type: Input
271
- }], className: [{
272
- type: Input
273
- }], dropdownClassName: [{
274
- type: Input
275
- }], valueChangeEventEmitter: [{
276
- type: Output,
277
- args: ['valueChange']
278
- }], primeAutocomplete: [{
279
- type: ViewChild,
280
- args: [AutoComplete]
281
- }] } });
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
2
+ import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { AutoComplete } from 'primeng/autocomplete';
4
+ import { BehaviorSubject, of, switchMap } from 'rxjs';
5
+ import { first, map } from 'rxjs/operators';
6
+ import { MediusFilterMatchType, MediusQueryParamBuilder } from '../../../api/models';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@ngx-translate/core";
9
+ import * as i2 from "../formly/wrappers";
10
+ import * as i3 from "@angular/forms";
11
+ import * as i4 from "primeng/autocomplete";
12
+ import * as i5 from "@angular/common";
13
+ export const MNG_AUTOCOMPLETE_VALUE_ACCESSOR = {
14
+ provide: NG_VALUE_ACCESSOR,
15
+ useExisting: forwardRef(() => MngAutocompleteComponent),
16
+ multi: true
17
+ };
18
+ export class MngAutocompleteComponent {
19
+ constructor(injector, translate, formlyWrapper) {
20
+ this.injector = injector;
21
+ this.translate = translate;
22
+ this.formlyWrapper = formlyWrapper;
23
+ this.itemsLabelTranslate = false;
24
+ this.inlineSearch = false;
25
+ this.openOnFocus = false;
26
+ this.multiselect = false;
27
+ this.className = null;
28
+ this.dropdownClassName = null;
29
+ this.valueChangeEventEmitter = new EventEmitter();
30
+ this.isInited = false;
31
+ this.suggestionsSubject = new BehaviorSubject([]);
32
+ this.searchSubscription = null;
33
+ this.dataProviderService = null;
34
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
35
+ this.onChangeFn = () => { };
36
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
37
+ this.onTouchedFn = () => { };
38
+ this.autocompleteFormControl = new FormControl();
39
+ this.suggestions$ = this.suggestionsSubject.asObservable();
40
+ }
41
+ ngOnInit() {
42
+ this.setItemsAndDataProvider();
43
+ }
44
+ ngOnDestroy() {
45
+ this.searchSubscription?.unsubscribe();
46
+ }
47
+ onSearch(event) {
48
+ this.searchSubscription?.unsubscribe();
49
+ if (this.dataProvider) {
50
+ const queryParamBuilder = MediusQueryParamBuilder.create();
51
+ if (this.itemsLabelProperty) {
52
+ queryParamBuilder.withSort(this.itemsLabelProperty);
53
+ }
54
+ if (event.query && event.query.length > 0 && this.itemsLabelProperty) {
55
+ queryParamBuilder.withFilter(this.itemsLabelProperty, event.query, undefined, MediusFilterMatchType.StartsWith);
56
+ }
57
+ this.searchSubscription = this.getLookup(queryParamBuilder.build(), event.query).subscribe({
58
+ next: items => {
59
+ this.setSuggestionsFromItems(items, event.query);
60
+ }
61
+ });
62
+ }
63
+ }
64
+ onSelect(value) {
65
+ let outputValue = value;
66
+ if (this.itemsValueProperty && typeof value === 'object') {
67
+ outputValue = value[this.itemsValueProperty];
68
+ }
69
+ this.onChangeFn(outputValue);
70
+ this.valueChangeEventEmitter.next(outputValue);
71
+ }
72
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
73
+ onFocus(event) {
74
+ if (this.openOnFocus) {
75
+ this.primeAutocomplete?.show();
76
+ }
77
+ }
78
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
79
+ onBlur(event) {
80
+ this.formlyWrapper?.formControl?.markAsTouched();
81
+ }
82
+ registerOnChange(fn) {
83
+ this.onChangeFn = fn;
84
+ }
85
+ registerOnTouched(fn) {
86
+ this.onTouchedFn = fn;
87
+ }
88
+ setDisabledState(isDisabled) {
89
+ if (isDisabled) {
90
+ this.autocompleteFormControl.disable();
91
+ }
92
+ else {
93
+ this.autocompleteFormControl.enable();
94
+ }
95
+ }
96
+ writeValue(value) {
97
+ this.setItemsAndDataProvider();
98
+ if (this.itemsValuePropertyInit && value != null && typeof value !== 'object') {
99
+ const defaultItem = { [this.itemsValuePropertyInit]: value };
100
+ if (this.itemsLabelProperty) {
101
+ defaultItem[this.itemsLabelProperty] = value;
102
+ }
103
+ const matchedItem = this.suggestionsSubject.value.find(i => i[this.itemsValuePropertyInit] === value);
104
+ if (matchedItem) {
105
+ this.autocompleteFormControl.setValue(matchedItem, { emitEvent: false });
106
+ }
107
+ else if (this.dataProvider) {
108
+ const queryParamBuilder = MediusQueryParamBuilder.create();
109
+ queryParamBuilder.withFilter(this.itemsValuePropertyInit, value, undefined, MediusFilterMatchType.Equals);
110
+ this.getLookup(queryParamBuilder.build())
111
+ .pipe(first())
112
+ .subscribe({
113
+ next: items => {
114
+ let isMatch = false;
115
+ if (items.length === 1) {
116
+ this.autocompleteFormControl.setValue(items[0]);
117
+ isMatch = true;
118
+ }
119
+ else if (items.length > 1) {
120
+ // for lookup data providers not using query params
121
+ const matchedItem = items.find(i => i[this.itemsValuePropertyInit] === value);
122
+ if (matchedItem) {
123
+ this.setAutocompleteValueFromWrite(matchedItem);
124
+ isMatch = true;
125
+ }
126
+ }
127
+ if (!isMatch) {
128
+ this.setAutocompleteValueFromWrite(defaultItem);
129
+ }
130
+ },
131
+ error: () => {
132
+ this.setAutocompleteValueFromWrite(defaultItem);
133
+ }
134
+ });
135
+ }
136
+ else {
137
+ this.setAutocompleteValueFromWrite(defaultItem);
138
+ }
139
+ }
140
+ else {
141
+ this.setAutocompleteValueFromWrite(value);
142
+ }
143
+ }
144
+ setItemsAndDataProvider() {
145
+ if (this.isInited) {
146
+ return;
147
+ }
148
+ this.itemsLabelProperty = this.itemsLabelPropertyInit;
149
+ this.itemsValueProperty = this.itemsValuePropertyInit;
150
+ if (this.dataProvider) {
151
+ this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
152
+ if (this.itemsLabelTranslate) {
153
+ // setup translation properties
154
+ if (this.itemsLabelPropertyInit) {
155
+ this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
156
+ }
157
+ else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
158
+ this.itemsLabelProperty = 'title_i18n';
159
+ this.itemsValueProperty = 'value';
160
+ }
161
+ else {
162
+ throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
163
+ }
164
+ }
165
+ }
166
+ else {
167
+ console.warn(`Data provider should be provided for MngAutocompleteComponent.`);
168
+ }
169
+ if (this.openOnFocus) {
170
+ this.onSearch({ query: '' });
171
+ }
172
+ this.isInited = true;
173
+ }
174
+ setAutocompleteValueFromWrite(value) {
175
+ if (value && this.itemsLabelTranslate) {
176
+ value = this.i18nPopulateItems([value], this.translate.instant(this.i18nGetItemsKeys([value])))[0];
177
+ }
178
+ this.autocompleteFormControl.setValue(value, { emitEvent: false });
179
+ }
180
+ getLookup(qp, query) {
181
+ if (this.dataProvider) {
182
+ return this.dataProvider.lookup(qp, this.dataProviderService, query).pipe(switchMap(items => {
183
+ if (this.itemsLabelTranslate) {
184
+ const translatedItems = this.i18nGetItemsKeys(items);
185
+ if (translatedItems.length === 0) {
186
+ return of([]);
187
+ }
188
+ return this.translate.stream(translatedItems).pipe(map(translations => this.i18nPopulateItems(items, translations)));
189
+ }
190
+ else {
191
+ return of(items);
192
+ }
193
+ }));
194
+ }
195
+ else {
196
+ return of([]);
197
+ }
198
+ }
199
+ i18nGetItemsKeys(items) {
200
+ return items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
201
+ }
202
+ i18nPopulateItems(items, i18nMap) {
203
+ return items.map(item => {
204
+ if (typeof item === 'object' && this.itemsLabelPropertyInit) {
205
+ const label = item[this.itemsLabelPropertyInit];
206
+ const translation = i18nMap[label];
207
+ if (translation) {
208
+ return { ...item, [this.itemsLabelProperty]: translation };
209
+ }
210
+ return { ...item };
211
+ }
212
+ else {
213
+ const translation = i18nMap[item];
214
+ return {
215
+ [this.itemsLabelProperty]: translation ?? item,
216
+ [this.itemsValueProperty]: item
217
+ };
218
+ }
219
+ });
220
+ }
221
+ setSuggestionsFromItems(items, query) {
222
+ if (this.inlineSearch) {
223
+ const queryLowerCase = query?.toLowerCase() ?? '';
224
+ const filteredItems = items.filter(i => {
225
+ let itemLabel = i;
226
+ if (this.itemsLabelProperty && typeof i === 'object') {
227
+ itemLabel = i[this.itemsLabelProperty];
228
+ }
229
+ if (itemLabel == null) {
230
+ return queryLowerCase == null || !queryLowerCase.length;
231
+ }
232
+ if (typeof itemLabel !== 'string') {
233
+ itemLabel = itemLabel.toString();
234
+ }
235
+ return itemLabel.toLowerCase().startsWith(queryLowerCase);
236
+ });
237
+ this.suggestionsSubject.next([...filteredItems]);
238
+ }
239
+ else {
240
+ this.suggestionsSubject.next([...items]);
241
+ }
242
+ }
243
+ }
244
+ MngAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
245
+ MngAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngAutocompleteComponent, selector: "mng-autocomplete", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", inlineSearch: "inlineSearch", openOnFocus: "openOnFocus", multiselect: "multiselect", placeholder: "placeholder", className: "className", dropdownClassName: "dropdownClassName" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeAutocomplete", first: true, predicate: AutoComplete, descendants: true }], ngImport: i0, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n", dependencies: [{ kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, decorators: [{
247
+ type: Component,
248
+ args: [{ selector: 'mng-autocomplete', providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n" }]
249
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
250
+ type: Optional
251
+ }] }]; }, propDecorators: { dataProvider: [{
252
+ type: Input
253
+ }], dataKeyProperty: [{
254
+ type: Input
255
+ }], itemsValuePropertyInit: [{
256
+ type: Input,
257
+ args: ['itemsValueProperty']
258
+ }], itemsLabelPropertyInit: [{
259
+ type: Input,
260
+ args: ['itemsLabelProperty']
261
+ }], itemsLabelTranslate: [{
262
+ type: Input
263
+ }], inlineSearch: [{
264
+ type: Input
265
+ }], openOnFocus: [{
266
+ type: Input
267
+ }], multiselect: [{
268
+ type: Input
269
+ }], placeholder: [{
270
+ type: Input
271
+ }], className: [{
272
+ type: Input
273
+ }], dropdownClassName: [{
274
+ type: Input
275
+ }], valueChangeEventEmitter: [{
276
+ type: Output,
277
+ args: ['valueChange']
278
+ }], primeAutocomplete: [{
279
+ type: ViewChild,
280
+ args: [AutoComplete]
281
+ }] } });
282
282
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBOEIsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUssT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGVBQWUsRUFBNEIsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBQyxxQkFBcUIsRUFBb0IsdUJBQXVCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQUlyRyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBcUI7SUFDN0QsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZELEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQVFGLE1BQU0sT0FBTyx3QkFBd0I7SUErQmpDLFlBQW9CLFFBQWtCLEVBQVUsU0FBMkIsRUFBc0IsYUFBNkM7UUFBMUgsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLGNBQVMs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QUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDNUM7SUFDTCxDQUFDOztxSEExUFEsd0JBQXdCO3lHQUF4Qix3QkFBd0IsZ2lCQUh0QixDQUFDLCtCQUErQixDQUFDLDZFQWtCakMsWUFBWSxnREN2QzNCLDJ1QkFvQkE7MkZESWEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNJLGtCQUFrQixhQUVqQixDQUFDLCtCQUErQixDQUFDLG1CQUMzQix1QkFBdUIsQ0FBQyxNQUFNOzswQkFpQytCLFFBQVE7NENBOUJ0RSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQzhCLHNCQUFzQjtzQkFBekQsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBQ1Msc0JBQXNCO3NCQUF6RCxLQUFLO3VCQUFDLG9CQUFvQjtnQkFDWCxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFFd0IsdUJBQXVCO3NCQUFwRCxNQUFNO3VCQUFDLGFBQWE7Z0JBRVcsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgRXhpc3RpbmdQcm92aWRlciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBdXRvQ29tcGxldGV9IGZyb20gJ3ByaW1lbmcvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLCBNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlcn0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge0lMb29rdXBEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uLy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7TW5nRm9ybWx5RmllbGRXcmFwcGVyQ29tcG9uZW50fSBmcm9tICcuLi9mb3JtbHkvd3JhcHBlcnMnO1xuXG5leHBvcnQgY29uc3QgTU5HX0FVVE9DT01QTEVURV9WQUxVRV9BQ0NFU1NPUjogRXhpc3RpbmdQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNbmdBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21uZy1hdXRvY29tcGxldGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW01OR19BVVRPQ09NUExFVEVfVkFMVUVfQUNDRVNTT1JdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0F1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8YW55LCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhS2V5UHJvcGVydHk/OiBzdHJpbmc7XG4gICAgQElucHV0KCdpdGVtc1ZhbHVlUHJvcGVydHknKSBwdWJsaWMgaXRlbXNWYWx1ZVByb3BlcnR5SW5pdD86IHN0cmluZztcbiAgICBASW5wdXQoJ2l0ZW1zTGFiZWxQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc0xhYmVsUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0xhYmVsVHJhbnNsYXRlID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGlubGluZVNlYXJjaCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXNlbGVjdCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgQE91dHB1dCgndmFsdWVDaGFuZ2UnKSBwdWJsaWMgdmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKEF1dG9Db21wbGV0ZSkgcHVibGljIHByaW1lQXV0b2NvbXBsZXRlPzogQXV0b0NvbXBsZXRlO1xuXG4gICAgcHJpdmF0ZSBpc0luaXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3VnZ2VzdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8YW55Pj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PGFueT4+KFtdKTtcbiAgICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uQ2hhbmdlRm46IGFueSA9ICgpID0+IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uVG91Y2hlZEZuOiBhbnkgPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBpdGVtc0xhYmVsUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHVibGljIGl0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IHRoaXMuc3VnZ2VzdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1seVdyYXBwZXI6IE1uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudCkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldEl0ZW1zQW5kRGF0YVByb3ZpZGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIG9uU2VhcmNoKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtQnVpbGRlciA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbUJ1aWxkZXIud2l0aFNvcnQodGhpcy5pdGVtc0xhYmVsUHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LnF1ZXJ5ICYmIGV2ZW50LnF1ZXJ5Lmxlbmd0aCA+IDAgJiYgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtQnVpbGRlci53aXRoRmlsdGVyKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5LCBldmVudC5xdWVyeSwgdW5kZWZpbmVkLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0TG9va3VwKHF1ZXJ5UGFyYW1CdWlsZGVyLmJ1aWxkKCksIGV2ZW50LnF1ZXJ5KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdWdnZXN0aW9uc0Zyb21JdGVtcyhpdGVtcywgZXZlbnQucXVlcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TZWxlY3QodmFsdWU6IGFueSkge1xuICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gdmFsdWVbdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbihvdXRwdXRWYWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIubmV4dChvdXRwdXRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRm9jdXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5PbkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLnByaW1lQXV0b2NvbXBsZXRlPy5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25CbHVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5mb3JtbHlXcmFwcGVyPy5mb3JtQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEl0ZW1zQW5kRGF0YVByb3ZpZGVyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdCAmJiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRJdGVtOiBhbnkgPSB7W3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdF06IHZhbHVlfTtcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRJdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkSXRlbSA9IHRoaXMuc3VnZ2VzdGlvbnNTdWJqZWN0LnZhbHVlLmZpbmQoaSA9PiBpW3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdCFdID09PSB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKG1hdGNoZWRJdGVtLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1CdWlsZGVyID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbUJ1aWxkZXIud2l0aEZpbHRlcih0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQsIHZhbHVlLCB1bmRlZmluZWQsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRMb29rdXAocXVlcnlQYXJhbUJ1aWxkZXIuYnVpbGQoKSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUoaXRlbXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvb2t1cCBkYXRhIHByb3ZpZGVycyBub3QgdXNpbmcgcXVlcnkgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaXRlbXMuZmluZChpID0+IGlbdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0IV0gPT09IHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dG9jb21wbGV0ZVZhbHVlRnJvbVdyaXRlKG1hdGNoZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0b2NvbXBsZXRlVmFsdWVGcm9tV3JpdGUoZGVmYXVsdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0b2NvbXBsZXRlVmFsdWVGcm9tV3JpdGUoZGVmYXVsdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRvY29tcGxldGVWYWx1ZUZyb21Xcml0ZShkZWZhdWx0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEF1dG9jb21wbGV0ZVZhbHVlRnJvbVdyaXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SXRlbXNBbmREYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdDtcbiAgICAgICAgdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UgPSB0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSA/IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHNldHVwIHRyYW5zbGF0aW9uIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gYCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fV9pMThuYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSAmJiAhdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gJ3RpdGxlX2kxOG4nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVzZSB3aXRoIHZhbHVlICgke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH0pIGFuZCBsYWJlbCAoJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9KSBwcm9wZXJ0eSBzZXR1cC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYERhdGEgcHJvdmlkZXIgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBNbmdBdXRvY29tcGxldGVDb21wb25lbnQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5vblNlYXJjaCh7cXVlcnk6ICcnfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzSW5pdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEF1dG9jb21wbGV0ZVZhbHVlRnJvbVdyaXRlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMuaXRlbXNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmkxOG5Qb3B1bGF0ZUl0ZW1zKFt2YWx1ZV0sIHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5pMThuR2V0SXRlbXNLZXlzKFt2YWx1ZV0pKSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExvb2t1cChxcDogTWVkaXVzUXVlcnlQYXJhbSwgcXVlcnk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFycmF5PGFueT4+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIubG9va3VwKHFwLCB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UsIHF1ZXJ5KS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRJdGVtcyA9IHRoaXMuaTE4bkdldEl0ZW1zS2V5cyhpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5zdHJlYW0odHJhbnNsYXRlZEl0ZW1zKS5waXBlKG1hcCh0cmFuc2xhdGlvbnMgPT4gdGhpcy5pMThuUG9wdWxhdGVJdGVtcyhpdGVtcywgdHJhbnNsYXRpb25zKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaTE4bkdldEl0ZW1zS2V5cyhpdGVtczogQXJyYXk8YW55Pik6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4gKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQgPyAoaXRlbVt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQgYXMga2V5b2Ygb2JqZWN0XSBhcyBzdHJpbmcpIDogaXRlbSkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGkxOG5Qb3B1bGF0ZUl0ZW1zKGl0ZW1zOiBBcnJheTxhbnk+LCBpMThuTWFwOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gaTE4bk1hcFtsYWJlbF07XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbSwgW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5IV06IHRyYW5zbGF0aW9ufTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBpMThuTWFwW2l0ZW1dO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSFdOiB0cmFuc2xhdGlvbiA/PyBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkhXTogaXRlbVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3VnZ2VzdGlvbnNGcm9tSXRlbXMoaXRlbXM6IEFycmF5PGFueT4sIHF1ZXJ5Pzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlubGluZVNlYXJjaCkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlMb3dlckNhc2UgPSBxdWVyeT8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1MYWJlbCA9IGk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ICYmIHR5cGVvZiBpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtTGFiZWwgPSBpW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1MYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUxvd2VyQ2FzZSA9PSBudWxsIHx8ICFxdWVyeUxvd2VyQ2FzZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbUxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtTGFiZWwgPSBpdGVtTGFiZWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocXVlcnlMb3dlckNhc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zU3ViamVjdC5uZXh0KFsuLi5maWx0ZXJlZEl0ZW1zXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zU3ViamVjdC5uZXh0KFsuLi5pdGVtc10pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPHAtYXV0b0NvbXBsZXRlXG4gICAgKG9uRm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2xcIlxuICAgIFtwbGFjZWhvbGRlcl09XCIkYW55KHBsYWNlaG9sZGVyKVwiXG4gICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgIFtkYXRhS2V5XT1cIiRhbnkoZGF0YUtleVByb3BlcnR5KVwiXG4gICAgW2ZpZWxkXT1cIiRhbnkoaXRlbXNMYWJlbFByb3BlcnR5KVwiXG4gICAgW3N1Z2dlc3Rpb25zXT1cIihzdWdnZXN0aW9ucyQgfCBhc3luYykgPz8gW11cIlxuICAgIFttdWx0aXBsZV09XCJtdWx0aXNlbGVjdFwiXG4gICAgW3Nob3dFbXB0eU1lc3NhZ2VdPVwidHJ1ZVwiXG4gICAgW2VtcHR5TWVzc2FnZV09XCInbW5nQXV0b2NvbXBsZXRlLm5vTWF0Y2hlcycgfCB0cmFuc2xhdGVcIlxuICAgIFtzdHlsZUNsYXNzXT1cIiRhbnkoY2xhc3NOYW1lKVwiXG4gICAgW3BhbmVsU3R5bGVDbGFzc109XCIkYW55KGRyb3Bkb3duQ2xhc3NOYW1lKVwiXG4gICAgW21pbkxlbmd0aF09XCJvcGVuT25Gb2N1cyA/IDAgOiAxXCJcbiAgICAoY29tcGxldGVNZXRob2QpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgKG9uU2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgIChvbkJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgZHJvcGRvd25Nb2RlPVwiY3VycmVudFwiPlxuPC9wLWF1dG9Db21wbGV0ZT5cbiJdfQ==