@mediusinc/mng-commons 3.6.0 → 4.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/README.md +6 -5
  2. package/esm2022/index.mjs +6 -3
  3. package/esm2022/lib/api/models/filter-param.model.mjs +1 -1
  4. package/esm2022/lib/api/models/index.mjs +1 -3
  5. package/esm2022/lib/api/models/query-param.model.mjs +1 -1
  6. package/esm2022/lib/api/models/query-result.model.mjs +12 -1
  7. package/esm2022/lib/api/services/api.abstract.service.mjs +2 -2
  8. package/esm2022/lib/api/services/get-all-api.abstract.service.mjs +1 -1
  9. package/esm2022/lib/api/utils/index.mjs +2 -2
  10. package/esm2022/lib/api/utils/object-serializer.util.mjs +53 -137
  11. package/esm2022/lib/components/action/action.component.mjs +17 -16
  12. package/esm2022/lib/components/action/editor/action-editor.component.mjs +12 -12
  13. package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +7 -7
  14. package/esm2022/lib/components/action/models/action-component.model.mjs +1 -1
  15. package/esm2022/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  16. package/esm2022/lib/components/action/models/action-execution.model.mjs +5 -5
  17. package/esm2022/lib/components/action/route/action-route.component.mjs +6 -6
  18. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +74 -65
  19. package/esm2022/lib/components/form/date-range/date-range.component.mjs +6 -7
  20. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +39 -39
  21. package/esm2022/lib/components/form/editor/form-editor.component.mjs +14 -16
  22. package/esm2022/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +6 -6
  23. package/esm2022/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
  24. package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +3 -3
  25. package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +3 -3
  26. package/esm2022/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +5 -5
  27. package/esm2022/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +5 -6
  28. package/esm2022/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +10 -13
  29. package/esm2022/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +3 -3
  30. package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +13 -13
  31. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +26 -15
  32. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +14 -14
  33. package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +5 -6
  34. package/esm2022/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +5 -6
  35. package/esm2022/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +39 -18
  36. package/esm2022/lib/components/layout/breadcrumb.component.mjs +4 -4
  37. package/esm2022/lib/components/layout/footer.component.mjs +4 -4
  38. package/esm2022/lib/components/layout/main-layout.component.mjs +8 -8
  39. package/esm2022/lib/components/layout/menu-item.component.mjs +8 -8
  40. package/esm2022/lib/components/layout/menu.component.mjs +7 -7
  41. package/esm2022/lib/components/layout/services/main-layout.component.service.mjs +4 -4
  42. package/esm2022/lib/components/layout/topbar-user.component.mjs +9 -9
  43. package/esm2022/lib/components/layout/topbar.component.mjs +8 -8
  44. package/esm2022/lib/components/layout/version.component.mjs +11 -11
  45. package/esm2022/lib/components/layoutV2/breadcrumb.component.mjs +6 -6
  46. package/esm2022/lib/components/layoutV2/footer.component.mjs +3 -3
  47. package/esm2022/lib/components/layoutV2/main-layout.component.mjs +14 -11
  48. package/esm2022/lib/components/layoutV2/menu-item.component.mjs +12 -9
  49. package/esm2022/lib/components/layoutV2/menu.component.mjs +5 -6
  50. package/esm2022/lib/components/layoutV2/model/layout-state.model.mjs +1 -1
  51. package/esm2022/lib/components/layoutV2/services/main-layout.component.service.mjs +30 -21
  52. package/esm2022/lib/components/layoutV2/services/menu.service.mjs +3 -3
  53. package/esm2022/lib/components/layoutV2/sidebar.component.mjs +18 -9
  54. package/esm2022/lib/components/layoutV2/topbar-user.component.mjs +6 -6
  55. package/esm2022/lib/components/layoutV2/topbar.component.mjs +6 -7
  56. package/esm2022/lib/components/layoutV2/version.component.mjs +11 -11
  57. package/esm2022/lib/components/pages/error/error.page.component.mjs +4 -4
  58. package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +4 -4
  59. package/esm2022/lib/components/tableview/index.mjs +1 -2
  60. package/esm2022/lib/components/tableview/models/table.event.mjs +1 -1
  61. package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +18 -18
  62. package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +5 -5
  63. package/esm2022/lib/components/tableview/table/column-filter-full/column-filter-full.component.mjs +8 -12
  64. package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +9 -32
  65. package/esm2022/lib/components/tableview/table/table.component.mjs +20 -25
  66. package/esm2022/lib/components/tableview/tableview.component.mjs +8 -10
  67. package/esm2022/lib/data-providers/base.data-provider.mjs +43 -12
  68. package/esm2022/lib/data-providers/editor.data-provider.mjs +82 -14
  69. package/esm2022/lib/data-providers/lookup.data-provider.mjs +38 -9
  70. package/esm2022/lib/data-providers/table.data-provider.mjs +41 -14
  71. package/esm2022/lib/data-providers/tableview-crud.data-provider.mjs +14 -6
  72. package/esm2022/lib/data-providers/tableview.data-provider.mjs +89 -29
  73. package/esm2022/lib/descriptors/action/action-confirmation.descriptor.mjs +2 -2
  74. package/esm2022/lib/descriptors/action/action-editor.descriptor.mjs +262 -0
  75. package/esm2022/lib/descriptors/action/action-link.descriptor.mjs +90 -0
  76. package/esm2022/lib/descriptors/action/action.descriptor.mjs +91 -352
  77. package/esm2022/lib/descriptors/action/index.mjs +3 -1
  78. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +215 -102
  79. package/esm2022/lib/descriptors/editor/field-action.descriptor.mjs +50 -0
  80. package/esm2022/lib/descriptors/editor/field-base.descriptor.mjs +293 -0
  81. package/esm2022/lib/descriptors/editor/field-group.descriptor.mjs +97 -0
  82. package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +211 -0
  83. package/esm2022/lib/descriptors/editor/field-many.descriptor.mjs +153 -0
  84. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +81 -852
  85. package/esm2022/lib/descriptors/editor/index.mjs +6 -1
  86. package/esm2022/lib/descriptors/editor/internal/editor-fields.model.mjs +2 -0
  87. package/esm2022/lib/descriptors/editor/internal/editor.model.mjs +2 -0
  88. package/esm2022/lib/descriptors/filter/filter-lookup.descriptor.mjs +210 -0
  89. package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +2 -208
  90. package/esm2022/lib/descriptors/filter/index.mjs +2 -1
  91. package/esm2022/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  92. package/esm2022/lib/descriptors/model/index.mjs +2 -0
  93. package/esm2022/lib/descriptors/model/model.descriptor.mjs +70 -0
  94. package/esm2022/lib/descriptors/table/column.descriptor.mjs +38 -49
  95. package/esm2022/lib/descriptors/table/internal/table-columns.model.mjs +2 -0
  96. package/esm2022/lib/descriptors/table/internal/table.model.mjs +2 -0
  97. package/esm2022/lib/descriptors/table/table.descriptor.mjs +143 -124
  98. package/esm2022/lib/descriptors/tableview/internal/tableview.model.mjs +2 -0
  99. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +240 -131
  100. package/esm2022/lib/directives/component.directive.mjs +11 -11
  101. package/esm2022/lib/directives/dialog-keydown-handler.directive.mjs +3 -3
  102. package/esm2022/lib/directives/template.directive.mjs +9 -9
  103. package/esm2022/lib/helpers/coercion.mjs +45 -0
  104. package/esm2022/lib/models/class.model.mjs +2 -0
  105. package/esm2022/lib/models/enum.model.mjs +1 -1
  106. package/esm2022/lib/models/index.mjs +4 -1
  107. package/esm2022/lib/models/radio.model.mjs +2 -0
  108. package/esm2022/lib/models/tableview-attr.model.mjs +1 -1
  109. package/esm2022/lib/models/type-registry.model.mjs +2 -0
  110. package/esm2022/lib/models/view-container.model.mjs +1 -1
  111. package/esm2022/lib/pipes/boolean.pipe.mjs +3 -3
  112. package/esm2022/lib/pipes/class-map.pipe.mjs +3 -3
  113. package/esm2022/lib/pipes/enum.pipe.mjs +6 -6
  114. package/esm2022/lib/pipes/enumerate-async.pipe.mjs +5 -5
  115. package/esm2022/lib/pipes/enumerate.pipe.mjs +5 -5
  116. package/esm2022/lib/pipes/getter.pipe.mjs +5 -5
  117. package/esm2022/lib/pipes/i18n-property.pipe.mjs +4 -4
  118. package/esm2022/lib/pipes/json-path.pipe.mjs +3 -3
  119. package/esm2022/lib/pipes/locale-default-row-class.pipe.mjs +5 -5
  120. package/esm2022/lib/pipes/parametrize.pipe.mjs +3 -3
  121. package/esm2022/lib/pipes/template.pipe.mjs +4 -4
  122. package/esm2022/lib/provide-commons.mjs +4 -4
  123. package/esm2022/lib/registry/type.registry.mjs +114 -0
  124. package/esm2022/lib/router/models/router.model.mjs +1 -1
  125. package/esm2022/lib/router/tableview-route-builder.mjs +5 -5
  126. package/esm2022/lib/security/authorization.service.mjs +9 -11
  127. package/esm2022/lib/services/action-executor.service.mjs +14 -12
  128. package/esm2022/lib/services/commons-init.service.mjs +3 -3
  129. package/esm2022/lib/services/commons.service.mjs +6 -5
  130. package/esm2022/lib/services/mng-localstorage-config.service.mjs +4 -4
  131. package/esm2022/lib/services/navigation.service.mjs +5 -5
  132. package/esm2022/lib/services/router.service.mjs +4 -4
  133. package/esm2022/lib/services/version.service.mjs +5 -5
  134. package/esm2022/lib/services/view-container.component.service.mjs +5 -5
  135. package/esm2022/lib/styles/styles.util.mjs +1 -1
  136. package/esm2022/lib/types/action-descriptor.types.mjs +2 -0
  137. package/esm2022/lib/types/data-provider.types.mjs +2 -0
  138. package/esm2022/lib/types/getter.type.mjs +2 -0
  139. package/esm2022/lib/types/index.mjs +5 -2
  140. package/esm2022/lib/types/localstorage-config-value.type.mjs +2 -0
  141. package/esm2022/lib/types/type.decorator.mjs +4 -14
  142. package/esm2022/lib/types/type.model.mjs +1 -1
  143. package/esm2022/lib/utils/action-data-provider.util.mjs +14 -8
  144. package/esm2022/lib/utils/decorator-metadata.util.mjs +61 -0
  145. package/esm2022/lib/utils/editor-formly.util.mjs +6 -5
  146. package/esm2022/lib/utils/enum.util.mjs +1 -1
  147. package/esm2022/lib/utils/export.util.mjs +5 -4
  148. package/esm2022/lib/utils/i18n.util.mjs +22 -22
  149. package/esm2022/lib/utils/index.mjs +2 -3
  150. package/esm2022/lib/utils/model.util.mjs +40 -36
  151. package/esm2022/lib/utils/notification.util.mjs +1 -1
  152. package/esm2022/lib/utils/tableview.util.mjs +17 -17
  153. package/fesm2022/mediusinc-mng-commons.mjs +11491 -11384
  154. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  155. package/index.d.ts +3 -2
  156. package/lib/api/models/filter-param.model.d.ts +3 -3
  157. package/lib/api/models/index.d.ts +0 -2
  158. package/lib/api/models/query-param.model.d.ts +3 -3
  159. package/lib/api/models/query-result.model.d.ts +3 -3
  160. package/lib/api/services/api.abstract.service.d.ts +1 -1
  161. package/lib/api/utils/index.d.ts +1 -1
  162. package/lib/api/utils/object-serializer.util.d.ts +3 -19
  163. package/lib/components/action/action.component.d.ts +5 -5
  164. package/lib/components/action/editor/action-editor.component.d.ts +7 -7
  165. package/lib/components/action/localization/data-language-dropdown.component.d.ts +6 -6
  166. package/lib/components/action/models/action-component.model.d.ts +4 -4
  167. package/lib/components/action/models/action-confirmation-service.model.d.ts +2 -2
  168. package/lib/components/action/models/action-execution.model.d.ts +14 -14
  169. package/lib/components/action/route/action-route.component.d.ts +2 -2
  170. package/lib/components/form/autocomplete/autocomplete.component.d.ts +15 -18
  171. package/lib/components/form/dropdown/dropdown.component.d.ts +9 -9
  172. package/lib/components/form/editor/form-editor.component.d.ts +8 -11
  173. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +4 -0
  174. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +4 -4
  175. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +3 -2
  176. package/lib/components/layout/topbar-user.component.d.ts +2 -2
  177. package/lib/components/layout/version.component.d.ts +2 -2
  178. package/lib/components/layoutV2/model/layout-state.model.d.ts +8 -9
  179. package/lib/components/layoutV2/services/main-layout.component.service.d.ts +1 -1
  180. package/lib/components/layoutV2/version.component.d.ts +2 -2
  181. package/lib/components/tableview/index.d.ts +0 -1
  182. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  183. package/lib/components/tableview/route/tableview-route.component.d.ts +7 -7
  184. package/lib/components/tableview/table/table.component.d.ts +9 -9
  185. package/lib/components/tableview/tableview.component.d.ts +8 -8
  186. package/lib/data-providers/base.data-provider.d.ts +30 -12
  187. package/lib/data-providers/editor.data-provider.d.ts +86 -23
  188. package/lib/data-providers/lookup.data-provider.d.ts +24 -11
  189. package/lib/data-providers/table.data-provider.d.ts +30 -17
  190. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -4
  191. package/lib/data-providers/tableview.data-provider.d.ts +41 -29
  192. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +3 -3
  193. package/lib/descriptors/action/action-editor.descriptor.d.ts +115 -0
  194. package/lib/descriptors/action/action-link.descriptor.d.ts +34 -0
  195. package/lib/descriptors/action/action.descriptor.d.ts +74 -160
  196. package/lib/descriptors/action/index.d.ts +2 -0
  197. package/lib/descriptors/editor/editor.descriptor.d.ts +131 -79
  198. package/lib/descriptors/editor/field-action.descriptor.d.ts +23 -0
  199. package/lib/descriptors/editor/field-base.descriptor.d.ts +126 -0
  200. package/lib/descriptors/editor/field-group.descriptor.d.ts +42 -0
  201. package/lib/descriptors/editor/field-lookup.descriptor.d.ts +80 -0
  202. package/lib/descriptors/editor/field-many.descriptor.d.ts +63 -0
  203. package/lib/descriptors/editor/field.descriptor.d.ts +100 -326
  204. package/lib/descriptors/editor/index.d.ts +5 -0
  205. package/lib/descriptors/editor/internal/editor-fields.model.d.ts +32 -0
  206. package/lib/descriptors/editor/internal/editor.model.d.ts +15 -0
  207. package/lib/descriptors/filter/filter-lookup.descriptor.d.ts +69 -0
  208. package/lib/descriptors/filter/filter.descriptor.d.ts +9 -67
  209. package/lib/descriptors/filter/index.d.ts +1 -0
  210. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +11 -16
  211. package/lib/descriptors/model/model.descriptor.d.ts +22 -0
  212. package/lib/descriptors/table/column.descriptor.d.ts +45 -33
  213. package/lib/descriptors/table/internal/table-columns.model.d.ts +11 -0
  214. package/lib/descriptors/table/internal/table.model.d.ts +9 -0
  215. package/lib/descriptors/table/table.descriptor.d.ts +82 -71
  216. package/lib/descriptors/tableview/internal/tableview.model.d.ts +11 -0
  217. package/lib/descriptors/tableview/tableview.descriptor.d.ts +106 -74
  218. package/lib/directives/component.directive.d.ts +5 -6
  219. package/lib/directives/template.directive.d.ts +2 -3
  220. package/lib/helpers/coercion.d.ts +9 -0
  221. package/lib/models/class.model.d.ts +6 -0
  222. package/lib/models/enum.model.d.ts +3 -2
  223. package/lib/models/index.d.ts +3 -0
  224. package/lib/models/radio.model.d.ts +6 -0
  225. package/lib/models/tableview-attr.model.d.ts +2 -2
  226. package/lib/models/type-registry.model.d.ts +7 -0
  227. package/lib/models/view-container.model.d.ts +6 -6
  228. package/lib/pipes/getter.pipe.d.ts +2 -1
  229. package/lib/pipes/i18n-property.pipe.d.ts +1 -1
  230. package/lib/pipes/locale-default-row-class.pipe.d.ts +2 -2
  231. package/lib/registry/type.registry.d.ts +25 -0
  232. package/lib/router/models/router.model.d.ts +5 -5
  233. package/lib/router/tableview-route-builder.d.ts +6 -6
  234. package/lib/security/authorization.service.d.ts +4 -7
  235. package/lib/services/action-executor.service.d.ts +7 -7
  236. package/lib/services/mng-localstorage-config.service.d.ts +3 -3
  237. package/lib/services/view-container.component.service.d.ts +3 -3
  238. package/lib/styles/styles.util.d.ts +5 -5
  239. package/lib/types/action-descriptor.types.d.ts +4 -0
  240. package/lib/types/data-provider.types.d.ts +3 -0
  241. package/lib/types/getter.type.d.ts +2 -0
  242. package/lib/types/index.d.ts +4 -1
  243. package/lib/types/localstorage-config-value.type.d.ts +1 -0
  244. package/lib/types/type.decorator.d.ts +0 -2
  245. package/lib/types/type.model.d.ts +12 -2
  246. package/lib/utils/action-data-provider.util.d.ts +6 -5
  247. package/lib/utils/{type.util.d.ts → decorator-metadata.util.d.ts} +2 -26
  248. package/lib/utils/editor-formly.util.d.ts +2 -2
  249. package/lib/utils/enum.util.d.ts +2 -2
  250. package/lib/utils/export.util.d.ts +2 -2
  251. package/lib/utils/i18n.util.d.ts +10 -11
  252. package/lib/utils/index.d.ts +1 -2
  253. package/lib/utils/model.util.d.ts +5 -3
  254. package/lib/utils/notification.util.d.ts +4 -4
  255. package/lib/utils/tableview.util.d.ts +6 -6
  256. package/openapi/templates/model.mustache +15 -2
  257. package/openapi/templates/models.mustache +0 -44
  258. package/package.json +10 -10
  259. package/scss/mng-commons-dark-v2.scss +2 -2
  260. package/scss/mng-commons-light-v2.scss +1 -1
  261. package/scss/v2/theme/{theme-base/components/data → extensions}/_fullcalendar.scss +14 -15
  262. package/scss/v2/theme/theme-base/_colors.scss +11 -12
  263. package/scss/v2/theme/theme-base/_common.scss +8 -5
  264. package/scss/v2/theme/theme-base/_components.scss +93 -89
  265. package/scss/v2/theme/theme-base/_mixins.scss +205 -71
  266. package/scss/v2/theme/theme-base/components/button/_button.scss +80 -68
  267. package/scss/v2/theme/theme-base/components/button/_speeddial.scss +11 -1
  268. package/scss/v2/theme/theme-base/components/button/_splitbutton.scss +128 -161
  269. package/scss/v2/theme/theme-base/components/data/_carousel.scss +1 -1
  270. package/scss/v2/theme/theme-base/components/data/_datatable.scss +3 -3
  271. package/scss/v2/theme/theme-base/components/data/_dataview.scss +0 -9
  272. package/scss/v2/theme/theme-base/components/data/_filter.scss +5 -6
  273. package/scss/v2/theme/theme-base/components/data/_orderlist.scss +15 -4
  274. package/scss/v2/theme/theme-base/components/data/_organizationchart.scss +1 -1
  275. package/scss/v2/theme/theme-base/components/data/_picklist.scss +14 -3
  276. package/scss/v2/theme/theme-base/components/data/_timeline.scss +3 -6
  277. package/scss/v2/theme/theme-base/components/data/_tree.scss +7 -6
  278. package/scss/v2/theme/theme-base/components/data/_treetable.scss +3 -4
  279. package/scss/v2/theme/theme-base/components/file/_fileupload.scss +6 -0
  280. package/scss/v2/theme/theme-base/components/input/_autocomplete.scss +43 -24
  281. package/scss/v2/theme/theme-base/components/input/_calendar.scss +9 -5
  282. package/scss/v2/theme/theme-base/components/input/_cascadeselect.scss +25 -20
  283. package/scss/v2/theme/theme-base/components/input/_checkbox.scss +9 -5
  284. package/scss/v2/theme/theme-base/components/input/_chips.scss +24 -13
  285. package/scss/v2/theme/theme-base/components/input/_dropdown.scss +29 -13
  286. package/scss/v2/theme/theme-base/components/input/_editor.scss +7 -7
  287. package/scss/v2/theme/theme-base/components/input/_inputgroup.scss +1 -2
  288. package/scss/v2/theme/theme-base/components/input/_inputmask.scss +2 -2
  289. package/scss/v2/theme/theme-base/components/input/_inputnumber.scss +7 -7
  290. package/scss/v2/theme/theme-base/components/input/_inputswitch.scss +3 -3
  291. package/scss/v2/theme/theme-base/components/input/_inputtext.scss +4 -3
  292. package/scss/v2/theme/theme-base/components/input/_listbox.scss +23 -8
  293. package/scss/v2/theme/theme-base/components/input/_multiselect.scss +31 -27
  294. package/scss/v2/theme/theme-base/components/input/_radiobutton.scss +2 -2
  295. package/scss/v2/theme/theme-base/components/input/_rating.scss +33 -28
  296. package/scss/v2/theme/theme-base/components/input/_treeselect.scss +6 -6
  297. package/scss/v2/theme/theme-base/components/menu/_breadcrumb.scss +3 -3
  298. package/scss/v2/theme/theme-base/components/menu/_contextmenu.scss +8 -30
  299. package/scss/v2/theme/theme-base/components/menu/_dock.scss +11 -2
  300. package/scss/v2/theme/theme-base/components/menu/_megamenu.scss +14 -65
  301. package/scss/v2/theme/theme-base/components/menu/_menu.scss +5 -13
  302. package/scss/v2/theme/theme-base/components/menu/_menubar.scss +32 -80
  303. package/scss/v2/theme/theme-base/components/menu/_panelmenu.scss +52 -39
  304. package/scss/v2/theme/theme-base/components/menu/_slidemenu.scss +15 -20
  305. package/scss/v2/theme/theme-base/components/menu/_steps.scss +2 -2
  306. package/scss/v2/theme/theme-base/components/menu/_tabmenu.scss +1 -2
  307. package/scss/v2/theme/theme-base/components/menu/_tieredmenu.scss +10 -32
  308. package/scss/v2/theme/theme-base/components/messages/_message.scss +2 -2
  309. package/scss/v2/theme/theme-base/components/messages/_toast.scss +2 -3
  310. package/scss/v2/theme/theme-base/components/misc/_chip.scss +7 -3
  311. package/scss/v2/theme/theme-base/components/misc/_inplace.scss +0 -1
  312. package/scss/v2/theme/theme-base/components/misc/_terminal.scss +9 -8
  313. package/scss/v2/theme/theme-base/components/multimedia/_galleria.scss +6 -0
  314. package/scss/v2/theme/theme-base/components/overlay/_confirmpopup.scss +3 -5
  315. package/scss/v2/theme/theme-base/components/panel/_accordion.scss +4 -4
  316. package/scss/v2/theme/theme-base/components/panel/_fieldset.scss +1 -1
  317. package/scss/v2/theme/theme-base/components/panel/_panel.scss +10 -5
  318. package/scss/v2/theme/theme-base/components/panel/_tabview.scss +6 -2
  319. package/scss/v2/theme/theme-dark/_variables.scss +756 -765
  320. package/scss/v2/theme/theme-dark/blue/theme.scss +1 -0
  321. package/scss/v2/theme/theme-light/_variables.scss +81 -94
  322. package/scss/v2/theme/theme-light/blue/theme.scss +1 -0
  323. package/esm2022/lib/api/models/mappers.mjs +0 -13
  324. package/esm2022/lib/api/models/serialization.model.mjs +0 -2
  325. package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -121
  326. package/esm2022/lib/descriptors/index.mjs +0 -2
  327. package/esm2022/lib/descriptors/model.descriptor.mjs +0 -45
  328. package/esm2022/lib/mng-commons.module.mjs +0 -472
  329. package/esm2022/lib/types/mng-localstorage-config-value.type.mjs +0 -2
  330. package/esm2022/lib/utils/coercion.util.mjs +0 -6
  331. package/esm2022/lib/utils/type.util.mjs +0 -94
  332. package/lib/api/models/mappers.d.ts +0 -6
  333. package/lib/api/models/serialization.model.d.ts +0 -9
  334. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +0 -37
  335. package/lib/descriptors/model.descriptor.d.ts +0 -18
  336. package/lib/mng-commons.module.d.ts +0 -105
  337. package/lib/types/mng-localstorage-config-value.type.d.ts +0 -1
  338. package/lib/utils/coercion.util.d.ts +0 -2
  339. package/openapi/templates/serializer-registration/model.mustache +0 -97
  340. package/openapi/templates/serializer-registration/models.mustache +0 -6
  341. /package/lib/descriptors/{index.d.ts → model/index.d.ts} +0 -0
@@ -1,17 +1,30 @@
1
1
  import { of } from 'rxjs';
2
- import { ModelDescriptor } from '../';
3
2
  import { TableviewActionDefaultCategories } from '../../components/action/models';
4
- import { DataProvider, EditorDataProvider } from '../../data-providers';
3
+ import { DataProvider } from '../../data-providers';
5
4
  import { MngInternalError } from '../../models';
6
5
  import { MngLoggerService } from '../../services';
7
6
  import { ButtonStyleBuilder } from '../../styles';
8
7
  import { StyleLevelEnum, StyleSizeEnum } from '../../styles/models';
9
- import { ActionDataProviderUtil, TypeUtil } from '../../utils';
10
- import { ActionActivationTriggerEnum, ActionEditorSubmitTypeEnum, ActionPositionEnum, ActionTypeEnum } from '../types';
8
+ import { ActionDataProviderUtil, DecoratorMetadataUtil } from '../../utils';
9
+ import { ModelDescriptor } from '../model';
10
+ import { ActionActivationTriggerEnum, ActionPositionEnum, ActionTypeEnum } from '../types';
11
11
  import { ActionButtonDescriptor } from './action-button.descriptor';
12
- import { ActionConfirmationDialogDescriptor } from './action-confirmation.descriptor';
13
- export class ActionDescriptor {
14
- constructor(model, actionName, parentType, parentProperty) {
12
+ import { ActionConfirmationDescriptor } from './action-confirmation.descriptor';
13
+ export const actionGetProviderCfgObj = (serviceOrDataProvider) => {
14
+ const cfg = {};
15
+ if (serviceOrDataProvider) {
16
+ if (serviceOrDataProvider.isDataProvider) {
17
+ // type casting needed, cause there was no other way found to differentiate the types
18
+ cfg.dataProvider = serviceOrDataProvider;
19
+ }
20
+ else {
21
+ cfg.serviceType = serviceOrDataProvider;
22
+ }
23
+ }
24
+ return cfg;
25
+ };
26
+ export class ActionDescriptorInst {
27
+ constructor(actionName, cfg) {
15
28
  this._type = ActionTypeEnum.Direct;
16
29
  this._activationTrigger = ActionActivationTriggerEnum.OnClick;
17
30
  this._position = ActionPositionEnum.ToolbarRight;
@@ -26,15 +39,21 @@ export class ActionDescriptor {
26
39
  // subactions
27
40
  this._subactionsAsMenu = false;
28
41
  this._subactions = [];
29
- this._model = model;
42
+ this._model = cfg?.model;
30
43
  this._actionName = actionName;
31
- if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
32
- throw new MngInternalError(`Provide both the parent type and parent property or none: ${this._actionName}, ${parentType}, ${parentProperty}.`);
44
+ if ((cfg?.parentType && !cfg?.parentProperty) || (!cfg?.parentProperty && cfg?.parentProperty)) {
45
+ throw new MngInternalError(`Provide both the parent type and parent property or none: ${this._actionName}, ${cfg?.parentType}, ${cfg?.parentProperty}.`);
33
46
  }
34
- this._parentType = parentType;
35
- this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
36
- this._parentProperty = parentProperty;
47
+ this._parentType = cfg?.parentType;
48
+ this._parentTypeName = cfg?.parentType ? DecoratorMetadataUtil.findTypeName(cfg?.parentType) ?? undefined : undefined;
49
+ this._parentProperty = cfg?.parentProperty;
37
50
  this.setI18nModelActionBaseKey();
51
+ if (cfg?.serviceType) {
52
+ this._dataProvider = DataProvider.fromAnyParam(this._model?.type, cfg.serviceType);
53
+ }
54
+ else if (cfg?.dataProvider) {
55
+ this._dataProvider = cfg.dataProvider;
56
+ }
38
57
  let displayName = actionName;
39
58
  if (this._model)
40
59
  displayName = `${this._model.typeName}.${displayName}`;
@@ -158,17 +177,6 @@ export class ActionDescriptor {
158
177
  : `${base ?? this._model.i18nBaseKey}.actions.${this._actionName}`;
159
178
  }
160
179
  }
161
- withDataProvider(dataProvider) {
162
- this._dataProvider = dataProvider;
163
- return this;
164
- }
165
- withServiceType(serviceType) {
166
- if (!this._model) {
167
- throw new MngInternalError(`Cannot set data provider for action ${this._actionNameLong} if no model type is provided`);
168
- }
169
- this._dataProvider = new DataProvider(this._model.type, serviceType);
170
- return this;
171
- }
172
180
  withRunFunction(fn) {
173
181
  this._runFunction = fn;
174
182
  return this;
@@ -194,7 +202,7 @@ export class ActionDescriptor {
194
202
  * creates confirmation action with default style based on action descriptor
195
203
  */
196
204
  withRunConfirmation() {
197
- this._runConfirmationDialogDescriptor = new ActionConfirmationDialogDescriptor();
205
+ this._runConfirmationDialogDescriptor = new ActionConfirmationDescriptor();
198
206
  this._runConfirmationDialogDescriptor.acceptButton.styleClass.withActionLevel(this._level);
199
207
  this._runConfirmationDialogDescriptor.rejectButton?.styleClass.withActionLevel(this._level);
200
208
  return this._runConfirmationDialogDescriptor;
@@ -261,13 +269,17 @@ export class ActionDescriptor {
261
269
  }
262
270
  withI18nBase(base) {
263
271
  if (typeof base !== 'string') {
264
- base = TypeUtil.findTypeName(base);
272
+ const typeName = DecoratorMetadataUtil.findTypeName(base);
273
+ if (!typeName) {
274
+ throw new MngInternalError(`Could not find define i18nBaseKey for ${base} on action ${this.actionNameLong}`);
275
+ }
276
+ base = typeName;
265
277
  }
266
278
  this.setI18nModelActionBaseKey(base);
267
279
  return this;
268
280
  }
269
- withSubactionsAsMenu() {
270
- this._subactionsAsMenu = true;
281
+ withSubactionsAsMenu(subactionsAsMenu = true) {
282
+ this._subactionsAsMenu = subactionsAsMenu;
271
283
  return this;
272
284
  }
273
285
  withSubactions(...subactions) {
@@ -283,7 +295,6 @@ export class ActionDescriptor {
283
295
  descriptor._positionTableviewCategories = this._positionTableviewCategories;
284
296
  descriptor._tableviewCategory = this._tableviewCategory;
285
297
  descriptor._routeUrl = this._routeUrl;
286
- descriptor._dataProvider = this._dataProvider;
287
298
  descriptor._runFunction = this._runFunction;
288
299
  descriptor._isVisibleFunction = this._isVisibleFunction;
289
300
  descriptor._isEnabledFunction = this._isEnabledFunction;
@@ -305,249 +316,52 @@ export class ActionDescriptor {
305
316
  return descriptor;
306
317
  }
307
318
  }
308
- export class ActionSimpleDescriptor extends ActionDescriptor {
309
- constructor(actionName, modelType, idProperty, titleProperty, i18nBaseKey) {
310
- const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty, i18nBaseKey) : null;
311
- super(model, actionName);
319
+ export class ActionDescriptor extends ActionDescriptorInst {
320
+ constructor() {
321
+ super('internal');
322
+ }
323
+ static create(actionName, cfg) {
324
+ return new ActionDescriptorInst(actionName, {
325
+ ...cfg
326
+ });
327
+ }
328
+ static createWithProvider(serviceProvider, actionName, cfg) {
329
+ return new ActionDescriptorInst(actionName, {
330
+ ...actionGetProviderCfgObj(serviceProvider),
331
+ ...cfg
332
+ });
333
+ }
334
+ static fromModel(model, actionName, cfg) {
335
+ return new ActionDescriptorInst(actionName, {
336
+ model,
337
+ ...cfg
338
+ });
339
+ }
340
+ static fromModelWithProvider(model, serviceProvider, actionName, cfg) {
341
+ return new ActionDescriptorInst(actionName, {
342
+ model,
343
+ ...actionGetProviderCfgObj(serviceProvider),
344
+ ...cfg
345
+ });
346
+ }
347
+ static fromClass(type, actionName, cfg) {
348
+ return new ActionDescriptorInst(actionName, {
349
+ model: ModelDescriptor.fromClass(type, cfg?.idProperty, cfg?.titleProperty, cfg?.i18nBaseKey),
350
+ ...cfg
351
+ });
352
+ }
353
+ static fromClassWithProvider(classType, serviceProvider, actionName, cfg) {
354
+ return new ActionDescriptorInst(actionName, {
355
+ model: ModelDescriptor.fromClass(classType, cfg?.idProperty, cfg?.titleProperty, cfg?.i18nBaseKey),
356
+ ...actionGetProviderCfgObj(serviceProvider),
357
+ ...cfg
358
+ });
312
359
  }
313
360
  }
314
- export class ActionEditorDescriptor extends ActionDescriptor {
315
- constructor(editorDescriptor, actionName, parentType, parentProperty) {
316
- super(editorDescriptor.model, actionName, parentType, parentProperty);
317
- this._editorActions = [];
318
- this._editorTitle = undefined;
319
- this._editorTitleParams = undefined;
320
- this._hasFetchNotificationSuccess = false;
321
- this._dialogSize = StyleSizeEnum.Normal;
322
- this._dataProvider = undefined;
323
- this._resubmitRefetch = true;
324
- this._unsavedChangesConfirmation = false;
325
- this._type = ActionTypeEnum.Editor;
326
- this._editorDescriptor = editorDescriptor;
327
- this._editorActions.push(ActionEditorSubmitDescriptor.forPrimary(this), ActionEditorSubmitDescriptor.forSecondary(this));
328
- }
329
- get editorTitle() {
330
- return this._editorTitle;
331
- }
332
- get editorTitleParams() {
333
- return this._editorTitleParams;
334
- }
335
- get editorDescriptor() {
336
- return this._editorDescriptor;
337
- }
338
- get dialogSize() {
339
- return this._dialogSize;
340
- }
341
- get dialogClassName() {
342
- return this._dialogClassName;
343
- }
344
- get hasFetchNotificationSuccess() {
345
- return this._hasFetchNotificationSuccess;
346
- }
347
- get fetchNotificationSuccessTitle() {
348
- return this._fetchNotificationSuccessTitle;
349
- }
350
- get fetchNotificationSuccessMessage() {
351
- return this._fetchNotificationSuccessMessage;
352
- }
353
- get dataProvider() {
354
- return this._dataProvider;
355
- }
356
- get runFunction() {
357
- throw new MngInternalError(`Run function cannot be used in editor action for ${this._actionNameLong}. Use submit function instead`);
358
- }
359
- get fetchFunction() {
360
- return this._fetchFunction;
361
- }
362
- get submitFunction() {
363
- return this._submitFunction;
364
- }
365
- get editorActions() {
366
- return this._editorActions;
367
- }
368
- get editorComponent() {
369
- return this._editorComponent;
370
- }
371
- get resubmitEnabled() {
372
- return this._resubmitEnabled;
373
- }
374
- get resubmitRefetch() {
375
- return this._resubmitRefetch;
376
- }
377
- get unsavedChangesConfirmation() {
378
- return this._unsavedChangesConfirmation;
379
- }
380
- withEditorTitle(title, params) {
381
- this._editorTitle = title;
382
- this._editorTitleParams = params;
383
- return this;
384
- }
385
- withDataProvider(dataProvider) {
386
- this._dataProvider = dataProvider;
387
- return this;
388
- }
389
- withServiceType(serviceType) {
390
- if (!this._model) {
391
- throw new MngInternalError(`Cannot set data provider for action ${this._actionNameLong} if no model type is provided`);
392
- }
393
- this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
394
- return this;
395
- }
396
- withDialogSize(size = StyleSizeEnum.Normal) {
397
- this._dialogSize = size;
398
- return this;
399
- }
400
- withDialogClassName(className) {
401
- this._dialogClassName = className;
402
- return this;
403
- }
404
- withRunFunction(fn) {
405
- return this.withSubmitFunction(fn);
406
- }
407
- withFetchFunction(fn) {
408
- this._fetchFunction = fn;
409
- return this;
410
- }
411
- withSubmitFunction(fn) {
412
- this._submitFunction = fn;
413
- return this;
414
- }
415
- withFetchNotificationError(title, message, hasNotification = true) {
416
- this._hasFetchNotificationSuccess = hasNotification;
417
- this._fetchNotificationSuccessTitle = title;
418
- this._fetchNotificationSuccessMessage = message;
419
- return this;
420
- }
421
- withEditorAction(action) {
422
- this._editorActions.push(action);
423
- return this;
424
- }
425
- withEditorActions(actions) {
426
- this._editorActions = actions;
427
- return this;
428
- }
429
- withEditorComponent(editorComponent) {
430
- this._editorComponent = editorComponent;
431
- return this;
432
- }
433
- withResubmit(enabled, refetch = true) {
434
- this._resubmitEnabled = enabled;
435
- this._resubmitRefetch = refetch;
436
- return this;
437
- }
438
- withUnsavedChangesConfirmation(unsavedChangesConfirmation = true) {
439
- this._unsavedChangesConfirmation = unsavedChangesConfirmation;
440
- return this;
441
- }
442
- }
443
- export class ActionEditorSubmitDescriptor extends ActionDescriptor {
444
- constructor(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
445
- super(editorAction.model, submitType === ActionEditorSubmitTypeEnum.Submit ? `${editorAction.actionName}.submit` : `${editorAction.actionName}.cancel`);
446
- this._editorAction = editorAction;
447
- this._submitType = submitType;
448
- this._position = ActionPositionEnum.FooterRight;
449
- this.button.styleClass.withActionLevel(editorAction.level).withTextButton();
450
- }
451
- /**
452
- * creates primary action with primary button style
453
- * @param editorAction
454
- * @param submitType
455
- */
456
- static forPrimary(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
457
- return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ActionButtonDescriptor().withStyleClass(new ButtonStyleBuilder()));
458
- }
459
- /**
460
- * creates secondary button with text button style
461
- * @param editorAction
462
- * @param submitType
463
- */
464
- static forSecondary(editorAction, submitType = ActionEditorSubmitTypeEnum.Cancel) {
465
- return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ActionButtonDescriptor().withStyleClass(new ButtonStyleBuilder().withTextButton()));
466
- }
467
- get submitType() {
468
- return this._submitType;
469
- }
470
- }
471
- export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
472
- static { this.ACTION_NAME = 'details'; }
473
- constructor(editorDescriptor) {
474
- super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
475
- this.withPosition(ActionPositionEnum.RowClick);
476
- this.withRouteTrigger(':itemId');
477
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
478
- this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel)]);
479
- this.withTableviewCategory(TableviewActionDefaultCategories.DETAILS);
480
- }
481
- withServiceType(serviceType) {
482
- return this.withServiceFetchFunction(serviceType);
483
- }
484
- withServiceFetchFunction(serviceType, fetchFn) {
485
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
486
- if (fetchFn) {
487
- dataProvider.withFetch(fetchFn);
488
- }
489
- this._dataProvider = dataProvider;
490
- return this;
491
- }
492
- }
493
- export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
494
- static { this.ACTION_NAME = 'add'; }
495
- constructor(editorDescriptor) {
496
- super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
497
- this.withPosition(ActionPositionEnum.ToolbarLeft);
498
- this.withRouteTrigger('add');
499
- this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
500
- this.button.withIcon('pi pi-plus');
501
- this.withTableviewCategory(TableviewActionDefaultCategories.ADD);
502
- this.withUnsavedChangesConfirmation();
503
- }
504
- withServiceType(serviceType) {
505
- return this.withServiceSubmitFunction(serviceType);
506
- }
507
- withServiceSubmitFunction(serviceType, createFn, fetchFn) {
508
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
509
- if (createFn) {
510
- dataProvider.withCreate(createFn);
511
- }
512
- if (fetchFn) {
513
- dataProvider.withFetch(fetchFn);
514
- }
515
- this._dataProvider = dataProvider;
516
- return this;
517
- }
518
- }
519
- export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
520
- static { this.ACTION_NAME = 'edit'; }
521
- constructor(editorDescriptor) {
522
- super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
523
- this.withPosition(ActionPositionEnum.RowInline);
524
- this.button.styleClass.withSize(StyleSizeEnum.Small);
525
- this.withRouteTrigger(':itemId/edit');
526
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
527
- this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
528
- this.withTableviewCategory(TableviewActionDefaultCategories.EDIT);
529
- this.button.withLabel(null).withIcon('pi pi-pencil');
530
- this.withUnsavedChangesConfirmation();
531
- }
532
- withServiceType(serviceType) {
533
- return this.withServiceSubmitFunction(serviceType);
534
- }
535
- withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
536
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
537
- if (updateFn) {
538
- dataProvider.withUpdate(updateFn);
539
- }
540
- if (fetchFn) {
541
- dataProvider.withFetch(fetchFn);
542
- }
543
- this._dataProvider = dataProvider;
544
- return this;
545
- }
546
- }
547
- export class ActionDeleteDescriptor extends ActionDescriptor {
361
+ export class ActionDeleteDescriptorInst extends ActionDescriptorInst {
548
362
  static { this.ACTION_NAME = 'delete'; }
549
- constructor(model) {
550
- super(model, ActionDeleteDescriptor.ACTION_NAME);
363
+ constructor(model, cfg) {
364
+ super(ActionDeleteDescriptorInst.ACTION_NAME, { model, ...cfg });
551
365
  this.withPosition(ActionPositionEnum.RowInline);
552
366
  this.button.styleClass.withSize(StyleSizeEnum.Small);
553
367
  this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
@@ -556,90 +370,15 @@ export class ActionDeleteDescriptor extends ActionDescriptor {
556
370
  this.withTableviewCategory(TableviewActionDefaultCategories.DELETE);
557
371
  this.button.withLabel(null).withIcon('pi pi-trash');
558
372
  }
559
- withServiceType(serviceType) {
560
- return this.withServiceDeleteFunction(serviceType);
561
- }
562
- withServiceDeleteFunction(serviceType, deleteFn) {
563
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
564
- if (deleteFn) {
565
- dataProvider.withDelete(deleteFn);
566
- }
567
- this._dataProvider = dataProvider;
568
- return this;
569
- }
570
373
  }
571
- export class ActionLinkDescriptor extends ActionDescriptor {
572
- constructor(model = null, actionName = 'link') {
573
- super(model, actionName);
574
- this._url = '';
575
- this._pathSegments = [];
576
- this._replaceUrl = false;
577
- this._target = '_self';
578
- this._isStyleLink = false;
579
- }
580
- static fromActionDescriptor(actionDescriptor) {
581
- const descriptor = new ActionLinkDescriptor(actionDescriptor.model, actionDescriptor.actionName);
582
- actionDescriptor.copyTo(descriptor);
583
- descriptor._dataProvider = undefined;
584
- descriptor._runConfirmationDialogDescriptor = undefined;
585
- descriptor._hasRunNotificationSuccess = false;
586
- descriptor._runNotificationSuccessTitle = undefined;
587
- descriptor._runNotificationSuccessMessage = undefined;
588
- descriptor._hasRunNotificationError = false;
589
- descriptor._runNotificationErrorTitle = undefined;
590
- descriptor._runNotificationErrorMessage = undefined;
591
- descriptor._afterRunAction = undefined;
592
- descriptor._onRunErrorAction = undefined;
593
- descriptor._hasItemsSelection = false;
594
- descriptor._subactionsAsMenu = false;
595
- descriptor._subactions = [];
596
- return descriptor;
597
- }
598
- get url() {
599
- return this._url;
600
- }
601
- get pathSegments() {
602
- return this._pathSegments;
603
- }
604
- get queryParams() {
605
- return this._queryParams;
606
- }
607
- get queryParamsHandling() {
608
- return this._queryParamsHandling;
609
- }
610
- get replaceUrl() {
611
- return this._replaceUrl;
374
+ export class ActionDeleteDescriptor {
375
+ static create(model) {
376
+ return new ActionDeleteDescriptorInst(model);
612
377
  }
613
- get target() {
614
- return this._target;
615
- }
616
- get isStyleLink() {
617
- return this._isStyleLink;
618
- }
619
- withHref(url) {
620
- this._url = url;
621
- return this;
622
- }
623
- withRouterLink(...pathSegments) {
624
- this._pathSegments = pathSegments;
625
- return this;
626
- }
627
- withQueryParams(queryParams, queryParamsHandling) {
628
- this._queryParams = queryParams;
629
- this._queryParamsHandling = queryParamsHandling;
630
- return this;
631
- }
632
- withReplaceUrl(replaceUrl = false) {
633
- this._replaceUrl = replaceUrl;
634
- return this;
635
- }
636
- withTarget(target = '_self') {
637
- this._target = target;
638
- return this;
639
- }
640
- withStyleLink(isStyleLink) {
641
- this._isStyleLink = isStyleLink;
642
- return this;
378
+ static createWithProvider(model, serviceProvider) {
379
+ return new ActionDeleteDescriptorInst(model, {
380
+ ...actionGetProviderCfgObj(serviceProvider)
381
+ });
643
382
  }
644
383
  }
645
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi9hY3Rpb24uZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxFQUEyRCxnQ0FBZ0MsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzFJLE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQXFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRWxFLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0QsT0FBTyxFQUFDLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNySCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRixNQUFNLE9BQU8sZ0JBQWdCO0lBcUR6QixZQUFZLEtBQWdDLEVBQUUsVUFBa0IsRUFBRSxVQUErQixFQUFFLGNBQXVCO1FBM0NoSCxVQUFLLEdBQW1CLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsdUJBQWtCLEdBQWdDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztR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QUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFVLEdBQUcsS0FBSztRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVSxDQUFDLFNBQTZCLE9BQU87UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxXQUFvQjtRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXJhbXMsIFF1ZXJ5UGFyYW1zSGFuZGxpbmd9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge01vZGVsRGVzY3JpcHRvcn0gZnJvbSAnLi4vJztcbmltcG9ydCB7QWN0aW9uQ29udGV4dCwgQWN0aW9uQ29udGV4dFZhbGlkYXRpb24sIElBY3Rpb25Db21wb25lbnQsIFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2FjdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHtEYXRhUHJvdmlkZXIsIEVkaXRvckRhdGFQcm92aWRlciwgSURhdGFQcm92aWRlciwgSUVkaXRvckRhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdJbnRlcm5hbEVycm9yfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtBUGVybWlzc2lvbnN9IGZyb20gJy4uLy4uL3NlY3VyaXR5L21vZGVsJztcbmltcG9ydCB7TW5nTG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtCdXR0b25TdHlsZUJ1aWxkZXJ9IGZyb20gJy4uLy4uL3N0eWxlcyc7XG5pbXBvcnQge1N0eWxlTGV2ZWxFbnVtLCBTdHlsZVNpemVFbnVtfSBmcm9tICcuLi8uLi9zdHlsZXMvbW9kZWxzJztcbmltcG9ydCB7Q2xhc3NUeXBlLCBJZFR5cGV9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7QWN0aW9uRGF0YVByb3ZpZGVyVXRpbCwgVHlwZVV0aWx9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7RWRpdG9yRGVzY3JpcHRvcn0gZnJvbSAnLi4vZWRpdG9yJztcbmltcG9ydCB7QWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLCBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bSwgQWN0aW9uUG9zaXRpb25FbnVtLCBBY3Rpb25UeXBlRW51bX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtBY3Rpb25CdXR0b25EZXNjcmlwdG9yfSBmcm9tICcuL2FjdGlvbi1idXR0b24uZGVzY3JpcHRvcic7XG5pbXBvcnQge0FjdGlvbkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3J9IGZyb20gJy4vYWN0aW9uLWNvbmZpcm1hdGlvbi5kZXNjcmlwdG9yJztcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGw7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lTG9uZzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZT86IENsYXNzVHlwZTx1bmtub3duPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudFR5cGVOYW1lPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50UHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX3R5cGU6IEFjdGlvblR5cGVFbnVtID0gQWN0aW9uVHlwZUVudW0uRGlyZWN0O1xuICAgIHByb3RlY3RlZCBfYWN0aXZhdGlvblRyaWdnZXI6IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PbkNsaWNrO1xuICAgIHByb3RlY3RlZCBfcG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSA9IEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyUmlnaHQ7XG4gICAgcHJvdGVjdGVkIF9sZXZlbDogU3R5bGVMZXZlbEVudW0gPSBTdHlsZUxldmVsRW51bS5EZWZhdWx0O1xuICAgIHByaXZhdGUgX3Bvc2l0aW9uVGFibGV2aWV3Q2F0ZWdvcmllcz86IHN0cmluZ1tdO1xuICAgIHByb3RlY3RlZCBfdGFibGV2aWV3Q2F0ZWdvcnk/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX3JvdXRlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBfZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIHByb3RlY3RlZCBfcnVuRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZCB8IG51bGw+O1xuICAgIHByb3RlY3RlZCBfaXNWaXNpYmxlRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfaXNFbmFibGVkRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJvdGVjdGVkIF9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yPzogQWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjxUPjtcblxuICAgIHByb3RlY3RlZCBfaGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcyA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfaGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfYWZ0ZXJSdW5BY3Rpb24/OiBBY3Rpb25EZXNjcmlwdG9yPHVua25vd24+IHwgKChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPik7XG4gICAgcHJvdGVjdGVkIF9vblJ1bkVycm9yQWN0aW9uPzogQWN0aW9uRGVzY3JpcHRvcjxUPiB8ICgoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IEFjdGlvbkRlc2NyaXB0b3I8VD4pO1xuXG4gICAgLy8gc2VjdXJpdHlcbiAgICBwcm90ZWN0ZWQgX3Blcm1pc3Npb25zPzogQVBlcm1pc3Npb25zO1xuXG4gICAgLy9idXR0b25cbiAgICBwcm90ZWN0ZWQgX2J1dHRvbiA9IG5ldyBBY3Rpb25CdXR0b25EZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBtdWx0aXBsZSByb3cgc2VsZWN0aW9uXG4gICAgcHJvdGVjdGVkIF9oYXNJdGVtc1NlbGVjdGlvbiA9IGZhbHNlO1xuXG4gICAgLy8gY3VzdG9tIGFjdGlvbiBjb21wb25lbnRcbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudD86IFR5cGU8SUFjdGlvbkNvbXBvbmVudDxUPj47XG5cbiAgICAvLyBzdWJhY3Rpb25zXG4gICAgcHJvdGVjdGVkIF9zdWJhY3Rpb25zQXNNZW51ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zdWJhY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGwsIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTx1bmtub3duPiwgcGFyZW50UHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XG5cbiAgICAgICAgaWYgKChwYXJlbnRUeXBlICYmICFwYXJlbnRQcm9wZXJ0eSkgfHwgKCFwYXJlbnRQcm9wZXJ0eSAmJiBwYXJlbnRQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBQcm92aWRlIGJvdGggdGhlIHBhcmVudCB0eXBlIGFuZCBwYXJlbnQgcHJvcGVydHkgb3Igbm9uZTogJHt0aGlzLl9hY3Rpb25OYW1lfSwgJHtwYXJlbnRUeXBlfSwgJHtwYXJlbnRQcm9wZXJ0eX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyZW50VHlwZSA9IHBhcmVudFR5cGU7XG4gICAgICAgIHRoaXMuX3BhcmVudFR5cGVOYW1lID0gcGFyZW50VHlwZSA/IFR5cGVVdGlsLmZpbmRUeXBlTmFtZShwYXJlbnRUeXBlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcGFyZW50UHJvcGVydHkgPSBwYXJlbnRQcm9wZXJ0eTtcblxuICAgICAgICB0aGlzLnNldEkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKTtcblxuICAgICAgICBsZXQgZGlzcGxheU5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwpIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fbW9kZWwudHlwZU5hbWV9LiR7ZGlzcGxheU5hbWV9YDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lKSB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS4ke3RoaXMuX3BhcmVudFByb3BlcnR5fV8ke2Rpc3BsYXlOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZUxvbmcgPSBkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRUeXBlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFR5cGVOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmF0aW9uVHJpZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3V0ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlVXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcnVuRnVuY3Rpb24gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5GdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZCB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9ydW5GdW5jdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYFJ1biBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCBmb3IgYWN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZUxvbmd9IGFuZCBjYW5ub3QgYmUgaW52b2tlZGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZUZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0VuYWJsZWRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25OYW1lTG9uZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWVMb25nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b24uc3R5bGVDbGFzcy5jdXN0b21DbGFzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuQ29uZmlybWF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciAhPT0gbnVsbCAmJiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhZnRlclJ1bkFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyUnVuQWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25SdW5FcnJvckFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUnVuRXJyb3JBY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwZXJtaXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3Q2F0ZWdvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdDYXRlZ29yeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0l0ZW1zU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzSXRlbXNTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBidXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdWJhY3Rpb25zQXNNZW51KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ViYWN0aW9uc0FzTWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1YmFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJhY3Rpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRJMThuTW9kZWxBY3Rpb25CYXNlS2V5KGJhc2U/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lIHx8IHRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5ID0gdGhpcy5fcGFyZW50VHlwZU5hbWVcbiAgICAgICAgICAgICAgICA/IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS5hY3Rpb25zLiR7dGhpcy5fcGFyZW50UHJvcGVydHl9XyR7dGhpcy5fYWN0aW9uTmFtZX1gXG4gICAgICAgICAgICAgICAgOiBgJHtiYXNlID8/IHRoaXMuX21vZGVsIS5pMThuQmFzZUtleX0uYWN0aW9ucy4ke3RoaXMuX2FjdGlvbk5hbWV9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcihgQ2Fubm90IHNldCBkYXRhIHByb3ZpZGVyIGZvciBhY3Rpb24gJHt0aGlzLl9hY3Rpb25OYW1lTG9uZ30gaWYgbm8gbW9kZWwgdHlwZSBpcyBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IG5ldyBEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJ1bkZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQgfCBudWxsPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9ydW5GdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aElzVmlzaWJsZUZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBTPikgPT4gT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc1Zpc2libGVGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aElzRW5hYmxlZEZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBTPikgPT4gT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvdXRlVHJpZ2dlcihyb3V0ZVVybDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyID0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGU7XG4gICAgICAgIHRoaXMuX3JvdXRlVXJsID0gcm91dGVVcmw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUG9zaXRpb24ocG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGNvbmZpcm1hdGlvbiBhY3Rpb24gd2l0aCBkZWZhdWx0IHN0eWxlIGJhc2VkIG9uIGFjdGlvbiBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSdW5Db25maXJtYXRpb24oKTogQWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IgPSBuZXcgQWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjxUPigpO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yLmFjY2VwdEJ1dHRvbi5zdHlsZUNsYXNzLndpdGhBY3Rpb25MZXZlbCh0aGlzLl9sZXZlbCk7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5zdHlsZUNsYXNzLndpdGhBY3Rpb25MZXZlbCh0aGlzLl9sZXZlbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgY29uZmlndXJhdGlvbiBkaWFsb2d1ZSB0byBhY3Rpb24gdXNpbmcgQWN0aW9uQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciBkZXNjcmlwdG9yIHdpdGggY3VzdG9taXphYmxlIGluZm9ybWF0aW9uIGZvciBkaWFsb2dcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFJ1bkNvbmZpcm1hdGlvbkRlc2NyaXB0b3IocnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjogQWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yID0gcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5Ob3RpZmljYXRpb25TdWNjZXNzKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3MgPSBoYXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uRXJyb3IodGl0bGU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGhhc05vdGlmaWNhdGlvbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSBoYXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBZnRlclJ1bkFjdGlvbjxSVCwgUyA9IGFueT4oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFJUPiB8ICgoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBBY3Rpb25EZXNjcmlwdG9yPFJUPikpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJSdW5BY3Rpb24gPSBhY3Rpb24gYXMgQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPiB8ICgoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE9uUnVuRXJyb3JBY3Rpb248UyA9IGFueT4oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFQ+IHwgKChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IEFjdGlvbkRlc2NyaXB0b3I8VD4pKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX29uUnVuRXJyb3JBY3Rpb24gPSBhY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IEFQZXJtaXNzaW9ucyk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5fdGFibGV2aWV3Q2F0ZWdvcnkpIHtcbiAgICAgICAgICAgIE1uZ0xvZ2dlclNlcnZpY2UuZ2V0KCkuZGVidWcoXG4gICAgICAgICAgICAgICAgYFdBUk5JTkc6IFBlcm1pc3Npb25zIHNldCBvbiBhY3Rpb24gJHt0aGlzLl9hY3Rpb25OYW1lTG9uZ30gd2l0aCByb3V0ZSB0eXBlICcke3RoaXMuX3RhYmxldmlld0NhdGVnb3J5fScgd2lsbCBiZSBvbWl0dGVkIGluIHJvdXRlIGd1YXJkIHZhbGlkYXRpb24uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhYmxldmlld0NhdGVnb3J5KHBlcm1pc3Npb25zUm91dGVUeXBlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGV2aWV3Q2F0ZWdvcnkgPSBwZXJtaXNzaW9uc1JvdXRlVHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhCdXR0b25EZXNjcmlwdG9yKGJ1dHRvbjogQWN0aW9uQnV0dG9uRGVzY3JpcHRvcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9idXR0b24gPSBidXR0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnV0dG9uKGxhYmVsPzogc3RyaW5nIHwgbnVsbCwgaWNvbjogc3RyaW5nIHwgbnVsbCA9IG51bGwsIHN0eWxlTGV2ZWwgPSBTdHlsZUxldmVsRW51bS5EZWZhdWx0LCBzdHlsZVRleHQgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9idXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpLndpdGhMYWJlbChsYWJlbCkud2l0aEljb24oaWNvbikud2l0aFN0eWxlQ2xhc3MobmV3IEJ1dHRvblN0eWxlQnVpbGRlcihzdHlsZUxldmVsKS53aXRoVGV4dEJ1dHRvbihzdHlsZVRleHQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc1NlbGVjdGlvbihoYXNTZWxlY3Rpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0l0ZW1zU2VsZWN0aW9uID0gaGFzU2VsZWN0aW9uO1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbiA9IHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uID8/IChjdHggPT4gb2YoKGN0eC5wYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXM/Lmxlbmd0aCA/PyAwKSA+IDApKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDb21wb25lbnQoY29tcG9uZW50OiBUeXBlPElBY3Rpb25Db21wb25lbnQ8VD4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMocG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMgPSBwb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSTE4bkJhc2UoYmFzZTogQ2xhc3NUeXBlPHVua25vd24+IHwgc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJhc2UgPSBUeXBlVXRpbC5maW5kVHlwZU5hbWUoYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRJMThuTW9kZWxBY3Rpb25CYXNlS2V5KGJhc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN1YmFjdGlvbnNBc01lbnUoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3N1YmFjdGlvbnNBc01lbnUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN1YmFjdGlvbnMoLi4uc3ViYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc3ViYWN0aW9ucy5wdXNoKC4uLnN1YmFjdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weVRvKGRlc2NyaXB0b3I6IEFjdGlvbkRlc2NyaXB0b3I8VD4pOiBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgZGVzY3JpcHRvci5faTE4bk1vZGVsQWN0aW9uQmFzZUtleSA9IHRoaXMuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk7XG4gICAgICAgIGRlc2NyaXB0b3IuX3R5cGUgPSB0aGlzLl90eXBlO1xuICAgICAgICBkZXNjcmlwdG9yLl9hY3RpdmF0aW9uVHJpZ2dlciA9IHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyO1xuICAgICAgICBkZXNjcmlwdG9yLl9wb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uO1xuICAgICAgICBkZXNjcmlwdG9yLl9sZXZlbCA9IHRoaXMuX2xldmVsO1xuICAgICAgICBkZXNjcmlwdG9yLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMgPSB0aGlzLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM7XG5cbiAgICAgICAgZGVzY3JpcHRvci5fdGFibGV2aWV3Q2F0ZWdvcnkgPSB0aGlzLl90YWJsZXZpZXdDYXRlZ29yeTtcbiAgICAgICAgZGVzY3JpcHRvci5fcm91dGVVcmwgPSB0aGlzLl9yb3V0ZVVybDtcbiAgICAgICAgZGVzY3JpcHRvci5fZGF0YVByb3ZpZGVyID0gdGhpcy5fZGF0YVByb3ZpZGVyO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bkZ1bmN0aW9uID0gdGhpcy5fcnVuRnVuY3Rpb247XG4gICAgICAgIGRlc2NyaXB0b3IuX2lzVmlzaWJsZUZ1bmN0aW9uID0gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgICAgIGRlc2NyaXB0b3IuX2lzRW5hYmxlZEZ1bmN0aW9uID0gdGhpcy5faXNFbmFibGVkRnVuY3Rpb247XG5cbiAgICAgICAgZGVzY3JpcHRvci5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciA9IHRoaXMuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I7XG5cbiAgICAgICAgZGVzY3JpcHRvci5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcyA9IHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3M7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSA9IHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZTtcblxuICAgICAgICBkZXNjcmlwdG9yLl9oYXNSdW5Ob3RpZmljYXRpb25FcnJvciA9IHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yO1xuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlID0gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZTtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlID0gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2FmdGVyUnVuQWN0aW9uID0gdGhpcy5fYWZ0ZXJSdW5BY3Rpb247XG4gICAgICAgIGRlc2NyaXB0b3IuX29uUnVuRXJyb3JBY3Rpb24gPSB0aGlzLl9vblJ1bkVycm9yQWN0aW9uO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX3Blcm1pc3Npb25zID0gdGhpcy5fcGVybWlzc2lvbnM7XG5cbiAgICAgICAgZGVzY3JpcHRvci5fYnV0dG9uID0gdGhpcy5fYnV0dG9uLmNvcHkoKTtcblxuICAgICAgICBkZXNjcmlwdG9yLl9oYXNJdGVtc1NlbGVjdGlvbiA9IHRoaXMuX2hhc0l0ZW1zU2VsZWN0aW9uO1xuICAgICAgICBkZXNjcmlwdG9yLl9jb21wb25lbnQgPSB0aGlzLl9jb21wb25lbnQ7XG4gICAgICAgIGRlc2NyaXB0b3IuX3N1YmFjdGlvbnNBc01lbnUgPSB0aGlzLl9zdWJhY3Rpb25zQXNNZW51O1xuICAgICAgICBkZXNjcmlwdG9yLl9zdWJhY3Rpb25zID0gdGhpcy5fc3ViYWN0aW9ucztcblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TaW1wbGVEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgY29uc3RydWN0b3IoYWN0aW9uTmFtZTogc3RyaW5nLCBtb2RlbFR5cGU/OiBDbGFzc1R5cGU8VD4sIGlkUHJvcGVydHk/OiBzdHJpbmcsIHRpdGxlUHJvcGVydHk/OiBzdHJpbmcsIGkxOG5CYXNlS2V5Pzogc3RyaW5nIHwgQ2xhc3NUeXBlPHVua25vd24+KSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUeXBlID8gbmV3IE1vZGVsRGVzY3JpcHRvcjxUPihtb2RlbFR5cGUsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHksIGkxOG5CYXNlS2V5KSA6IG51bGw7XG4gICAgICAgIHN1cGVyKG1vZGVsLCBhY3Rpb25OYW1lKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPjtcblxuICAgIHByb3RlY3RlZCBfZWRpdG9yQWN0aW9uczogQWN0aW9uRGVzY3JpcHRvcjxUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF9lZGl0b3JUaXRsZT86IHN0cmluZyB8IG51bGwgPSB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIF9lZGl0b3JUaXRsZVBhcmFtcz86IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIHByb3RlY3RlZCBfaGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NpemUgPSBTdHlsZVNpemVFbnVtLk5vcm1hbDtcbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ0NsYXNzTmFtZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfZGF0YVByb3ZpZGVyPzogSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+ID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfZmV0Y2hGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUPjtcbiAgICBwcm90ZWN0ZWQgX3N1Ym1pdEZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JDb21wb25lbnQ/OiBUeXBlPGFueT47XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3VibWl0RW5hYmxlZD86IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9yZXN1Ym1pdFJlZmV0Y2ggPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfdW5zYXZlZENoYW5nZXNDb25maXJtYXRpb24gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4sIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTx1bmtub3duPiwgcGFyZW50UHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvci5tb2RlbCwgYWN0aW9uTmFtZSwgcGFyZW50VHlwZSwgcGFyZW50UHJvcGVydHkpO1xuICAgICAgICB0aGlzLl90eXBlID0gQWN0aW9uVHlwZUVudW0uRWRpdG9yO1xuICAgICAgICB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yID0gZWRpdG9yRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucy5wdXNoKEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IuZm9yUHJpbWFyeSh0aGlzKSwgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvci5mb3JTZWNvbmRhcnkodGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvclRpdGxlUGFyYW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yVGl0bGVQYXJhbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWFsb2dTaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcnVuRnVuY3Rpb24oKTogKGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPikgPT4gT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBSdW4gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gZWRpdG9yIGFjdGlvbiBmb3IgJHt0aGlzLl9hY3Rpb25OYW1lTG9uZ30uIFVzZSBzdWJtaXQgZnVuY3Rpb24gaW5zdGVhZGApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdWJtaXRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yQWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvckFjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN1Ym1pdEVuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXN1Ym1pdEVuYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN1Ym1pdFJlZmV0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXN1Ym1pdFJlZmV0Y2g7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1bnNhdmVkQ2hhbmdlc0NvbmZpcm1hdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vuc2F2ZWRDaGFuZ2VzQ29uZmlybWF0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yVGl0bGUodGl0bGU6IHN0cmluZyB8IG51bGwsIHBhcmFtcz86IGFueSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9lZGl0b3JUaXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLl9lZGl0b3JUaXRsZVBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyOiBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5fbW9kZWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBDYW5ub3Qgc2V0IGRhdGEgcHJvdmlkZXIgZm9yIGFjdGlvbiAke3RoaXMuX2FjdGlvbk5hbWVMb25nfSBpZiBubyBtb2RlbCB0eXBlIGlzIHByb3ZpZGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbC50eXBlLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGlhbG9nU2l6ZShzaXplID0gU3R5bGVTaXplRW51bS5Ob3JtYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nU2l6ZSA9IHNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGlhbG9nQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ0NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhSdW5GdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU3VibWl0RnVuY3Rpb24oZm4gYXMgKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUPik7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGZXRjaEZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZldGNoRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdWJtaXRGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9zdWJtaXRGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZldGNoTm90aWZpY2F0aW9uRXJyb3IodGl0bGU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGhhc05vdGlmaWNhdGlvbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhFZGl0b3JBY3Rpb24oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvckFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvckFjdGlvbnMoYWN0aW9uczogQWN0aW9uRGVzY3JpcHRvcjxUPltdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvckFjdGlvbnMgPSBhY3Rpb25zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvckNvbXBvbmVudChlZGl0b3JDb21wb25lbnQ6IFR5cGU8YW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9lZGl0b3JDb21wb25lbnQgPSBlZGl0b3JDb21wb25lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVzdWJtaXQoZW5hYmxlZD86IGJvb2xlYW4sIHJlZmV0Y2ggPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Jlc3VibWl0RW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICAgIHRoaXMuX3Jlc3VibWl0UmVmZXRjaCA9IHJlZmV0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVW5zYXZlZENoYW5nZXNDb25maXJtYXRpb24odW5zYXZlZENoYW5nZXNDb25maXJtYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Vuc2F2ZWRDaGFuZ2VzQ29uZmlybWF0aW9uID0gdW5zYXZlZENoYW5nZXNDb25maXJtYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JBY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3VibWl0VHlwZTogQWN0aW9uRWRpdG9yU3VibWl0VHlwZUVudW07XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JBY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4sIHN1Ym1pdFR5cGUgPSBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bS5TdWJtaXQpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yQWN0aW9uLm1vZGVsLCBzdWJtaXRUeXBlID09PSBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bS5TdWJtaXQgPyBgJHtlZGl0b3JBY3Rpb24uYWN0aW9uTmFtZX0uc3VibWl0YCA6IGAke2VkaXRvckFjdGlvbi5hY3Rpb25OYW1lfS5jYW5jZWxgKTtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9uID0gZWRpdG9yQWN0aW9uO1xuICAgICAgICB0aGlzLl9zdWJtaXRUeXBlID0gc3VibWl0VHlwZTtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBBY3Rpb25Qb3NpdGlvbkVudW0uRm9vdGVyUmlnaHQ7XG5cbiAgICAgICAgdGhpcy5idXR0b24uc3R5bGVDbGFzcy53aXRoQWN0aW9uTGV2ZWwoZWRpdG9yQWN0aW9uLmxldmVsKS53aXRoVGV4dEJ1dHRvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZXMgcHJpbWFyeSBhY3Rpb24gd2l0aCBwcmltYXJ5IGJ1dHRvbiBzdHlsZVxuICAgICAqIEBwYXJhbSBlZGl0b3JBY3Rpb25cbiAgICAgKiBAcGFyYW0gc3VibWl0VHlwZVxuICAgICAqL1xuICAgIHN0YXRpYyBmb3JQcmltYXJ5PFQ+KGVkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiwgc3VibWl0VHlwZSA9IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLlN1Ym1pdCk6IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3I8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IoZWRpdG9yQWN0aW9uLCBzdWJtaXRUeXBlKS53aXRoQnV0dG9uRGVzY3JpcHRvcihuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpLndpdGhTdHlsZUNsYXNzKG5ldyBCdXR0b25TdHlsZUJ1aWxkZXIoKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZXMgc2Vjb25kYXJ5IGJ1dHRvbiB3aXRoIHRleHQgYnV0dG9uIHN0eWxlXG4gICAgICogQHBhcmFtIGVkaXRvckFjdGlvblxuICAgICAqIEBwYXJhbSBzdWJtaXRUeXBlXG4gICAgICovXG4gICAgc3RhdGljIGZvclNlY29uZGFyeTxUPihlZGl0b3JBY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4sIHN1Ym1pdFR5cGUgPSBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bS5DYW5jZWwpOiBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yKGVkaXRvckFjdGlvbiwgc3VibWl0VHlwZSkud2l0aEJ1dHRvbkRlc2NyaXB0b3IoXG4gICAgICAgICAgICBuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpLndpdGhTdHlsZUNsYXNzKG5ldyBCdXR0b25TdHlsZUJ1aWxkZXIoKS53aXRoVGV4dEJ1dHRvbigpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VibWl0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdFR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRGV0YWlsc0Rlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RldGFpbHMnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JEZXRhaWxzRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljayk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignOml0ZW1JZCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hPckZhaWwpO1xuXG4gICAgICAgIHRoaXMud2l0aEVkaXRvckFjdGlvbnMoW25ldyBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yKHRoaXMsIEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLkNhbmNlbCldKTtcbiAgICAgICAgdGhpcy53aXRoVGFibGV2aWV3Q2F0ZWdvcnkoVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuREVUQUlMUyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VydmljZUZldGNoRnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZUZldGNoRnVuY3Rpb248Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4sIGZldGNoRm4/OiAoaWQ6IElkVHlwZSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAoZmV0Y2hGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhGZXRjaChmZXRjaEZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckFkZERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2FkZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsIEFjdGlvbkVkaXRvckFkZERlc2NyaXB0b3IuQUNUSU9OX05BTUUpO1xuICAgICAgICB0aGlzLndpdGhQb3NpdGlvbihBY3Rpb25Qb3NpdGlvbkVudW0uVG9vbGJhckxlZnQpO1xuICAgICAgICB0aGlzLndpdGhSb3V0ZVRyaWdnZXIoJ2FkZCcpO1xuICAgICAgICB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkNyZWF0ZU9yRmFpbCk7XG5cbiAgICAgICAgdGhpcy5idXR0b24ud2l0aEljb24oJ3BpIHBpLXBsdXMnKTtcbiAgICAgICAgdGhpcy53aXRoVGFibGV2aWV3Q2F0ZWdvcnkoVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuQUREKTtcbiAgICAgICAgdGhpcy53aXRoVW5zYXZlZENoYW5nZXNDb25maXJtYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZVN1Ym1pdEZ1bmN0aW9uPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+LCBjcmVhdGVGbj86IChpdGVtPzogVCwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4sIGZldGNoRm4/OiAoaWQ6IElkVHlwZSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAoY3JlYXRlRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoQ3JlYXRlKGNyZWF0ZUZuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmV0Y2hGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhGZXRjaChmZXRjaEZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckVkaXREZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ1RJT05fTkFNRSA9ICdlZGl0JztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvciwgQWN0aW9uRWRpdG9yRWRpdERlc2NyaXB0b3IuQUNUSU9OX05BTUUpO1xuICAgICAgICB0aGlzLndpdGhQb3NpdGlvbihBY3Rpb25Qb3NpdGlvbkVudW0uUm93SW5saW5lKTtcbiAgICAgICAgdGhpcy5idXR0b24uc3R5bGVDbGFzcy53aXRoU2l6ZShTdHlsZVNpemVFbnVtLlNtYWxsKTtcbiAgICAgICAgdGhpcy53aXRoUm91dGVUcmlnZ2VyKCc6aXRlbUlkL2VkaXQnKTtcbiAgICAgICAgdGhpcy53aXRoRmV0Y2hGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkZldGNoT3JGYWlsKTtcbiAgICAgICAgdGhpcy53aXRoU3VibWl0RnVuY3Rpb24oQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5VcGRhdGVPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5FRElUKTtcbiAgICAgICAgdGhpcy5idXR0b24ud2l0aExhYmVsKG51bGwpLndpdGhJY29uKCdwaSBwaS1wZW5jaWwnKTtcbiAgICAgICAgdGhpcy53aXRoVW5zYXZlZENoYW5nZXNDb25maXJtYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZVN1Ym1pdEZ1bmN0aW9uPFM+KFxuICAgICAgICBzZXJ2aWNlVHlwZTogVHlwZTxTPixcbiAgICAgICAgdXBkYXRlRm4/OiAoaWQ6IElkVHlwZSwgaXRlbT86IFQsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+LFxuICAgICAgICBmZXRjaEZuPzogKGlkOiBJZFR5cGUsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+XG4gICAgKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwhLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgaWYgKHVwZGF0ZUZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFVwZGF0ZSh1cGRhdGVGbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZldGNoRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoRmV0Y2goZmV0Y2hGbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EZWxldGVEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ1RJT05fTkFNRSA9ICdkZWxldGUnO1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihtb2RlbCwgQWN0aW9uRGVsZXRlRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dJbmxpbmUpO1xuICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZUNsYXNzLndpdGhTaXplKFN0eWxlU2l6ZUVudW0uU21hbGwpO1xuICAgICAgICB0aGlzLndpdGhSdW5GdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkRlbGV0ZU9yRmFpbCk7XG4gICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlQ2xhc3Mud2l0aEFjdGlvbkxldmVsKFN0eWxlTGV2ZWxFbnVtLkRhbmdlcik7XG4gICAgICAgIHRoaXMud2l0aFJ1bkNvbmZpcm1hdGlvbigpO1xuICAgICAgICB0aGlzLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5ERUxFVEUpO1xuICAgICAgICB0aGlzLmJ1dHRvbi53aXRoTGFiZWwobnVsbCkud2l0aEljb24oJ3BpIHBpLXRyYXNoJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VydmljZURlbGV0ZUZ1bmN0aW9uKHNlcnZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNlcnZpY2VEZWxldGVGdW5jdGlvbjxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPiwgZGVsZXRlRm4/OiAoaWQ6IElkVHlwZSwgaXRlbT86IFQsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwhLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgaWYgKGRlbGV0ZUZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aERlbGV0ZShkZWxldGVGbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25MaW5rRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByaXZhdGUgX3VybCA9ICcnO1xuICAgIHByaXZhdGUgX3BhdGhTZWdtZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtcz86IFBhcmFtcztcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtc0hhbmRsaW5nPzogUXVlcnlQYXJhbXNIYW5kbGluZztcbiAgICBwcml2YXRlIF9yZXBsYWNlVXJsID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdGFyZ2V0ID0gJ19zZWxmJztcbiAgICBwcml2YXRlIF9pc1N0eWxlTGluayA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGwgPSBudWxsLCBhY3Rpb25OYW1lID0gJ2xpbmsnKSB7XG4gICAgICAgIHN1cGVyKG1vZGVsLCBhY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BY3Rpb25EZXNjcmlwdG9yPFQ+KGFjdGlvbkRlc2NyaXB0b3I6IEFjdGlvbkRlc2NyaXB0b3I8VD4pOiBBY3Rpb25MaW5rRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgQWN0aW9uTGlua0Rlc2NyaXB0b3I8VD4oYWN0aW9uRGVzY3JpcHRvci5tb2RlbCwgYWN0aW9uRGVzY3JpcHRvci5hY3Rpb25OYW1lKTtcblxuICAgICAgICBhY3Rpb25EZXNjcmlwdG9yLmNvcHlUbyhkZXNjcmlwdG9yKTtcblxuICAgICAgICBkZXNjcmlwdG9yLl9kYXRhUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZGVzY3JpcHRvci5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBkZXNjcmlwdG9yLl9hZnRlclJ1bkFjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVzY3JpcHRvci5fb25SdW5FcnJvckFjdGlvbiA9IHVuZGVmaW5lZDtcblxuICAgICAgICBkZXNjcmlwdG9yLl9oYXNJdGVtc1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBkZXNjcmlwdG9yLl9zdWJhY3Rpb25zQXNNZW51ID0gZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuX3N1YmFjdGlvbnMgPSBbXTtcblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0aFNlZ21lbnRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGhTZWdtZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zKCk6IFBhcmFtcyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zSGFuZGxpbmcoKTogUXVlcnlQYXJhbXNIYW5kbGluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVwbGFjZVVybCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcGxhY2VVcmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YXJnZXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU3R5bGVMaW5rKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTdHlsZUxpbms7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIcmVmKHVybDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb3V0ZXJMaW5rKC4uLnBhdGhTZWdtZW50czogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGF0aFNlZ21lbnRzID0gcGF0aFNlZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiBQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zSGFuZGxpbmcgPSBxdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJlcGxhY2VVcmwocmVwbGFjZVVybCA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JlcGxhY2VVcmwgPSByZXBsYWNlVXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhcmdldCh0YXJnZXQ6ICdfc2VsZicgfCAnX2JsYW5rJyA9ICdfc2VsZicpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN0eWxlTGluayhpc1N0eWxlTGluazogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc1N0eWxlTGluayA9IGlzU3R5bGVMaW5rO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iXX0=
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi9hY3Rpb24uZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sRUFBa0MsZ0NBQWdDLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqSCxPQUFPLEVBQUMsWUFBWSxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU5QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsMkJBQTJCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBOEI5RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFpQixxQkFBMEQsRUFBRSxFQUFFO0lBQ2xILE1BQU0sR0FBRyxHQUEyRCxFQUFFLENBQUM7SUFDdkUsSUFBSSxxQkFBcUIsRUFBRTtRQUN2QixJQUFLLHFCQUF1QyxDQUFDLGNBQWMsRUFBRTtZQUN6RCxxRkFBcUY7WUFDckYsR0FBRyxDQUFDLFlB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OlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtvZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7QWN0aW9uQ29udGV4dCwgSUFjdGlvbkNvbXBvbmVudCwgVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXN9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYWN0aW9uL21vZGVscyc7XG5pbXBvcnQge0RhdGFQcm92aWRlciwgSURhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdJbnRlcm5hbEVycm9yfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtBUGVybWlzc2lvbnN9IGZyb20gJy4uLy4uL3NlY3VyaXR5L21vZGVsJztcbmltcG9ydCB7TW5nTG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtCdXR0b25TdHlsZUJ1aWxkZXJ9IGZyb20gJy4uLy4uL3N0eWxlcyc7XG5pbXBvcnQge1N0eWxlTGV2ZWxFbnVtLCBTdHlsZVNpemVFbnVtfSBmcm9tICcuLi8uLi9zdHlsZXMvbW9kZWxzJztcbmltcG9ydCB7QWN0aW9uUnVuRm5UeXBlLCBBY3Rpb25WYWxpZGF0aW9uRm5UeXBlLCBDbGFzc1R5cGUsIFNlcnZpY2VDbGFzc1R5cGV9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7QWN0aW9uRGF0YVByb3ZpZGVyVXRpbCwgRGVjb3JhdG9yTWV0YWRhdGFVdGlsfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQge01vZGVsRGVzY3JpcHRvcn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0sIEFjdGlvblBvc2l0aW9uRW51bSwgQWN0aW9uVHlwZUVudW19IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7QWN0aW9uQnV0dG9uRGVzY3JpcHRvcn0gZnJvbSAnLi9hY3Rpb24tYnV0dG9uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtBY3Rpb25Db25maXJtYXRpb25EZXNjcmlwdG9yfSBmcm9tICcuL2FjdGlvbi1jb25maXJtYXRpb24uZGVzY3JpcHRvcic7XG5cbmV4cG9ydCB0eXBlIEFjdGlvbkRlc2NyaXB0b3JDb25zdHJ1Y3Rvck9wdHNUeXBlPE1vZGVsLCBTZXJ2aWNlPiA9IEFjdGlvbkRlc2NyaXB0b3JDcmVhdGVPcHRzUGFyZW50VHlwZSAmXG4gICAgQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNQcm92aWRlclR5cGU8TW9kZWwsIFNlcnZpY2U+ICYge1xuICAgICAgICBtb2RlbD86IE1vZGVsRGVzY3JpcHRvcjxNb2RlbD47XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uRGVzY3JpcHRvckNyZWF0ZUZyb21DbGFzc09wdHM8TW9kZWw+ID0gQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNNb2RlbDxNb2RlbD4gJiBBY3Rpb25EZXNjcmlwdG9yQ3JlYXRlT3B0c0kxOG5UeXBlICYgQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNQYXJlbnRUeXBlO1xuXG5leHBvcnQgdHlwZSBBY3Rpb25EZXNjcmlwdG9yQ3JlYXRlT3B0c1Byb3ZpZGVyVHlwZTxNb2RlbCwgU2VydmljZT4gPSB7XG4gICAgc2VydmljZVR5cGU/OiBTZXJ2aWNlQ2xhc3NUeXBlPFNlcnZpY2U+O1xuICAgIGRhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXI8TW9kZWwsIFNlcnZpY2U+O1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNJMThuVHlwZSA9IHtcbiAgICBpMThuQmFzZUtleT86IHN0cmluZyB8IENsYXNzVHlwZTxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNNb2RlbDxNb2RlbD4gPSB7XG4gICAgaWRQcm9wZXJ0eT86IGtleW9mIE1vZGVsO1xuICAgIHRpdGxlUHJvcGVydHk/OiBrZXlvZiBNb2RlbDtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGlvbkRlc2NyaXB0b3JDcmVhdGVPcHRzUGFyZW50VHlwZSA9IHtcbiAgICBwYXJlbnRUeXBlPzogQ2xhc3NUeXBlPHVua25vd24+O1xuICAgIHBhcmVudFByb3BlcnR5Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uUHJvdmlkZXJUeXBlPE1vZGVsLCBTZXJ2aWNlPiA9IFNlcnZpY2VDbGFzc1R5cGU8U2VydmljZT4gfCBJRGF0YVByb3ZpZGVyPE1vZGVsLCBTZXJ2aWNlPjtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkdldFByb3ZpZGVyQ2ZnT2JqID0gPE1vZGVsLCBTZXJ2aWNlPihzZXJ2aWNlT3JEYXRhUHJvdmlkZXI/OiBBY3Rpb25Qcm92aWRlclR5cGU8TW9kZWwsIFNlcnZpY2U+KSA9PiB7XG4gICAgY29uc3QgY2ZnOiBBY3Rpb25EZXNjcmlwdG9yQ3JlYXRlT3B0c1Byb3ZpZGVyVHlwZTxNb2RlbCwgU2VydmljZT4gPSB7fTtcbiAgICBpZiAoc2VydmljZU9yRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgIGlmICgoc2VydmljZU9yRGF0YVByb3ZpZGVyIGFzIElEYXRhUHJvdmlkZXIpLmlzRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAvLyB0eXBlIGNhc3RpbmcgbmVlZGVkLCBjYXVzZSB0aGVyZSB3YXMgbm8gb3RoZXIgd2F5IGZvdW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIHR5cGVzXG4gICAgICAgICAgICBjZmcuZGF0YVByb3ZpZGVyID0gc2VydmljZU9yRGF0YVByb3ZpZGVyIGFzIElEYXRhUHJvdmlkZXI8TW9kZWwsIFNlcnZpY2U+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2ZnLnNlcnZpY2VUeXBlID0gc2VydmljZU9yRGF0YVByb3ZpZGVyIGFzIFNlcnZpY2VDbGFzc1R5cGU8U2VydmljZT47XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNmZztcbn07XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EZXNjcmlwdG9ySW5zdDxNb2RlbCwgU2VydmljZSA9IGFueT4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw/OiBNb2RlbERlc2NyaXB0b3I8TW9kZWw+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWN0aW9uTmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWN0aW9uTmFtZUxvbmc6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudFR5cGU/OiBDbGFzc1R5cGU8dW5rbm93bj47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYXJlbnRUeXBlTmFtZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudFByb3BlcnR5Pzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPE1vZGVsLCBTZXJ2aWNlPjtcblxuICAgIHByb3RlY3RlZCBfaTE4bk1vZGVsQWN0aW9uQmFzZUtleT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfdHlwZTogQWN0aW9uVHlwZUVudW0gPSBBY3Rpb25UeXBlRW51bS5EaXJlY3Q7XG4gICAgcHJvdGVjdGVkIF9hY3RpdmF0aW9uVHJpZ2dlcjogQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtID0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uQ2xpY2s7XG4gICAgcHJvdGVjdGVkIF9wb3NpdGlvbjogQWN0aW9uUG9zaXRpb25FbnVtID0gQWN0aW9uUG9zaXRpb25FbnVtLlRvb2xiYXJSaWdodDtcbiAgICBwcm90ZWN0ZWQgX2xldmVsOiBTdHlsZUxldmVsRW51bSA9IFN0eWxlTGV2ZWxFbnVtLkRlZmF1bHQ7XG4gICAgcHJpdmF0ZSBfcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgcHJvdGVjdGVkIF90YWJsZXZpZXdDYXRlZ29yeT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfcm91dGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIF9ydW5GdW5jdGlvbj86IEFjdGlvblJ1bkZuVHlwZTxNb2RlbCwgU2VydmljZT47XG4gICAgcHJvdGVjdGVkIF9pc1Zpc2libGVGdW5jdGlvbj86IEFjdGlvblZhbGlkYXRpb25GblR5cGU8TW9kZWwsIFNlcnZpY2U+O1xuICAgIHByb3RlY3RlZCBfaXNFbmFibGVkRnVuY3Rpb24/OiBBY3Rpb25WYWxpZGF0aW9uRm5UeXBlPE1vZGVsLCBTZXJ2aWNlPjtcblxuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcj86IEFjdGlvbkNvbmZpcm1hdGlvbkRlc2NyaXB0b3I8TW9kZWw+O1xuXG4gICAgcHJvdGVjdGVkIF9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9oYXNSdW5Ob3RpZmljYXRpb25FcnJvciA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9hZnRlclJ1bkFjdGlvbj86IEFjdGlvbkRlc2NyaXB0b3JJbnN0PGFueT4gfCAoKGN0eDogQWN0aW9uQ29udGV4dDxNb2RlbCwgYW55PikgPT4gQWN0aW9uRGVzY3JpcHRvckluc3Q8YW55Pik7XG4gICAgcHJvdGVjdGVkIF9vblJ1bkVycm9yQWN0aW9uPzogQWN0aW9uRGVzY3JpcHRvckluc3Q8TW9kZWw+IHwgKChjdHg6IEFjdGlvbkNvbnRleHQ8TW9kZWwsIGFueT4pID0+IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsPik7XG5cbiAgICAvLyBzZWN1cml0eVxuICAgIHByb3RlY3RlZCBfcGVybWlzc2lvbnM/OiBBUGVybWlzc2lvbnM7XG5cbiAgICAvL2J1dHRvblxuICAgIHByb3RlY3RlZCBfYnV0dG9uID0gbmV3IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IoKTtcblxuICAgIC8vIG11bHRpcGxlIHJvdyBzZWxlY3Rpb25cbiAgICBwcm90ZWN0ZWQgX2hhc0l0ZW1zU2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gYWN0aW9uIGNvbXBvbmVudFxuICAgIHByb3RlY3RlZCBfY29tcG9uZW50PzogVHlwZTxJQWN0aW9uQ29tcG9uZW50PE1vZGVsPj47XG5cbiAgICAvLyBzdWJhY3Rpb25zXG4gICAgcHJvdGVjdGVkIF9zdWJhY3Rpb25zQXNNZW51ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zdWJhY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9ySW5zdDxNb2RlbD4+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYWN0aW9uTmFtZTogc3RyaW5nLCBjZmc/OiBBY3Rpb25EZXNjcmlwdG9yQ29uc3RydWN0b3JPcHRzVHlwZTxNb2RlbCwgU2VydmljZT4pIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBjZmc/Lm1vZGVsO1xuICAgICAgICB0aGlzLl9hY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcblxuICAgICAgICBpZiAoKGNmZz8ucGFyZW50VHlwZSAmJiAhY2ZnPy5wYXJlbnRQcm9wZXJ0eSkgfHwgKCFjZmc/LnBhcmVudFByb3BlcnR5ICYmIGNmZz8ucGFyZW50UHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcihgUHJvdmlkZSBib3RoIHRoZSBwYXJlbnQgdHlwZSBhbmQgcGFyZW50IHByb3BlcnR5IG9yIG5vbmU6ICR7dGhpcy5fYWN0aW9uTmFtZX0sICR7Y2ZnPy5wYXJlbnRUeXBlfSwgJHtjZmc/LnBhcmVudFByb3BlcnR5fS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYXJlbnRUeXBlID0gY2ZnPy5wYXJlbnRUeXBlO1xuICAgICAgICB0aGlzLl9wYXJlbnRUeXBlTmFtZSA9IGNmZz8ucGFyZW50VHlwZSA/IERlY29yYXRvck1ldGFkYXRhVXRpbC5maW5kVHlwZU5hbWUoY2ZnPy5wYXJlbnRUeXBlKSA/PyB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BhcmVudFByb3BlcnR5ID0gY2ZnPy5wYXJlbnRQcm9wZXJ0eTtcblxuICAgICAgICB0aGlzLnNldEkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKTtcblxuICAgICAgICBpZiAoY2ZnPy5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gRGF0YVByb3ZpZGVyLmZyb21BbnlQYXJhbTxNb2RlbCwgU2VydmljZT4odGhpcy5fbW9kZWw/LnR5cGUsIGNmZy5zZXJ2aWNlVHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ZnPy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGNmZy5kYXRhUHJvdmlkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGlzcGxheU5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwpIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fbW9kZWwudHlwZU5hbWV9LiR7ZGlzcGxheU5hbWV9YDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lKSB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS4ke3RoaXMuX3BhcmVudFByb3BlcnR5fV8ke2Rpc3BsYXlOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZUxvbmcgPSBkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRUeXBlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFR5cGVOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmF0aW9uVHJpZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3V0ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlVXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcnVuRnVuY3Rpb24gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5GdW5jdGlvbigpOiBBY3Rpb25SdW5GblR5cGU8TW9kZWwsIFNlcnZpY2U+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9ydW5GdW5jdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYFJ1biBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCBmb3IgYWN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZUxvbmd9IGFuZCBjYW5ub3QgYmUgaW52b2tlZGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZUZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0VuYWJsZWRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25OYW1lTG9uZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWVMb25nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b24uc3R5bGVDbGFzcy5jdXN0b21DbGFzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuQ29uZmlybWF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciAhPT0gbnVsbCAmJiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhZnRlclJ1bkFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyUnVuQWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25SdW5FcnJvckFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUnVuRXJyb3JBY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwZXJtaXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3Q2F0ZWdvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdDYXRlZ29yeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0l0ZW1zU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzSXRlbXNTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBidXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdWJhY3Rpb25zQXNNZW51KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ViYWN0aW9uc0FzTWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1YmFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJhY3Rpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRJMThuTW9kZWxBY3Rpb25CYXNlS2V5KGJhc2U/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lIHx8IHRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5ID0gdGhpcy5fcGFyZW50VHlwZU5hbWVcbiAgICAgICAgICAgICAgICA/IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS5hY3Rpb25zLiR7dGhpcy5fcGFyZW50UHJvcGVydHl9XyR7dGhpcy5fYWN0aW9uTmFtZX1gXG4gICAgICAgICAgICAgICAgOiBgJHtiYXNlID8/IHRoaXMuX21vZGVsIS5pMThuQmFzZUtleX0uYWN0aW9ucy4ke3RoaXMuX2FjdGlvbk5hbWV9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuRnVuY3Rpb24oZm46IEFjdGlvblJ1bkZuVHlwZTxNb2RlbCwgU2VydmljZT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc1Zpc2libGVGdW5jdGlvbihmbj86IEFjdGlvblZhbGlkYXRpb25GblR5cGU8TW9kZWwsIFNlcnZpY2U+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzVmlzaWJsZUZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXNFbmFibGVkRnVuY3Rpb24oZm4/OiBBY3Rpb25WYWxpZGF0aW9uRm5UeXBlPE1vZGVsLCBTZXJ2aWNlPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvdXRlVHJpZ2dlcihyb3V0ZVVybDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyID0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGU7XG4gICAgICAgIHRoaXMuX3JvdXRlVXJsID0gcm91dGVVcmw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUG9zaXRpb24ocG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGNvbmZpcm1hdGlvbiBhY3Rpb24gd2l0aCBkZWZhdWx0IHN0eWxlIGJhc2VkIG9uIGFjdGlvbiBkZXNjcmlwdG9yXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSdW5Db25maXJtYXRpb24oKTogQWN0aW9uQ29uZmlybWF0aW9uRGVzY3JpcHRvcjxNb2RlbD4ge1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yID0gbmV3IEFjdGlvbkNvbmZpcm1hdGlvbkRlc2NyaXB0b3I8TW9kZWw+KCk7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLnN0eWxlQ2xhc3Mud2l0aEFjdGlvbkxldmVsKHRoaXMuX2xldmVsKTtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvci5yZWplY3RCdXR0b24/LnN0eWxlQ2xhc3Mud2l0aEFjdGlvbkxldmVsKHRoaXMuX2xldmVsKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjb25maWd1cmF0aW9uIGRpYWxvZ3VlIHRvIGFjdGlvbiB1c2luZyBBY3Rpb25Db25maWd1cmF0aW9uRGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSBydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yIGRlc2NyaXB0b3Igd2l0aCBjdXN0b21pemFibGUgaW5mb3JtYXRpb24gZm9yIGRpYWxvZ1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUnVuQ29uZmlybWF0aW9uRGVzY3JpcHRvcihydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yPzogQWN0aW9uQ29uZmlybWF0aW9uRGVzY3JpcHRvcjxNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciA9IHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uU3VjY2Vzcyh0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJ1bk5vdGlmaWNhdGlvbkVycm9yKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWZ0ZXJSdW5BY3Rpb248UmV0dXJuLCBTZXJ2aWNlID0gYW55PihhY3Rpb24/OiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxSZXR1cm4+IHwgKChjdHg6IEFjdGlvbkNvbnRleHQ8TW9kZWwsIFNlcnZpY2U+KSA9PiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxSZXR1cm4+KSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9hZnRlclJ1bkFjdGlvbiA9IGFjdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhPblJ1bkVycm9yQWN0aW9uPFMgPSBhbnk+KGFjdGlvbj86IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsPiB8ICgoY3R4OiBBY3Rpb25Db250ZXh0PE1vZGVsLCBTPikgPT4gQWN0aW9uRGVzY3JpcHRvckluc3Q8TW9kZWw+KSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9vblJ1bkVycm9yQWN0aW9uID0gYWN0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBBUGVybWlzc2lvbnMpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYmxldmlld0NhdGVnb3J5KSB7XG4gICAgICAgICAgICBNbmdMb2dnZXJTZXJ2aWNlLmdldCgpLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXQVJOSU5HOiBQZXJtaXNzaW9ucyBzZXQgb24gYWN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZUxvbmd9IHdpdGggcm91dGUgdHlwZSAnJHt0aGlzLl90YWJsZXZpZXdDYXRlZ29yeX0nIHdpbGwgYmUgb21pdHRlZCBpbiByb3V0ZSBndWFyZCB2YWxpZGF0aW9uLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUYWJsZXZpZXdDYXRlZ29yeShwZXJtaXNzaW9uc1JvdXRlVHlwZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0NhdGVnb3J5ID0gcGVybWlzc2lvbnNSb3V0ZVR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnV0dG9uRGVzY3JpcHRvcihidXR0b246IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gYnV0dG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEJ1dHRvbihsYWJlbD86IHN0cmluZyB8IG51bGwsIGljb246IHN0cmluZyB8IG51bGwgPSBudWxsLCBzdHlsZUxldmVsID0gU3R5bGVMZXZlbEVudW0uRGVmYXVsdCwgc3R5bGVUZXh0ID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gbmV3IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IoKS53aXRoTGFiZWwobGFiZWwpLndpdGhJY29uKGljb24pLndpdGhTdHlsZUNsYXNzKG5ldyBCdXR0b25TdHlsZUJ1aWxkZXIoc3R5bGVMZXZlbCkud2l0aFRleHRCdXR0b24oc3R5bGVUZXh0KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXRlbXNTZWxlY3Rpb24oaGFzU2VsZWN0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNJdGVtc1NlbGVjdGlvbiA9IGhhc1NlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkRnVuY3Rpb24gPSB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbiA/PyAoY3R4ID0+IG9mKChjdHgucGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zPy5sZW5ndGggPz8gMCkgPiAwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxJQWN0aW9uQ29tcG9uZW50PE1vZGVsPj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBvc2l0aW9uVGFibGV2aWV3Q2F0ZWdvcmllcyhwb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uVGFibGV2aWV3Q2F0ZWdvcmllcyA9IHBvc2l0aW9uVGFibGV2aWV3Q2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJMThuQmFzZShiYXNlOiBDbGFzc1R5cGU8dW5rbm93bj4gfCBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBEZWNvcmF0b3JNZXRhZGF0YVV0aWwuZmluZFR5cGVOYW1lKGJhc2UpO1xuICAgICAgICAgICAgaWYgKCF0eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBkZWZpbmUgaTE4bkJhc2VLZXkgZm9yICR7YmFzZX0gb24gYWN0aW9uICR7dGhpcy5hY3Rpb25OYW1lTG9uZ31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJhc2UgPSB0eXBlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoYmFzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU3ViYWN0aW9uc0FzTWVudShzdWJhY3Rpb25zQXNNZW51ID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zdWJhY3Rpb25zQXNNZW51ID0gc3ViYWN0aW9uc0FzTWVudTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdWJhY3Rpb25zKC4uLnN1YmFjdGlvbnM6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsPj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc3ViYWN0aW9ucy5wdXNoKC4uLnN1YmFjdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weVRvKGRlc2NyaXB0b3I6IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsLCBTZXJ2aWNlPik6IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsLCBTZXJ2aWNlPiB7XG4gICAgICAgIGRlc2NyaXB0b3IuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXkgPSB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgICAgICBkZXNjcmlwdG9yLl90eXBlID0gdGhpcy5fdHlwZTtcbiAgICAgICAgZGVzY3JpcHRvci5fYWN0aXZhdGlvblRyaWdnZXIgPSB0aGlzLl9hY3RpdmF0aW9uVHJpZ2dlcjtcbiAgICAgICAgZGVzY3JpcHRvci5fcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5fbGV2ZWwgPSB0aGlzLl9sZXZlbDtcbiAgICAgICAgZGVzY3JpcHRvci5fcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzID0gdGhpcy5fcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX3RhYmxldmlld0NhdGVnb3J5ID0gdGhpcy5fdGFibGV2aWV3Q2F0ZWdvcnk7XG4gICAgICAgIGRlc2NyaXB0b3IuX3JvdXRlVXJsID0gdGhpcy5fcm91dGVVcmw7XG5cbiAgICAgICAgZGVzY3JpcHRvci5fcnVuRnVuY3Rpb24gPSB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5faXNWaXNpYmxlRnVuY3Rpb24gPSB0aGlzLl9pc1Zpc2libGVGdW5jdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5faXNFbmFibGVkRnVuY3Rpb24gPSB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbjtcblxuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yID0gdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcjtcblxuICAgICAgICBkZXNjcmlwdG9yLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcztcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlID0gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSA9IHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3I7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGUgPSB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlO1xuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2UgPSB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U7XG5cbiAgICAgICAgZGVzY3JpcHRvci5fYWZ0ZXJSdW5BY3Rpb24gPSB0aGlzLl9hZnRlclJ1bkFjdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5fb25SdW5FcnJvckFjdGlvbiA9IHRoaXMuX29uUnVuRXJyb3JBY3Rpb247XG5cbiAgICAgICAgZGVzY3JpcHRvci5fcGVybWlzc2lvbnMgPSB0aGlzLl9wZXJtaXNzaW9ucztcblxuICAgICAgICBkZXNjcmlwdG9yLl9idXR0b24gPSB0aGlzLl9idXR0b24uY29weSgpO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2hhc0l0ZW1zU2VsZWN0aW9uID0gdGhpcy5faGFzSXRlbXNTZWxlY3Rpb247XG4gICAgICAgIGRlc2NyaXB0b3IuX2NvbXBvbmVudCA9IHRoaXMuX2NvbXBvbmVudDtcbiAgICAgICAgZGVzY3JpcHRvci5fc3ViYWN0aW9uc0FzTWVudSA9IHRoaXMuX3N1YmFjdGlvbnNBc01lbnU7XG4gICAgICAgIGRlc2NyaXB0b3IuX3N1YmFjdGlvbnMgPSB0aGlzLl9zdWJhY3Rpb25zO1xuXG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdpbnRlcm5hbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPE1vZGVsPihhY3Rpb25OYW1lOiBzdHJpbmcsIGNmZz86IEFjdGlvbkRlc2NyaXB0b3JDcmVhdGVPcHRzUGFyZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsLCB1bmRlZmluZWQ+KGFjdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIC4uLmNmZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVdpdGhQcm92aWRlcjxTZXJ2aWNlLCBNb2RlbD4oc2VydmljZVByb3ZpZGVyOiBBY3Rpb25Qcm92aWRlclR5cGU8TW9kZWwsIFNlcnZpY2U+LCBhY3Rpb25OYW1lOiBzdHJpbmcsIGNmZz86IEFjdGlvbkRlc2NyaXB0b3JDcmVhdGVPcHRzUGFyZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkRlc2NyaXB0b3JJbnN0PE1vZGVsLCBTZXJ2aWNlPihhY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICAuLi5hY3Rpb25HZXRQcm92aWRlckNmZ09iaihzZXJ2aWNlUHJvdmlkZXIpLFxuICAgICAgICAgICAgLi4uY2ZnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU1vZGVsPE1vZGVsPihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPE1vZGVsPiwgYWN0aW9uTmFtZTogc3RyaW5nLCBjZmc/OiBBY3Rpb25EZXNjcmlwdG9yQ3JlYXRlT3B0c1BhcmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25EZXNjcmlwdG9ySW5zdDxNb2RlbCwgdW5kZWZpbmVkPihhY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIC4uLmNmZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Nb2RlbFdpdGhQcm92aWRlcjxNb2RlbCwgU2VydmljZT4oXG4gICAgICAgIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8TW9kZWw+LFxuICAgICAgICBzZXJ2aWNlUHJvdmlkZXI6IEFjdGlvblByb3ZpZGVyVHlwZTxNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIGFjdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgY2ZnPzogQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNQYXJlbnRUeXBlXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWN0aW9uRGVzY3JpcHRvckluc3Q8TW9kZWwsIFNlcnZpY2U+KGFjdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgLi4uYWN0aW9uR2V0UHJvdmlkZXJDZmdPYmooc2VydmljZVByb3ZpZGVyKSxcbiAgICAgICAgICAgIC4uLmNmZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21DbGFzczxNb2RlbD4odHlwZTogQ2xhc3NUeXBlPE1vZGVsPiwgYWN0aW9uTmFtZTogc3RyaW5nLCBjZmc/OiBBY3Rpb25EZXNjcmlwdG9yQ3JlYXRlRnJvbUNsYXNzT3B0czxNb2RlbD4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25EZXNjcmlwdG9ySW5zdDxNb2RlbCwgdW5kZWZpbmVkPihhY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBtb2RlbDogTW9kZWxEZXNjcmlwdG9yLmZyb21DbGFzczxNb2RlbD4odHlwZSwgY2ZnPy5pZFByb3BlcnR5LCBjZmc/LnRpdGxlUHJvcGVydHksIGNmZz8uaTE4bkJhc2VLZXkpLFxuICAgICAgICAgICAgLi4uY2ZnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUNsYXNzV2l0aFByb3ZpZGVyPE1vZGVsLCBTZXJ2aWNlPihcbiAgICAgICAgY2xhc3NUeXBlOiBDbGFzc1R5cGU8TW9kZWw+LFxuICAgICAgICBzZXJ2aWNlUHJvdmlkZXI6IEFjdGlvblByb3ZpZGVyVHlwZTxNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIGFjdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgY2ZnPzogQWN0aW9uRGVzY3JpcHRvckNyZWF0ZUZyb21DbGFzc09wdHM8TW9kZWw+XG4gICAgKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWN0aW9uRGVzY3JpcHRvckluc3Q8TW9kZWwsIFNlcnZpY2U+KGFjdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIG1vZGVsOiBNb2RlbERlc2NyaXB0b3IuZnJvbUNsYXNzPE1vZGVsPihjbGFzc1R5cGUsIGNmZz8uaWRQcm9wZXJ0eSwgY2ZnPy50aXRsZVByb3BlcnR5LCBjZmc/LmkxOG5CYXNlS2V5KSxcbiAgICAgICAgICAgIC4uLmFjdGlvbkdldFByb3ZpZGVyQ2ZnT2JqKHNlcnZpY2VQcm92aWRlciksXG4gICAgICAgICAgICAuLi5jZmdcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRGVsZXRlRGVzY3JpcHRvckluc3Q8TW9kZWwsIFNlcnZpY2UgPSBhbnk+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvckluc3Q8TW9kZWwsIFNlcnZpY2U+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RlbGV0ZSc7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPE1vZGVsPiwgY2ZnPzogQWN0aW9uRGVzY3JpcHRvckNyZWF0ZU9wdHNQcm92aWRlclR5cGU8TW9kZWwsIFNlcnZpY2U+KSB7XG4gICAgICAgIHN1cGVyKEFjdGlvbkRlbGV0ZURlc2NyaXB0b3JJbnN0LkFDVElPTl9OQU1FLCB7bW9kZWwsIC4uLmNmZ30pO1xuICAgICAgICB0aGlzLndpdGhQb3NpdGlvbihBY3Rpb25Qb3NpdGlvbkVudW0uUm93SW5saW5lKTtcbiAgICAgICAgdGhpcy5idXR0b24uc3R5bGVDbGFzcy53aXRoU2l6ZShTdHlsZVNpemVFbnVtLlNtYWxsKTtcbiAgICAgICAgdGhpcy53aXRoUnVuRnVuY3Rpb24oQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5EZWxldGVPckZhaWwpO1xuICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZUNsYXNzLndpdGhBY3Rpb25MZXZlbChTdHlsZUxldmVsRW51bS5EYW5nZXIpO1xuICAgICAgICB0aGlzLndpdGhSdW5Db25maXJtYXRpb24oKTtcbiAgICAgICAgdGhpcy53aXRoVGFibGV2aWV3Q2F0ZWdvcnkoVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuREVMRVRFKTtcbiAgICAgICAgdGhpcy5idXR0b24ud2l0aExhYmVsKG51bGwpLndpdGhJY29uKCdwaSBwaS10cmFzaCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlbGV0ZURlc2NyaXB0b3Ige1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPE1vZGVsPihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPE1vZGVsPikge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkRlbGV0ZURlc2NyaXB0b3JJbnN0PE1vZGVsLCB1bmRlZmluZWQ+KG1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVdpdGhQcm92aWRlcjxNb2RlbCwgU2VydmljZT4obW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxNb2RlbD4sIHNlcnZpY2VQcm92aWRlcjogQWN0aW9uUHJvdmlkZXJUeXBlPE1vZGVsLCBTZXJ2aWNlPikge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkRlbGV0ZURlc2NyaXB0b3JJbnN0PE1vZGVsLCBTZXJ2aWNlPihtb2RlbCwge1xuICAgICAgICAgICAgLi4uYWN0aW9uR2V0UHJvdmlkZXJDZmdPYmooc2VydmljZVByb3ZpZGVyKVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=