@mediusinc/mng-commons 1.3.0-1c14fa2b → 2.0.0-rc.0-08f92864

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 (230) hide show
  1. package/assets/i18n/en.json +9 -0
  2. package/assets/i18n/sl.json +9 -0
  3. package/esm2020/lib/api/utils/medius-rest.util.mjs +1 -1
  4. package/esm2020/lib/components/action/action.component.mjs +76 -20
  5. package/esm2020/lib/components/action/editor/action-editor.component.mjs +12 -12
  6. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +6 -6
  7. package/esm2020/lib/components/action/models/action-component.model.mjs +1 -1
  8. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  9. package/esm2020/lib/components/action/models/action-execution.model.mjs +1 -1
  10. package/esm2020/lib/components/action/route/action-route.component.mjs +6 -5
  11. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +11 -10
  12. package/esm2020/lib/components/form/date-range/date-range.component.mjs +9 -8
  13. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +13 -11
  14. package/esm2020/lib/components/form/editor/form-editor.component.mjs +14 -11
  15. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +13 -9
  16. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +8 -7
  17. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +8 -7
  18. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +11 -9
  19. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +50 -20
  20. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +5 -5
  21. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +27 -17
  22. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +32 -12
  23. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +21 -12
  24. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +13 -11
  25. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
  26. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +10 -9
  27. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +11 -10
  28. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  29. package/esm2020/lib/components/layout/breadcrumb.component.mjs +7 -6
  30. package/esm2020/lib/components/layout/footer.component.mjs +6 -5
  31. package/esm2020/lib/components/layout/main-layout.component.mjs +8 -8
  32. package/esm2020/lib/components/layout/menu-item.component.mjs +43 -23
  33. package/esm2020/lib/components/layout/menu.component.mjs +24 -13
  34. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +3 -3
  35. package/esm2020/lib/components/layout/topbar.component.mjs +14 -12
  36. package/esm2020/lib/components/layout/version.component.mjs +6 -6
  37. package/esm2020/lib/components/tableview/models/table.event.mjs +1 -1
  38. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +38 -10
  39. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +5 -6
  40. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +14 -13
  41. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +29 -12
  42. package/esm2020/lib/components/tableview/table/table.component.mjs +33 -17
  43. package/esm2020/lib/components/tableview/tableview.component.mjs +13 -11
  44. package/esm2020/lib/descriptors/action/action-button.descriptor.mjs +60 -0
  45. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +2 -2
  46. package/esm2020/lib/descriptors/action/action.descriptor.mjs +579 -0
  47. package/esm2020/lib/descriptors/action/index.mjs +4 -0
  48. package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +291 -0
  49. package/esm2020/lib/descriptors/editor/field-validation.descriptor.mjs +25 -0
  50. package/esm2020/lib/descriptors/editor/field.descriptor.mjs +990 -0
  51. package/esm2020/lib/descriptors/editor/index.mjs +4 -0
  52. package/esm2020/lib/descriptors/filter/filter.descriptor.mjs +370 -0
  53. package/esm2020/lib/descriptors/filter/index.mjs +2 -0
  54. package/esm2020/lib/descriptors/index.mjs +1 -11
  55. package/esm2020/lib/descriptors/table/column.descriptor.mjs +406 -0
  56. package/esm2020/lib/descriptors/table/index.mjs +3 -0
  57. package/esm2020/lib/descriptors/table/table.descriptor.mjs +497 -0
  58. package/esm2020/lib/descriptors/tableview/index.mjs +2 -0
  59. package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +346 -0
  60. package/esm2020/lib/directives/component.directive.mjs +5 -4
  61. package/esm2020/lib/directives/template.directive.mjs +5 -4
  62. package/esm2020/lib/mng-commons.module.mjs +108 -138
  63. package/esm2020/lib/models/column-value.model.mjs +1 -1
  64. package/esm2020/lib/models/config.model.mjs +1 -1
  65. package/esm2020/lib/models/menu.model.mjs +1 -1
  66. package/esm2020/lib/models/view-container.model.mjs +1 -1
  67. package/esm2020/lib/pipes/boolean.pipe.mjs +5 -4
  68. package/esm2020/lib/pipes/class-map.pipe.mjs +5 -4
  69. package/esm2020/lib/pipes/enum.pipe.mjs +5 -4
  70. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +5 -4
  71. package/esm2020/lib/pipes/enumerate.pipe.mjs +5 -4
  72. package/esm2020/lib/pipes/getter.pipe.mjs +5 -4
  73. package/esm2020/lib/pipes/i18n-property.pipe.mjs +5 -4
  74. package/esm2020/lib/pipes/json-path.pipe.mjs +5 -4
  75. package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +5 -4
  76. package/esm2020/lib/pipes/parametrize.pipe.mjs +5 -4
  77. package/esm2020/lib/pipes/template.pipe.mjs +5 -4
  78. package/esm2020/lib/provide-commons.mjs +73 -0
  79. package/esm2020/lib/router/index.mjs +2 -1
  80. package/esm2020/lib/router/models/router.model.mjs +1 -1
  81. package/esm2020/lib/router/route-builder.mjs +31 -144
  82. package/esm2020/lib/router/routes-builder.mjs +67 -0
  83. package/esm2020/lib/router/tableview-route-builder.mjs +2 -2
  84. package/esm2020/lib/security/authorization.guard.mjs +8 -5
  85. package/esm2020/lib/security/authorization.service.mjs +8 -5
  86. package/esm2020/lib/services/action-executor.service.mjs +13 -7
  87. package/esm2020/lib/services/commons.service.mjs +15 -10
  88. package/esm2020/lib/services/configuration.service.mjs +27 -20
  89. package/esm2020/lib/services/internal/commons-init.service.mjs +13 -7
  90. package/esm2020/lib/services/navigation.service.mjs +8 -5
  91. package/esm2020/lib/services/providers/config-service.provider.mjs +5 -4
  92. package/esm2020/lib/services/router.service.mjs +97 -0
  93. package/esm2020/lib/services/version.service.mjs +8 -5
  94. package/esm2020/lib/services/view-container.component.service.mjs +4 -4
  95. package/esm2020/lib/styles/styles.util.mjs +1 -1
  96. package/esm2020/lib/utils/action-data-provider.util.mjs +1 -1
  97. package/esm2020/lib/utils/editor-formly.util.mjs +2 -2
  98. package/esm2020/lib/utils/export.util.mjs +20 -0
  99. package/esm2020/lib/utils/i18n.util.mjs +1 -1
  100. package/esm2020/lib/utils/index.mjs +2 -1
  101. package/esm2020/lib/utils/notification.util.mjs +1 -1
  102. package/esm2020/lib/utils/route.util.mjs +13 -1
  103. package/esm2020/lib/utils/tableview.util.mjs +1 -1
  104. package/esm2020/public-api.mjs +7 -1
  105. package/fesm2015/mediusinc-mng-commons.mjs +6767 -6381
  106. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  107. package/fesm2020/mediusinc-mng-commons.mjs +6707 -6325
  108. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  109. package/lib/api/utils/medius-rest.util.d.ts +1 -1
  110. package/lib/components/action/action.component.d.ts +10 -5
  111. package/lib/components/action/editor/action-editor.component.d.ts +2 -2
  112. package/lib/components/action/localization/data-language-dropdown.component.d.ts +2 -2
  113. package/lib/components/action/models/action-component.model.d.ts +1 -1
  114. package/lib/components/action/models/action-confirmation-service.model.d.ts +1 -1
  115. package/lib/components/action/models/action-execution.model.d.ts +2 -2
  116. package/lib/components/action/route/action-route.component.d.ts +2 -2
  117. package/lib/components/form/autocomplete/autocomplete.component.d.ts +1 -1
  118. package/lib/components/form/date-range/date-range.component.d.ts +1 -1
  119. package/lib/components/form/dropdown/dropdown.component.d.ts +1 -1
  120. package/lib/components/form/editor/form-editor.component.d.ts +2 -2
  121. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +2 -2
  122. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +2 -2
  123. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +2 -2
  124. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +2 -2
  125. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +2 -2
  126. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +1 -1
  127. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +2 -2
  128. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +3 -2
  129. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +2 -2
  130. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +1 -1
  131. package/lib/components/form/formly/models/formly-field.model.d.ts +2 -2
  132. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +1 -1
  133. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -2
  134. package/lib/components/form/models/field-action-context.model.d.ts +1 -1
  135. package/lib/components/layout/breadcrumb.component.d.ts +1 -1
  136. package/lib/components/layout/footer.component.d.ts +1 -1
  137. package/lib/components/layout/main-layout.component.d.ts +1 -1
  138. package/lib/components/layout/menu-item.component.d.ts +6 -2
  139. package/lib/components/layout/menu.component.d.ts +9 -3
  140. package/lib/components/layout/topbar.component.d.ts +1 -1
  141. package/lib/components/layout/version.component.d.ts +1 -1
  142. package/lib/components/tableview/models/table.event.d.ts +1 -1
  143. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +9 -2
  144. package/lib/components/tableview/route/tableview-route.component.d.ts +3 -2
  145. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
  146. package/lib/components/tableview/table/column-value/column-value.component.d.ts +2 -2
  147. package/lib/components/tableview/table/table.component.d.ts +4 -2
  148. package/lib/components/tableview/tableview.component.d.ts +3 -2
  149. package/lib/descriptors/{action-button.descriptor.d.ts → action/action-button.descriptor.d.ts} +1 -1
  150. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +2 -2
  151. package/lib/descriptors/{action.descriptor.d.ts → action/action.descriptor.d.ts} +16 -8
  152. package/lib/descriptors/action/index.d.ts +3 -0
  153. package/lib/descriptors/{editor.descriptor.d.ts → editor/editor.descriptor.d.ts} +9 -6
  154. package/lib/descriptors/{field-validation.descriptor.d.ts → editor/field-validation.descriptor.d.ts} +1 -1
  155. package/lib/descriptors/{field.descriptor.d.ts → editor/field.descriptor.d.ts} +14 -10
  156. package/lib/descriptors/editor/index.d.ts +3 -0
  157. package/lib/descriptors/{filter.descriptor.d.ts → filter/filter.descriptor.d.ts} +11 -9
  158. package/lib/descriptors/filter/index.d.ts +1 -0
  159. package/lib/descriptors/index.d.ts +0 -10
  160. package/lib/descriptors/{column.descriptor.d.ts → table/column.descriptor.d.ts} +4 -4
  161. package/lib/descriptors/table/index.d.ts +2 -0
  162. package/lib/descriptors/{table.descriptor.d.ts → table/table.descriptor.d.ts} +12 -7
  163. package/lib/descriptors/tableview/index.d.ts +1 -0
  164. package/lib/descriptors/{tableview.descriptor.d.ts → tableview/tableview.descriptor.d.ts} +9 -7
  165. package/lib/directives/component.directive.d.ts +1 -1
  166. package/lib/directives/template.directive.d.ts +1 -1
  167. package/lib/mng-commons.module.d.ts +90 -88
  168. package/lib/models/column-value.model.d.ts +1 -1
  169. package/lib/models/config.model.d.ts +1 -0
  170. package/lib/models/menu.model.d.ts +1 -1
  171. package/lib/models/version.model.d.ts +1 -1
  172. package/lib/models/view-container.model.d.ts +1 -1
  173. package/lib/pipes/boolean.pipe.d.ts +1 -1
  174. package/lib/pipes/class-map.pipe.d.ts +1 -1
  175. package/lib/pipes/enum.pipe.d.ts +1 -1
  176. package/lib/pipes/enumerate-async.pipe.d.ts +1 -1
  177. package/lib/pipes/enumerate.pipe.d.ts +1 -1
  178. package/lib/pipes/getter.pipe.d.ts +1 -1
  179. package/lib/pipes/i18n-property.pipe.d.ts +1 -1
  180. package/lib/pipes/json-path.pipe.d.ts +1 -1
  181. package/lib/pipes/locale-default-row-class.pipe.d.ts +2 -2
  182. package/lib/pipes/parametrize.pipe.d.ts +1 -1
  183. package/lib/pipes/template.pipe.d.ts +1 -1
  184. package/lib/provide-commons.d.ts +3 -0
  185. package/lib/router/index.d.ts +1 -0
  186. package/lib/router/models/router.model.d.ts +5 -2
  187. package/lib/router/route-builder.d.ts +12 -48
  188. package/lib/router/routes-builder.d.ts +29 -0
  189. package/lib/router/tableview-route-builder.d.ts +2 -1
  190. package/lib/services/action-executor.service.d.ts +2 -1
  191. package/lib/services/commons.service.d.ts +3 -3
  192. package/lib/services/configuration.service.d.ts +4 -1
  193. package/lib/services/internal/commons-init.service.d.ts +4 -2
  194. package/lib/services/router.service.d.ts +22 -0
  195. package/lib/services/view-container.component.service.d.ts +1 -1
  196. package/lib/styles/styles.util.d.ts +2 -1
  197. package/lib/types/type.model.d.ts +8 -8
  198. package/lib/utils/editor-formly.util.d.ts +1 -1
  199. package/lib/utils/export.util.d.ts +5 -0
  200. package/lib/utils/i18n.util.d.ts +2 -1
  201. package/lib/utils/index.d.ts +1 -0
  202. package/lib/utils/notification.util.d.ts +2 -1
  203. package/lib/utils/route.util.d.ts +55 -0
  204. package/lib/utils/tableview.util.d.ts +1 -1
  205. package/package.json +6 -6
  206. package/public-api.d.ts +6 -0
  207. package/scss/common/layout/_breadcrumb.scss +12 -2
  208. package/scss/common/layout/_exception.scss +1 -1
  209. package/scss/common/layout/_inlinemenu.scss +13 -0
  210. package/scss/common/layout/_login.scss +1 -0
  211. package/scss/common/layout/_rightmenu.scss +5 -0
  212. package/scss/common/layout/menu/_menu_common.scss +1 -1
  213. package/scss/common/theme/designer/_components.scss +4 -4
  214. package/scss/common/theme/designer/_mixins.scss +29 -0
  215. package/scss/common/theme/extensions/_datatable.scss +2 -2
  216. package/scss/common/variables/layout/_layout_dark.scss +0 -1
  217. package/scss/common/variables/layout/_layout_light.scss +0 -1
  218. package/scss/common/variables/theme/_theme_dark.scss +72 -46
  219. package/scss/common/variables/theme/_theme_light.scss +70 -33
  220. package/scss/mng-overrides/_layout_menu.scss +4 -0
  221. package/version-info.json +6 -6
  222. package/esm2020/lib/descriptors/action-button.descriptor.mjs +0 -60
  223. package/esm2020/lib/descriptors/action.descriptor.mjs +0 -560
  224. package/esm2020/lib/descriptors/column.descriptor.mjs +0 -405
  225. package/esm2020/lib/descriptors/editor.descriptor.mjs +0 -290
  226. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +0 -25
  227. package/esm2020/lib/descriptors/field.descriptor.mjs +0 -987
  228. package/esm2020/lib/descriptors/filter.descriptor.mjs +0 -368
  229. package/esm2020/lib/descriptors/table.descriptor.mjs +0 -482
  230. package/esm2020/lib/descriptors/tableview.descriptor.mjs +0 -344
@@ -39,9 +39,12 @@ export class MngAuthorizationService {
39
39
  return serviceInstance.isPermitted(route, this.router.routerState.snapshot, actionCtx);
40
40
  }
41
41
  }
42
- MngAuthorizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAuthorizationService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.MngCommonsService }], target: i0.ɵɵFactoryTarget.Injectable });
43
- MngAuthorizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAuthorizationService });
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAuthorizationService, decorators: [{
45
- type: Injectable
42
+ MngAuthorizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngAuthorizationService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.MngCommonsService }], target: i0.ɵɵFactoryTarget.Injectable });
43
+ MngAuthorizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngAuthorizationService, providedIn: 'root' });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngAuthorizationService, decorators: [{
45
+ type: Injectable,
46
+ args: [{
47
+ providedIn: 'root'
48
+ }]
46
49
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.MngCommonsService }]; } });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZWN1cml0eS9hdXRob3JpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQWEsYUFBYSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkMsT0FBTyxFQUFlLHFCQUFxQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFbkYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFHdkQsTUFBTSxPQUFPLHVCQUF1QjtJQUNoQyxZQUFvQixRQUFrQixFQUFVLE1BQWMsRUFBVSxPQUEwQjtRQUE5RSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQW1CO0lBQUcsQ0FBQztJQUUvRixXQUFXLENBQUMsV0FBeUIsRUFBRSxLQUE4QixFQUFFLFNBQXFEO1FBQy9ILFFBQVEsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1lBQ25DLEtBQUsscUJBQXFCLENBQUMsR0FBRztnQkFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQThCLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLEtBQUsscUJBQXFCLENBQUMsR0FBRztnQkFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQThCLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLEtBQUsscUJBQXFCLENBQUMsT0FBTztnQkFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBa0MsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekY7Z0JBQ0ksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEc7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLFVBQTJCLEVBQUUsS0FBOEIsRUFBRSxTQUFxRDtRQUNySSxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7SUFFTyxjQUFjLENBQUMsVUFBMkIsRUFBRSxLQUE4QixFQUFFLFNBQXFEO1FBQ3JJLE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0ksQ0FBQztJQUVPLGtCQUFrQixDQUFDLFVBQStCLEVBQUUsS0FBOEIsRUFBRSxTQUFxRDtRQUM3SSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQjtRQUNELE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7O29IQS9CUSx1QkFBdUI7d0hBQXZCLHVCQUF1QjsyRkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3Rvcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0FjdGlvbkNvbnRleHRWYWxpZGF0aW9ufSBmcm9tICcuLi9jb21wb25lbnRzL2FjdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHtBUGVybWlzc2lvbnMsIEF1dGhvcml6YXRpb25UeXBlRW51bSwgUGVybWlzc2lvbnN9IGZyb20gJy4uL3NlY3VyaXR5L21vZGVsJztcbmltcG9ydCB7TW5nQ29tbW9uc1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7QXV0aG9yaXphdGlvblV0aWx9IGZyb20gJy4vYXV0aG9yaXphdGlvbi51dGlsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1uZ0F1dGhvcml6YXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBjb21tb25zOiBNbmdDb21tb25zU2VydmljZSkge31cblxuICAgIHB1YmxpYyBpc1Blcm1pdHRlZChwZXJtaXNzaW9uczogQVBlcm1pc3Npb25zLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGFjdGlvbkN0eD86IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHN3aXRjaCAocGVybWlzc2lvbnMuYXV0aG9yaXphdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQXV0aG9yaXphdGlvblR5cGVFbnVtLkFsbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1Blcm1pdHRlZEFsbChwZXJtaXNzaW9ucyBhcyBQZXJtaXNzaW9ucy5BbGwsIHJvdXRlLCBhY3Rpb25DdHgpO1xuICAgICAgICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZUVudW0uQW55OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUGVybWl0dGVkQW55KHBlcm1pc3Npb25zIGFzIFBlcm1pc3Npb25zLkFueSwgcm91dGUsIGFjdGlvbkN0eCk7XG4gICAgICAgICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlRW51bS5TZXJ2aWNlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUGVybWl0dGVkU2VydmljZShwZXJtaXNzaW9ucyBhcyBQZXJtaXNzaW9ucy5TZXJ2aWNlLCByb3V0ZSwgYWN0aW9uQ3R4KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbW9ucy51c2VyUm9sZXMkLnBpcGUobWFwKHVyID0+IEF1dGhvcml6YXRpb25VdGlsLmlzUGVybWl0dGVkKHBlcm1pc3Npb25zLCB1cikpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRBbGwocGVybWlzc2lvbjogUGVybWlzc2lvbnMuQWxsLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGFjdGlvbkN0eD86IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+KSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHBlcm1pc3Npb24ucGVybWlzc2lvbnMubWFwKHAgPT4gdGhpcy5pc1Blcm1pdHRlZChwLCByb3V0ZSwgYWN0aW9uQ3R4KSkpLnBpcGUobWFwKHJlcyA9PiByZXMuZXZlcnkoaXAgPT4gaXAgPT09IHRydWUpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Blcm1pdHRlZEFueShwZXJtaXNzaW9uOiBQZXJtaXNzaW9ucy5BbnksIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgYWN0aW9uQ3R4PzogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocGVybWlzc2lvbi5wZXJtaXNzaW9ucy5tYXAocCA9PiB0aGlzLmlzUGVybWl0dGVkKHAsIHJvdXRlLCBhY3Rpb25DdHgpKSkucGlwZShtYXAocmVzID0+IHJlcy5zb21lKGlwID0+IGlwID09PSB0cnVlKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRTZXJ2aWNlKHBlcm1pc3Npb246IFBlcm1pc3Npb25zLlNlcnZpY2UsIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgYWN0aW9uQ3R4PzogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUluc3RhbmNlID0gdGhpcy5pbmplY3Rvci5nZXQocGVybWlzc2lvbi5zZXJ2aWNlKTtcbiAgICAgICAgaWYgKCFzZXJ2aWNlSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2VydmljZSBpbnN0YW5jZSBjb3VsZCBub3QgYmUgcmV0cmVpdmVkIGZvciB0eXBlICR7cGVybWlzc2lvbi5zZXJ2aWNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VydmljZUluc3RhbmNlLmlzUGVybWl0dGVkKHJvdXRlLCB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCwgYWN0aW9uQ3R4KTtcbiAgICB9XG59XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZWN1cml0eS9hdXRob3JpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBVyxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQWEsYUFBYSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkMsT0FBTyxFQUFlLHFCQUFxQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFbkYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFLdkQsTUFBTSxPQUFPLHVCQUF1QjtJQUNoQyxZQUFvQixRQUFrQixFQUFVLE1BQWMsRUFBVSxPQUEwQjtRQUE5RSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQW1CO0lBQUcsQ0FBQztJQUUvRixXQUFXLENBQUMsV0FBeUIsRUFBRSxLQUE4QixFQUFFLFNBQXFEO1FBQy9ILFFBQVEsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1lBQ25DLEtBQUsscUJBQXFCLENBQUMsR0FBRztnQkFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQThCLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLEtBQUsscUJBQXFCLENBQUMsR0FBRztnQkFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQThCLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pGLEtBQUsscUJBQXFCLENBQUMsT0FBTztnQkFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBa0MsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekY7Z0JBQ0ksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEc7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLFVBQTJCLEVBQUUsS0FBOEIsRUFBRSxTQUFxRDtRQUNySSxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7SUFFTyxjQUFjLENBQUMsVUFBMkIsRUFBRSxLQUE4QixFQUFFLFNBQXFEO1FBQ3JJLE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0ksQ0FBQztJQUVPLGtCQUFrQixDQUFDLFVBQStCLEVBQUUsS0FBOEIsRUFBRSxTQUFxRDtRQUM3SSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQjtRQUNELE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7O29IQS9CUSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZwQixNQUFNOzJGQUVULHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge09ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7QWN0aW9uQ29udGV4dFZhbGlkYXRpb259IGZyb20gJy4uL2NvbXBvbmVudHMvYWN0aW9uL21vZGVscyc7XG5pbXBvcnQge0FQZXJtaXNzaW9ucywgQXV0aG9yaXphdGlvblR5cGVFbnVtLCBQZXJtaXNzaW9uc30gZnJvbSAnLi4vc2VjdXJpdHkvbW9kZWwnO1xuaW1wb3J0IHtNbmdDb21tb25zU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHtBdXRob3JpemF0aW9uVXRpbH0gZnJvbSAnLi9hdXRob3JpemF0aW9uLnV0aWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0F1dGhvcml6YXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBjb21tb25zOiBNbmdDb21tb25zU2VydmljZSkge31cblxuICAgIHB1YmxpYyBpc1Blcm1pdHRlZChwZXJtaXNzaW9uczogQVBlcm1pc3Npb25zLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGFjdGlvbkN0eD86IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHN3aXRjaCAocGVybWlzc2lvbnMuYXV0aG9yaXphdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQXV0aG9yaXphdGlvblR5cGVFbnVtLkFsbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1Blcm1pdHRlZEFsbChwZXJtaXNzaW9ucyBhcyBQZXJtaXNzaW9ucy5BbGwsIHJvdXRlLCBhY3Rpb25DdHgpO1xuICAgICAgICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZUVudW0uQW55OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUGVybWl0dGVkQW55KHBlcm1pc3Npb25zIGFzIFBlcm1pc3Npb25zLkFueSwgcm91dGUsIGFjdGlvbkN0eCk7XG4gICAgICAgICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlRW51bS5TZXJ2aWNlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUGVybWl0dGVkU2VydmljZShwZXJtaXNzaW9ucyBhcyBQZXJtaXNzaW9ucy5TZXJ2aWNlLCByb3V0ZSwgYWN0aW9uQ3R4KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbW9ucy51c2VyUm9sZXMkLnBpcGUobWFwKHVyID0+IEF1dGhvcml6YXRpb25VdGlsLmlzUGVybWl0dGVkKHBlcm1pc3Npb25zLCB1cikpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRBbGwocGVybWlzc2lvbjogUGVybWlzc2lvbnMuQWxsLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGFjdGlvbkN0eD86IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+KSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHBlcm1pc3Npb24ucGVybWlzc2lvbnMubWFwKHAgPT4gdGhpcy5pc1Blcm1pdHRlZChwLCByb3V0ZSwgYWN0aW9uQ3R4KSkpLnBpcGUobWFwKHJlcyA9PiByZXMuZXZlcnkoaXAgPT4gaXAgPT09IHRydWUpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Blcm1pdHRlZEFueShwZXJtaXNzaW9uOiBQZXJtaXNzaW9ucy5BbnksIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgYWN0aW9uQ3R4PzogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocGVybWlzc2lvbi5wZXJtaXNzaW9ucy5tYXAocCA9PiB0aGlzLmlzUGVybWl0dGVkKHAsIHJvdXRlLCBhY3Rpb25DdHgpKSkucGlwZShtYXAocmVzID0+IHJlcy5zb21lKGlwID0+IGlwID09PSB0cnVlKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRTZXJ2aWNlKHBlcm1pc3Npb246IFBlcm1pc3Npb25zLlNlcnZpY2UsIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgYWN0aW9uQ3R4PzogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUluc3RhbmNlID0gdGhpcy5pbmplY3Rvci5nZXQocGVybWlzc2lvbi5zZXJ2aWNlKTtcbiAgICAgICAgaWYgKCFzZXJ2aWNlSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2VydmljZSBpbnN0YW5jZSBjb3VsZCBub3QgYmUgcmV0cmVpdmVkIGZvciB0eXBlICR7cGVybWlzc2lvbi5zZXJ2aWNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VydmljZUluc3RhbmNlLmlzUGVybWl0dGVkKHJvdXRlLCB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCwgYWN0aW9uQ3R4KTtcbiAgICB9XG59XG4iXX0=
@@ -3,7 +3,7 @@ import { Inject, Injectable } from '@angular/core';
3
3
  import { from, mergeMap, of, switchMap, throwError } from 'rxjs';
4
4
  import { catchError, filter, first, map } from 'rxjs/operators';
5
5
  import { ActionContext, ActionContextValidation, ActionInstance, ActionInstanceStateEnum, ActionParameters } from '../components/action/models';
6
- import { ActionEditorDescriptor } from '../descriptors';
6
+ import { ActionEditorDescriptor } from '../descriptors/action';
7
7
  import { ActionActivationTriggerEnum, ActionTypeEnum } from '../descriptors/types';
8
8
  import { StyleSizeEnum } from '../styles/models';
9
9
  import { I18nUtils, NotificationUtil, StringUtil } from '../utils';
@@ -127,7 +127,10 @@ export class MngActionExecutorService {
127
127
  ctx.instance.isRunLoadingSubject.next(false);
128
128
  // handle notification
129
129
  if (ctx.instance.action.hasRunNotificationSuccess) {
130
- ctx.notification = NotificationUtil.actionNotificationSuccess(this.translate, ctx.instance.action, ctx.functionName, ctx.instance.action.runNotificationSuccessTitle, ctx.instance.action.runNotificationSuccessMessage, ctx.parameters.viewContainer ?? undefined, ctx.parameters?.item);
130
+ ctx.notification = NotificationUtil.actionNotificationSuccess(this.translate, ctx.instance.action, ctx.functionName, ctx.instance.action.runNotificationSuccessTitle, ctx.instance.action.runNotificationSuccessMessage, ctx.parameters.viewContainer ?? undefined, {
131
+ ...ctx.parameters?.item,
132
+ ...runResult
133
+ });
131
134
  }
132
135
  // handle possible after run action
133
136
  if (ctx.instance.action.afterRunAction) {
@@ -541,12 +544,15 @@ export class MngActionExecutorService {
541
544
  return this.errorMapper.toMngError(error, actionError);
542
545
  }
543
546
  }
544
- MngActionExecutorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.DialogService }, { token: i3.ConfirmationService }, { token: i4.TranslateService }, { token: i5.MngConfigurationService }, { token: i6.MngNavigationService }, { token: i7.MngErrorMapperService }, { token: i8.MngParametrizePipe }, { token: ACTION_EDITOR_DIALOG_COMPONENT_SETTING }], target: i0.ɵɵFactoryTarget.Injectable });
545
- MngActionExecutorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService });
546
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService, decorators: [{
547
- type: Injectable
547
+ MngActionExecutorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngActionExecutorService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.DialogService }, { token: i3.ConfirmationService }, { token: i4.TranslateService }, { token: i5.MngConfigurationService }, { token: i6.MngNavigationService }, { token: i7.MngErrorMapperService }, { token: i8.MngParametrizePipe }, { token: ACTION_EDITOR_DIALOG_COMPONENT_SETTING }], target: i0.ɵɵFactoryTarget.Injectable });
548
+ MngActionExecutorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngActionExecutorService, providedIn: 'root' });
549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: MngActionExecutorService, decorators: [{
550
+ type: Injectable,
551
+ args: [{
552
+ providedIn: 'root'
553
+ }]
548
554
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.DialogService }, { type: i3.ConfirmationService }, { type: i4.TranslateService }, { type: i5.MngConfigurationService }, { type: i6.MngNavigationService }, { type: i7.MngErrorMapperService }, { type: i8.MngParametrizePipe }, { type: i0.Type, decorators: [{
549
555
  type: Inject,
550
556
  args: [ACTION_EDITOR_DIALOG_COMPONENT_SETTING]
551
557
  }] }]; } });
552
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWV4ZWN1dG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2FjdGlvbi1leGVjdXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQU1qRSxPQUFPLEVBQWEsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFDLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQTZCLE1BQU0sNkJBQTZCLENBQUM7QUFHMUssT0FBTyxFQUFtQixzQkFBc0IsRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RixPQUFPLEVBQUMsMkJBQTJCLEVBQUUsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSWpFLE9BQU8sRUFBQyxzQ0FBc0MsRUFBQyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7OztBQUdoRSxNQUFNLE9BQU8sd0JBQXdCO0lBR2pDLFlBQ1ksUUFBa0IsRUFDbEIsTUFBYyxFQUNkLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxTQUEyQixFQUMzQixvQkFBNkMsRUFDN0MsaUJBQXVDLEVBQ3ZDLFdBQWtDLEVBQ2xDLFdBQStCLEVBQ2lC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LHdCQUF3QixrVEFhckIsc0NBQXNDO3lIQWJ6Qyx3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVTs7MEJBY0YsTUFBTTsyQkFBQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtDb25maXJtYXRpb24sIENvbmZpcm1hdGlvblNlcnZpY2V9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7RGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZ30gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgZnJvbSwgbWVyZ2VNYXAsIG9mLCBzd2l0Y2hNYXAsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBmaWx0ZXIsIGZpcnN0LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtBY3Rpb25Db250ZXh0LCBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbiwgQWN0aW9uSW5zdGFuY2UsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLCBBY3Rpb25QYXJhbWV0ZXJzLCBJQWN0aW9uQ29uZmlybWF0aW9uU2VydmljZX0gZnJvbSAnLi4vY29tcG9uZW50cy9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZXZpZXcvbW9kZWxzJztcbmltcG9ydCB7SURhdGFQcm92aWRlciwgSUVkaXRvckRhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtBY3Rpb25EZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yLCBUYWJsZURlc2NyaXB0b3J9IGZyb20gJy4uL2Rlc2NyaXB0b3JzJztcbmltcG9ydCB7QWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcn0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvYWN0aW9uL2FjdGlvbi1jb25maXJtYXRpb24uZGVzY3JpcHRvcic7XG5pbXBvcnQge0FjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSwgQWN0aW9uVHlwZUVudW19IGZyb20gJy4uL2Rlc2NyaXB0b3JzL3R5cGVzJztcbmltcG9ydCB7SVZpZXdDb250YWluZXIsIE1uZ0Vycm9yfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdQYXJhbWV0cml6ZVBpcGV9IGZyb20gJy4uL3BpcGVzJztcbmltcG9ydCB7U3R5bGVTaXplRW51bX0gZnJvbSAnLi4vc3R5bGVzL21vZGVscyc7XG5pbXBvcnQge0kxOG5VdGlscywgTm90aWZpY2F0aW9uVXRpbCwgU3RyaW5nVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtNbmdDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtNbmdFcnJvck1hcHBlclNlcnZpY2V9IGZyb20gJy4vZXJyb3ItbWFwcGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtNbmdOYXZpZ2F0aW9uU2VydmljZX0gZnJvbSAnLi9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtBQ1RJT05fRURJVE9SX0RJQUxPR19DT01QT05FTlRfU0VUVElOR30gZnJvbSAnLi90b2tlbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW5nQWN0aW9uRXhlY3V0b3JTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGRlYnVnID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU2VydmljZTogTW5nQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1uZ05hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVycm9yTWFwcGVyOiBNbmdFcnJvck1hcHBlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGFyYW1ldHJpemU6IE1uZ1BhcmFtZXRyaXplUGlwZSxcbiAgICAgICAgQEluamVjdChBQ1RJT05fRURJVE9SX0RJQUxPR19DT01QT05FTlRfU0VUVElORykgcHJpdmF0ZSBkZWZhdWx0RWRpdG9yRGlhbG9nQ29tcG9uZW50OiBUeXBlPGFueT5cbiAgICApIHtcbiAgICAgICAgLy8gdGhpcy5kZWJ1ZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBTPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4sIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8VD4sIGRhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXI8VCwgUz4pOiBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBTPiB7XG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlciA/PyBhY3Rpb24uZGF0YVByb3ZpZGVyID8/IHBhcmFtZXRlcnMudmlld0NvbnRhaW5lcj8uZ2V0RGF0YVByb3ZpZGVyKCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IG5ldyBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxULCBTPihhY3Rpb24sIHBhcmFtZXRlcnMsIGN0eERhdGFQcm92aWRlciwgdGhpcy5nZXREYXRhUHJvdmlkZXJTZXJ2aWNlKGN0eERhdGFQcm92aWRlcikgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUFjdGlvbkNvbnRleHQ8VCwgUz4oXG4gICAgICAgIGluc3RhbmNlOiBBY3Rpb25JbnN0YW5jZTxULCBTPixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uQ29udGV4dDxULCBTPiB7XG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlciA/PyBpbnN0YW5jZS5hY3Rpb24uZGF0YVByb3ZpZGVyID8/IHBhcmFtZXRlcnMudmlld0NvbnRhaW5lcj8uZ2V0RGF0YVByb3ZpZGVyKCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IG5ldyBBY3Rpb25Db250ZXh0PFQsIFM+KGluc3RhbmNlLCBwYXJhbWV0ZXJzLCAncnVuJywgY3R4RGF0YVByb3ZpZGVyLCB0aGlzLmdldERhdGFQcm92aWRlclNlcnZpY2UoY3R4RGF0YVByb3ZpZGVyKSA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjdHgucHJldmlvdXNBY3Rpb25JbnN0YW5jZSA9IHByZXZpb3VzQWN0aW9uSW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLm5ld0NvbnRleHQoY3R4KTtcbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhY3Rpb24gZXhlYyBjb250ZXh0IGZvciBhY3Rpb24gb2YgdHlwZSBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSBJdGVtIGluc3RhbmNlIChpZiBleGlzdHMpLlxuICAgICAqIEBwYXJhbSBpdGVtSWQgSXRlbSBpZCAoaWYgZXhpc3RzKS5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIERhdGEgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHNvdXJjZUNvbXBvbmVudCBTb3VyY2UgY29tcG9uZW50IGZyb20gd2hlcmUgdGhlIGNvbnRleHQgcHJlcGFyYXRpb24gd2FzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gdmlld0NvbnRhaW5lciBWaWV3IGNvbnRhaW5lci9zZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBhY3Rpb25EYXRhIEFkZGl0aW9uYWwgYWN0aW9uIGRhdGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlQ29udGV4dEZvckVkaXRvcjxULCBTPihcbiAgICAgICAgaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPFQsIFM+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFQ+LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdzdWJtaXQnIHwgJ2ZldGNoJyxcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSUVkaXRvckRhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uQ29udGV4dDxULCBTPiB7XG4gICAgICAgIGNvbnN0IGVkaXRvckFjdGlvbiA9IGluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+O1xuICAgICAgICBsZXQgY3R4RGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICBpZiAoIWN0eERhdGFQcm92aWRlciAmJiBlZGl0b3JBY3Rpb24uZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjdHhEYXRhUHJvdmlkZXIgPSBlZGl0b3JBY3Rpb24uZGF0YVByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4RGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3Q29udGFpbmVyRGF0YVByb3ZpZGVyID0gcGFyYW1ldGVycy52aWV3Q29udGFpbmVyPy5nZXREYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgICAgIGlmICh2aWV3Q29udGFpbmVyRGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgY3R4RGF0YVByb3ZpZGVyID0gdmlld0NvbnRhaW5lckRhdGFQcm92aWRlciBhcyBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIFM+O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0eCA9IG5ldyBBY3Rpb25Db250ZXh0PFQsIFM+KGluc3RhbmNlLCBwYXJhbWV0ZXJzLCBmdW5jdGlvbk5hbWUsIGN0eERhdGFQcm92aWRlciwgdGhpcy5nZXREYXRhUHJvdmlkZXJTZXJ2aWNlKGN0eERhdGFQcm92aWRlcikgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgY3R4LnByZXZpb3VzQWN0aW9uSW5zdGFuY2UgPSBwcmV2aW91c0FjdGlvbkluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5uZXdDb250ZXh0KGN0eCk7XG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhY3Rpb24gY29udGV4dCBieSBzdWJtaXR0aW5nIGV4ZWN1dGlvbiByZXN1bHRzL2Vycm9ycyB0byBjb250ZXh0LCB3YXRjaGluZyBvdmVyIGluc3RhbmNlIHJlc3VsdHMvZXJyb3JzLCBkaXNwbGF5aW5nIG5vdGlmaWNhdGlvbnMsXG4gICAgICogcnVubmluZyBuZXh0L2Vycm9yIGFjdGlvbiBhbmQgdHJpZ2dlcmluZyBkaXNtaXNzIG9mIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBFZGl0b3IgZGF0YSBwcm92aWRlciBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFjdGlvbiBjb250ZXh0IGZvciBzdWJtaXQgKD1ydW4pIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBydW5BY3Rpb25Db250ZXh0PFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgaXNNYWluUnVuRm4gPSBjdHguZnVuY3Rpb25OYW1lID09PSAnc3VibWl0JyB8fCBjdHguZnVuY3Rpb25OYW1lID09PSAncnVuJztcbiAgICAgICAgbGV0IGFjdGlvbkVkaXRvcjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPjtcblxuICAgICAgICBsZXQgZm5PYnM6IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+O1xuICAgICAgICBzd2l0Y2ggKGN0eC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgICAgICAgICAgYWN0aW9uRWRpdG9yID0gY3R4Lmluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uRWRpdG9yLnN1Ym1pdEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihgU3VibWl0IGZ1bmN0aW9uIGZvciBhY3Rpb24gJHthY3Rpb25FZGl0b3IuYWN0aW9uTmFtZUxvbmd9IGNhbm5vdCBiZSBpbnZva2VkLmApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm5PYnMgPSBhY3Rpb25FZGl0b3Iuc3VibWl0RnVuY3Rpb247XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmZXRjaCc6XG4gICAgICAgICAgICAgICAgYWN0aW9uRWRpdG9yID0gY3R4Lmluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+O1xuICAgICAgICAgICAgICAgIGZuT2JzID0gYWN0aW9uRWRpdG9yLmZldGNoRnVuY3Rpb247XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdydW4nOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBmbk9icyA9IGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuRnVuY3Rpb247XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXRPYnMgPSBvZih2b2lkIDApLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbWFpbiBydW4gZnVuY3Rpb24sIGFsc28gc2V0IGxvYWRpbmcgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmlzUnVuTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GZXRjaFN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzdGFydCBjb250ZXh0IGV4ZWN1dGlvbiB0byBtYXJrIGV4ZWN1dGlvbiBsb2FkaW5nXG4gICAgICAgICAgICAgICAgY3R4LmV4ZWN1dGlvblN0YXJ0KCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZm5PYnMoY3R4KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWVyZ2VNYXAocnVuUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzZXQgbmV4dCBzdGF0ZSBkZXBlbmRpbmcgb24gcnVuXG4gICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gaXNNYWluUnVuRm4gPyBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5FbmQgOiBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GZXRjaEVuZDtcbiAgICAgICAgICAgICAgICAvLyBzZXQgZXhlY3V0aW9uIHJlc3VsdFxuICAgICAgICAgICAgICAgIGN0eC5leGVjdXRpb25OZXh0KHJ1blJlc3VsdCwgaXNNYWluUnVuRm4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWFpblJ1bkZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbnN0YW5jZSBmaW5hbCByZXN1bHQgb24gbWFpbiBydW4gZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5yZXN1bHQgPSBydW5SZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5pc1J1bkxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBub3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5pbnN0YW5jZS5hY3Rpb24uaGFzUnVuTm90aWZpY2F0aW9uU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm5vdGlmaWNhdGlvbiA9IE5vdGlmaWNhdGlvblV0aWwuYWN0aW9uTm90aWZpY2F0aW9uU3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgucGFyYW1ldGVycy52aWV3Q29udGFpbmVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgucGFyYW1ldGVycz8uaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBwb3NzaWJsZSBhZnRlciBydW4gYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHguaW5zdGFuY2UuYWN0aW9uLmFmdGVyUnVuQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIG5ldyBzdGF0ZSBmb3IgbmV4dCBhY3Rpb24gc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLk5leHRBY3Rpb25TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRBY3Rpb25JbnN0YW5jZSA9IHRoaXMuYWN0aXZhdGVBY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmFjdGlvbi5hZnRlclJ1bkFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uUGFyYW1ldGVyczx1bmtub3duPihjdHgucGFyYW1ldGVycy5pdGVtSWQsIHJ1blJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBY3Rpb25EYXRhKGN0eC5wYXJhbWV0ZXJzLmFjdGlvbkRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUm91dGUoY3R4LnBhcmFtZXRlcnMucm91dGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU291cmNlQ29tcG9uZW50KGN0eC5wYXJhbWV0ZXJzLnNvdXJjZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhWaWV3Q29udGFpbmVyKGN0eC5wYXJhbWV0ZXJzLnZpZXdDb250YWluZXIgYXMgSVZpZXdDb250YWluZXI8dW5rbm93biwgdW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UgYXMgQWN0aW9uSW5zdGFuY2U8dW5rbm93biwgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UubmV4dEFjdGlvbkluc3RhbmNlID0gbmV4dEFjdGlvbkluc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2ggY3VycmVudCBhY3Rpb24gd2hlbiBuZXh0IGFjdGlvbiBmaW5pc2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRBY3Rpb25JbnN0YW5jZS5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGUgPT4gc3RhdGUgPj0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2VzcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uTmV4dEFjdGlvbkVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1blJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihydW5SZXN1bHQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAocnVuUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVhY3RpdmF0ZSBhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQWN0aW9uKGN0eC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBydW5SZXN1bHQ7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gZXJyb3IgdG8gbW5nIGFjdGlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbkVycm9yID0gdGhpcy50b01uZ0FjdGlvbkVycm9yKGVycik7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgaW5zdGFuY2Ugc3RhdGUgdG8gZXJyb3JcbiAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBpc01haW5SdW5GbiA/IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkVycm9yIDogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmV0Y2hFcnJvcjtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGV4ZWN1dGlvbiBlcnJvciBvbiBjb250ZXh0XG4gICAgICAgICAgICAgICAgY3R4LmV4ZWN1dGlvbkVycm9yKGFjdGlvbkVycm9yKTtcblxuICAgICAgICAgICAgICAgIGxldCBlcnJvck9icyA9IG9mKHZvaWQgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTWFpblJ1bkZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5lcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmlzUnVuTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGVycm9yIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5oYXNSdW5Ob3RpZmljYXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uVXRpbC5hY3Rpb25Ob3RpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnBhcmFtZXRlcnMudmlld0NvbnRhaW5lciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnBhcmFtZXRlcnMuaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBwb3NzaWJsZSBlcnJvciBhY3Rpb24gaWYgcnVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5GbiAmJiBjdHguaW5zdGFuY2UuYWN0aW9uLm9uUnVuRXJyb3JBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBzdGFydCB3aXRoIHRyaWdnZXIsIGJlY2F1c2Ugcm91dGluZyBtaWdodCBiZSBwcm9ibGVtYXRpYyAobG91c2luZyBwcmV2aW91cyByZXN1bHRzIGV0Yy4pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckFjdGlvbkluc3RhbmNlID0gdGhpcy5hY3RpdmF0ZUFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuYWN0aW9uLm9uUnVuRXJyb3JBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvblBhcmFtZXRlcnM8VD4oY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBjdHgucGFyYW1ldGVycy5pdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEFjdGlvbkRhdGEoY3R4LnBhcmFtZXRlcnMuYWN0aW9uRGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhSb3V0ZShjdHgucGFyYW1ldGVycy5yb3V0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTb3VyY2VDb21wb25lbnQoY3R4LnBhcmFtZXRlcnMuc291cmNlQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFZpZXdDb250YWluZXIoY3R4LnBhcmFtZXRlcnMudmlld0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZSA9IGVycm9yQWN0aW9uSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck9icyA9IGVycm9yQWN0aW9uSW5zdGFuY2Uuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlID0+IHN0YXRlID49IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbGlzdGUgYW5kIG1hcCBvbmx5IHRvIG1hcmsgaW5zdGFuY2Ugc3RhdGUgYXMgZmluaXNoZWQgZXJyb3Igc3RhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JPYnMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVBY3Rpb24oY3R4Lmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGhyb3cgZXJyb3IgdG8gcHJvcGFnYXRlIGZ1cmhlclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYWN0aW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0T2JzLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYEFjdGlvbkNvbnRleHQgJHtjdHguY29udGV4dExvbmdOYW1lfSBleGVjdXRpb24gbmV4dCBldmVudGAsIHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYEFjdGlvbkNvbnRleHQgJHtjdHguY29udGV4dExvbmdOYW1lfSBleGVjdXRpb24gZXJyb3IgZXZlbnRgLCBlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJldE9icztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGVkaXRvciBhY3Rpb24ncyBzdWJtaXQgKD1tYWluIHJ1bikgZnVuY3Rpb24gYnkgY3JlYXRpbmcgbmV3IGFjdGlvbiBjb250ZXh0IGZvciBhY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRWRpdG9yIGRhdGEgcHJvdmlkZXIgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIE9wdGlvbmFsIGV4aXN0aW5nIGFjdGlvbiBpbnN0YW5jZSAoaWYgbm9uIHByb3ZpZGVkLCBuZXcgd2lsbCBiZSBjcmVhdGVkKS5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZSBPcHRpb25hbCBwcmV2aW91cyBhY3Rpb24gaW5zdGFuY2UgdG8gbGluayBpbiBuZXh0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBBY3Rpb24gY29udGV4dCBmb3Igc3VibWl0ICg9cnVuKSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcnVuRWRpdG9yU2F2ZTxULCBTPihcbiAgICAgICAgYWN0aW9uOiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFQ+LFxuICAgICAgICBkYXRhUHJvdmlkZXI/OiBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIFM+LFxuICAgICAgICBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPFQsIFM+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8dW5rbm93biwgdW5rbm93bj5cbiAgICApOiBBY3Rpb25Db250ZXh0PFQsIFM+IHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBub24gcHJvdmlkZWRcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjdGlvbkluc3RhbmNlPFQsIFM+KGFjdGlvbiwgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZCwgdGhpcy5kZWJ1Zyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucHJlcGFyZUNvbnRleHRGb3JFZGl0b3IoaW5zdGFuY2UsIHBhcmFtZXRlcnMsICdzdWJtaXQnLCBkYXRhUHJvdmlkZXIsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnJ1bkFjdGlvbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgc2VydmljZSBpbnN0YW5jZSBvZiBkYXRhIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBEYXRhIHByb3ZpZGVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0YVByb3ZpZGVyU2VydmljZTxULCBTPihkYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIFM+KTogUyB8IG51bGwge1xuICAgICAgICBpZiAoZGF0YVByb3ZpZGVyPy5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0PFM+KGRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgZWRpdG9yIGFjdGlvbidzIGZldGNoIGZ1bmN0aW9uIGJ5IGNyZWF0aW5nIG5ldyBhY3Rpb24gY29udGV4dCBmb3IgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIEVkaXRvciBkYXRhIHByb3ZpZGVyIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWN0aW9uIGNvbnRleHQgZm9yIGZldGNoIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBydW5FZGl0b3JGZXRjaDxULCBTPihcbiAgICAgICAgYWN0aW9uOiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFQ+LFxuICAgICAgICBkYXRhUHJvdmlkZXI/OiBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIFM+LFxuICAgICAgICBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPFQsIFM+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8dW5rbm93biwgdW5rbm93bj5cbiAgICApOiBBY3Rpb25Db250ZXh0PFQsIFM+IHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBub24gcHJvdmlkZWRcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjdGlvbkluc3RhbmNlPFQsIFM+KGFjdGlvbiwgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZCwgdGhpcy5kZWJ1Zyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucHJlcGFyZUNvbnRleHRGb3JFZGl0b3IoaW5zdGFuY2UsIHBhcmFtZXRlcnMsICdmZXRjaCcsIGRhdGFQcm92aWRlciwgcHJldmlvdXNBY3Rpb25JbnN0YW5jZSk7XG4gICAgICAgIHRoaXMucnVuQWN0aW9uQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhY3Rpb24ncyBtYWluIHJ1biBmdW5jdGlvbiBieSBjcmVhdGluZyBuZXcgYWN0aW9uIGNvbnRleHQgZm9yIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQgcnVuLlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRGF0YSBwcm92aWRlciBmb3IgY29udGV4dCBydW4uXG4gICAgICogQHBhcmFtIGluc3RhbmNlIE9wdGlvbmFsIGV4aXN0aW5nIGFjdGlvbiBpbnN0YW5jZSAoaWYgbm9uIHByb3ZpZGVkLCBuZXcgd2lsbCBiZSBjcmVhdGVkKS5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZSBPcHRpb25hbCBwcmV2aW91cyBhY3Rpb24gaW5zdGFuY2UgdG8gbGluayBpbiBuZXh0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBBY3Rpb24gY29udGV4dCBmb3IgcnVuIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBydW5BY3Rpb248VCwgUz4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uQ29udGV4dDxULCBTPiB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbm9uIHByb3ZpZGVkXG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpb25JbnN0YW5jZTxULCBTPihhY3Rpb24sIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQsIHRoaXMuZGVidWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnByZXBhcmVBY3Rpb25Db250ZXh0KGluc3RhbmNlLCBwYXJhbWV0ZXJzLCBkYXRhUHJvdmlkZXIsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgICAgICBpZiAoYWN0aW9uLmhhc1J1bkNvbmZpcm1hdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29tcG9uZW50ID0gcGFyYW1ldGVycz8uc291cmNlQ29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWF0aW9uRGVzY3JpcHRvciA9IGFjdGlvbi5ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yIGFzIEFjdGlvbkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I8VD47XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50Py5nZXRDb25maXJtYXRpb25TZXJ2aWNlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBzb3VyY2VDb21wb25lbnQ/LmdldENvbmZpcm1hdGlvblNlcnZpY2VJbnN0YW5jZUtleSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIGNvbXBvbmVudCAke3NvdXJjZUNvbXBvbmVudH0gc2hvdWxkIGJlIGltcGxlbWVudGluZyBJQ29uZmlybWF0aW9uU2VydmljZSBpbnRlcmZhY2UgdG8gYmUgYWJsZSB0byBwcm92aWRlIGNvbmZpcm1hdGlvbiBmdW5jdGlvbmFsaXR5LmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcGFyYW1ldGVycy5pdGVtO1xuXG4gICAgICAgICAgICBjb25zdCBzcmNDb25maXJtQ29tcG9uZW50ID0gc291cmNlQ29tcG9uZW50IGFzIElBY3Rpb25Db25maXJtYXRpb25TZXJ2aWNlO1xuICAgICAgICAgICAgbGV0IGNvbmZpcm1QYXJhbXM6IENvbmZpcm1hdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBrZXk6IHNyY0NvbmZpcm1Db21wb25lbnQuZ2V0Q29uZmlybWF0aW9uU2VydmljZUluc3RhbmNlS2V5KGFjdGlvbiksXG4gICAgICAgICAgICAgICAgaWNvbjogY29uZmlybWF0aW9uRGVzY3JpcHRvci5pY29uLFxuICAgICAgICAgICAgICAgIGFjY2VwdFZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWNjZXB0SWNvbjogY29uZmlybWF0aW9uRGVzY3JpcHRvci5hY2NlcHRCdXR0b24uaWNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uU3R5bGVDbGFzczogY29uZmlybWF0aW9uRGVzY3JpcHRvci5hY2NlcHRCdXR0b24uc3R5bGVDbGFzcy5idWlsZCgpLFxuICAgICAgICAgICAgICAgIHJlamVjdFZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVqZWN0SWNvbjogY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/Lmljb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlamVjdEJ1dHRvblN0eWxlQ2xhc3M6IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5zdHlsZUNsYXNzLmJ1aWxkKCksXG4gICAgICAgICAgICAgICAgY2xvc2VPbkVzY2FwZTogY29uZmlybWF0aW9uRGVzY3JpcHRvci5jbG9zZU9uRXNjYXBlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uRGVzY3JpcHRvci50aXRsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMuaGVhZGVyID0gSTE4blV0aWxzLkFjdGlvbi5nZXQodGhpcy50cmFuc2xhdGUsIGFjdGlvbiwgJ2NvbmZpcm0udGl0bGUnLCBjb25maXJtYXRpb25EZXNjcmlwdG9yLnRpdGxlLCBpdGVtLCAnZ2VuZXJhbC5jb25maXJtYXRpb24nKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLm1lc3NhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maXJtUGFyYW1zLm1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBJMThuVXRpbHMuQWN0aW9uLmdldCh0aGlzLnRyYW5zbGF0ZSwgYWN0aW9uLCAnY29uZmlybS5tZXNzYWdlJywgY29uZmlybWF0aW9uRGVzY3JpcHRvci5tZXNzYWdlLCBTdHJpbmdVdGlsLmVzY2FwZUh0bWxBbnkoaXRlbSksICdnZW5lcmFsLmNvbmZpcm1hdGlvbicpID8/XG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLmxhYmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5hY2NlcHRMYWJlbCA9XG4gICAgICAgICAgICAgICAgICAgIEkxOG5VdGlscy5BY3Rpb24uZ2V0KHRoaXMudHJhbnNsYXRlLCBhY3Rpb24sICdjb25maXJtLmFjY2VwdCcsIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLmxhYmVsLCBpdGVtLCAnZ2VuZXJhbC55ZXMnKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLmFjY2VwdEJ1dHRvbi5pY29uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5hY2NlcHRJY29uID0gY29uZmlybWF0aW9uRGVzY3JpcHRvci5hY2NlcHRCdXR0b24uaWNvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5pY29uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5yZWplY3RJY29uID0gY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/Lmljb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8ubGFiZWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maXJtUGFyYW1zLnJlamVjdExhYmVsID1cbiAgICAgICAgICAgICAgICAgICAgSTE4blV0aWxzLkFjdGlvbi5nZXQodGhpcy50cmFuc2xhdGUsIGFjdGlvbiwgJ2NvbmZpcm0ucmVqZWN0JywgY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/LmxhYmVsLCBpdGVtLCAnZ2VuZXJhbC5ubycpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uID09IG51bGwgfHwgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uLmxhYmVsID09PSBudWxsICYmIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uLmljb24gPT09IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5yZWplY3RWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMuYWNjZXB0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlIS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkNvbmZpcm1hdGlvbkVuZEFjY2VwdDtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bkFjdGlvbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25maXJtUGFyYW1zLnJlamVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSEuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5Db25maXJtYXRpb25FbmRSZWplY3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQWN0aW9uKGluc3RhbmNlISk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5ydW5Db25maXJtYXRpb25Db25maWdNYXBGbikge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMgPSBjb25maXJtYXRpb25EZXNjcmlwdG9yLnJ1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuKGNvbnRleHQsIGNvbmZpcm1QYXJhbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250ZXh0LmNvbmZpcm1hdGlvbiA9IGNvbmZpcm1QYXJhbXM7XG4gICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkNvbmZpcm1hdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICBzcmNDb25maXJtQ29tcG9uZW50LmdldENvbmZpcm1hdGlvblNlcnZpY2UoKS5jb25maXJtKGNvbmZpcm1QYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ydW5BY3Rpb25Db250ZXh0KGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyBhY3Rpb24gKGluIGNhc2Ugb2YgZGlhbG9nLCBkaWFsb2cgd2lsbCBiZSBvcGVuZWQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgYWN0aXZhdGlvbiBvZiBhY3Rpb24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIE9wdGlvbmFsIGV4aXN0aW5nIGFjdGlvbiBpbnN0YW5jZSAoaWYgbm9uIHByb3ZpZGVkLCBuZXcgd2lsbCBiZSBjcmVhdGVkKS5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZSBPcHRpb25hbCBwcmV2aW91cyBhY3Rpb24gaW5zdGFuY2UgdG8gbGluayBpbiBuZXh0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiBBY3Rpb24gaW5zdGFuY2UgLSBpZiBub24gcHJvdmlkZWQgaW4gcGFyYW1ldGVycywgdGhlIG5ld2x5IGNyZWF0ZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aXZhdGVBY3Rpb248VCwgUz4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uSW5zdGFuY2U8VCwgUz4ge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5vbiBwcm92aWRlZFxuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aW9uSW5zdGFuY2U8VCwgUz4oYWN0aW9uLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uU3RhcnQsIHRoaXMuZGVidWcpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmFjdGl2YXRpb25QYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgLy8gc3RhcnQgYWN0aXZhdGlvbiBpbnN0YW5jZVxuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25TdGFydDtcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlRW51bS5FZGl0b3IpIHtcbiAgICAgICAgICAgIGxldCBkaWFsb2dDb21wb25lbnQgPSB0aGlzLmRlZmF1bHRFZGl0b3JEaWFsb2dDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dDbGFzc05hbWVzID0gWydtbmctZGlhbG9nJ107XG4gICAgICAgICAgICBpZiAoYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uRWRpdG9yRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaChhY3Rpb24uZGlhbG9nQ2xhc3NOYW1lID8/ICdtbmctYWN0aW9uLWVkaXRvci1kaWFsb2cnKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5kaWFsb2dTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5FeHRyYVNtYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXhzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLlNtYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXNtJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLkxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLWxnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLkV4dHJhTGFyZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dDbGFzc05hbWVzLnB1c2goJ21uZy1kaWFsb2cteGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0eWxlU2l6ZUVudW0uTm9ybWFsOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudCA9IGFjdGlvbi5lZGl0b3JDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlhbG9nQ29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGRpYWxvZ0NsYXNzTmFtZXMuam9pbignICcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGlhbG9nQ29uZmlnLmRhdGEuYWN0aW9uSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5kYXRhLnByZXZpb3VzQWN0aW9uSW5zdGFuY2UgPSBwcmV2aW91c0FjdGlvbkluc3RhbmNlO1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZGlhbG9nQ29tcG9uZW50LCBkaWFsb2dDb25maWcpO1xuICAgICAgICAgICAgZGlhbG9nUmVmLm9uQ2xvc2UucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUFjdGlvbihpbnN0YW5jZSEsIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnN0YW5jZS5hY3RpdmF0aW9uRGlhbG9nUmVmID0gZGlhbG9nUmVmO1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlyZWN0bHkgZXhlY3V0ZSBhY3Rpb25cbiAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnJ1bkFjdGlvbjxULCBTPihhY3Rpb24sIHBhcmFtZXRlcnMsIHVuZGVmaW5lZCwgaW5zdGFuY2UsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWFjdGl2YXRlcyBhY3Rpb24gYnkgY2hvb3NpbmcgZmluYWwgc3RhdGUsIGNsb3NpbmcgZGlhbG9nIGFuZCBjb21wbGV0aW5nIGFsbCBzdWJqZWN0cyBpbiBpbnN0YW5jZSBhbmQgY29udGV4dHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBmcm9tRGlhbG9nTGlzdGVuZXIgRGVhY3RpdmF0aW9uIGNhbGxlZCBmcm9tIGRpYWxvZyBsaXN0ZW5lciwgaW4gdGhpcyBjYXNlIGRlYWN0aXZhdGlvbiBoYXBwZW5zIG9ubHkgaWYgdHJ1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVhY3RpdmF0ZUFjdGlvbjxULCBTPihpbnN0YW5jZTogQWN0aW9uSW5zdGFuY2U8VCwgUz4sIGZyb21EaWFsb2dMaXN0ZW5lciA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghZnJvbURpYWxvZ0xpc3RlbmVyICYmIGluc3RhbmNlLnN0YXRlID49IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgQWN0aW9uSW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSBhbHJlYWR5IGZpbmlzaGVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmluYWxTdGF0ZTogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW07XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UucmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxTdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3M7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLmVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxTdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaEVycm9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxTdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaERpc21pc3NlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNEaWFsb2cgPSB0eXBlb2YgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBpZiAoaGFzRGlhbG9nICYmICFmcm9tRGlhbG9nTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0ZSA9PT0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdGF0ZSBpcyBmaW5pc2ggYW5kIG5vdCBjYWxsZWQgZnJvbSBkaWFsb2cgbGlzdGVuZXIsIGNsb3NlIHRoZSBkaWFsb2cgZmlyc3Qgd2hpY2ggd2lsbCByZXRyaWdnZXIgdGhpcyBmdW5jdGlvbiwgdGhlbiBmaW5pc2ggaXRcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiEuY2xvc2UoaW5zdGFuY2UucmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgYW5kIGRpc21pc3NlZCBtdXN0IGJvdGggaGF2ZSBmcm9tRGlhbG9nTGlzdGVuZXIgdG8gYmUgYWJsZSB0byBmaW5pc2hcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgZmluYWwgc3RhdGUgb24gaW5zdGFuY2VcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBmaW5hbFN0YXRlO1xuICAgICAgICAvLyBjb21wbGV0ZSBhbGwgc3ViamVjdHNcbiAgICAgICAgaW5zdGFuY2UuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYWN0aW9uIGZyb20gdGFibGUgcm93IGNsaWNrIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGFyZ2V0IHRhYmxlIGNsaWNrIGV2ZW50LlxuICAgICAqIEBwYXJhbSByb3V0ZSBDdXJyZW50bHkgYWN0aXZhdGUgcm91dGUuXG4gICAgICogQHBhcmFtIHRhYmxlRGVzY3JpcHRvciBUYWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBkYXRhS2V5UHJvcGVydHkgRGF0YSBrZXkgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJSb3dDbGlja0FjdGlvbjxUPihcbiAgICAgICAgYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFQ+LFxuICAgICAgICBldmVudDogTW5nVGFibGVDZWxsQ2xpY2tFdmVudDxUPixcbiAgICAgICAgcm91dGU/OiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgdGFibGVEZXNjcmlwdG9yPzogVGFibGVEZXNjcmlwdG9yPFQ+LFxuICAgICAgICBkYXRhS2V5UHJvcGVydHk/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgY29uc3QgaWRQcm9wZXJ0eSA9IGRhdGFLZXlQcm9wZXJ0eSA/PyB0YWJsZURlc2NyaXB0b3I/LmRhdGFLZXlQcm9wZXJ0eSA/PyBhY3Rpb24/Lm1vZGVsPy5pZFByb3BlcnR5TmFtZSA/PyBkYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGlmICghaWRQcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3cgY2xpY2sgYWN0aW9uICR7YWN0aW9uLmFjdGlvbk5hbWVMb25nfSBjYW4gbm90IGJlIHRyaWdnZXJlZCwgYmVjYXVzZSBpZCBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93SXRlbSA9IGV2ZW50Py5yb3dJdGVtIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlckFjdGlvbihhY3Rpb24sIG5ldyBBY3Rpb25QYXJhbWV0ZXJzPFQ+KHJvd0l0ZW1baWRQcm9wZXJ0eV0sIGV2ZW50LnJvd0l0ZW0pLndpdGhSb3V0ZShyb3V0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGFjdGlvbiB3aXRoIHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBhY3Rpb24gZXhlY3V0aW9uIHRvIGNvbnN0cnVjdCBuZXcgcm91dGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFjdGlvbiBpbnN0YW5jZSAtIGlmIG5vbiBwcm92aWRlZCBpbiBwYXJhbWV0ZXJzLCB0aGUgbmV3bHkgY3JlYXRlZCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB0cmlnZ2VyQWN0aW9uPFQsIFM+KGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPiwgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPik6IEFjdGlvbkluc3RhbmNlPFQsIFM+IHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWN0aW9uSW5zdGFuY2U8VCwgUz4oYWN0aW9uLCB1bmRlZmluZWQsIHRoaXMuZGVidWcpO1xuICAgICAgICBpbnN0YW5jZS50cmlnZ2VyUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChhY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgPT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmw6IFVybFRyZWUgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgbGV0IGFjdGlvblVybCA9IGFjdGlvbi5yb3V0ZVVybCA/PyAnJztcbiAgICAgICAgICAgIC8vIFRPRE86IGRvbnQgc3RyaXAgJy8nLCBidXQgdXNlIGl0IGFjY29yZGluZ2x5IHdpdGggQW5ndWxhcidzIHJvdXRlciBwYXR0ZXJucyAoLywgLi8sIC4uLylcbiAgICAgICAgICAgIGlmIChhY3Rpb25Vcmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsID0gYWN0aW9uVXJsLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uVXJsU2VnbWVudHMgPSB0aGlzLnBhcmFtZXRyaXplLnRyYW5zZm9ybShhY3Rpb25VcmwsIHBhcmFtZXRlcnMuaXRlbUlkLCBwYXJhbWV0ZXJzLml0ZW0sIHBhcmFtZXRlcnMuYWN0aW9uRGF0YSkuc3BsaXQoJy8nKTtcblxuICAgICAgICAgICAgaW5zdGFuY2UudHJpZ2dlclJvdXRlTmF2aWdhdGlvbiA9IGZyb20odGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Jhc2VVcmwsIC4uLmFjdGlvblVybFNlZ21lbnRzXSwge3JlbGF0aXZlVG86IHBhcmFtZXRlcnMucm91dGUsIHF1ZXJ5UGFyYW1zOiBwYXJzZWRVcmwucXVlcnlQYXJhbXN9KSk7XG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uVHJpZ2dlckVuZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlQWN0aW9uKGFjdGlvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWFjdGl2YXRlcyBvbiByb3V0ZSB0cmlnZ2VyZWQgYWN0aW9uIGJ5IHRyeWluZyB0byByZXJvdXRlIGJhY2sgdG8gbG9jYXRpb24gd2hlcmUgYWN0aW9uIHdhcyB0cmlnZ2VyZWQuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVhY3RpdmF0ZU9uUm91dGVUcmlnZ2VyZWRBY3Rpb248VCwgUz4oaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPFQsIFM+KSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgIT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9yIG5vdywgZGVhY3RpdmF0aW9uIGFsd2F5cyBtZWFucyBnb2luZyBiYWNrIHRvIHRhYmxldmlldyByb290XG4gICAgICAgIC8vIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldFByZXZpb3VzTG9jYXRpb24oKSkge1xuICAgICAgICAvLyAgICAgLy8gdGhlcmUgYXJlIGludGVybmFsIGhpc3RvcnkgcmVjb3Jkcywgc28gYmFjayBjYW4gYmUgbm9ybWFsbHkgY2FsbGVkXG4gICAgICAgIC8vICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmJhY2soKTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIC8vIHRoZXJlIGlzIG5vIGludGVybmFsIGhpc3RvcnkgcmVjb3JkcywgZmlndXJlIG91dCB0aGUgYmFzZSB1cmwgYnkgZWxpbWluYXRpbmcgYWN0aW9uIHNwZWNpZmljIHVybFxuICAgICAgICBsZXQgdXJsID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgICAgLy8gbGV0IHByZXZpb3VzVXJsID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRQcmV2aW91c0xvY2F0aW9uKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHVybCwgcHJldmlvdXNVcmwpO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5iYWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cmxQYXRoU2VnbWVudHMgPSB1cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBsZXQgYWN0aW9uVXJsID0gaW5zdGFuY2UuYWN0aW9uPy5yb3V0ZVVybCA/PyAnJztcbiAgICAgICAgICAgIGlmIChhY3Rpb25Vcmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsID0gYWN0aW9uVXJsLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjdGlvblVybFNlZ21lbnRzID0gYWN0aW9uVXJsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdFVybCA9ICcvJyArIHVybFBhdGhTZWdtZW50cy5zbGljZSgwLCB1cmxQYXRoU2VnbWVudHMubGVuZ3RoIC0gYWN0aW9uVXJsU2VnbWVudHMubGVuZ3RoKS5qb2luKCcvJyk7XG4gICAgICAgICAgICAvLyBjb25zdCByZXBsYWNlVXJsID0gcHJldmlvdXNVcmwgIT09IG51bGwgJiYgcHJldmlvdXNVcmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdID09PSByZWRpcmVjdFVybDtcbiAgICAgICAgICAgIC8vIE5vIFVSTCByZXBsYWNlcywgcHJvYmFibHkgb2ssIHRvIGFsbG93IGdvaW5nIGJhY2tcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocmVkaXJlY3RVcmwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gZXJyb3Igb2YgYW55IHR5cGUgdG8gbW5nIGVycm9yIGJ5IHVzaW5nIGVycm9yIG1hcHBlciB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIGJ5IGZpbmFsIHByb2plY3QuXG4gICAgICogQHBhcmFtIGVycm9yIGVycm9yIG9mIGFueSB0eXBlLlxuICAgICAqXG4gICAgICogQHJldHVybiBtYXBwZWQgTW5nRXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIHRvTW5nQWN0aW9uRXJyb3IoZXJyb3I/OiBhbnkpOiBNbmdFcnJvciB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkVycm9yOiBNbmdFcnJvciA9IHtcbiAgICAgICAgICAgIG5hbWU6IGVycm9yPy5uYW1lID8/ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgPz8gJ1Vua25vd24gZXJyb3InLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBhY3Rpb25FcnJvci5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICAgICAgICBhY3Rpb25FcnJvci5zdGF0dXNEZXNjcmlwdGlvbiA9IGVycm9yLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICBhY3Rpb25FcnJvci51cmwgPSBlcnJvci51cmwgPz8gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yTWFwcGVyLnRvTW5nRXJyb3IoZXJyb3IsIGFjdGlvbkVycm9yKTtcbiAgICB9XG59XG4iXX0=
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWV4ZWN1dG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2FjdGlvbi1leGVjdXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQU1qRSxPQUFPLEVBQWEsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFDLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQTZCLE1BQU0sNkJBQTZCLENBQUM7QUFHMUssT0FBTyxFQUFtQixzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRy9FLE9BQU8sRUFBQywyQkFBMkIsRUFBRSxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUdqRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFJakUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7O0FBS2hFLE1BQU0sT0FBTyx3QkFBd0I7SUFHakMsWUFDWSxRQUFrQixFQUNsQixNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLFNBQTJCLEVBQzNCLG9CQUE2QyxFQUM3QyxpQkFBdUMsRUFDdkMsV0FBa0MsRUFDbEMsV0FBK0IsRUFDaUIs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QVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7O3FIQXRvQlEsd0JBQXdCLGtUQWFyQixzQ0FBc0M7eUhBYnpDLHdCQUF3QixjQUZyQixNQUFNOzJGQUVULHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQWNRLE1BQU07MkJBQUMsc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlciwgVXJsVHJlZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Q29uZmlybWF0aW9uLCBDb25maXJtYXRpb25TZXJ2aWNlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0RpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb25maWd9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQge09ic2VydmFibGUsIGZyb20sIG1lcmdlTWFwLCBvZiwgc3dpdGNoTWFwLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZmlsdGVyLCBmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7QWN0aW9uQ29udGV4dCwgQWN0aW9uQ29udGV4dFZhbGlkYXRpb24sIEFjdGlvbkluc3RhbmNlLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bSwgQWN0aW9uUGFyYW1ldGVycywgSUFjdGlvbkNvbmZpcm1hdGlvblNlcnZpY2V9IGZyb20gJy4uL2NvbXBvbmVudHMvYWN0aW9uL21vZGVscyc7XG5pbXBvcnQge01uZ1RhYmxlQ2VsbENsaWNrRXZlbnR9IGZyb20gJy4uL2NvbXBvbmVudHMvdGFibGV2aWV3L21vZGVscyc7XG5pbXBvcnQge0lEYXRhUHJvdmlkZXIsIElFZGl0b3JEYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7QWN0aW9uRGVzY3JpcHRvciwgQWN0aW9uRWRpdG9yRGVzY3JpcHRvcn0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvYWN0aW9uJztcbmltcG9ydCB7QWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcn0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvYWN0aW9uL2FjdGlvbi1jb25maXJtYXRpb24uZGVzY3JpcHRvcic7XG5pbXBvcnQge1RhYmxlRGVzY3JpcHRvcn0gZnJvbSAnLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0sIEFjdGlvblR5cGVFbnVtfSBmcm9tICcuLi9kZXNjcmlwdG9ycy90eXBlcyc7XG5pbXBvcnQge0lWaWV3Q29udGFpbmVyLCBNbmdFcnJvcn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nUGFyYW1ldHJpemVQaXBlfSBmcm9tICcuLi9waXBlcyc7XG5pbXBvcnQge1N0eWxlU2l6ZUVudW19IGZyb20gJy4uL3N0eWxlcy9tb2RlbHMnO1xuaW1wb3J0IHtJMThuVXRpbHMsIE5vdGlmaWNhdGlvblV0aWwsIFN0cmluZ1V0aWx9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7TW5nQ29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7TW5nRXJyb3JNYXBwZXJTZXJ2aWNlfSBmcm9tICcuL2Vycm9yLW1hcHBlci5zZXJ2aWNlJztcbmltcG9ydCB7TW5nTmF2aWdhdGlvblNlcnZpY2V9IGZyb20gJy4vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7QUNUSU9OX0VESVRPUl9ESUFMT0dfQ09NUE9ORU5UX1NFVFRJTkd9IGZyb20gJy4vdG9rZW5zJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZGVidWcgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBNbmdDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTW5nTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXJyb3JNYXBwZXI6IE1uZ0Vycm9yTWFwcGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwYXJhbWV0cml6ZTogTW5nUGFyYW1ldHJpemVQaXBlLFxuICAgICAgICBASW5qZWN0KEFDVElPTl9FRElUT1JfRElBTE9HX0NPTVBPTkVOVF9TRVRUSU5HKSBwcml2YXRlIGRlZmF1bHRFZGl0b3JEaWFsb2dDb21wb25lbnQ6IFR5cGU8YW55PlxuICAgICkge1xuICAgICAgICAvLyB0aGlzLmRlYnVnID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIFM+KGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPiwgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPiwgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxULCBTPik6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIFM+IHtcbiAgICAgICAgY29uc3QgY3R4RGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyID8/IGFjdGlvbi5kYXRhUHJvdmlkZXIgPz8gcGFyYW1ldGVycy52aWV3Q29udGFpbmVyPy5nZXREYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIFM+KGFjdGlvbiwgcGFyYW1ldGVycywgY3R4RGF0YVByb3ZpZGVyLCB0aGlzLmdldERhdGFQcm92aWRlclNlcnZpY2UoY3R4RGF0YVByb3ZpZGVyKSA/PyB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gY3R4O1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlQWN0aW9uQ29udGV4dDxULCBTPihcbiAgICAgICAgaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPFQsIFM+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFQ+LFxuICAgICAgICBkYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIFM+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8dW5rbm93biwgdW5rbm93bj5cbiAgICApOiBBY3Rpb25Db250ZXh0PFQsIFM+IHtcbiAgICAgICAgY29uc3QgY3R4RGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyID8/IGluc3RhbmNlLmFjdGlvbi5kYXRhUHJvdmlkZXIgPz8gcGFyYW1ldGVycy52aWV3Q29udGFpbmVyPy5nZXREYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IEFjdGlvbkNvbnRleHQ8VCwgUz4oaW5zdGFuY2UsIHBhcmFtZXRlcnMsICdydW4nLCBjdHhEYXRhUHJvdmlkZXIsIHRoaXMuZ2V0RGF0YVByb3ZpZGVyU2VydmljZShjdHhEYXRhUHJvdmlkZXIpID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGN0eC5wcmV2aW91c0FjdGlvbkluc3RhbmNlID0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZTtcbiAgICAgICAgaW5zdGFuY2UubmV3Q29udGV4dChjdHgpO1xuICAgICAgICByZXR1cm4gY3R4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFjdGlvbiBleGVjIGNvbnRleHQgZm9yIGFjdGlvbiBvZiB0eXBlIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIEl0ZW0gaW5zdGFuY2UgKGlmIGV4aXN0cykuXG4gICAgICogQHBhcmFtIGl0ZW1JZCBJdGVtIGlkIChpZiBleGlzdHMpLlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRGF0YSBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gc291cmNlQ29tcG9uZW50IFNvdXJjZSBjb21wb25lbnQgZnJvbSB3aGVyZSB0aGUgY29udGV4dCBwcmVwYXJhdGlvbiB3YXMgY2FsbGVkLlxuICAgICAqIEBwYXJhbSB2aWV3Q29udGFpbmVyIFZpZXcgY29udGFpbmVyL3NlcnZpY2UuXG4gICAgICogQHBhcmFtIGFjdGlvbkRhdGEgQWRkaXRpb25hbCBhY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVDb250ZXh0Rm9yRWRpdG9yPFQsIFM+KFxuICAgICAgICBpbnN0YW5jZTogQWN0aW9uSW5zdGFuY2U8VCwgUz4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8VD4sXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogJ3N1Ym1pdCcgfCAnZmV0Y2gnLFxuICAgICAgICBkYXRhUHJvdmlkZXI/OiBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIFM+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8dW5rbm93biwgdW5rbm93bj5cbiAgICApOiBBY3Rpb25Db250ZXh0PFQsIFM+IHtcbiAgICAgICAgY29uc3QgZWRpdG9yQWN0aW9uID0gaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgICAgIGxldCBjdHhEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIGlmICghY3R4RGF0YVByb3ZpZGVyICYmIGVkaXRvckFjdGlvbi5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGN0eERhdGFQcm92aWRlciA9IGVkaXRvckFjdGlvbi5kYXRhUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdHhEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdDb250YWluZXJEYXRhUHJvdmlkZXIgPSBwYXJhbWV0ZXJzLnZpZXdDb250YWluZXI/LmdldERhdGFQcm92aWRlcigpO1xuICAgICAgICAgICAgaWYgKHZpZXdDb250YWluZXJEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBjdHhEYXRhUHJvdmlkZXIgPSB2aWV3Q29udGFpbmVyRGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgUz47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IEFjdGlvbkNvbnRleHQ8VCwgUz4oaW5zdGFuY2UsIHBhcmFtZXRlcnMsIGZ1bmN0aW9uTmFtZSwgY3R4RGF0YVByb3ZpZGVyLCB0aGlzLmdldERhdGFQcm92aWRlclNlcnZpY2UoY3R4RGF0YVByb3ZpZGVyKSA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjdHgucHJldmlvdXNBY3Rpb25JbnN0YW5jZSA9IHByZXZpb3VzQWN0aW9uSW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLm5ld0NvbnRleHQoY3R4KTtcbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGFjdGlvbiBjb250ZXh0IGJ5IHN1Ym1pdHRpbmcgZXhlY3V0aW9uIHJlc3VsdHMvZXJyb3JzIHRvIGNvbnRleHQsIHdhdGNoaW5nIG92ZXIgaW5zdGFuY2UgcmVzdWx0cy9lcnJvcnMsIGRpc3BsYXlpbmcgbm90aWZpY2F0aW9ucyxcbiAgICAgKiBydW5uaW5nIG5leHQvZXJyb3IgYWN0aW9uIGFuZCB0cmlnZ2VyaW5nIGRpc21pc3Mgb2YgYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIEVkaXRvciBkYXRhIHByb3ZpZGVyIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWN0aW9uIGNvbnRleHQgZm9yIHN1Ym1pdCAoPXJ1bikgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHJ1bkFjdGlvbkNvbnRleHQ8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBpc01haW5SdW5GbiA9IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdzdWJtaXQnIHx8IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdydW4nO1xuICAgICAgICBsZXQgYWN0aW9uRWRpdG9yOiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+O1xuXG4gICAgICAgIGxldCBmbk9iczogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD47XG4gICAgICAgIHN3aXRjaCAoY3R4LmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgICAgICAgICBhY3Rpb25FZGl0b3IgPSBjdHguaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25FZGl0b3Iuc3VibWl0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBTdWJtaXQgZnVuY3Rpb24gZm9yIGFjdGlvbiAke2FjdGlvbkVkaXRvci5hY3Rpb25OYW1lTG9uZ30gY2Fubm90IGJlIGludm9rZWQuYCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbk9icyA9IGFjdGlvbkVkaXRvci5zdWJtaXRGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ZldGNoJzpcbiAgICAgICAgICAgICAgICBhY3Rpb25FZGl0b3IgPSBjdHguaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD47XG4gICAgICAgICAgICAgICAgZm5PYnMgPSBhY3Rpb25FZGl0b3IuZmV0Y2hGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3J1bic6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGZuT2JzID0gY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5GdW5jdGlvbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldE9icyA9IG9mKHZvaWQgMCkucGlwZShcbiAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBtYWluIHJ1biBmdW5jdGlvbiwgYWxzbyBzZXQgbG9hZGluZyB0byB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1blN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuaXNSdW5Mb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoU3RhcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNvbnRleHQgZXhlY3V0aW9uIHRvIG1hcmsgZXhlY3V0aW9uIGxvYWRpbmdcbiAgICAgICAgICAgICAgICBjdHguZXhlY3V0aW9uU3RhcnQoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmbk9icyhjdHgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZXJnZU1hcChydW5SZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHNldCBuZXh0IHN0YXRlIGRlcGVuZGluZyBvbiBydW5cbiAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBpc01haW5SdW5GbiA/IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkVuZCA6IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoRW5kO1xuICAgICAgICAgICAgICAgIC8vIHNldCBleGVjdXRpb24gcmVzdWx0XG4gICAgICAgICAgICAgICAgY3R4LmV4ZWN1dGlvbk5leHQocnVuUmVzdWx0LCBpc01haW5SdW5Gbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluc3RhbmNlIGZpbmFsIHJlc3VsdCBvbiBtYWluIHJ1biBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnJlc3VsdCA9IHJ1blJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmlzUnVuTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uVXRpbC5hY3Rpb25Ob3RpZmljYXRpb25TdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5hY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5wYXJhbWV0ZXJzLnZpZXdDb250YWluZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LnBhcmFtZXRlcnM/Lml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJ1blJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcG9zc2libGUgYWZ0ZXIgcnVuIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5hZnRlclJ1bkFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBuZXcgc3RhdGUgZm9yIG5leHQgYWN0aW9uIHN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5OZXh0QWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0QWN0aW9uSW5zdGFuY2UgPSB0aGlzLmFjdGl2YXRlQWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5hY3Rpb24uYWZ0ZXJSdW5BY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvblBhcmFtZXRlcnM8dW5rbm93bj4oY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBydW5SZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQWN0aW9uRGF0YShjdHgucGFyYW1ldGVycy5hY3Rpb25EYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJvdXRlKGN0eC5wYXJhbWV0ZXJzLnJvdXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUNvbXBvbmVudChjdHgucGFyYW1ldGVycy5zb3VyY2VDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoVmlld0NvbnRhaW5lcihjdHgucGFyYW1ldGVycy52aWV3Q29udGFpbmVyIGFzIElWaWV3Q29udGFpbmVyPHVua25vd24sIHVua25vd24+KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlIGFzIEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLm5leHRBY3Rpb25JbnN0YW5jZSA9IG5leHRBY3Rpb25JbnN0YW5jZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoIGN1cnJlbnQgYWN0aW9uIHdoZW4gbmV4dCBhY3Rpb24gZmluaXNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0QWN0aW9uSW5zdGFuY2Uuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHN0YXRlID0+IHN0YXRlID49IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLk5leHRBY3Rpb25FbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydW5SZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YocnVuUmVzdWx0KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJ1blJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTWFpblJ1bkZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUFjdGlvbihjdHguaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuUmVzdWx0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtIGVycm9yIHRvIG1uZyBhY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25FcnJvciA9IHRoaXMudG9NbmdBY3Rpb25FcnJvcihlcnIpO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluc3RhbmNlIHN0YXRlIHRvIGVycm9yXG4gICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gaXNNYWluUnVuRm4gPyBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5FcnJvciA6IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoRXJyb3I7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBleGVjdXRpb24gZXJyb3Igb24gY29udGV4dFxuICAgICAgICAgICAgICAgIGN0eC5leGVjdXRpb25FcnJvcihhY3Rpb25FcnJvcik7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JPYnMgPSBvZih2b2lkIDApO1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5pc1J1bkxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlcnJvciBub3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5pbnN0YW5jZS5hY3Rpb24uaGFzUnVuTm90aWZpY2F0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkVycm9yLm5vdGlmaWNhdGlvbiA9IE5vdGlmaWNhdGlvblV0aWwuYWN0aW9uTm90aWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5wYXJhbWV0ZXJzLnZpZXdDb250YWluZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5wYXJhbWV0ZXJzLml0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcG9zc2libGUgZXJyb3IgYWN0aW9uIGlmIHJ1blxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYWluUnVuRm4gJiYgY3R4Lmluc3RhbmNlLmFjdGlvbi5vblJ1bkVycm9yQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3Qgc3RhcnQgd2l0aCB0cmlnZ2VyLCBiZWNhdXNlIHJvdXRpbmcgbWlnaHQgYmUgcHJvYmxlbWF0aWMgKGxvdXNpbmcgcHJldmlvdXMgcmVzdWx0cyBldGMuKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JBY3Rpb25JbnN0YW5jZSA9IHRoaXMuYWN0aXZhdGVBY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmFjdGlvbi5vblJ1bkVycm9yQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25QYXJhbWV0ZXJzPFQ+KGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCwgY3R4LnBhcmFtZXRlcnMuaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBY3Rpb25EYXRhKGN0eC5wYXJhbWV0ZXJzLmFjdGlvbkRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUm91dGUoY3R4LnBhcmFtZXRlcnMucm91dGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU291cmNlQ29tcG9uZW50KGN0eC5wYXJhbWV0ZXJzLnNvdXJjZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhWaWV3Q29udGFpbmVyKGN0eC5wYXJhbWV0ZXJzLnZpZXdDb250YWluZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLmVycm9yQWN0aW9uSW5zdGFuY2UgPSBlcnJvckFjdGlvbkluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JPYnMgPSBlcnJvckFjdGlvbkluc3RhbmNlLnN0YXRlJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZSA9PiBzdGF0ZSA+PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdm9pZCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGxpc3RlIGFuZCBtYXAgb25seSB0byBtYXJrIGluc3RhbmNlIHN0YXRlIGFzIGZpbmlzaGVkIGVycm9yIHN0YXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yT2JzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWFjdGl2YXRlIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQWN0aW9uKGN0eC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRocm93IGVycm9yIHRvIHByb3BhZ2F0ZSBmdXJoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGFjdGlvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldE9icy5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpb25Db250ZXh0ICR7Y3R4LmNvbnRleHRMb25nTmFtZX0gZXhlY3V0aW9uIG5leHQgZXZlbnRgLCByZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBBY3Rpb25Db250ZXh0ICR7Y3R4LmNvbnRleHRMb25nTmFtZX0gZXhlY3V0aW9uIGVycm9yIGV2ZW50YCwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXRPYnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBlZGl0b3IgYWN0aW9uJ3Mgc3VibWl0ICg9bWFpbiBydW4pIGZ1bmN0aW9uIGJ5IGNyZWF0aW5nIG5ldyBhY3Rpb24gY29udGV4dCBmb3IgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIEVkaXRvciBkYXRhIHByb3ZpZGVyIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWN0aW9uIGNvbnRleHQgZm9yIHN1Ym1pdCAoPXJ1bikgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHJ1bkVkaXRvclNhdmU8VCwgUz4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSUVkaXRvckRhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uQ29udGV4dDxULCBTPiB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbm9uIHByb3ZpZGVkXG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpb25JbnN0YW5jZTxULCBTPihhY3Rpb24sIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQsIHRoaXMuZGVidWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnByZXBhcmVDb250ZXh0Rm9yRWRpdG9yKGluc3RhbmNlLCBwYXJhbWV0ZXJzLCAnc3VibWl0JywgZGF0YVByb3ZpZGVyLCBwcmV2aW91c0FjdGlvbkluc3RhbmNlKTtcbiAgICAgICAgdGhpcy5ydW5BY3Rpb25Db250ZXh0KGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHNlcnZpY2UgaW5zdGFuY2Ugb2YgZGF0YSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRGF0YSBwcm92aWRlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldERhdGFQcm92aWRlclNlcnZpY2U8VCwgUz4oZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxULCBTPik6IFMgfCBudWxsIHtcbiAgICAgICAgaWYgKGRhdGFQcm92aWRlcj8uc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldDxTPihkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGVkaXRvciBhY3Rpb24ncyBmZXRjaCBmdW5jdGlvbiBieSBjcmVhdGluZyBuZXcgYWN0aW9uIGNvbnRleHQgZm9yIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBFZGl0b3IgZGF0YSBwcm92aWRlciBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEFjdGlvbiBjb250ZXh0IGZvciBmZXRjaCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcnVuRWRpdG9yRmV0Y2g8VCwgUz4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxUPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSUVkaXRvckRhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+XG4gICAgKTogQWN0aW9uQ29udGV4dDxULCBTPiB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbm9uIHByb3ZpZGVkXG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpb25JbnN0YW5jZTxULCBTPihhY3Rpb24sIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQsIHRoaXMuZGVidWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnByZXBhcmVDb250ZXh0Rm9yRWRpdG9yKGluc3RhbmNlLCBwYXJhbWV0ZXJzLCAnZmV0Y2gnLCBkYXRhUHJvdmlkZXIsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnJ1bkFjdGlvbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWN0aW9uJ3MgbWFpbiBydW4gZnVuY3Rpb24gYnkgY3JlYXRpbmcgbmV3IGFjdGlvbiBjb250ZXh0IGZvciBhY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFjdGlvbiBwYXJhbWV0ZXJzIGZvciBjb250ZXh0IHJ1bi5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIERhdGEgcHJvdmlkZXIgZm9yIGNvbnRleHQgcnVuLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWN0aW9uIGNvbnRleHQgZm9yIHJ1biBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcnVuQWN0aW9uPFQsIFM+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8VD4sXG4gICAgICAgIGRhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXI8VCwgUz4sXG4gICAgICAgIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8VCwgUz4sXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTx1bmtub3duLCB1bmtub3duPlxuICAgICk6IEFjdGlvbkNvbnRleHQ8VCwgUz4ge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5vbiBwcm92aWRlZFxuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aW9uSW5zdGFuY2U8VCwgUz4oYWN0aW9uLCBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uRW5kLCB0aGlzLmRlYnVnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wcmVwYXJlQWN0aW9uQ29udGV4dChpbnN0YW5jZSwgcGFyYW1ldGVycywgZGF0YVByb3ZpZGVyLCBwcmV2aW91c0FjdGlvbkluc3RhbmNlKTtcbiAgICAgICAgaWYgKGFjdGlvbi5oYXNSdW5Db25maXJtYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbXBvbmVudCA9IHBhcmFtZXRlcnM/LnNvdXJjZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IgPSBhY3Rpb24ucnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciBhcyBBY3Rpb25Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yPFQ+O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudD8uZ2V0Q29uZmlybWF0aW9uU2VydmljZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2Ygc291cmNlQ29tcG9uZW50Py5nZXRDb25maXJtYXRpb25TZXJ2aWNlSW5zdGFuY2VLZXkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBjb21wb25lbnQgJHtzb3VyY2VDb21wb25lbnR9IHNob3VsZCBiZSBpbXBsZW1lbnRpbmcgSUNvbmZpcm1hdGlvblNlcnZpY2UgaW50ZXJmYWNlIHRvIGJlIGFibGUgdG8gcHJvdmlkZSBjb25maXJtYXRpb24gZnVuY3Rpb25hbGl0eS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmFtZXRlcnMuaXRlbTtcblxuICAgICAgICAgICAgY29uc3Qgc3JjQ29uZmlybUNvbXBvbmVudCA9IHNvdXJjZUNvbXBvbmVudCBhcyBJQWN0aW9uQ29uZmlybWF0aW9uU2VydmljZTtcbiAgICAgICAgICAgIGxldCBjb25maXJtUGFyYW1zOiBDb25maXJtYXRpb24gPSB7XG4gICAgICAgICAgICAgICAga2V5OiBzcmNDb25maXJtQ29tcG9uZW50LmdldENvbmZpcm1hdGlvblNlcnZpY2VJbnN0YW5jZUtleShhY3Rpb24pLFxuICAgICAgICAgICAgICAgIGljb246IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuaWNvbixcbiAgICAgICAgICAgICAgICBhY2NlcHRWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFjY2VwdEljb246IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLmljb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvblN0eWxlQ2xhc3M6IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLnN0eWxlQ2xhc3MuYnVpbGQoKSxcbiAgICAgICAgICAgICAgICByZWplY3RWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlamVjdEljb246IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5pY29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWplY3RCdXR0b25TdHlsZUNsYXNzOiBjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8uc3R5bGVDbGFzcy5idWlsZCgpLFxuICAgICAgICAgICAgICAgIGNsb3NlT25Fc2NhcGU6IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuY2xvc2VPbkVzY2FwZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IudGl0bGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maXJtUGFyYW1zLmhlYWRlciA9IEkxOG5VdGlscy5BY3Rpb24uZ2V0KHRoaXMudHJhbnNsYXRlLCBhY3Rpb24sICdjb25maXJtLnRpdGxlJywgY29uZmlybWF0aW9uRGVzY3JpcHRvci50aXRsZSwgaXRlbSwgJ2dlbmVyYWwuY29uZmlybWF0aW9uJykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5tZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5tZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgSTE4blV0aWxzLkFjdGlvbi5nZXQodGhpcy50cmFuc2xhdGUsIGFjdGlvbiwgJ2NvbmZpcm0ubWVzc2FnZScsIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IubWVzc2FnZSwgU3RyaW5nVXRpbC5lc2NhcGVIdG1sQW55KGl0ZW0pLCAnZ2VuZXJhbC5jb25maXJtYXRpb24nKSA/P1xuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLmFjY2VwdEJ1dHRvbi5sYWJlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMuYWNjZXB0TGFiZWwgPVxuICAgICAgICAgICAgICAgICAgICBJMThuVXRpbHMuQWN0aW9uLmdldCh0aGlzLnRyYW5zbGF0ZSwgYWN0aW9uLCAnY29uZmlybS5hY2NlcHQnLCBjb25maXJtYXRpb25EZXNjcmlwdG9yLmFjY2VwdEJ1dHRvbi5sYWJlbCwgaXRlbSwgJ2dlbmVyYWwueWVzJykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5hY2NlcHRCdXR0b24uaWNvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMuYWNjZXB0SWNvbiA9IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uLmljb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8uaWNvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMucmVqZWN0SWNvbiA9IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5pY29uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/LmxhYmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlybVBhcmFtcy5yZWplY3RMYWJlbCA9XG4gICAgICAgICAgICAgICAgICAgIEkxOG5VdGlscy5BY3Rpb24uZ2V0KHRoaXMudHJhbnNsYXRlLCBhY3Rpb24sICdjb25maXJtLnJlamVjdCcsIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5sYWJlbCwgaXRlbSwgJ2dlbmVyYWwubm8nKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbiA9PSBudWxsIHx8IChjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbi5sYWJlbCA9PT0gbnVsbCAmJiBjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbi5pY29uID09PSBudWxsKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1QYXJhbXMucmVqZWN0VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maXJtUGFyYW1zLmFjY2VwdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSEuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5Db25maXJtYXRpb25FbmRBY2NlcHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5BY3Rpb25Db250ZXh0KGNvbnRleHQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uZmlybVBhcmFtcy5yZWplY3QgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UhLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uUnVuQ29uZmlybWF0aW9uRW5kUmVqZWN0O1xuICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUFjdGlvbihpbnN0YW5jZSEpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucnVuQ29uZmlybWF0aW9uQ29uZmlnTWFwRm4pIHtcbiAgICAgICAgICAgICAgICBjb25maXJtUGFyYW1zID0gY29uZmlybWF0aW9uRGVzY3JpcHRvci5ydW5Db25maXJtYXRpb25Db25maWdNYXBGbihjb250ZXh0LCBjb25maXJtUGFyYW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGV4dC5jb25maXJtYXRpb24gPSBjb25maXJtUGFyYW1zO1xuICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5Db25maXJtYXRpb25TdGFydDtcblxuICAgICAgICAgICAgc3JjQ29uZmlybUNvbXBvbmVudC5nZXRDb25maXJtYXRpb25TZXJ2aWNlKCkuY29uZmlybShjb25maXJtUGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuQWN0aW9uQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZXMgYWN0aW9uIChpbiBjYXNlIG9mIGRpYWxvZywgZGlhbG9nIHdpbGwgYmUgb3BlbmVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGFjdGl2YXRpb24gb2YgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQWN0aW9uIGluc3RhbmNlIC0gaWYgbm9uIHByb3ZpZGVkIGluIHBhcmFtZXRlcnMsIHRoZSBuZXdseSBjcmVhdGVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlQWN0aW9uPFQsIFM+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8VD4sXG4gICAgICAgIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8VCwgUz4sXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTx1bmtub3duLCB1bmtub3duPlxuICAgICk6IEFjdGlvbkluc3RhbmNlPFQsIFM+IHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBub24gcHJvdmlkZWRcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjdGlvbkluc3RhbmNlPFQsIFM+KGFjdGlvbiwgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvblN0YXJ0LCB0aGlzLmRlYnVnKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5hY3RpdmF0aW9uUGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIC8vIHN0YXJ0IGFjdGl2YXRpb24gaW5zdGFuY2VcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uU3RhcnQ7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICBsZXQgZGlhbG9nQ29tcG9uZW50ID0gdGhpcy5kZWZhdWx0RWRpdG9yRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nQ2xhc3NOYW1lcyA9IFsnbW5nLWRpYWxvZyddO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkVkaXRvckRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBkaWFsb2dDbGFzc05hbWVzLnB1c2goYWN0aW9uLmRpYWxvZ0NsYXNzTmFtZSA/PyAnbW5nLWFjdGlvbi1lZGl0b3ItZGlhbG9nJyk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uZGlhbG9nU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0eWxlU2l6ZUVudW0uRXh0cmFTbWFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy14cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5TbWFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy1zbScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5MYXJnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaCgnbW5nLWRpYWxvZy1sZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5FeHRyYUxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXhsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLk5vcm1hbDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmVkaXRvckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkaWFsb2dDb21wb25lbnQgPSBhY3Rpb24uZWRpdG9yQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzOiBkaWFsb2dDbGFzc05hbWVzLmpvaW4oJyAnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5kYXRhLmFjdGlvbkluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgICBkaWFsb2dDb25maWcuZGF0YS5wcmV2aW91c0FjdGlvbkluc3RhbmNlID0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5vbkNsb3NlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVBY3Rpb24oaW5zdGFuY2UhLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRpcmVjdGx5IGV4ZWN1dGUgYWN0aW9uXG4gICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQ7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5ydW5BY3Rpb248VCwgUz4oYWN0aW9uLCBwYXJhbWV0ZXJzLCB1bmRlZmluZWQsIGluc3RhbmNlLCBwcmV2aW91c0FjdGlvbkluc3RhbmNlKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lmluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVhY3RpdmF0ZXMgYWN0aW9uIGJ5IGNob29zaW5nIGZpbmFsIHN0YXRlLCBjbG9zaW5nIGRpYWxvZyBhbmQgY29tcGxldGluZyBhbGwgc3ViamVjdHMgaW4gaW5zdGFuY2UgYW5kIGNvbnRleHRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gZnJvbURpYWxvZ0xpc3RlbmVyIERlYWN0aXZhdGlvbiBjYWxsZWQgZnJvbSBkaWFsb2cgbGlzdGVuZXIsIGluIHRoaXMgY2FzZSBkZWFjdGl2YXRpb24gaGFwcGVucyBvbmx5IGlmIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVBY3Rpb248VCwgUz4oaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPFQsIFM+LCBmcm9tRGlhbG9nTGlzdGVuZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWZyb21EaWFsb2dMaXN0ZW5lciAmJiBpbnN0YW5jZS5zdGF0ZSA+PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYEFjdGlvbkluc3RhbmNlICR7aW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX0gYWxyZWFkeSBmaW5pc2hlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbmFsU3RhdGU6IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtO1xuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLnJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5lcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hFcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hEaXNtaXNzZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgY29uc3QgaGFzRGlhbG9nID0gdHlwZW9mIGluc3RhbmNlLmFjdGl2YXRpb25EaWFsb2dSZWYgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgaWYgKGhhc0RpYWxvZyAmJiAhZnJvbURpYWxvZ0xpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdGUgPT09IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3RhdGUgaXMgZmluaXNoIGFuZCBub3QgY2FsbGVkIGZyb20gZGlhbG9nIGxpc3RlbmVyLCBjbG9zZSB0aGUgZGlhbG9nIGZpcnN0IHdoaWNoIHdpbGwgcmV0cmlnZ2VyIHRoaXMgZnVuY3Rpb24sIHRoZW4gZmluaXNoIGl0XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2YXRpb25EaWFsb2dSZWYhLmNsb3NlKGluc3RhbmNlLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVycm9yIGFuZCBkaXNtaXNzZWQgbXVzdCBib3RoIGhhdmUgZnJvbURpYWxvZ0xpc3RlbmVyIHRvIGJlIGFibGUgdG8gZmluaXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGZpbmFsIHN0YXRlIG9uIGluc3RhbmNlXG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gZmluYWxTdGF0ZTtcbiAgICAgICAgLy8gY29tcGxldGUgYWxsIHN1YmplY3RzXG4gICAgICAgIGluc3RhbmNlLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGFjdGlvbiBmcm9tIHRhYmxlIHJvdyBjbGljayBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIGV2ZW50IFRhcmdldCB0YWJsZSBjbGljayBldmVudC5cbiAgICAgKiBAcGFyYW0gcm91dGUgQ3VycmVudGx5IGFjdGl2YXRlIHJvdXRlLlxuICAgICAqIEBwYXJhbSB0YWJsZURlc2NyaXB0b3IgVGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gZGF0YUtleVByb3BlcnR5IERhdGEga2V5IHByb3BlcnR5LlxuICAgICAqL1xuICAgIHB1YmxpYyB0cmlnZ2VyUm93Q2xpY2tBY3Rpb248VD4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPixcbiAgICAgICAgZXZlbnQ6IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4sXG4gICAgICAgIHJvdXRlPzogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHRhYmxlRGVzY3JpcHRvcj86IFRhYmxlRGVzY3JpcHRvcjxUPixcbiAgICAgICAgZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGlkUHJvcGVydHkgPSBkYXRhS2V5UHJvcGVydHkgPz8gdGFibGVEZXNjcmlwdG9yPy5kYXRhS2V5UHJvcGVydHkgPz8gYWN0aW9uPy5tb2RlbD8uaWRQcm9wZXJ0eU5hbWUgPz8gZGF0YUtleVByb3BlcnR5O1xuICAgICAgICBpZiAoIWlkUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm93IGNsaWNrIGFjdGlvbiAke2FjdGlvbi5hY3Rpb25OYW1lTG9uZ30gY2FuIG5vdCBiZSB0cmlnZ2VyZWQsIGJlY2F1c2UgaWQgcHJvcGVydHkgY291bGQgbm90IGJlIGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd0l0ZW0gPSBldmVudD8ucm93SXRlbSBhcyBhbnk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBuZXcgQWN0aW9uUGFyYW1ldGVyczxUPihyb3dJdGVtW2lkUHJvcGVydHldLCBldmVudC5yb3dJdGVtKS53aXRoUm91dGUocm91dGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgYWN0aW9uIGV4ZWN1dGlvbiB0byBjb25zdHJ1Y3QgbmV3IHJvdXRlLlxuICAgICAqXG4gICAgICogQHJldHVybiBBY3Rpb24gaW5zdGFuY2UgLSBpZiBub24gcHJvdmlkZWQgaW4gcGFyYW1ldGVycywgdGhlIG5ld2x5IGNyZWF0ZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlckFjdGlvbjxULCBTPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4sIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8VD4pOiBBY3Rpb25JbnN0YW5jZTxULCBTPiB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEFjdGlvbkluc3RhbmNlPFQsIFM+KGFjdGlvbiwgdW5kZWZpbmVkLCB0aGlzLmRlYnVnKTtcbiAgICAgICAgaW5zdGFuY2UudHJpZ2dlclBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBpZiAoYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyID09PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsOiBVcmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5yb3V0ZXIudXJsKTtcbiAgICAgICAgICAgIGxldCBhY3Rpb25VcmwgPSBhY3Rpb24ucm91dGVVcmwgPz8gJyc7XG4gICAgICAgICAgICAvLyBUT0RPOiBkb250IHN0cmlwICcvJywgYnV0IHVzZSBpdCBhY2NvcmRpbmdseSB3aXRoIEFuZ3VsYXIncyByb3V0ZXIgcGF0dGVybnMgKC8sIC4vLCAuLi8pXG4gICAgICAgICAgICBpZiAoYWN0aW9uVXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvblVybCA9IGFjdGlvblVybC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdGlvblVybFNlZ21lbnRzID0gdGhpcy5wYXJhbWV0cml6ZS50cmFuc2Zvcm0oYWN0aW9uVXJsLCBwYXJhbWV0ZXJzLml0ZW1JZCwgcGFyYW1ldGVycy5pdGVtLCBwYXJhbWV0ZXJzLmFjdGlvbkRhdGEpLnNwbGl0KCcvJyk7XG5cbiAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJSb3V0ZU5hdmlnYXRpb24gPSBmcm9tKHRoaXMucm91dGVyLm5hdmlnYXRlKFtiYXNlVXJsLCAuLi5hY3Rpb25VcmxTZWdtZW50c10sIHtyZWxhdGl2ZVRvOiBwYXJhbWV0ZXJzLnJvdXRlLCBxdWVyeVBhcmFtczogcGFyc2VkVXJsLnF1ZXJ5UGFyYW1zfSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlRyaWdnZXJFbmQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUFjdGlvbihhY3Rpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVhY3RpdmF0ZXMgb24gcm91dGUgdHJpZ2dlcmVkIGFjdGlvbiBieSB0cnlpbmcgdG8gcmVyb3V0ZSBiYWNrIHRvIGxvY2F0aW9uIHdoZXJlIGFjdGlvbiB3YXMgdHJpZ2dlcmVkLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVPblJvdXRlVHJpZ2dlcmVkQWN0aW9uPFQsIFM+KGluc3RhbmNlOiBBY3Rpb25JbnN0YW5jZTxULCBTPikge1xuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyICE9PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvciBub3csIGRlYWN0aXZhdGlvbiBhbHdheXMgbWVhbnMgZ29pbmcgYmFjayB0byB0YWJsZXZpZXcgcm9vdFxuICAgICAgICAvLyBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRQcmV2aW91c0xvY2F0aW9uKCkpIHtcbiAgICAgICAgLy8gICAgIC8vIHRoZXJlIGFyZSBpbnRlcm5hbCBoaXN0b3J5IHJlY29yZHMsIHNvIGJhY2sgY2FuIGJlIG5vcm1hbGx5IGNhbGxlZFxuICAgICAgICAvLyAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5iYWNrKCk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAvLyB0aGVyZSBpcyBubyBpbnRlcm5hbCBoaXN0b3J5IHJlY29yZHMsIGZpZ3VyZSBvdXQgdGhlIGJhc2UgdXJsIGJ5IGVsaW1pbmF0aW5nIGFjdGlvbiBzcGVjaWZpYyB1cmxcbiAgICAgICAgbGV0IHVybCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgICAgIC8vIGxldCBwcmV2aW91c1VybCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0UHJldmlvdXNMb2NhdGlvbigpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh1cmwsIHByZXZpb3VzVXJsKTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYmFjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsUGF0aFNlZ21lbnRzID0gdXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgbGV0IGFjdGlvblVybCA9IGluc3RhbmNlLmFjdGlvbj8ucm91dGVVcmwgPz8gJyc7XG4gICAgICAgICAgICBpZiAoYWN0aW9uVXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvblVybCA9IGFjdGlvblVybC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25VcmxTZWdtZW50cyA9IGFjdGlvblVybC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSAnLycgKyB1cmxQYXRoU2VnbWVudHMuc2xpY2UoMCwgdXJsUGF0aFNlZ21lbnRzLmxlbmd0aCAtIGFjdGlvblVybFNlZ21lbnRzLmxlbmd0aCkuam9pbignLycpO1xuICAgICAgICAgICAgLy8gY29uc3QgcmVwbGFjZVVybCA9IHByZXZpb3VzVXJsICE9PSBudWxsICYmIHByZXZpb3VzVXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSA9PT0gcmVkaXJlY3RVcmw7XG4gICAgICAgICAgICAvLyBObyBVUkwgcmVwbGFjZXMsIHByb2JhYmx5IG9rLCB0byBhbGxvdyBnb2luZyBiYWNrXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJlZGlyZWN0VXJsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGVycm9yIG9mIGFueSB0eXBlIHRvIG1uZyBlcnJvciBieSB1c2luZyBlcnJvciBtYXBwZXIgdGhhdCBjb3VsZCBiZSBwcm92aWRlZCBieSBmaW5hbCBwcm9qZWN0LlxuICAgICAqIEBwYXJhbSBlcnJvciBlcnJvciBvZiBhbnkgdHlwZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gbWFwcGVkIE1uZ0Vycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b01uZ0FjdGlvbkVycm9yKGVycm9yPzogYW55KTogTW5nRXJyb3Ige1xuICAgICAgICBjb25zdCBhY3Rpb25FcnJvcjogTW5nRXJyb3IgPSB7XG4gICAgICAgICAgICBuYW1lOiBlcnJvcj8ubmFtZSA/PyAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlID8/ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvclxuICAgICAgICB9O1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgYWN0aW9uRXJyb3Iuc3RhdHVzID0gZXJyb3Iuc3RhdHVzO1xuICAgICAgICAgICAgYWN0aW9uRXJyb3Iuc3RhdHVzRGVzY3JpcHRpb24gPSBlcnJvci5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgYWN0aW9uRXJyb3IudXJsID0gZXJyb3IudXJsID8/IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvck1hcHBlci50b01uZ0Vycm9yKGVycm9yLCBhY3Rpb25FcnJvcik7XG4gICAgfVxufVxuIl19