@mediusinc/mng-commons 0.10.3-rc.2 → 0.12.0

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 (325) hide show
  1. package/assets/i18n/en.json +3 -0
  2. package/assets/i18n/sl.json +3 -0
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +67 -67
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +152 -152
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  19. package/esm2020/lib/components/action/action.component.mjs +199 -199
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +247 -247
  21. package/esm2020/lib/components/action/index.mjs +3 -3
  22. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  23. package/esm2020/lib/components/action/models/action-execution.model.mjs +235 -235
  24. package/esm2020/lib/components/action/models/index.mjs +2 -2
  25. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  26. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +277 -277
  27. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +186 -169
  28. package/esm2020/lib/components/form/editor/form-editor.component.mjs +212 -212
  29. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +48 -48
  30. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +43 -43
  31. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  32. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +101 -101
  33. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +22 -22
  34. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +179 -179
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +173 -173
  36. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +150 -150
  37. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -17
  38. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  39. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  41. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  42. package/esm2020/lib/components/form/index.mjs +3 -3
  43. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  44. package/esm2020/lib/components/form/models/index.mjs +1 -1
  45. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  47. package/esm2020/lib/components/layout/index.mjs +7 -7
  48. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  49. package/esm2020/lib/components/layout/menu-item.component.mjs +239 -239
  50. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  51. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  52. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  53. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  54. package/esm2020/lib/components/layout/version.component.mjs +58 -58
  55. package/esm2020/lib/components/tableview/index.mjs +6 -6
  56. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  57. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  58. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +57 -57
  59. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +60 -60
  60. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +105 -102
  61. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  62. package/esm2020/lib/components/tableview/table/table.component.mjs +509 -498
  63. package/esm2020/lib/components/tableview/tableview.component.mjs +91 -91
  64. package/esm2020/lib/config/formly.config.mjs +181 -181
  65. package/esm2020/lib/config/index.mjs +1 -1
  66. package/esm2020/lib/config/models/index.mjs +3 -2
  67. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  68. package/esm2020/lib/config/models/mng-formly-config-model.mjs +2 -0
  69. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  70. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  71. package/esm2020/lib/data-providers/index.mjs +5 -5
  72. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  73. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  74. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  75. package/esm2020/lib/descriptors/action.descriptor.mjs +587 -587
  76. package/esm2020/lib/descriptors/column.descriptor.mjs +264 -264
  77. package/esm2020/lib/descriptors/editor.descriptor.mjs +146 -146
  78. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  79. package/esm2020/lib/descriptors/field.descriptor.mjs +819 -819
  80. package/esm2020/lib/descriptors/filter.descriptor.mjs +291 -289
  81. package/esm2020/lib/descriptors/index.mjs +9 -9
  82. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  83. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  84. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  85. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  86. package/esm2020/lib/descriptors/table.descriptor.mjs +197 -197
  87. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  88. package/esm2020/lib/descriptors/types/action.type.mjs +52 -52
  89. package/esm2020/lib/descriptors/types/column.type.mjs +10 -10
  90. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  91. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  92. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  93. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  94. package/esm2020/lib/descriptors/types/table.type.mjs +16 -16
  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 +440 -442
  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 +2 -0
  103. package/esm2020/lib/models/index.mjs +9 -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 +1 -1
  117. package/esm2020/lib/router/route-builder.mjs +426 -426
  118. package/esm2020/lib/router/tableview-route-builder.mjs +159 -159
  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 +94 -94
  127. package/esm2020/lib/services/action-executor.service.mjs +535 -535
  128. package/esm2020/lib/services/commons.service.mjs +342 -342
  129. package/esm2020/lib/services/configuration.service.mjs +110 -110
  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/types/index.mjs +2 -2
  147. package/esm2020/lib/types/type.decorator.mjs +12 -12
  148. package/esm2020/lib/types/type.model.mjs +1 -1
  149. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  150. package/esm2020/lib/utils/editor-formly.util.mjs +251 -243
  151. package/esm2020/lib/utils/enum.util.mjs +81 -81
  152. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  153. package/esm2020/lib/utils/index.mjs +7 -7
  154. package/esm2020/lib/utils/model.util.mjs +59 -59
  155. package/esm2020/lib/utils/notification.util.mjs +45 -45
  156. package/esm2020/lib/utils/route.util.mjs +23 -23
  157. package/esm2020/lib/utils/styles.util.mjs +40 -40
  158. package/esm2020/lib/utils/type.util.mjs +76 -76
  159. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  160. package/esm2020/public-api.mjs +51 -51
  161. package/fesm2015/mediusinc-mng-commons.mjs +10700 -10664
  162. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  163. package/fesm2020/mediusinc-mng-commons.mjs +10552 -10513
  164. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  165. package/{mediusinc-mng-commons.d.ts → index.d.ts} +5 -5
  166. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  167. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  168. package/lib/api/models/filter-param.model.d.ts +23 -23
  169. package/lib/api/models/index.d.ts +8 -8
  170. package/lib/api/models/mappers.d.ts +6 -6
  171. package/lib/api/models/query-mode.model.d.ts +16 -16
  172. package/lib/api/models/query-param.model.d.ts +31 -31
  173. package/lib/api/models/query-result.model.d.ts +23 -23
  174. package/lib/api/models/serialization.model.d.ts +8 -8
  175. package/lib/api/services/api.abstract.service.d.ts +24 -24
  176. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  177. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  178. package/lib/api/services/index.d.ts +3 -3
  179. package/lib/api/utils/index.d.ts +2 -2
  180. package/lib/api/utils/medius-rest.util.d.ts +15 -15
  181. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  182. package/lib/components/action/action.component.d.ts +75 -75
  183. package/lib/components/action/editor/action-editor.component.d.ts +64 -64
  184. package/lib/components/action/index.d.ts +3 -3
  185. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  186. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  187. package/lib/components/action/models/index.d.ts +2 -2
  188. package/lib/components/action/route/action-route.component.d.ts +31 -31
  189. package/lib/components/form/autocomplete/autocomplete.component.d.ts +56 -56
  190. package/lib/components/form/dropdown/dropdown.component.d.ts +50 -47
  191. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  192. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +15 -15
  193. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  194. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +13 -13
  195. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +23 -23
  196. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +10 -10
  197. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +45 -45
  198. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +23 -23
  199. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +38 -38
  200. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  201. package/lib/components/form/formly/fields/index.d.ts +9 -9
  202. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  203. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  204. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  205. package/lib/components/form/index.d.ts +3 -3
  206. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  207. package/lib/components/form/models/index.d.ts +1 -1
  208. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  209. package/lib/components/layout/footer.component.d.ts +9 -9
  210. package/lib/components/layout/index.d.ts +7 -7
  211. package/lib/components/layout/main-layout.component.d.ts +20 -20
  212. package/lib/components/layout/menu-item.component.d.ts +44 -44
  213. package/lib/components/layout/menu.component.d.ts +10 -10
  214. package/lib/components/layout/services/index.d.ts +1 -1
  215. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  216. package/lib/components/layout/topbar.component.d.ts +24 -24
  217. package/lib/components/layout/version.component.d.ts +19 -19
  218. package/lib/components/tableview/index.d.ts +6 -6
  219. package/lib/components/tableview/models/index.d.ts +1 -1
  220. package/lib/components/tableview/models/table.event.d.ts +17 -17
  221. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  222. package/lib/components/tableview/route/tableview-route.component.d.ts +23 -23
  223. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +32 -32
  224. package/lib/components/tableview/table/column-value/column-value.component.d.ts +29 -29
  225. package/lib/components/tableview/table/table.component.d.ts +108 -108
  226. package/lib/components/tableview/tableview.component.d.ts +41 -41
  227. package/lib/config/formly.config.d.ts +16 -15
  228. package/lib/config/index.d.ts +1 -1
  229. package/lib/config/models/index.d.ts +2 -1
  230. package/lib/config/models/mng-config.model.d.ts +36 -36
  231. package/lib/config/models/mng-formly-config-model.d.ts +17 -0
  232. package/lib/data-providers/base.data-provider.d.ts +14 -14
  233. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  234. package/lib/data-providers/index.d.ts +5 -5
  235. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  236. package/lib/data-providers/table.data-provider.d.ts +14 -14
  237. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  238. package/lib/descriptors/action.descriptor.d.ts +234 -234
  239. package/lib/descriptors/column.descriptor.d.ts +82 -82
  240. package/lib/descriptors/editor.descriptor.d.ts +37 -37
  241. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  242. package/lib/descriptors/field.descriptor.d.ts +300 -294
  243. package/lib/descriptors/filter.descriptor.d.ts +106 -106
  244. package/lib/descriptors/index.d.ts +9 -9
  245. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  246. package/lib/descriptors/interfaces/index.d.ts +2 -2
  247. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  248. package/lib/descriptors/model.descriptor.d.ts +15 -15
  249. package/lib/descriptors/table.descriptor.d.ts +66 -66
  250. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  251. package/lib/descriptors/types/action.type.d.ts +45 -45
  252. package/lib/descriptors/types/column.type.d.ts +9 -9
  253. package/lib/descriptors/types/editor.type.d.ts +6 -6
  254. package/lib/descriptors/types/field.type.d.ts +44 -44
  255. package/lib/descriptors/types/filter.type.d.ts +27 -27
  256. package/lib/descriptors/types/index.d.ts +6 -6
  257. package/lib/descriptors/types/table.type.d.ts +13 -13
  258. package/lib/directives/component.directive.d.ts +16 -16
  259. package/lib/directives/index.d.ts +2 -2
  260. package/lib/directives/template.directive.d.ts +13 -13
  261. package/lib/mng-commons.module.d.ts +87 -87
  262. package/lib/models/column-value.model.d.ts +4 -4
  263. package/lib/models/enum.model.d.ts +6 -6
  264. package/lib/models/error.model.d.ts +14 -14
  265. package/lib/models/formly-field.model.d.ts +16 -0
  266. package/lib/models/index.d.ts +8 -7
  267. package/lib/models/menu.model.d.ts +27 -27
  268. package/lib/models/user.model.d.ts +8 -8
  269. package/lib/models/version.model.d.ts +18 -18
  270. package/lib/models/view-container.model.d.ts +6 -6
  271. package/lib/pipes/boolean.pipe.d.ts +7 -7
  272. package/lib/pipes/enum.pipe.d.ts +8 -8
  273. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  274. package/lib/pipes/index.d.ts +5 -5
  275. package/lib/pipes/json-path.pipe.d.ts +13 -13
  276. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  277. package/lib/router/index.d.ts +2 -2
  278. package/lib/router/models/index.d.ts +1 -1
  279. package/lib/router/models/router.model.d.ts +27 -27
  280. package/lib/router/route-builder.d.ts +98 -98
  281. package/lib/router/tableview-route-builder.d.ts +34 -34
  282. package/lib/security/authorization.guard.d.ts +11 -11
  283. package/lib/security/authorization.service.d.ts +19 -19
  284. package/lib/security/authorization.util.d.ts +5 -5
  285. package/lib/security/index.d.ts +3 -3
  286. package/lib/security/model/authorization.type.d.ts +6 -6
  287. package/lib/security/model/index.d.ts +3 -3
  288. package/lib/security/model/permission-service.interface.d.ts +6 -6
  289. package/lib/security/model/permissions.model.d.ts +44 -44
  290. package/lib/services/action-executor.service.d.ts +149 -149
  291. package/lib/services/commons.service.d.ts +78 -78
  292. package/lib/services/configuration.service.d.ts +36 -36
  293. package/lib/services/error-mapper.service.d.ts +7 -7
  294. package/lib/services/index.d.ts +6 -6
  295. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  296. package/lib/services/internal/commons-init.service.d.ts +16 -16
  297. package/lib/services/internal/index.d.ts +2 -2
  298. package/lib/services/navigation.service.d.ts +14 -14
  299. package/lib/services/providers/config-service.provider.d.ts +6 -6
  300. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  301. package/lib/services/providers/index.d.ts +2 -2
  302. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  303. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  304. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  305. package/lib/services/tokens/index.d.ts +4 -4
  306. package/lib/services/tokens/module-config.token.d.ts +3 -3
  307. package/lib/services/version.service.d.ts +13 -13
  308. package/lib/services/view-container.component.service.d.ts +22 -22
  309. package/lib/types/index.d.ts +2 -2
  310. package/lib/types/type.decorator.d.ts +4 -4
  311. package/lib/types/type.model.d.ts +23 -23
  312. package/lib/utils/action-data-provider.util.d.ts +20 -20
  313. package/lib/utils/editor-formly.util.d.ts +11 -11
  314. package/lib/utils/enum.util.d.ts +50 -50
  315. package/lib/utils/i18n.util.d.ts +56 -56
  316. package/lib/utils/index.d.ts +7 -7
  317. package/lib/utils/model.util.d.ts +8 -8
  318. package/lib/utils/notification.util.d.ts +11 -11
  319. package/lib/utils/route.util.d.ts +4 -4
  320. package/lib/utils/styles.util.d.ts +14 -14
  321. package/lib/utils/type.util.d.ts +36 -36
  322. package/package.json +10 -10
  323. package/public-api.d.ts +32 -32
  324. package/version-info.json +7 -7
  325. package/mediusinc-mng-commons-0.10.3-rc.2.tgz +0 -0
@@ -1,169 +1,186 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
2
- import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { Dropdown } from 'primeng/dropdown';
4
- import { ReplaySubject, of, switchMap } from 'rxjs';
5
- import { first, map } from 'rxjs/operators';
6
- import { 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 "primeng/dropdown";
11
- import * as i4 from "primeng/multiselect";
12
- import * as i5 from "@angular/common";
13
- import * as i6 from "@angular/forms";
14
- export const MNG_DROPDOWN_VALUE_ACCESSOR = {
15
- provide: NG_VALUE_ACCESSOR,
16
- useExisting: forwardRef(() => MngDropdownComponent),
17
- multi: true
18
- };
19
- export class MngDropdownComponent {
20
- constructor(injector, translate, formlyWrapper) {
21
- this.injector = injector;
22
- this.translate = translate;
23
- this.formlyWrapper = formlyWrapper;
24
- this.itemsLabelTranslate = false;
25
- this.multiselect = false;
26
- this.showClear = true;
27
- this.selectFirstItem = false;
28
- this.className = null;
29
- this.dropdownClassName = null;
30
- this.valueChangeEventEmitter = new EventEmitter();
31
- this.itemsSubject = new ReplaySubject(1);
32
- this.dataProviderService = null;
33
- // eslint-disable-next-line @typescript-eslint/no-empty-function
34
- this.onChangeFn = () => { };
35
- // eslint-disable-next-line @typescript-eslint/no-empty-function
36
- this.onTouchedFn = () => { };
37
- this.dropdownFormControl = new FormControl();
38
- this.items$ = this.itemsSubject.asObservable();
39
- }
40
- ngOnInit() {
41
- this.dropdownFormControl.valueChanges.subscribe(v => {
42
- this.onChangeFn(v);
43
- this.valueChangeEventEmitter.next(v);
44
- });
45
- this.itemsLabelProperty = this.itemsLabelPropertyInit;
46
- this.itemsValueProperty = this.itemsValuePropertyInit;
47
- if (this.dataProvider) {
48
- this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
49
- const queryParamBuilder = MediusQueryParamBuilder.create();
50
- if (this.itemsLabelTranslate) {
51
- // setup translation properties
52
- if (this.itemsLabelPropertyInit) {
53
- this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
54
- }
55
- else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
56
- this.itemsLabelProperty = 'title_i18n';
57
- this.itemsValueProperty = 'value';
58
- }
59
- else {
60
- throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
61
- }
62
- }
63
- this.itemsSubscription = this.dataProvider
64
- .lookup(queryParamBuilder.build(), this.dataProviderService)
65
- .pipe(switchMap(items => {
66
- if (this.itemsLabelTranslate) {
67
- const translationKeys = items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
68
- return this.translate.stream(translationKeys).pipe(map(translations => items.map(item => {
69
- if (typeof item === 'object' && this.itemsLabelPropertyInit) {
70
- const label = item[this.itemsLabelPropertyInit];
71
- const translation = translations[label];
72
- if (translation) {
73
- return { ...item, [this.itemsLabelProperty]: translation };
74
- }
75
- return { ...item };
76
- }
77
- else {
78
- const translation = translations[item];
79
- return {
80
- [this.itemsLabelProperty]: translation ?? item,
81
- [this.itemsValueProperty]: item
82
- };
83
- }
84
- })));
85
- }
86
- else {
87
- return of(items);
88
- }
89
- }))
90
- .subscribe(res => {
91
- this.itemsSubject.next(res);
92
- });
93
- if (this.selectFirstItem && !this.dropdownFormControl?.value) {
94
- this.items$.pipe(first()).subscribe(res => {
95
- const value = this.itemsValueProperty ? res[0][this.itemsValueProperty] : res[0];
96
- this.dropdownFormControl?.setValue(value);
97
- });
98
- }
99
- }
100
- else {
101
- console.warn(`Data provider should be provided for MngDropdownComponent.`);
102
- }
103
- }
104
- ngOnDestroy() {
105
- this.itemsSubscription?.unsubscribe();
106
- }
107
- registerOnChange(fn) {
108
- this.onChangeFn = fn;
109
- }
110
- registerOnTouched(fn) {
111
- this.onTouchedFn = fn;
112
- }
113
- setDisabledState(isDisabled) {
114
- if (isDisabled) {
115
- this.dropdownFormControl.disable();
116
- }
117
- else {
118
- this.dropdownFormControl.enable();
119
- }
120
- }
121
- writeValue(obj) {
122
- this.dropdownFormControl.setValue(obj, { emitEvent: false });
123
- }
124
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
125
- onBlur($event) {
126
- this.formlyWrapper?.formControl?.markAsTouched();
127
- }
128
- }
129
- MngDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngDropdownComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
130
- MngDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: MngDropdownComponent, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsDisabledProperty: "itemsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n display=\"chip\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"false\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n", components: [{ type: i3.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], pipes: { "async": i5.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngDropdownComponent, decorators: [{
132
- type: Component,
133
- args: [{ selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n display=\"chip\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"false\"\n (onBlur)=\"onBlur($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n" }]
134
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
135
- type: Optional
136
- }] }]; }, propDecorators: { dataProvider: [{
137
- type: Input
138
- }], dataKeyProperty: [{
139
- type: Input
140
- }], itemsLabelPropertyInit: [{
141
- type: Input,
142
- args: ['itemsLabelProperty']
143
- }], itemsLabelTranslate: [{
144
- type: Input
145
- }], itemsValuePropertyInit: [{
146
- type: Input,
147
- args: ['itemsValueProperty']
148
- }], itemsDisabledProperty: [{
149
- type: Input
150
- }], multiselect: [{
151
- type: Input
152
- }], placeholder: [{
153
- type: Input
154
- }], showClear: [{
155
- type: Input
156
- }], selectFirstItem: [{
157
- type: Input
158
- }], className: [{
159
- type: Input
160
- }], dropdownClassName: [{
161
- type: Input
162
- }], valueChangeEventEmitter: [{
163
- type: Output,
164
- args: ['valueChange']
165
- }], primeDropdown: [{
166
- type: ViewChild,
167
- args: [Dropdown]
168
- }] } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQThCLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlLLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBYSxhQUFhLEVBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckYsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFJNUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQXFCO0lBQ3pELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFRRixNQUFNLE9BQU8sb0JBQW9CO0lBK0I3QixZQUFvQixRQUFrQixFQUFVLFNBQTJCLEVBQXNCLGFBQTZDO1FBQTFILGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFzQixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0M7UUEzQjlILHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUc1QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGNBQVMsR0FBa0IsSUFBSSxDQUFDO1FBQ2hDLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFFMUIsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU1uRSxpQkFBWSxHQUF3QixJQUFJLGFBQWEsQ0FBYSxDQUFDLENBQUMsQ0FBQztRQUNyRSx3QkFBbUIsR0FBUSxJQUFJLENBQUM7UUFDeEMsZ0VBQWdFO1FBQ3hELGVBQVUsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDbkMsZ0VBQWdFO1FBQ3hELGdCQUFXLEdBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRTdCLHdCQUFtQixHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JELFdBQU0sR0FBMkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUd3RSxDQUFDO0lBRWxKLFFBQVE7UUFDSixJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFFdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXhILE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFCLCtCQUErQjtnQkFDL0IsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsT0FBTyxDQUFDO2lCQUNuRTtxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO29CQUNqRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDO29CQUN2QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDO2lCQUNyQztxQkFBTTtvQkFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsc0JBQXNCLGdCQUFnQixJQUFJLENBQUMsc0JBQXNCLG1CQUFtQixDQUFDLENBQUM7aUJBQ3pJO2FBQ0o7WUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVk7aUJBQ3JDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUM7aUJBQzNELElBQUksQ0FDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzFCLE1BQU0sZUFBZSxHQUFhLEtBQUssQ0FBQyxHQUFHLENBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQyxDQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBVyxDQUNySixDQUFDO29CQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUM5QyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDZixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNiLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTs0QkFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0MsQ0FBVyxDQUFDOzRCQUMxRSxNQUFNLFdBQVcsR0FBdUIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM1RCxJQUFJLFdBQVcsRUFBRTtnQ0FDYixPQUFPLEVBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQW1CLENBQUMsRUFBRSxXQUFXLEVBQUMsQ0FBQzs2QkFDN0Q7NEJBQ0QsT0FBTyxFQUFDLEdBQUcsSUFBSSxFQUFDLENBQUM7eUJBQ3BCOzZCQUFNOzRCQUNILE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDdkMsT0FBTztnQ0FDSCxDQUFDLElBQUksQ0FBQyxrQkFBbUIsQ0FBQyxFQUFFLFdBQVcsSUFBSSxJQUFJO2dDQUMvQyxDQUFDLElBQUksQ0FBQyxrQkFBbUIsQ0FBQyxFQUFFLElBQUk7NkJBQ25DLENBQUM7eUJBQ0w7b0JBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FDSixDQUFDO2lCQUNMO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNwQjtZQUNMLENBQUMsQ0FBQyxDQUNMO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUVQLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7YUFBTTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztTQUM5RTtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNoQyxJQUFJLFVBQVUsRUFBRTtZQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN0QzthQUFNO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFRO1FBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDckQsQ0FBQzs7aUhBdElRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLDhrQkFIbEIsQ0FBQywyQkFBMkIsQ0FBQyx5RUFtQjdCLFFBQVEsZ0RDeEN2QixvdUNBaUNBOzJGRFRhLG9CQUFvQjtrQkFOaEMsU0FBUzsrQkFDSSxjQUFjLGFBRWIsQ0FBQywyQkFBMkIsQ0FBQyxtQkFDdkIsdUJBQXVCLENBQUMsTUFBTTs7MEJBaUMrQixRQUFROzRDQTlCdEUsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUM4QixzQkFBc0I7c0JBQXpELEtBQUs7dUJBQUMsb0JBQW9CO2dCQUNYLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFDOEIsc0JBQXNCO3NCQUF6RCxLQUFLO3VCQUFDLG9CQUFvQjtnQkFDWCxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFFd0IsdUJBQXVCO3NCQUFwRCxNQUFNO3VCQUFDLGFBQWE7Z0JBRU8sYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEV4aXN0aW5nUHJvdmlkZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RHJvcGRvd259IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXJ9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudH0gZnJvbSAnLi4vZm9ybWx5L3dyYXBwZXJzJztcblxuZXhwb3J0IGNvbnN0IE1OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUjogRXhpc3RpbmdQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNbmdEcm9wZG93bkNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW5nLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW01OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPGFueSwgYW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgnaXRlbXNMYWJlbFByb3BlcnR5JykgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2l0ZW1zVmFsdWVQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc1ZhbHVlUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0Rpc2FibGVkUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2xlYXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RGaXJzdEl0ZW0gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgQE91dHB1dCgndmFsdWVDaGFuZ2UnKSBwdWJsaWMgdmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKERyb3Bkb3duKSBwdWJsaWMgcHJpbWVEcm9wZG93bj86IERyb3Bkb3duO1xuXG4gICAgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgaXRlbXNTdWJqZWN0OiBTdWJqZWN0PEFycmF5PGFueT4+ID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8YW55Pj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uQ2hhbmdlRm46IGFueSA9ICgpID0+IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uVG91Y2hlZEZuOiBhbnkgPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBkcm9wZG93bkZvcm1Db250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgIHB1YmxpYyBpdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8YW55Pj4gPSB0aGlzLml0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwcml2YXRlIGl0ZW1zU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1seVdyYXBwZXI6IE1uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudCkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VGbih2KTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIubmV4dCh2KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ7XG4gICAgICAgIHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID0gdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0O1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlID0gdGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUgPyB0aGlzLmluamVjdG9yLmdldDxhbnk+KHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1CdWlsZGVyID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCB0cmFuc2xhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9IGAke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH1faTE4bmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgJiYgIXRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9ICd0aXRsZV9pMThuJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1c2Ugd2l0aCB2YWx1ZSAoJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9KSBhbmQgbGFiZWwgKCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fSkgcHJvcGVydHkgc2V0dXAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLml0ZW1zU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgICAgICAubG9va3VwKHF1ZXJ5UGFyYW1CdWlsZGVyLmJ1aWxkKCksIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbktleXM6IHN0cmluZ1tdID0gaXRlbXMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0+ICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0ID8gKGl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nKSA6IGl0ZW0pIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLnN0cmVhbSh0cmFuc2xhdGlvbktleXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCh0cmFuc2xhdGlvbnMgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdHJhbnNsYXRpb25zW2xhYmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW0sIFt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSFdOiB0cmFuc2xhdGlvbn07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tpdGVtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSFdOiB0cmFuc2xhdGlvbiA/PyBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5IV06IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zU3ViamVjdC5uZXh0KHJlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEZpcnN0SXRlbSAmJiAhdGhpcy5kcm9wZG93bkZvcm1Db250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPyByZXNbMF1bdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHldIDogcmVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGF0YSBwcm92aWRlciBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIE1uZ0Ryb3Bkb3duQ29tcG9uZW50LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnNldFZhbHVlKG9iaiwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25CbHVyKCRldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybWx5V3JhcHBlcj8uZm9ybUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG59XG4iLCI8cC1kcm9wZG93blxuICAgICpuZ0lmPVwiIW11bHRpc2VsZWN0OyBlbHNlIHBNdWx0aXNlbGVjdFwiXG4gICAgW2Zvcm1Db250cm9sXT1cImRyb3Bkb3duRm9ybUNvbnRyb2xcIlxuICAgIFtwbGFjZWhvbGRlcl09XCIkYW55KHBsYWNlaG9sZGVyKVwiXG4gICAgW2RhdGFLZXldPVwiJGFueShkYXRhS2V5UHJvcGVydHkpXCJcbiAgICBbb3B0aW9uTGFiZWxdPVwiJGFueShpdGVtc0xhYmVsUHJvcGVydHkpXCJcbiAgICBbb3B0aW9uVmFsdWVdPVwiJGFueShpdGVtc1ZhbHVlUHJvcGVydHkpXCJcbiAgICBbb3B0aW9uRGlzYWJsZWRdPVwiJGFueShpdGVtc0Rpc2FibGVkUHJvcGVydHkpXCJcbiAgICBbb3B0aW9uc109XCIkYW55KGl0ZW1zJCB8IGFzeW5jKVwiXG4gICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIlxuICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcbiAgICBbc3R5bGVDbGFzc109XCIkYW55KGNsYXNzTmFtZSlcIlxuICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiJGFueShkcm9wZG93bkNsYXNzTmFtZSlcIlxuICAgIChvbkJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuPC9wLWRyb3Bkb3duPlxuPG5nLXRlbXBsYXRlICNwTXVsdGlzZWxlY3Q+XG4gICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgZGlzcGxheT1cImNoaXBcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZHJvcGRvd25Gb3JtQ29udHJvbFwiXG4gICAgICAgIFtkZWZhdWx0TGFiZWxdPVwiJGFueShwbGFjZWhvbGRlcilcIlxuICAgICAgICBbZGF0YUtleV09XCIkYW55KGRhdGFLZXlQcm9wZXJ0eSlcIlxuICAgICAgICBbb3B0aW9uTGFiZWxdPVwiJGFueShpdGVtc0xhYmVsUHJvcGVydHkpXCJcbiAgICAgICAgW29wdGlvblZhbHVlXT1cIiRhbnkoaXRlbXNWYWx1ZVByb3BlcnR5KVwiXG4gICAgICAgIFtvcHRpb25EaXNhYmxlZF09XCIkYW55KGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eSlcIlxuICAgICAgICBbb3B0aW9uc109XCIoaXRlbXMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJGFueShjbGFzc05hbWUpXCJcbiAgICAgICAgW3BhbmVsU3R5bGVDbGFzc109XCIkYW55KGRyb3Bkb3duQ2xhc3NOYW1lKVwiXG4gICAgICAgIFtmaWx0ZXJdPVwiZmFsc2VcIlxuICAgICAgICAob25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgPC9wLW11bHRpU2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
2
+ import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Dropdown } from 'primeng/dropdown';
4
+ import { ReplaySubject, of, switchMap } from 'rxjs';
5
+ import { first, map } from 'rxjs/operators';
6
+ import { 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/common";
11
+ import * as i4 from "@angular/forms";
12
+ import * as i5 from "primeng/dropdown";
13
+ import * as i6 from "primeng/multiselect";
14
+ export const MNG_DROPDOWN_VALUE_ACCESSOR = {
15
+ provide: NG_VALUE_ACCESSOR,
16
+ useExisting: forwardRef(() => MngDropdownComponent),
17
+ multi: true
18
+ };
19
+ export class MngDropdownComponent {
20
+ constructor(injector, translate, formlyWrapper) {
21
+ this.injector = injector;
22
+ this.translate = translate;
23
+ this.formlyWrapper = formlyWrapper;
24
+ this.itemsLabelTranslate = false;
25
+ this.multiselect = false;
26
+ this.showClear = true;
27
+ this.selectFirstItem = false;
28
+ this.className = null;
29
+ this.dropdownClassName = null;
30
+ this.changeValueOnBlur = false;
31
+ this.valueChangeEventEmitter = new EventEmitter();
32
+ this.itemsSubject = new ReplaySubject(1);
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.dropdownFormControl = new FormControl();
39
+ this.items$ = this.itemsSubject.asObservable();
40
+ }
41
+ ngOnInit() {
42
+ this.itemsLabelProperty = this.itemsLabelPropertyInit;
43
+ this.itemsValueProperty = this.itemsValuePropertyInit;
44
+ this.dropdownFormControl.valueChanges.subscribe(v => {
45
+ if (!this.changeValueOnBlur) {
46
+ this.propagateValueChange(v);
47
+ }
48
+ });
49
+ if (this.dataProvider) {
50
+ this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
51
+ const queryParamBuilder = MediusQueryParamBuilder.create();
52
+ if (this.itemsLabelTranslate) {
53
+ // setup translation properties
54
+ if (this.itemsLabelPropertyInit) {
55
+ this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
56
+ }
57
+ else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
58
+ this.itemsLabelProperty = 'title_i18n';
59
+ this.itemsValueProperty = 'value';
60
+ }
61
+ else {
62
+ throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
63
+ }
64
+ }
65
+ this.itemsSubscription = this.dataProvider
66
+ .lookup(queryParamBuilder.build(), this.dataProviderService)
67
+ .pipe(switchMap(items => {
68
+ if (this.itemsLabelTranslate) {
69
+ const translationKeys = items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
70
+ return this.translate.stream(translationKeys).pipe(map(translations => items.map(item => {
71
+ if (typeof item === 'object' && this.itemsLabelPropertyInit) {
72
+ const label = item[this.itemsLabelPropertyInit];
73
+ const translation = translations[label];
74
+ if (translation) {
75
+ return { ...item, [this.itemsLabelProperty]: translation };
76
+ }
77
+ return { ...item };
78
+ }
79
+ else {
80
+ const translation = translations[item];
81
+ return {
82
+ [this.itemsLabelProperty]: translation ?? item,
83
+ [this.itemsValueProperty]: item
84
+ };
85
+ }
86
+ })));
87
+ }
88
+ else {
89
+ return of(items);
90
+ }
91
+ }))
92
+ .subscribe(res => {
93
+ this.itemsSubject.next(res);
94
+ });
95
+ if (this.selectFirstItem && !this.dropdownFormControl?.value) {
96
+ this.items$.pipe(first()).subscribe(res => {
97
+ const value = this.itemsValueProperty ? res[0][this.itemsValueProperty] : res[0];
98
+ this.dropdownFormControl?.setValue(value);
99
+ });
100
+ }
101
+ }
102
+ else {
103
+ console.warn(`Data provider should be provided for MngDropdownComponent.`);
104
+ }
105
+ }
106
+ ngOnDestroy() {
107
+ this.itemsSubscription?.unsubscribe();
108
+ }
109
+ registerOnChange(fn) {
110
+ this.onChangeFn = fn;
111
+ }
112
+ registerOnTouched(fn) {
113
+ this.onTouchedFn = fn;
114
+ }
115
+ setDisabledState(isDisabled) {
116
+ if (isDisabled) {
117
+ this.dropdownFormControl.disable();
118
+ }
119
+ else {
120
+ this.dropdownFormControl.enable();
121
+ }
122
+ }
123
+ writeValue(obj) {
124
+ this.dropdownFormControl.setValue(obj, { emitEvent: false });
125
+ }
126
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
127
+ onDropdownBlur(event) {
128
+ if (this.changeValueOnBlur) {
129
+ this.propagateValueChange(this.dropdownFormControl.value);
130
+ }
131
+ }
132
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
133
+ onPanelHide(event) {
134
+ if (this.changeValueOnBlur) {
135
+ this.propagateValueChange(this.dropdownFormControl.value);
136
+ }
137
+ }
138
+ propagateValueChange(value) {
139
+ this.formlyWrapper?.formControl?.markAsTouched();
140
+ this.onChangeFn(value);
141
+ this.valueChangeEventEmitter.next(value);
142
+ }
143
+ }
144
+ MngDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngDropdownComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
145
+ MngDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngDropdownComponent, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsDisabledProperty: "itemsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName", changeValueOnBlur: "changeValueOnBlur" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "itemSize", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngDropdownComponent, decorators: [{
147
+ type: Component,
148
+ args: [{ selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n" }]
149
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
150
+ type: Optional
151
+ }] }]; }, propDecorators: { dataProvider: [{
152
+ type: Input
153
+ }], dataKeyProperty: [{
154
+ type: Input
155
+ }], itemsLabelPropertyInit: [{
156
+ type: Input,
157
+ args: ['itemsLabelProperty']
158
+ }], itemsLabelTranslate: [{
159
+ type: Input
160
+ }], itemsValuePropertyInit: [{
161
+ type: Input,
162
+ args: ['itemsValueProperty']
163
+ }], itemsDisabledProperty: [{
164
+ type: Input
165
+ }], multiselect: [{
166
+ type: Input
167
+ }], placeholder: [{
168
+ type: Input
169
+ }], showClear: [{
170
+ type: Input
171
+ }], selectFirstItem: [{
172
+ type: Input
173
+ }], className: [{
174
+ type: Input
175
+ }], dropdownClassName: [{
176
+ type: Input
177
+ }], changeValueOnBlur: [{
178
+ type: Input
179
+ }], valueChangeEventEmitter: [{
180
+ type: Output,
181
+ args: ['valueChange']
182
+ }], primeDropdown: [{
183
+ type: ViewChild,
184
+ args: [Dropdown]
185
+ }] } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQThCLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlLLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBYSxhQUFhLEVBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckYsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFJNUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQXFCO0lBQ3pELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFRRixNQUFNLE9BQU8sb0JBQW9CO0lBZ0M3QixZQUFvQixRQUFrQixFQUFVLFNBQTJCLEVBQXNCLGFBQTZDO1FBQTFILGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFzQixrQkFBYSxHQUFi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c0JBQXhCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFFd0IsdUJBQXVCO3NCQUFwRCxNQUFNO3VCQUFDLGFBQWE7Z0JBRU8sYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEV4aXN0aW5nUHJvdmlkZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RHJvcGRvd259IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXJ9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudH0gZnJvbSAnLi4vZm9ybWx5L3dyYXBwZXJzJztcblxuZXhwb3J0IGNvbnN0IE1OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUjogRXhpc3RpbmdQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNbmdEcm9wZG93bkNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW5nLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW01OR19EUk9QRE9XTl9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPGFueSwgYW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgnaXRlbXNMYWJlbFByb3BlcnR5JykgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2l0ZW1zVmFsdWVQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc1ZhbHVlUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0Rpc2FibGVkUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2xlYXIgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RGaXJzdEl0ZW0gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25DbGFzc05hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGFuZ2VWYWx1ZU9uQmx1ciA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgndmFsdWVDaGFuZ2UnKSBwdWJsaWMgdmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKERyb3Bkb3duKSBwdWJsaWMgcHJpbWVEcm9wZG93bj86IERyb3Bkb3duO1xuXG4gICAgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgaXRlbXNTdWJqZWN0OiBTdWJqZWN0PEFycmF5PGFueT4+ID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8YW55Pj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uQ2hhbmdlRm46IGFueSA9ICgpID0+IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uVG91Y2hlZEZuOiBhbnkgPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBkcm9wZG93bkZvcm1Db250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgIHB1YmxpYyBpdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8YW55Pj4gPSB0aGlzLml0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwcml2YXRlIGl0ZW1zU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1seVdyYXBwZXI6IE1uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudCkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdDtcbiAgICAgICAgdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQ7XG5cbiAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hhbmdlVmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlID8gdGhpcy5pbmplY3Rvci5nZXQ8YW55Pih0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkgOiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtQnVpbGRlciA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNsYXRpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSBgJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9X2kxOG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ICYmICF0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSAndGl0bGVfaTE4bic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdXNlIHdpdGggdmFsdWUgKCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fSkgYW5kIGxhYmVsICgke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH0pIHByb3BlcnR5IHNldHVwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyXG4gICAgICAgICAgICAgICAgLmxvb2t1cChxdWVyeVBhcmFtQnVpbGRlci5idWlsZCgpLCB0aGlzLmRhdGFQcm92aWRlclNlcnZpY2UpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25LZXlzOiBzdHJpbmdbXSA9IGl0ZW1zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9PiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCA/IChpdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZykgOiBpdGVtKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5zdHJlYW0odHJhbnNsYXRpb25LZXlzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAodHJhbnNsYXRpb25zID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRyYW5zbGF0aW9uc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtLCBbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb259O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbX07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb24gPz8gaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSFdOiBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0gJiYgIXRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID8gcmVzWzBdW3RoaXMuaXRlbXNWYWx1ZVByb3BlcnR5XSA6IHJlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZvcm1Db250cm9sPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYERhdGEgcHJvdmlkZXIgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBNbmdEcm9wZG93bkNvbXBvbmVudC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLml0ZW1zU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC5zZXRWYWx1ZShvYmosIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRHJvcGRvd25CbHVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVDaGFuZ2UodGhpcy5kcm9wZG93bkZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblBhbmVsSGlkZShldmVudDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmNoYW5nZVZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHRoaXMuZHJvcGRvd25Gb3JtQ29udHJvbC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb3BhZ2F0ZVZhbHVlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5mb3JtbHlXcmFwcGVyPy5mb3JtQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIubmV4dCh2YWx1ZSk7XG4gICAgfVxufVxuIiwiPHAtZHJvcGRvd25cbiAgICAqbmdJZj1cIiFtdWx0aXNlbGVjdDsgZWxzZSBwTXVsdGlzZWxlY3RcIlxuICAgIFtmb3JtQ29udHJvbF09XCJkcm9wZG93bkZvcm1Db250cm9sXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiJGFueShwbGFjZWhvbGRlcilcIlxuICAgIFtkYXRhS2V5XT1cIiRhbnkoZGF0YUtleVByb3BlcnR5KVwiXG4gICAgW29wdGlvbkxhYmVsXT1cIiRhbnkoaXRlbXNMYWJlbFByb3BlcnR5KVwiXG4gICAgW29wdGlvblZhbHVlXT1cIiRhbnkoaXRlbXNWYWx1ZVByb3BlcnR5KVwiXG4gICAgW29wdGlvbkRpc2FibGVkXT1cIiRhbnkoaXRlbXNEaXNhYmxlZFByb3BlcnR5KVwiXG4gICAgW29wdGlvbnNdPVwiJGFueShpdGVtcyQgfCBhc3luYylcIlxuICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcbiAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXG4gICAgW3N0eWxlQ2xhc3NdPVwiJGFueShjbGFzc05hbWUpXCJcbiAgICBbcGFuZWxTdHlsZUNsYXNzXT1cIiRhbnkoZHJvcGRvd25DbGFzc05hbWUpXCJcbiAgICAob25CbHVyKT1cIm9uRHJvcGRvd25CbHVyKCRldmVudClcIlxuICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuPC9wLWRyb3Bkb3duPlxuPG5nLXRlbXBsYXRlICNwTXVsdGlzZWxlY3Q+XG4gICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgW21heFNlbGVjdGVkTGFiZWxzXT1cIjFcIlxuICAgICAgICBbc2VsZWN0ZWRJdGVtc0xhYmVsXT1cIidtbmdEcm9wZG93bi5tdWx0aXNlbGVjdE92ZXJNYXhEaXNwbGF5TGltaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImRyb3Bkb3duRm9ybUNvbnRyb2xcIlxuICAgICAgICBbZGVmYXVsdExhYmVsXT1cIiRhbnkocGxhY2Vob2xkZXIpXCJcbiAgICAgICAgW2RhdGFLZXldPVwiJGFueShkYXRhS2V5UHJvcGVydHkpXCJcbiAgICAgICAgW29wdGlvbkxhYmVsXT1cIiRhbnkoaXRlbXNMYWJlbFByb3BlcnR5KVwiXG4gICAgICAgIFtvcHRpb25WYWx1ZV09XCIkYW55KGl0ZW1zVmFsdWVQcm9wZXJ0eSlcIlxuICAgICAgICBbb3B0aW9uRGlzYWJsZWRdPVwiJGFueShpdGVtc0Rpc2FibGVkUHJvcGVydHkpXCJcbiAgICAgICAgW29wdGlvbnNdPVwiKGl0ZW1zJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cIiRhbnkoY2xhc3NOYW1lKVwiXG4gICAgICAgIFtwYW5lbFN0eWxlQ2xhc3NdPVwiJGFueShkcm9wZG93bkNsYXNzTmFtZSlcIlxuICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXG4gICAgICAgIChvblBhbmVsSGlkZSk9XCJvblBhbmVsSGlkZSgkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgPC9wLW11bHRpU2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==