@mediusinc/mng-commons 5.0.0-rc.1 → 5.0.0-rc.3

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 (245) hide show
  1. package/core/data-providers/base-data-provider.factory.d.ts +13 -0
  2. package/core/data-providers/base.data-provider.d.ts +2 -14
  3. package/core/descriptors/editor.descriptor.d.ts +1 -1
  4. package/core/descriptors/tableview.descriptor.d.ts +5 -5
  5. package/core/directives/component.directive.d.ts +2 -2
  6. package/core/index.d.ts +1 -0
  7. package/core/router/route-builder.d.ts +149 -26
  8. package/core/router/routes-builder.d.ts +28 -13
  9. package/core/security/permission.service.d.ts +1 -0
  10. package/core/services/commons-router.service.d.ts +3 -3
  11. package/core/services/commons.service.d.ts +31 -42
  12. package/core/services/tokens/module-config.token.d.ts +2 -2
  13. package/esm2022/core/components/notification/notification-wrapper.component.mjs +5 -5
  14. package/esm2022/core/components/pages/error/error.page.component.mjs +5 -5
  15. package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +5 -5
  16. package/esm2022/core/data-providers/base-data-provider.factory.mjs +28 -0
  17. package/esm2022/core/data-providers/base.data-provider.mjs +1 -31
  18. package/esm2022/core/descriptors/editor.descriptor.mjs +1 -1
  19. package/esm2022/core/descriptors/tableview.descriptor.mjs +1 -1
  20. package/esm2022/core/directives/component.directive.mjs +12 -9
  21. package/esm2022/core/directives/dialog-keydown-handler.directive.mjs +3 -3
  22. package/esm2022/core/directives/template.directive.mjs +3 -3
  23. package/esm2022/core/index.mjs +2 -1
  24. package/esm2022/core/pipes/boolean.pipe.mjs +3 -3
  25. package/esm2022/core/pipes/class-map.pipe.mjs +3 -3
  26. package/esm2022/core/pipes/enum.pipe.mjs +3 -3
  27. package/esm2022/core/pipes/enumerate-async.pipe.mjs +3 -3
  28. package/esm2022/core/pipes/enumerate.pipe.mjs +3 -3
  29. package/esm2022/core/pipes/getter.pipe.mjs +3 -3
  30. package/esm2022/core/pipes/i18n-property.pipe.mjs +3 -3
  31. package/esm2022/core/pipes/json-path.pipe.mjs +3 -3
  32. package/esm2022/core/pipes/parametrize.pipe.mjs +3 -3
  33. package/esm2022/core/pipes/template.pipe.mjs +3 -3
  34. package/esm2022/core/router/route-builder.mjs +211 -84
  35. package/esm2022/core/router/routes-builder.mjs +41 -43
  36. package/esm2022/core/security/permission.service.mjs +7 -5
  37. package/esm2022/core/services/commons-init.service.mjs +5 -5
  38. package/esm2022/core/services/commons-router.service.mjs +18 -17
  39. package/esm2022/core/services/commons.service.mjs +112 -169
  40. package/esm2022/core/services/local-storage-config.service.mjs +3 -3
  41. package/esm2022/core/services/tokens/module-config.token.mjs +1 -1
  42. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +4 -4
  43. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +31 -0
  44. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +1 -31
  45. package/esm2022/form/api/index.mjs +2 -1
  46. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +105 -102
  47. package/esm2022/form/components/date-range/date-range.component.mjs +3 -3
  48. package/esm2022/form/components/dropdown/dropdown.component.mjs +148 -90
  49. package/esm2022/form/directives/input-trim.directive.mjs +3 -3
  50. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +8 -0
  51. package/esm2022/model/descriptors/enum.descriptor.mjs +3 -6
  52. package/esm2022/model/descriptors/model.descriptor.mjs +22 -9
  53. package/esm2022/model/descriptors/type.descriptor.mjs +3 -9
  54. package/esm2022/model/index.mjs +3 -1
  55. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +33 -0
  56. package/esm2022/table/api/data-providers/table.data-provider.mjs +1 -31
  57. package/esm2022/table/api/descriptors/sort.descriptor.mjs +2 -2
  58. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +89 -0
  59. package/esm2022/table/api/descriptors/table.descriptor.mjs +4 -139
  60. package/esm2022/table/api/helpers/table-descriptor-helpers.mjs +97 -0
  61. package/esm2022/table/api/index.mjs +4 -1
  62. package/esm2022/table/components/column-filter-full/column-filter-full.component.mjs +8 -9
  63. package/esm2022/table/components/column-value/column-value.component.mjs +4 -4
  64. package/esm2022/table/components/table/table.component.mjs +7 -7
  65. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +5 -5
  66. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +3 -3
  67. package/esm2022/table/services/data-list.service.mjs +4 -4
  68. package/esm2022/tableview/action/components/action/action.component.mjs +142 -190
  69. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +58 -68
  70. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +133 -154
  71. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +22 -40
  72. package/esm2022/tableview/action/components/route/action-route.component.mjs +21 -26
  73. package/esm2022/tableview/action/components/table/action-table.component.mjs +4 -4
  74. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +1 -1
  75. package/esm2022/tableview/action/services/action-executor.service.mjs +10 -10
  76. package/esm2022/tableview/action/services/component-action-executor.service.mjs +3 -3
  77. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +3 -3
  78. package/esm2022/tableview/action/services/navigation.service.mjs +6 -5
  79. package/esm2022/tableview/action/services/root-action-executor.service.mjs +3 -3
  80. package/esm2022/tableview/action/services/view-container.service.mjs +8 -24
  81. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +119 -0
  82. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +77 -0
  83. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +28 -80
  84. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +45 -0
  85. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +1 -32
  86. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +3 -69
  87. package/esm2022/tableview/api/action/models/action-component.model.mjs +1 -1
  88. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +1 -1
  89. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +1 -1
  90. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +33 -0
  91. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +1 -31
  92. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +81 -0
  93. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +24 -161
  94. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +1 -1
  95. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +13 -5
  96. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +3 -3
  97. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +4 -4
  98. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +3 -3
  99. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +1 -1
  100. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +36 -7
  101. package/esm2022/tableview/api/editor/helpers/editor-descriptor-helpers.mjs +95 -0
  102. package/esm2022/tableview/api/editor/helpers/field-validators.mjs +17 -27
  103. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +1 -1
  104. package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +1 -1
  105. package/esm2022/tableview/api/editor/models/field-validation.model.mjs +2 -0
  106. package/esm2022/tableview/api/editor/models/field.model.mjs +1 -1
  107. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
  108. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +1 -1
  109. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +3 -3
  110. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +1 -1
  111. package/esm2022/tableview/api/index.mjs +11 -1
  112. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +47 -0
  113. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +5 -46
  114. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +111 -0
  115. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +26 -186
  116. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +2 -2
  117. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +5 -5
  118. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +53 -18
  119. package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +110 -0
  120. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +2 -2
  121. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +163 -138
  122. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +9 -5
  123. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +13 -16
  124. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +3 -3
  125. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +103 -0
  126. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +12 -16
  127. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +3 -3
  128. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +36 -53
  129. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +3 -3
  130. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +20 -24
  131. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +24 -28
  132. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +30 -31
  133. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +3 -3
  134. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +3 -3
  135. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +3 -3
  136. package/esm2022/tableview/editor/helpers/editor-formly.mjs +85 -56
  137. package/esm2022/tableview/editor/helpers/formly-config.mjs +5 -3
  138. package/esm2022/tableview/editor/models/formly-config.model.mjs +1 -1
  139. package/esm2022/tableview/editor/services/form-editor.service.mjs +96 -0
  140. package/esm2022/tableview/index.mjs +2 -1
  141. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +10 -10
  142. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +26 -43
  143. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +17 -43
  144. package/fesm2022/mediusinc-mng-commons-core.mjs +460 -390
  145. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  146. package/fesm2022/mediusinc-mng-commons-filter.mjs +3 -3
  147. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  148. package/fesm2022/mediusinc-mng-commons-form-api.mjs +18 -18
  149. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  150. package/fesm2022/mediusinc-mng-commons-form.mjs +257 -195
  151. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  152. package/fesm2022/mediusinc-mng-commons-model.mjs +43 -33
  153. package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
  154. package/fesm2022/mediusinc-mng-commons-table-api.mjs +192 -146
  155. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  156. package/fesm2022/mediusinc-mng-commons-table.mjs +26 -27
  157. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  158. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +906 -665
  159. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  160. package/fesm2022/mediusinc-mng-commons-tableview.mjs +1015 -960
  161. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  162. package/form/api/data-providers/lookup-data-provider.factory.d.ts +18 -0
  163. package/form/api/data-providers/lookup.data-provider.d.ts +2 -14
  164. package/form/api/index.d.ts +1 -0
  165. package/form/components/autocomplete/autocomplete.component.d.ts +33 -24
  166. package/form/components/dropdown/dropdown.component.d.ts +38 -25
  167. package/model/data-providers/base-from-type-data-provider.factory.d.ts +8 -0
  168. package/model/descriptors/enum.descriptor.d.ts +1 -2
  169. package/model/descriptors/model.descriptor.d.ts +11 -4
  170. package/model/descriptors/type.descriptor.d.ts +2 -4
  171. package/model/index.d.ts +1 -0
  172. package/package.json +1 -1
  173. package/table/api/data-providers/table-data-provider.factory.d.ts +18 -0
  174. package/table/api/data-providers/table.data-provider.d.ts +2 -14
  175. package/table/api/descriptors/table-descriptor.factory.d.ts +44 -0
  176. package/table/api/descriptors/table.descriptor.d.ts +4 -65
  177. package/table/api/helpers/table-descriptor-helpers.d.ts +44 -0
  178. package/table/api/index.d.ts +3 -0
  179. package/table/components/column-filter-full/column-filter-full.component.d.ts +5 -4
  180. package/table/components/table/table.component.d.ts +11 -11
  181. package/table/services/data-list.service.d.ts +9 -10
  182. package/tableview/action/components/action/action.component.d.ts +37 -44
  183. package/tableview/action/components/editor/action-editor.component.d.ts +20 -18
  184. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +24 -26
  185. package/tableview/action/components/localization/data-language-dropdown.component.d.ts +11 -14
  186. package/tableview/action/components/route/action-route.component.d.ts +7 -12
  187. package/tableview/action/components/table/action-table.component.d.ts +3 -3
  188. package/tableview/action/models/execution/action-instance.model.d.ts +2 -1
  189. package/tableview/action/services/view-container.service.d.ts +3 -9
  190. package/tableview/api/action/descriptors/action-descriptor.factory.d.ts +36 -0
  191. package/tableview/api/action/descriptors/action-editor-descriptor.factory.d.ts +31 -0
  192. package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +25 -37
  193. package/tableview/api/action/descriptors/action-link-descriptor.factory.d.ts +15 -0
  194. package/tableview/api/action/descriptors/action-link.descriptor.d.ts +1 -9
  195. package/tableview/api/action/descriptors/action.descriptor.d.ts +4 -27
  196. package/tableview/api/action/models/action-component.model.d.ts +8 -8
  197. package/tableview/api/action/models/execution/action-instance.model.d.ts +2 -1
  198. package/tableview/api/action/models/execution/view-container.model.d.ts +4 -3
  199. package/tableview/api/editor/data-providers/editor-data-provider.factory.d.ts +18 -0
  200. package/tableview/api/editor/data-providers/editor.data-provider.d.ts +2 -14
  201. package/tableview/api/editor/descriptors/editor-descriptor.factory.d.ts +44 -0
  202. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +44 -105
  203. package/tableview/api/editor/descriptors/field-action.descriptor.d.ts +3 -3
  204. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +35 -33
  205. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +8 -7
  206. package/tableview/api/editor/descriptors/field-lookup.descriptor.d.ts +2 -2
  207. package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +8 -8
  208. package/tableview/api/editor/descriptors/field-validation.descriptor.d.ts +10 -13
  209. package/tableview/api/editor/descriptors/field.descriptor.d.ts +16 -1
  210. package/tableview/api/editor/helpers/editor-descriptor-helpers.d.ts +43 -0
  211. package/tableview/api/editor/helpers/field-validators.d.ts +7 -3
  212. package/tableview/api/editor/models/editor-fields.model.d.ts +25 -21
  213. package/tableview/api/editor/models/field-action-context.model.d.ts +10 -8
  214. package/tableview/api/editor/models/field-validation.model.d.ts +26 -0
  215. package/tableview/api/editor/models/field.model.d.ts +0 -10
  216. package/tableview/api/editor/models/form-editor.event.d.ts +26 -16
  217. package/tableview/api/editor/models/form-editor.interface.d.ts +38 -8
  218. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  219. package/tableview/api/editor/models/formly-field.model.d.ts +9 -7
  220. package/tableview/api/index.d.ts +10 -0
  221. package/tableview/api/tableview/data-providers/tableview-data-provider.factory.d.ts +25 -0
  222. package/tableview/api/tableview/data-providers/tableview.data-provider.d.ts +3 -20
  223. package/tableview/api/tableview/descriptors/tableview-descriptor.factory.d.ts +49 -0
  224. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +41 -102
  225. package/tableview/api/tableview/helpers/tableview-create.d.ts +2 -2
  226. package/tableview/api/tableview/helpers/tableview-default-actions.d.ts +4 -2
  227. package/tableview/api/tableview/helpers/tableview-descriptor-helpers.d.ts +42 -0
  228. package/tableview/api/tableview/helpers/tableview-input-builder.d.ts +1 -1
  229. package/tableview/editor/components/editor/form-editor.component.d.ts +54 -36
  230. package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +5 -3
  231. package/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +1 -0
  232. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +22 -0
  233. package/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +1 -1
  234. package/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.d.ts +5 -7
  235. package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +1 -1
  236. package/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +3 -4
  237. package/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +3 -5
  238. package/tableview/editor/helpers/editor-formly.d.ts +11 -10
  239. package/tableview/editor/models/formly-config.model.d.ts +1 -1
  240. package/tableview/editor/services/form-editor.service.d.ts +39 -0
  241. package/tableview/index.d.ts +1 -0
  242. package/tableview/tableview/components/route/tableview-route.component.d.ts +2 -2
  243. package/tableview/tableview/components/tableview/tableview.component.d.ts +11 -10
  244. package/tableview/tableview/router/tableview-route-builder.d.ts +7 -13
  245. package/version-info.json +11 -0
@@ -1,21 +1,16 @@
1
- import { CommonsInternalError, TypeRegistry } from '@mediusinc/mng-commons/core';
2
- import { ModelDescriptor, findClassTitleAttribute } from '@mediusinc/mng-commons/model';
3
- import { ColumnTypeEnum, TableDescriptor, TableDynamicDescriptor } from '@mediusinc/mng-commons/table/api';
4
- import { EditorDescriptor } from '../../editor/descriptors/editor.descriptor';
5
- import { getFieldInputTypeFromColumnType } from '../../editor/helpers/class-attribute-converter';
1
+ import { TableDescriptorInst, TableDynamicDescriptorInst } from '@mediusinc/mng-commons/table/api';
2
+ import { EditorDescriptorInst } from '../../editor/descriptors/editor.descriptor';
6
3
  import { TableviewEditorTypeEnum } from '../../editor/models/editor.model';
7
- import { FieldInputTypeEnum } from '../../editor/models/field.model';
8
- import { getTableviewClassAttributeDef } from '../helpers/class-attribute-converter';
9
4
  export class TableviewDescriptorInst {
10
5
  constructor(model) {
11
6
  this._isLocalized = false;
12
7
  this._model = model;
13
- this._table = TableDescriptor.fromModel(model);
8
+ this._table = new TableDescriptorInst(model);
14
9
  this._tableTitle = `${this._model.i18nBaseKey}.name`;
15
- this._detailsEditor = EditorDescriptor.fromModel(model, TableviewEditorTypeEnum.Details);
10
+ this._detailsEditor = new EditorDescriptorInst(model, TableviewEditorTypeEnum.Details);
16
11
  this._detailsEditor.withDisabled();
17
- this._addEditor = EditorDescriptor.fromModel(model, TableviewEditorTypeEnum.Add);
18
- this._editEditor = EditorDescriptor.fromModel(model, TableviewEditorTypeEnum.Edit);
12
+ this._addEditor = new EditorDescriptorInst(model, TableviewEditorTypeEnum.Add);
13
+ this._editEditor = new EditorDescriptorInst(model, TableviewEditorTypeEnum.Edit);
19
14
  }
20
15
  get table() {
21
16
  return this._table;
@@ -81,10 +76,13 @@ export class TableviewDescriptorInst {
81
76
  this._tableTitle = title;
82
77
  return this;
83
78
  }
84
- withValidator(name, expression) {
85
- this._detailsEditor.addValidation(name, expression);
86
- this._addEditor.addValidation(name, expression);
87
- this._editEditor.addValidation(name, expression);
79
+ withValidation(name, expression, message, opts) {
80
+ return this.withValidationUnsafe(name, expression, message, opts);
81
+ }
82
+ withValidationUnsafe(name, expression, message, opts) {
83
+ this._detailsEditor.withValidationUnsafe(name, expression, message, opts);
84
+ this._addEditor.withValidationUnsafe(name, expression, message, opts);
85
+ this._editEditor.withValidationUnsafe(name, expression, message, opts);
88
86
  return this;
89
87
  }
90
88
  getColumn(property) {
@@ -253,6 +251,11 @@ export class TableviewDescriptorInst {
253
251
  properties.forEach(p => this.addField(p));
254
252
  return this;
255
253
  }
254
+ addFieldAction(actionName) {
255
+ const field = this._detailsEditor.addFieldAction(actionName);
256
+ this.addFieldToEditAndAdd(field);
257
+ return field;
258
+ }
256
259
  addFieldToEditAndAdd(field) {
257
260
  this._addEditor.addFieldDescriptor(field);
258
261
  this._editEditor.addFieldDescriptor(field);
@@ -266,7 +269,7 @@ export class TableviewDescriptorInst {
266
269
  * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
267
270
  * @typeparam FieldValue - The value type of field on editor.
268
271
  *
269
- * @returns {FieldLookupDescriptor<LookupModel, TableviewModel, undefined, FieldValue>} - The field lookup descriptor.
272
+ * @returns {FieldLookupDescriptor<LookupModel, TableviewModel, undefined, FieldValue, ParentEditorModel>} - The field lookup descriptor.
270
273
  */
271
274
  addFieldLookup(property, type) {
272
275
  const field = this._detailsEditor.addFieldLookup(property, type);
@@ -282,7 +285,7 @@ export class TableviewDescriptorInst {
282
285
  * @typeparam LookupModel - The field model type, defaults to the non-nullable type of the editor's property.
283
286
  * @typeparam FieldValue - The value type of field on editor.
284
287
  *
285
- * @returns {FieldLookupDescriptor<LookupModel, TableviewModel, undefined, FieldValue>} - The field lookup descriptor.
288
+ * @returns {FieldLookupDescriptor<LookupModel, TableviewModel, undefined, FieldValue, ParentEditorModel>} - The field lookup descriptor.
286
289
  */
287
290
  addFieldLookupUnsafe(property, type) {
288
291
  const field = this._detailsEditor.addFieldLookupUnsafe(property, type);
@@ -421,23 +424,13 @@ export class TableviewDescriptorInst {
421
424
  this.addFieldToEditAndAdd(field);
422
425
  return field;
423
426
  }
424
- addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor) {
425
- const field = this._detailsEditor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor);
427
+ addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
428
+ const field = this._detailsEditor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
426
429
  this.addFieldToEditAndAdd(field);
427
430
  return field;
428
431
  }
429
- addFieldManyToManyEditorUnsafe(property, mainTableDescriptor, lookupTableDescriptor) {
430
- const field = this._detailsEditor.addFieldManyToManyEditorUnsafe(property, mainTableDescriptor, lookupTableDescriptor);
431
- this.addFieldToEditAndAdd(field);
432
- return field;
433
- }
434
- addFieldManyToManyEditorWithProvider(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
435
- const field = this._detailsEditor.addFieldManyToManyEditorWithProvider(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
436
- this.addFieldToEditAndAdd(field);
437
- return field;
438
- }
439
- addFieldManyToManyEditorWithProviderUnsafe(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
440
- const field = this._detailsEditor.addFieldManyToManyEditorWithProviderUnsafe(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
432
+ addFieldManyToManyEditorUnsafe(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
433
+ const field = this._detailsEditor.addFieldManyToManyEditorUnsafe(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
441
434
  this.addFieldToEditAndAdd(field);
442
435
  return field;
443
436
  }
@@ -463,101 +456,6 @@ export class TableviewDescriptorInst {
463
456
  tableview._isLocalized = this._isLocalized;
464
457
  return tableview;
465
458
  }
466
- /**
467
- * creates column and field with custom type, for example currency
468
- * if field exists, it is replaced
469
- * DO NOT USE WITH TYPES WHERE ARGS ARE REQUIRED - ERROR WILL BE THROWN
470
- * for enum use withEnumType
471
- * for custom class use withClassType
472
- * @param property name of field
473
- * @param columnType required column type
474
- * @param fieldType optional, if not provided it is converted from column type
475
- * @param columnDisplayType optional
476
- */
477
- withModifiedType(property, columnType, fieldType, columnDisplayType) {
478
- return this.withModifiedTypeUnsafe(property, columnType, fieldType, columnDisplayType);
479
- }
480
- withModifiedTypeUnsafe(property, columnType, fieldType, columnDisplayType) {
481
- if (!this.model.type) {
482
- throw new CommonsInternalError(`withModifiedType cannot be executed for property ${property}: Model type is not defined.`);
483
- }
484
- if (columnType === ColumnTypeEnum.Enum) {
485
- throw new CommonsInternalError('Do not use with types where args are required', { name: 'TableviewDescriptorError' });
486
- }
487
- const attributeDef = getTableviewClassAttributeDef(this.model.type).find(attr => attr.name === property);
488
- if (attributeDef != null) {
489
- fieldType ??= getFieldInputTypeFromColumnType(columnType, columnDisplayType);
490
- attributeDef.fieldType = fieldType;
491
- this._table.withColumnModifiedTypeUnsafe(property, columnType, columnDisplayType);
492
- this._editEditor.withFieldModifiedTypeUnsafe(property, fieldType);
493
- this._addEditor.withFieldModifiedTypeUnsafe(property, fieldType);
494
- this._detailsEditor.withFieldModifiedTypeUnsafe(property, fieldType);
495
- }
496
- return this;
497
- }
498
- /**
499
- * creates column with enum type
500
- * if fields exists, it is replaced
501
- * @param property property name
502
- * @param enumDesc type of enum
503
- * @param fieldType type of field, optional, default is Text
504
- */
505
- withModifiedEnum(property, enumDesc, fieldType) {
506
- return this.withModifiedEnumUnsafe(property, enumDesc, fieldType);
507
- }
508
- withModifiedEnumUnsafe(property, enumDesc, fieldType) {
509
- if (!this.model.type) {
510
- throw new CommonsInternalError(`withModifiedEnum cannot be executed for property ${property}: Model type is not defined.`);
511
- }
512
- const attributeDef = getTableviewClassAttributeDef(this.model.type).find(attr => attr.name === property);
513
- if (attributeDef != null) {
514
- attributeDef.fieldType = fieldType ?? FieldInputTypeEnum.Text;
515
- this._table.withColumnModifiedEnumUnsafe(property, enumDesc);
516
- this._editEditor.withFieldModifiedEnumUnsafe(property, enumDesc);
517
- this._detailsEditor.withFieldModifiedEnumUnsafe(property, enumDesc);
518
- this._addEditor.withFieldModifiedEnumUnsafe(property, enumDesc);
519
- }
520
- return this;
521
- }
522
- /**
523
- * generates column with custom class type
524
- * field is generated only if lookupProvider is provided
525
- * @param property property name
526
- * @param type class type of object
527
- * @param titleProperty
528
- * @param lookupProvider
529
- * @param optionsLabelProperty
530
- * @param filterProperty
531
- */
532
- withModifiedLookup(property, type, lookupProvider, titleProperty, optionsLabelProperty, filterProperty) {
533
- return this.withModifiedLookupUnsafe(property, type, lookupProvider, titleProperty, optionsLabelProperty, filterProperty);
534
- }
535
- withModifiedLookupUnsafe(property, type, lookupProvider, titleProperty, optionsLabelProperty, filterProperty) {
536
- if (!this.model.type) {
537
- throw new CommonsInternalError(`withModifiedLookup cannot be executed for property ${property}: Model type is not defined.`);
538
- }
539
- const attributeDef = getTableviewClassAttributeDef(this.model.type).find(attr => attr.name === property);
540
- if (attributeDef != null) {
541
- type ??= attributeDef.classType ?? TypeRegistry.get().findType(attributeDef.type);
542
- titleProperty ??= type ? findClassTitleAttribute(type) ?? undefined : undefined;
543
- optionsLabelProperty ??= titleProperty;
544
- attributeDef.columnType = ColumnTypeEnum.String;
545
- attributeDef.fieldType = FieldInputTypeEnum.Text;
546
- if (lookupProvider != null) {
547
- this._table.withColumnModifiedLookupUnsafe(property, lookupProvider, optionsLabelProperty, filterProperty);
548
- this._addEditor.withFieldModifiedLookupWithProviderUnsafe(property, lookupProvider, optionsLabelProperty);
549
- this._detailsEditor.withFieldModifiedLookupWithProviderUnsafe(property, lookupProvider, optionsLabelProperty);
550
- this._editEditor.withFieldModifiedLookupWithProviderUnsafe(property, lookupProvider, optionsLabelProperty);
551
- }
552
- else {
553
- const column = this._table.getColumnUnsafe(property) ?? this.addColumnUnsafe(property);
554
- if (titleProperty) {
555
- column.withGetter(value => value?.[titleProperty]);
556
- }
557
- }
558
- }
559
- return this;
560
- }
561
459
  localized(property, model, localeProperty) {
562
460
  return this.localizedUnsafe(property, model, localeProperty);
563
461
  }
@@ -570,57 +468,10 @@ export class TableviewDescriptorInst {
570
468
  return this;
571
469
  }
572
470
  }
573
- export class TableviewDescriptor extends TableviewDescriptorInst {
574
- constructor() {
575
- super(ModelDescriptor.create());
576
- }
577
- static create(idProperty, titleProperty, i18nBaseKey) {
578
- return new TableviewDescriptorInst(ModelDescriptor.create(idProperty, titleProperty, i18nBaseKey));
579
- }
580
- static fromClass(type, idProperty, titleProperty, i18nBaseKey) {
581
- return new TableviewDescriptorInst(ModelDescriptor.fromClass(type, idProperty, titleProperty, i18nBaseKey));
582
- }
583
- static fromModel(model) {
584
- return new TableviewDescriptorInst(model);
585
- }
586
- /**
587
- * generates descriptor from attribute definition of openapi model
588
- * @param type class type
589
- * @param idProperty
590
- * @param titleProperty
591
- */
592
- static fromClassWithAutoAttrsDef(type, idProperty, titleProperty) {
593
- const model = ModelDescriptor.fromClass(type, idProperty, titleProperty);
594
- const descriptor = TableviewDescriptor.fromModel(model);
595
- descriptor.withTableDescriptor(TableDescriptor.fromClassWithAutoAttrsDef(type, idProperty, titleProperty));
596
- descriptor.withEditDescriptor(EditorDescriptor.fromClassWithAutoAttrsDef(type, idProperty, titleProperty, TableviewEditorTypeEnum.Edit));
597
- descriptor.withDetailsDescriptor(EditorDescriptor.fromClassWithAutoAttrsDef(type, idProperty, titleProperty, TableviewEditorTypeEnum.Details).withDisabled());
598
- descriptor.withAddDescriptor(EditorDescriptor.fromClassWithAutoAttrsDef(type, idProperty, titleProperty, TableviewEditorTypeEnum.Add));
599
- return descriptor;
600
- }
601
- /**
602
- * generates descriptor from given attribute definition
603
- * @param type class type
604
- * @param columnAttributes attribute definition to generate columns
605
- * @param fieldAttributes attribute definition to generate fields, if undefined columnDefinition is used, if null editors are not generated
606
- * @param idProperty
607
- * @param titleProperty
608
- */
609
- static fromClassWithCustomAttrsDef(type, columnAttributes, fieldAttributes, idProperty, titleProperty) {
610
- const descriptor = TableviewDescriptor.fromModel(ModelDescriptor.fromClass(type, idProperty, titleProperty));
611
- descriptor.withTableDescriptor(TableDescriptor.fromClassWithCustomAttrsDef(type, columnAttributes, idProperty, titleProperty));
612
- if (fieldAttributes !== null) {
613
- descriptor.withEditDescriptor(EditorDescriptor.fromClassWithCustomAttrsDef(type, fieldAttributes ?? columnAttributes, idProperty, titleProperty, TableviewEditorTypeEnum.Edit));
614
- descriptor.withDetailsDescriptor(EditorDescriptor.fromClassWithCustomAttrsDef(type, fieldAttributes ?? columnAttributes, idProperty, titleProperty, TableviewEditorTypeEnum.Details));
615
- descriptor.withAddDescriptor(EditorDescriptor.fromClassWithCustomAttrsDef(type, fieldAttributes ?? columnAttributes, idProperty, titleProperty, TableviewEditorTypeEnum.Add));
616
- }
617
- return descriptor;
618
- }
619
- }
620
471
  export class TableviewDynamicDescriptorInt extends TableviewDescriptorInst {
621
472
  constructor(model) {
622
473
  super(model);
623
- this._table = TableDynamicDescriptor.fromModel(this.model);
474
+ this._table = new TableDynamicDescriptorInst(this.model);
624
475
  this._tableTitle = undefined;
625
476
  }
626
477
  get table() {
@@ -658,15 +509,4 @@ export class TableviewDynamicDescriptorInt extends TableviewDescriptorInst {
658
509
  return descriptor;
659
510
  }
660
511
  }
661
- export class TableviewDynamicDescriptor extends TableviewDynamicDescriptorInt {
662
- constructor() {
663
- super(ModelDescriptor.create());
664
- }
665
- static create(idProperty, titleProperty, i18nBaseKey) {
666
- return new TableviewDynamicDescriptorInt(ModelDescriptor.create(idProperty, titleProperty, i18nBaseKey));
667
- }
668
- static fromModel(model) {
669
- return new TableviewDynamicDescriptorInt(model);
670
- }
671
- }
672
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGV2aWV3LmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvYXBpL3NyYy90YWJsZXZpZXcvZGVzY3JpcHRvcnMvdGFibGV2aWV3LmRlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUdILG9CQUFvQixFQU9wQixZQUFZLEVBQ2YsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQWlCLGVBQWUsRUFBa0IsdUJBQXVCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0SCxPQUFPLEVBR0gsY0FBYyxFQUdkLGVBQWUsRUFFZixzQkFBc0IsRUFFekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQXVCLE1BQU0sNENBQTRDLENBQUM7QUFJbEcsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFFL0YsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFHbkYsTUFBTSxPQUFPLHVCQUF1QjtJQWNoQyxZQUFzQixLQUFzQztRQUZsRCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUczQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFD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LENBQUM7UUFDeEUsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsNkJBQTZCO0lBQ3pFO1FBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQW1CLEVBQUUsYUFBc0IsRUFBRSxXQUFxQztRQUNuRyxPQUFPLElBQUksNkJBQTZCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBTSxVQUFVLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBMkI7UUFDL0MsT0FBTyxJQUFJLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmllbGRWYWxpZGF0b3JGbn0gZnJvbSAnQG5neC1mb3JtbHkvY29yZS9saWIvbW9kZWxzL2NvbmZpZyc7XG5cbmltcG9ydCB7XG4gICAgQXJyYXlJdGVtVHlwZSxcbiAgICBDbGFzc1R5cGUsXG4gICAgQ29tbW9uc0ludGVybmFsRXJyb3IsXG4gICAgRW51bUNvbnN0YW50VHlwZSxcbiAgICBJTG9va3VwRGF0YVByb3ZpZGVyLFxuICAgIElUYWJsZXZpZXdEZXNjcmlwdG9yLFxuICAgIElkVHlwZSxcbiAgICBLZXlvZkFuZE9mVHlwZSxcbiAgICBOdWxsYWJsZSxcbiAgICBUeXBlUmVnaXN0cnlcbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtFbnVtRGVzY3JpcHRvciwgTW9kZWxEZXNjcmlwdG9yLCBUeXBlRGVzY3JpcHRvciwgZmluZENsYXNzVGl0bGVBdHRyaWJ1dGV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5EZXNjcmlwdG9yLFxuICAgIENvbHVtbkRpc3BsYXlUeXBlRW51bSxcbiAgICBDb2x1bW5UeXBlRW51bSxcbiAgICBJQ29sdW1uc01hbmFnZUludGVyZmFjZSxcbiAgICBJVGFibGVEYXRhUHJvdmlkZXIsXG4gICAgVGFibGVEZXNjcmlwdG9yLFxuICAgIFRhYmxlRGVzY3JpcHRvckluc3QsXG4gICAgVGFibGVEeW5hbWljRGVzY3JpcHRvcixcbiAgICBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdFxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxlL2FwaSc7XG5cbmltcG9ydCB7RWRpdG9yRGVzY3JpcHRvciwgRWRpdG9yRGVzY3JpcHRvckluc3R9IGZyb20gJy4uLy4uL2VkaXRvci9kZXNjcmlwdG9ycy9lZGl0b3IuZGVzY3JpcHRvcic7XG5pbXBvcnQge0FGaWVsZERlc2NyaXB0b3J9IGZyb20gJy4uLy4uL2VkaXRvci9kZXNjcmlwdG9ycy9maWVsZC1iYXNlLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtGaWVsZExvb2t1cERlc2NyaXB0b3IsIEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlfSBmcm9tICcuLi8uLi9lZGl0b3IvZGVzY3JpcHRvcnMvZmllbGQtbG9va3VwLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtGaWVsZElucHV0RGVzY3JpcHRvclR5cGV9IGZyb20gJy4uLy4uL2VkaXRvci9kZXNjcmlwdG9ycy9maWVsZC5kZXNjcmlwdG9yJztcbmltcG9ydCB7Z2V0RmllbGRJbnB1dFR5cGVGcm9tQ29sdW1uVHlwZX0gZnJvbSAnLi4vLi4vZWRpdG9yL2hlbHBlcnMvY2xhc3MtYXR0cmlidXRlLWNvbnZlcnRlcic7XG5pbXBvcnQge0lGaWVsZHNNYW5hZ2VJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2VkaXRvci9tb2RlbHMvZWRpdG9yLWZpZWxkcy5tb2RlbCc7XG5pbXBvcnQge1RhYmxldmlld0VkaXRvclR5cGVFbnVtfSBmcm9tICcuLi8uLi9lZGl0b3IvbW9kZWxzL2VkaXRvci5tb2RlbCc7XG5pbXBvcnQge0ZpZWxkSW5wdXRUeXBlRW51bX0gZnJvbSAnLi4vLi4vZWRpdG9yL21vZGVscy9maWVsZC5tb2RlbCc7XG5pbXBvcnQge2dldFRhYmxldmlld0NsYXNzQXR0cmlidXRlRGVmfSBmcm9tICcuLi9oZWxwZXJzL2NsYXNzLWF0dHJpYnV0ZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHtUYWJsZXZpZXdDbGFzc0F0dHJpYnV0ZURlZn0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXRhYmxldmlldy1hdHRyaWJ1dGUubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRzID0ga2V5b2YgVGFibGV2aWV3TW9kZWwsIEZpbHRlcnMgPSBrZXlvZiBUYWJsZXZpZXdNb2RlbD5cbiAgICBpbXBsZW1lbnRzIElUYWJsZXZpZXdEZXNjcmlwdG9yPFRhYmxldmlld01vZGVsLCBTb3J0cywgRmlsdGVycz4sIElDb2x1bW5zTWFuYWdlSW50ZXJmYWNlPFRhYmxldmlld01vZGVsLCBTb3J0cywgRmlsdGVycz4sIElGaWVsZHNNYW5hZ2VJbnRlcmZhY2U8VGFibGV2aWV3TW9kZWw+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUYWJsZXZpZXdNb2RlbD47XG5cbiAgICBwcm90ZWN0ZWQgX3RhYmxlOiBUYWJsZURlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBTb3J0cywgRmlsdGVycz47XG4gICAgcHJvdGVjdGVkIF9kZXRhaWxzRWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD47XG4gICAgcHJvdGVjdGVkIF9hZGRFZGl0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsPjtcbiAgICBwcm90ZWN0ZWQgX2VkaXRFZGl0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsPjtcblxuICAgIHByb3RlY3RlZCBfdGFibGVUaXRsZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfaXNMb2NhbGl6ZWQgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFRhYmxldmlld01vZGVsPikge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLl90YWJsZSA9IFRhYmxlRGVzY3JpcHRvci5mcm9tTW9kZWwobW9kZWwpO1xuICAgICAgICB0aGlzLl90YWJsZVRpdGxlID0gYCR7dGhpcy5fbW9kZWwuaTE4bkJhc2VLZXl9Lm5hbWVgO1xuICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yID0gRWRpdG9yRGVzY3JpcHRvci5mcm9tTW9kZWwobW9kZWwsIFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkRldGFpbHMpO1xuICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICB0aGlzLl9hZGRFZGl0b3IgPSBFZGl0b3JEZXNjcmlwdG9yLmZyb21Nb2RlbChtb2RlbCwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkKTtcbiAgICAgICAgdGhpcy5fZWRpdEVkaXRvciA9IEVkaXRvckRlc2NyaXB0b3IuZnJvbU1vZGVsKG1vZGVsLCBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXRhaWxzRWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWlsc0VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFkZEVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRFZGl0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGVUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0xvY2FsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9jYWxpemVkO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGFibGVEZXNjcmlwdG9yKGRlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRzLCBGaWx0ZXJzPik6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZSA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yRGVzY3JpcHRvcnMoZGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RldGFpbHNFZGl0b3IgPSBkZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fYWRkRWRpdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZXRhaWxzRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWRkRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWRkRWRpdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhFZGl0RGVzY3JpcHRvcihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdEVkaXRvciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZXMgbmV3IGNvcHkgb2YgZWRpdG9yIGRlc2NyaXB0b3IgYW5kIG1ha2VzIGl0IGRpc2FibGVkXG4gICAgICogdXNhYmxlIGluIGNvbWJpbmF0aW9uIHdpdGggdGhpczo6d2l0aEVkaXRvckRlc2NyaXB0b3JzLCB3aGVyZSBkZXRhaWxzRGVzY3JpcHRvciBpcyBtYWRlIG5vbi1kaXNhYmxlZFxuICAgICAqIEBwYXJhbSB0eXBlIHdoaWNoIGVkaXRvciB0eXBlIHRvIHNldCB0byBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGlzYWJsZWRFZGl0b3JEZXNjcmlwdG9yKHR5cGUgPSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKTogdGhpcyB7XG4gICAgICAgIGlmICh0eXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0RWRpdG9yID0gdGhpcy5fZWRpdEVkaXRvci5jb3B5KCkud2l0aERpc2FibGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRGV0YWlscykge1xuICAgICAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvciA9IHRoaXMuX2RldGFpbHNFZGl0b3IuY29weSgpLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkRWRpdG9yID0gdGhpcy5fYWRkRWRpdG9yLmNvcHkoKS53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhYmxlVGl0bGUodGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZVRpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogRmllbGRWYWxpZGF0b3JGbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZFZhbGlkYXRpb24obmFtZSwgZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5hZGRWYWxpZGF0aW9uKG5hbWUsIGV4cHJlc3Npb24pO1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yLmFkZFZhbGlkYXRpb24obmFtZSwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2x1bW4ocHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5nZXRDb2x1bW4ocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2x1bW5VbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuZ2V0Q29sdW1uVW5zYWZlKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ29sdW1uKHByb3BlcnR5OiBrZXlvZiBUYWJsZXZpZXdNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YWJsZS5yZW1vdmVDb2x1bW4ocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVDb2x1bW5VbnNhZmUocHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YWJsZS5yZW1vdmVDb2x1bW5VbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29sdW1uPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZSA9IENvbHVtbk1vZGVsPihjb2x1bW46IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxldmlld01vZGVsLCBDb2x1bW5WYWx1ZT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aENvbHVtbjxDb2x1bW5Nb2RlbCwgQ29sdW1uVmFsdWU+KGNvbHVtbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb2x1bW48UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbD4ocHJvcGVydHk6IFByb3BlcnR5KTogQ29sdW1uRGVzY3JpcHRvcjxOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBUYWJsZXZpZXdNb2RlbCwgVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRDb2x1bW4ocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb2x1bW5FbnVtPFByb3BlcnR5S2V5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIEVudW0gZXh0ZW5kcyBOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eUtleV0+Pihwcm9wZXJ0eTogUHJvcGVydHlLZXksIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkQ29sdW1uRW51bShwcm9wZXJ0eSwgZW51bURlc2MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb2x1bW5VbnNhZmU8Q29sdW1uTW9kZWwgPSBhbnk+KHByb3BlcnR5OiBzdHJpbmcpOiBDb2x1bW5EZXNjcmlwdG9yPENvbHVtbk1vZGVsLCBUYWJsZXZpZXdNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkQ29sdW1uVW5zYWZlKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENvbHVtbnMoLi4ucHJvcGVydGllczogKGtleW9mIFRhYmxldmlld01vZGVsKVtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhDb2x1bW5zKC4uLnByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U29ydChwcm9wZXJ0eTogU29ydHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmdldFNvcnQocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmdldFNvcnRVbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTb3J0KHByb3BlcnR5OiBTb3J0cykge1xuICAgICAgICB0aGlzLl90YWJsZS5yZW1vdmVTb3J0KHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZVNvcnRVbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3J0KHByb3BlcnR5OiBTb3J0cywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZFNvcnQocHJvcGVydHksIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkU29ydFVuc2FmZShwcm9wZXJ0eSwgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU29ydChwcm9wZXJ0eTogU29ydHMsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhTb3J0KHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZS53aXRoU29ydFVuc2FmZShwcm9wZXJ0eSwgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRTb3J0KHByb3BlcnR5OiBTb3J0cywgYXNjZW5kaW5nPzogYm9vbGVhbiwgb3JkZXI/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhEZWZhdWx0U29ydChwcm9wZXJ0eSwgYXNjZW5kaW5nLCBvcmRlciwgZW5hYmxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZywgYXNjZW5kaW5nPzogYm9vbGVhbiwgb3JkZXI/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhEZWZhdWx0U29ydFVuc2FmZShwcm9wZXJ0eSwgYXNjZW5kaW5nLCBvcmRlciwgZW5hYmxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU29ydHMoLi4ucHJvcGVydGllczogU29ydHNbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZS53aXRoU29ydHMoLi4ucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU29ydHNVbnNhZmUoLi4ucHJvcGVydGllczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aFNvcnRzVW5zYWZlKC4uLnByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyKHByb3BlcnR5OiBGaWx0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5nZXRGaWx0ZXIocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuZ2V0RmlsdGVyVW5zYWZlKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyKHByb3BlcnR5OiBGaWx0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUZpbHRlcihwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpbHRlclVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUZpbHRlclVuc2FmZShwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpbHRlcjxGaWx0ZXJNb2RlbCA9IEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCA/IFRhYmxldmlld01vZGVsW0ZpbHRlcnNdIDogbmV2ZXI+KHByb3BlcnR5OiBGaWx0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRGaWx0ZXI8RmlsdGVyTW9kZWw+KHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsID8gTm9uTnVsbGFibGU8VGFibGV2aWV3TW9kZWxbRmlsdGVyc10+IDogbmV2ZXIsIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBwcm9wZXJ0eTogRmlsdGVycyxcbiAgICAgICAgcHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPEZpbHRlck1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgb3B0aW9uc1ZhbHVlUHJvcGVydHk/OiBrZXlvZiBGaWx0ZXJNb2RlbFxuICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyTG9va3VwPEZpbHRlck1vZGVsLCBTZXJ2aWNlPihwcm9wZXJ0eSwgcHJvdmlkZXIsIG9wdGlvbnNWYWx1ZVByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwVW5zYWZlPEZpbHRlck1vZGVsLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihwcm9wZXJ0eTogc3RyaW5nLCBwcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8RmlsdGVyTW9kZWwsIFNlcnZpY2U+LCBvcHRpb25zVmFsdWVQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyTG9va3VwVW5zYWZlPEZpbHRlck1vZGVsLCBTZXJ2aWNlPihwcm9wZXJ0eSwgcHJvdmlkZXIsIG9wdGlvbnNWYWx1ZVByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bTxFbnVtPihwcm9wZXJ0eTogRmlsdGVycywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlckxvb2t1cEVudW08RW51bT4ocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtID0gRW51bUNvbnN0YW50VHlwZT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LCBvcHRpb25zPzogQXJyYXk8RW51bT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlckxvb2t1cEVudW1VbnNhZmU8RW51bT4ocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyRnJvbUNvbHVtbihwcm9wZXJ0eTogRXh0cmFjdDxGaWx0ZXJzLCBrZXlvZiBUYWJsZXZpZXdNb2RlbD4sIGZvcmNlU2ltcGxlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlckZyb21Db2x1bW4ocHJvcGVydHksIGZvcmNlU2ltcGxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpbHRlcnNGcm9tQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiBFeHRyYWN0PEZpbHRlcnMsIGtleW9mIFRhYmxldmlld01vZGVsPltdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhGaWx0ZXJzRnJvbUNvbHVtbnMoLi4ucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsdGVyc0Zyb21Db2x1bW5zVW5zYWZlKC4uLnByb3BlcnRpZXM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhGaWx0ZXJzRnJvbUNvbHVtbnNVbnNhZmUoLi4ucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGZvcmNlU2ltcGxlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmUocHJvcGVydHksIGZvcmNlU2ltcGxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpbHRlcjxGaWx0ZXJNb2RlbD4ocHJvcGVydHk6IEZpbHRlcnMsIGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcjxGaWx0ZXJNb2RlbCwgVGFibGV2aWV3TW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhGaWx0ZXI8RmlsdGVyTW9kZWw+KHByb3BlcnR5LCBmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4oZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4oZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKHByb3BlcnR5OiBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgZWRpdG9yVHlwZTogVGFibGV2aWV3RWRpdG9yVHlwZUVudW0pOiBBRmllbGREZXNjcmlwdG9yPGFueSwgVGFibGV2aWV3TW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgZWRpdG9yVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGVkaXRvclR5cGU6IFRhYmxldmlld0VkaXRvclR5cGVFbnVtKTogQUZpZWxkRGVzY3JpcHRvcjxhbnksIFRhYmxldmlld01vZGVsPiB8IG51bGwge1xuICAgICAgICBzd2l0Y2ggKGVkaXRvclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZWRpdEVkaXRvci5nZXRGaWVsZFVuc2FmZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBjYXNlIFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkRWRpdG9yLmdldEZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGNhc2UgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRGV0YWlsczpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWlsc0VkaXRvci5nZXRGaWVsZFVuc2FmZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBjYXNlIFRhYmxldmlld0VkaXRvclR5cGVFbnVtLk5vbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmllbGQocHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yLnJlbW92ZUZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fYWRkRWRpdG9yLnJlbW92ZUZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5yZW1vdmVGaWVsZFVuc2FmZShwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkRGVzY3JpcHRvcjxGaWVsZE1vZGVsPihmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICB0aGlzLl9hZGRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgdGhpcy5fZWRpdEVkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQ8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRmllbGRNb2RlbCA9IE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+KHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGQ8UHJvcGVydHksIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRVbnNhZmU8RmllbGRNb2RlbCA9IEZpZWxkSW5wdXREZXNjcmlwdG9yVHlwZSwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkVW5zYWZlPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRzKC4uLnByb3BlcnRpZXM6IChrZXlvZiBUYWJsZXZpZXdNb2RlbClbXSk6IHRoaXMge1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCA9PiB0aGlzLmFkZEZpZWxkKHApKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRGaWVsZFRvRWRpdEFuZEFkZDxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbD4oZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgVGFibGV2aWV3TW9kZWwsIEZpZWxkVmFsdWU+KSB7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBsb29rdXAgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsLCB1bmRlZmluZWQsIEZpZWxkVmFsdWU+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXA8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cDxQcm9wZXJ0eSwgTG9va3VwTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCB0eXBlKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbVU5TQUZFXSBBZGRzIGxvb2t1cCBmaWVsZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBVTlNBRkUgYmVjYXVzZSBwcm9wZXJ0eSBpcyBub3QgdHlwZS1jaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE1vZGVsIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwgKGRlZmluZXMgMm5kIGdlbmVyaWMpLlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwTW9kZWwgLSBUaGUgZmllbGQgbW9kZWwgdHlwZSwgZGVmYXVsdHMgdG8gdGhlIG5vbi1udWxsYWJsZSB0eXBlIG9mIHRoZSBlZGl0b3IncyBwcm9wZXJ0eS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgdW5kZWZpbmVkLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwVW5zYWZlPExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlID0gTG9va3VwTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcsIHR5cGU/OiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4pIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwVW5zYWZlPExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZpZWxkIGxvb2t1cCB3aXRoIG9wdGlvbnMgdmFsdWUgcHJvcGVydHkgZm9yIGxvb2t1cCBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8RmllbGRNb2RlbD59IHR5cGUgLSBUaGUgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBUaGUgdmFsdWUgcHJvcGVydHkgdXNlZCBhcyB2YWx1ZSBpbiB0aGUgbG9va3VwIG9wdGlvbnMuXG4gICAgICogQHR5cGVwYXJhbSBQcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIEVkaXRvck1vZGVsLlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwTW9kZWwgLSBUaGUgZmllbGQgbW9kZWwgdHlwZSwgZGVmYXVsdHMgdG8gdGhlIG5vbi1udWxsYWJsZSB0eXBlIG9mIHRoZSBlZGl0b3IncyBwcm9wZXJ0eS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cFZhbHVlUHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgbG9va3VwIG1vZGVsIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIHZhbHVlIHR5cGUgb2YgZmllbGQgb24gZWRpdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCxcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPixcbiAgICAgICAgRmllbGRWYWx1ZSA9IFRhYmxldmlld01vZGVsW1Byb3BlcnR5XVxuICAgID4ocHJvcGVydHk6IFByb3BlcnR5LCB0eXBlOiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4sIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5OiBMb29rdXBWYWx1ZVByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eTxQcm9wZXJ0eSwgTG9va3VwTW9kZWwsIExvb2t1cFZhbHVlUHJvcGVydHksIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbVU5TQUZFXSBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggb3B0aW9ucyB2YWx1ZSBwcm9wZXJ0eSBmb3IgbG9va3VwIG1vZGVsLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIFVOU0FGRSBiZWNhdXNlIHByb3BlcnR5IGlzIG5vdCB0eXBlLWNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgYXMgdmFsdWUgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBWYWx1ZVByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIGxvb2t1cCBtb2RlbCB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsLCB1bmRlZmluZWQsIEZpZWxkVmFsdWU+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHlVbnNhZmU8TG9va3VwTW9kZWwsIEZpZWxkVmFsdWUgPSBOdWxsYWJsZTxJZFR5cGU+PihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eVVuc2FmZTxMb29rdXBNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHR5cGUsIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggYSBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgdG8gdGhlIGVkaXRvciBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBmaWVsZCBsb29rdXAgZGF0YSBwcm92aWRlciBvciBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSBbdHlwZV0gLSBUaGUgdHlwZSBvZiBsb29rdXAgLSBpZiBkYXRhIHByb3ZpZGVyIGlzIHBhc3NlZCBhcyBwcmV2aW91cyBwYXJhbWV0ZXIsIHR5cGUgY2FuIGJlIG9taXR0ZWQuIElmIHNlcnZpY2UgaXMgcHJvdmlkZXIsIHR5cGUgcGFyYW1ldGVyIGlzIHByb3Bvc2VkIGluIGZhdm91ciBvZiBjb3JyZWN0IHR5cGluZy5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gVGhlIGxvb2t1cCBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSBmaWVsZCB2YWx1ZSB0eXBlLCBkZWZhdWx0cyB0byB0aGUgZWRpdG9yJ3MgcHJvcGVydHkgdHlwZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gQ3JlYXRlZCBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXI8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgU2VydmljZSwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcjxQcm9wZXJ0eSwgU2VydmljZSwgTG9va3VwTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCBwcm92aWRlciwgdHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW1VOU0FGRV0gQWRkcyBhIGZpZWxkIGxvb2t1cCB3aXRoIGEgZGF0YSBwcm92aWRlciBvciBzZXJ2aWNlIHRvIHRoZSBlZGl0b3IgbW9kZWwuXG4gICAgICogVGhpcyBtZXRob2QgaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPn0gcHJvdmlkZXIgLSBUaGUgbG9va3VwIHByb3ZpZGVyIG9yIHNlcnZpY2UgZm9yIHRoZSBmaWVsZCBsb29rdXAuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4/fSB0eXBlIC0gT3B0aW9uYWwgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgZmllbGQgbG9va3VwLlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwTW9kZWwgLSBUaGUgZmllbGQgbG9va3VwIG1vZGVsIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gVGhlIGxvb2t1cCBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIHZhbHVlIHR5cGUgb2YgZmllbGQgb24gZWRpdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvciBhZGRlZCB0byB0aGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyVW5zYWZlPExvb2t1cE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlID0gTG9va3VwTW9kZWw+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICB0eXBlPzogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlclVuc2FmZTxMb29rdXBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHByb3ZpZGVyLCB0eXBlKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggZGF0YSBwcm92aWRlciBvciBzZXJ2aWNlIGFuZCBvcHRpb25zIHZhbHVlIHByb3BlcnR5IGZvciBsb29rdXAgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPEZpZWxkTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBsb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFRoZSB2YWx1ZSBwcm9wZXJ0eSB1c2VkIGFzIHZhbHVlIGluIHRoZSBsb29rdXAgb3B0aW9ucy5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBTZXJ2aWNlIC0gVGhlIGxvb2t1cCBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwVmFsdWVQcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiBsb29rdXAgbW9kZWwgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIGFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHk8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsXG4gICAgICAgIFNlcnZpY2UsXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHlcbiAgICApOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5PFByb3BlcnR5LCBTZXJ2aWNlLCBMb29rdXBNb2RlbCwgTG9va3VwVmFsdWVQcm9wZXJ0eSwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW1VOU0FGRV0gQWRkcyBhIGZpZWxkIGxvb2t1cCB3aXRoIGRhdGEgcHJvdmlkZXIgb3Igc2VydmljZSBhbmQgb3B0aW9ucyB2YWx1ZSBwcm9wZXJ0eSBmb3IgbG9va3VwIG1vZGVsLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIFVOU0FGRSBiZWNhdXNlIHByb3BlcnR5IGlzIG5vdCB0eXBlLWNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxGaWVsZE1vZGVsLCBTZXJ2aWNlPn0gcHJvdmlkZXIgLSBUaGUgbG9va3VwIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8RmllbGRNb2RlbD59IHR5cGUgLSBUaGUgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFRoZSB2YWx1ZSBwcm9wZXJ0eSB1c2VkIGluIHRoZSBsb29rdXAgb3B0aW9ucy5cbiAgICAgKiBAdHlwZXBhcmFtIFNlcnZpY2UgLSBUaGUgc2VydmljZSB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwTW9kZWwgLSBUaGUgZmllbGQgbW9kZWwgdHlwZSwgZGVmYXVsdHMgdG8gdGhlIG5vbi1udWxsYWJsZSB0eXBlIG9mIHRoZSBlZGl0b3IncyBwcm9wZXJ0eS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBFZGl0b3JNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIGFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHlVbnNhZmU8U2VydmljZSwgTG9va3VwTW9kZWwsIEZpZWxkVmFsdWUgPSBMb29rdXBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IHN0cmluZ1xuICAgICk6IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHlVbnNhZmU8U2VydmljZSwgTG9va3VwTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW08UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRW51bSBleHRlbmRzIE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPixcbiAgICAgICAgb3B0aW9ucz86IEFycmF5PEVudW0+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cEVudW0ocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0gPSBFbnVtQ29uc3RhbnRUeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5LCBlbnVtRGVzYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbFtdPihwcm9wZXJ0eTogc3RyaW5nLCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRNYW55RWRpdG9yVW5zYWZlPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCB0YWJsZXZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgbWFpblRhYmxlRGVzY3JpcHRvciwgbG9va3VwVGFibGVEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55VG9NYW55RWRpdG9yVW5zYWZlPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsW10+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgbWFpblRhYmxlRGVzY3JpcHRvciwgbG9va3VwVGFibGVEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55VG9NYW55RWRpdG9yV2l0aFByb3ZpZGVyPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICBTZXJ2aWNlLFxuICAgICAgICBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldXG4gICAgPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cERhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2U+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3JXaXRoUHJvdmlkZXI8UHJvcGVydHksIFNlcnZpY2UsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvcldpdGhQcm92aWRlclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbFtdPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yV2l0aFByb3ZpZGVyVW5zYWZlPEZpZWxkTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5jcmVhdGVUYWJHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5jcmVhdGVUYWJHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IuY3JlYXRlVGFiR3JvdXAobmFtZSwgdGl0bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RldGFpbHNFZGl0b3IuY3JlYXRlRmllbGRHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5jcmVhdGVGaWVsZEdyb3VwKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5fZWRpdEVkaXRvci5jcmVhdGVGaWVsZEdyb3VwKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRzLCBGaWx0ZXJzPiB7XG4gICAgICAgIGNvbnN0IHRhYmxldmlldyA9IG5ldyBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgU29ydHMsIEZpbHRlcnM+KHRoaXMuX21vZGVsLmNvcHkoKSk7XG4gICAgICAgIHRhYmxldmlldy5fdGFibGUgPSB0aGlzLl90YWJsZS5jb3B5KCk7XG4gICAgICAgIHRhYmxldmlldy5fZGV0YWlsc0VkaXRvciA9IHRoaXMuX2RldGFpbHNFZGl0b3IuY29weSgpO1xuICAgICAgICB0YWJsZXZpZXcuX2FkZEVkaXRvciA9IHRoaXMuX2FkZEVkaXRvci5jb3B5KCk7XG4gICAgICAgIHRhYmxldmlldy5fZWRpdEVkaXRvciA9IHRoaXMuX2VkaXRFZGl0b3IuY29weSgpO1xuICAgICAgICB0YWJsZXZpZXcuX3RhYmxlVGl0bGUgPSB0aGlzLl90YWJsZVRpdGxlO1xuICAgICAgICB0YWJsZXZpZXcuX2lzTG9jYWxpemVkID0gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgICAgIHJldHVybiB0YWJsZXZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBjb2x1bW4gYW5kIGZpZWxkIHdpdGggY3VzdG9tIHR5cGUsIGZvciBleGFtcGxlIGN1cnJlbmN5XG4gICAgICogaWYgZmllbGQgZXhpc3RzLCBpdCBpcyByZXBsYWNlZFxuICAgICAqIERPIE5PVCBVU0UgV0lUSCBUWVBFUyBXSEVSRSBBUkdTIEFSRSBSRVFVSVJFRCAtIEVSUk9SIFdJTEwgQkUgVEhST1dOXG4gICAgICogZm9yIGVudW0gdXNlIHdpdGhFbnVtVHlwZVxuICAgICAqIGZvciBjdXN0b20gY2xhc3MgdXNlIHdpdGhDbGFzc1R5cGVcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgbmFtZSBvZiBmaWVsZFxuICAgICAqIEBwYXJhbSBjb2x1bW5UeXBlIHJlcXVpcmVkIGNvbHVtbiB0eXBlXG4gICAgICogQHBhcmFtIGZpZWxkVHlwZSBvcHRpb25hbCwgaWYgbm90IHByb3ZpZGVkIGl0IGlzIGNvbnZlcnRlZCBmcm9tIGNvbHVtbiB0eXBlXG4gICAgICogQHBhcmFtIGNvbHVtbkRpc3BsYXlUeXBlIG9wdGlvbmFsXG4gICAgICovXG4gICAgcHVibGljIHdpdGhNb2RpZmllZFR5cGUocHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsLCBjb2x1bW5UeXBlOiBDb2x1bW5UeXBlRW51bSwgZmllbGRUeXBlPzogRmllbGRJbnB1dFR5cGVFbnVtLCBjb2x1bW5EaXNwbGF5VHlwZT86IENvbHVtbkRpc3BsYXlUeXBlRW51bSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoTW9kaWZpZWRUeXBlVW5zYWZlKHByb3BlcnR5IGFzIHN0cmluZywgY29sdW1uVHlwZSwgZmllbGRUeXBlLCBjb2x1bW5EaXNwbGF5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNb2RpZmllZFR5cGVVbnNhZmUocHJvcGVydHk6IHN0cmluZywgY29sdW1uVHlwZTogQ29sdW1uVHlwZUVudW0sIGZpZWxkVHlwZT86IEZpZWxkSW5wdXRUeXBlRW51bSwgY29sdW1uRGlzcGxheVR5cGU/OiBDb2x1bW5EaXNwbGF5VHlwZUVudW0pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgd2l0aE1vZGlmaWVkVHlwZSBjYW5ub3QgYmUgZXhlY3V0ZWQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHl9OiBNb2RlbCB0eXBlIGlzIG5vdCBkZWZpbmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlRW51bS5FbnVtKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoJ0RvIG5vdCB1c2Ugd2l0aCB0eXBlcyB3aGVyZSBhcmdzIGFyZSByZXF1aXJlZCcsIHtuYW1lOiAnVGFibGV2aWV3RGVzY3JpcHRvckVycm9yJ30pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlRGVmID0gZ2V0VGFibGV2aWV3Q2xhc3NBdHRyaWJ1dGVEZWYodGhpcy5tb2RlbC50eXBlKS5maW5kKGF0dHIgPT4gYXR0ci5uYW1lID09PSBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZURlZiAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWVsZFR5cGUgPz89IGdldEZpZWxkSW5wdXRUeXBlRnJvbUNvbHVtblR5cGUoY29sdW1uVHlwZSwgY29sdW1uRGlzcGxheVR5cGUpO1xuICAgICAgICAgICAgYXR0cmlidXRlRGVmLmZpZWxkVHlwZSA9IGZpZWxkVHlwZTtcblxuICAgICAgICAgICAgdGhpcy5fdGFibGUud2l0aENvbHVtbk1vZGlmaWVkVHlwZVVuc2FmZShwcm9wZXJ0eSwgY29sdW1uVHlwZSwgY29sdW1uRGlzcGxheVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdEVkaXRvci53aXRoRmllbGRNb2RpZmllZFR5cGVVbnNhZmUocHJvcGVydHksIGZpZWxkVHlwZSk7XG4gICAgICAgICAgICB0aGlzLl9hZGRFZGl0b3Iud2l0aEZpZWxkTW9kaWZpZWRUeXBlVW5zYWZlKHByb3BlcnR5LCBmaWVsZFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci53aXRoRmllbGRNb2RpZmllZFR5cGVVbnNhZmUocHJvcGVydHksIGZpZWxkVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGNvbHVtbiB3aXRoIGVudW0gdHlwZVxuICAgICAqIGlmIGZpZWxkcyBleGlzdHMsIGl0IGlzIHJlcGxhY2VkXG4gICAgICogQHBhcmFtIHByb3BlcnR5IHByb3BlcnR5IG5hbWVcbiAgICAgKiBAcGFyYW0gZW51bURlc2MgdHlwZSBvZiBlbnVtXG4gICAgICogQHBhcmFtIGZpZWxkVHlwZSB0eXBlIG9mIGZpZWxkLCBvcHRpb25hbCwgZGVmYXVsdCBpcyBUZXh0XG4gICAgICovXG4gICAgcHVibGljIHdpdGhNb2RpZmllZEVudW08UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRW51bSBleHRlbmRzIE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1EZXNjPzogRW51bURlc2NyaXB0b3I8RW51bT4sXG4gICAgICAgIGZpZWxkVHlwZT86IEZpZWxkSW5wdXRUeXBlRW51bVxuICAgICk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoTW9kaWZpZWRFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2MsIGZpZWxkVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNb2RpZmllZEVudW1VbnNhZmU8RW51bSA9IGFueT4ocHJvcGVydHk6IHN0cmluZywgZW51bURlc2M/OiBFbnVtRGVzY3JpcHRvcjxFbnVtPiwgZmllbGRUeXBlPzogRmllbGRJbnB1dFR5cGVFbnVtKTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbC50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYHdpdGhNb2RpZmllZEVudW0gY2Fubm90IGJlIGV4ZWN1dGVkIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5fTogTW9kZWwgdHlwZSBpcyBub3QgZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVEZWYgPSBnZXRUYWJsZXZpZXdDbGFzc0F0dHJpYnV0ZURlZih0aGlzLm1vZGVsLnR5cGUpLmZpbmQoYXR0ciA9PiBhdHRyLm5hbWUgPT09IHByb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlRGVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZURlZi5maWVsZFR5cGUgPSBmaWVsZFR5cGUgPz8gRmllbGRJbnB1dFR5cGVFbnVtLlRleHQ7XG5cbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLndpdGhDb2x1bW5Nb2RpZmllZEVudW1VbnNhZmU8RW51bT4ocHJvcGVydHksIGVudW1EZXNjKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRFZGl0b3Iud2l0aEZpZWxkTW9kaWZpZWRFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5LCBlbnVtRGVzYyk7XG4gICAgICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yLndpdGhGaWVsZE1vZGlmaWVkRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSwgZW51bURlc2MpO1xuICAgICAgICAgICAgdGhpcy5fYWRkRWRpdG9yLndpdGhGaWVsZE1vZGlmaWVkRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSwgZW51bURlc2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGNvbHVtbiB3aXRoIGN1c3RvbSBjbGFzcyB0eXBlXG4gICAgICogZmllbGQgaXMgZ2VuZXJhdGVkIG9ubHkgaWYgbG9va3VwUHJvdmlkZXIgaXMgcHJvdmlkZWRcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgbmFtZVxuICAgICAqIEBwYXJhbSB0eXBlIGNsYXNzIHR5cGUgb2Ygb2JqZWN0XG4gICAgICogQHBhcmFtIHRpdGxlUHJvcGVydHlcbiAgICAgKiBAcGFyYW0gbG9va3VwUHJvdmlkZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0xhYmVsUHJvcGVydHlcbiAgICAgKiBAcGFyYW0gZmlsdGVyUHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1vZGlmaWVkTG9va3VwPExvb2t1cE1vZGVsPihcbiAgICAgICAgcHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICB0eXBlPzogQ2xhc3NUeXBlPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPExvb2t1cE1vZGVsPixcbiAgICAgICAgdGl0bGVQcm9wZXJ0eT86IHN0cmluZyxcbiAgICAgICAgb3B0aW9uc0xhYmVsUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlclByb3BlcnR5Pzogc3RyaW5nXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhNb2RpZmllZExvb2t1cFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIHR5cGUsIGxvb2t1cFByb3ZpZGVyLCB0aXRsZVByb3BlcnR5LCBvcHRpb25zTGFiZWxQcm9wZXJ0eSwgZmlsdGVyUHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTW9kaWZpZWRMb29rdXBVbnNhZmU8TG9va3VwTW9kZWw+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0eXBlPzogQ2xhc3NUeXBlPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPExvb2t1cE1vZGVsPixcbiAgICAgICAgdGl0bGVQcm9wZXJ0eT86IHN0cmluZyxcbiAgICAgICAgb3B0aW9uc0xhYmVsUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlclByb3BlcnR5Pzogc3RyaW5nXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbC50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYHdpdGhNb2RpZmllZExvb2t1cCBjYW5ub3QgYmUgZXhlY3V0ZWQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHl9OiBNb2RlbCB0eXBlIGlzIG5vdCBkZWZpbmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlRGVmID0gZ2V0VGFibGV2aWV3Q2xhc3NBdHRyaWJ1dGVEZWYodGhpcy5tb2RlbC50eXBlKS5maW5kKGF0dHIgPT4gYXR0ci5uYW1lID09PSBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZURlZiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eXBlID8/PSBhdHRyaWJ1dGVEZWYuY2xhc3NUeXBlID8/IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kVHlwZShhdHRyaWJ1dGVEZWYudHlwZSk7XG4gICAgICAgICAgICB0aXRsZVByb3BlcnR5ID8/PSB0eXBlID8gZmluZENsYXNzVGl0bGVBdHRyaWJ1dGUodHlwZSkgPz8gdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0aW9uc0xhYmVsUHJvcGVydHkgPz89IHRpdGxlUHJvcGVydHk7XG4gICAgICAgICAgICBhdHRyaWJ1dGVEZWYuY29sdW1uVHlwZSA9IENvbHVtblR5cGVFbnVtLlN0cmluZztcbiAgICAgICAgICAgIGF0dHJpYnV0ZURlZi5maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uVGV4dDtcblxuICAgICAgICAgICAgaWYgKGxvb2t1cFByb3ZpZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJsZS53aXRoQ29sdW1uTW9kaWZpZWRMb29rdXBVbnNhZmUocHJvcGVydHksIGxvb2t1cFByb3ZpZGVyLCBvcHRpb25zTGFiZWxQcm9wZXJ0eSwgZmlsdGVyUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZEVkaXRvci53aXRoRmllbGRNb2RpZmllZExvb2t1cFdpdGhQcm92aWRlclVuc2FmZShwcm9wZXJ0eSwgbG9va3VwUHJvdmlkZXIsIG9wdGlvbnNMYWJlbFByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yLndpdGhGaWVsZE1vZGlmaWVkTG9va3VwV2l0aFByb3ZpZGVyVW5zYWZlKHByb3BlcnR5LCBsb29rdXBQcm92aWRlciwgb3B0aW9uc0xhYmVsUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VkaXRFZGl0b3Iud2l0aEZpZWxkTW9kaWZpZWRMb29rdXBXaXRoUHJvdmlkZXJVbnNhZmUocHJvcGVydHksIGxvb2t1cFByb3ZpZGVyLCBvcHRpb25zTGFiZWxQcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX3RhYmxlLmdldENvbHVtblVuc2FmZShwcm9wZXJ0eSkgPz8gdGhpcy5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZVByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aXRoR2V0dGVyKHZhbHVlID0+IHZhbHVlPy5bdGl0bGVQcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9jYWxpemVkPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIExvY2FsaXphdGlvbk1vZGVsID0gQXJyYXlJdGVtVHlwZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+PihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtb2RlbDogTW9kZWxEZXNjcmlwdG9yPExvY2FsaXphdGlvbk1vZGVsPixcbiAgICAgICAgbG9jYWxlUHJvcGVydHk6IGtleW9mIExvY2FsaXphdGlvbk1vZGVsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIG1vZGVsLCBsb2NhbGVQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2NhbGl6ZWRVbnNhZmU8TG9jYWxpemF0aW9uTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8TG9jYWxpemF0aW9uTW9kZWw+LCBsb2NhbGVQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuZGV0YWlsc0VkaXRvci5sb2NhbGl6ZWRVbnNhZmUocHJvcGVydHksIG1vZGVsLCBsb2NhbGVQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRWRpdG9yLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSwgbW9kZWwsIGxvY2FsZVByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5lZGl0RWRpdG9yLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSwgbW9kZWwsIGxvY2FsZVByb3BlcnR5KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZXZpZXdEZXNjcmlwdG9yIGV4dGVuZHMgVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8YW55PiB7XG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihNb2RlbERlc2NyaXB0b3IuY3JlYXRlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPFRhYmxldmlld01vZGVsLCBTb3J0UHJvcGVydHkgPSBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRmlsdGVyUHJvcGVydHkgPSBrZXlvZiBUYWJsZXZpZXdNb2RlbD4oXG4gICAgICAgIGlkUHJvcGVydHk/OiBrZXlvZiBUYWJsZXZpZXdNb2RlbCxcbiAgICAgICAgdGl0bGVQcm9wZXJ0eT86IGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICBpMThuQmFzZUtleT86IHN0cmluZyB8IENsYXNzVHlwZTx1bmtub3duPlxuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBTb3J0UHJvcGVydHksIEZpbHRlclByb3BlcnR5PiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRQcm9wZXJ0eSwgRmlsdGVyUHJvcGVydHk+KE1vZGVsRGVzY3JpcHRvci5jcmVhdGU8VGFibGV2aWV3TW9kZWw+KGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHksIGkxOG5CYXNlS2V5KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ2xhc3M8VGFibGV2aWV3TW9kZWwsIFNvcnRQcm9wZXJ0eSA9IGtleW9mIFRhYmxldmlld01vZGVsLCBGaWx0ZXJQcm9wZXJ0eSA9IGtleW9mIFRhYmxldmlld01vZGVsPihcbiAgICAgICAgdHlwZTogQ2xhc3NUeXBlPFRhYmxldmlld01vZGVsPixcbiAgICAgICAgaWRQcm9wZXJ0eT86IGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICB0aXRsZVByb3BlcnR5Pzoga2V5b2YgVGFibGV2aWV3TW9kZWwsXG4gICAgICAgIGkxOG5CYXNlS2V5PzogQ2xhc3NUeXBlPHVua25vd24+IHwgc3RyaW5nXG4gICAgKTogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRQcm9wZXJ0eSwgRmlsdGVyUHJvcGVydHk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgU29ydFByb3BlcnR5LCBGaWx0ZXJQcm9wZXJ0eT4oTW9kZWxEZXNjcmlwdG9yLmZyb21DbGFzcyh0eXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBpMThuQmFzZUtleSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU1vZGVsPFRhYmxldmlld01vZGVsLCBTb3J0UHJvcGVydHkgPSBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRmlsdGVyUHJvcGVydHkgPSBrZXlvZiBUYWJsZXZpZXdNb2RlbD4oXG4gICAgICAgIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8VGFibGV2aWV3TW9kZWw+XG4gICAgKTogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRQcm9wZXJ0eSwgRmlsdGVyUHJvcGVydHk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgU29ydFByb3BlcnR5LCBGaWx0ZXJQcm9wZXJ0eT4obW9kZWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlcyBkZXNjcmlwdG9yIGZyb20gYXR0cmlidXRlIGRlZmluaXRpb24gb2Ygb3BlbmFwaSBtb2RlbFxuICAgICAqIEBwYXJhbSB0eXBlIGNsYXNzIHR5cGVcbiAgICAgKiBAcGFyYW0gaWRQcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0aXRsZVByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ2xhc3NXaXRoQXV0b0F0dHJzRGVmPFRhYmxldmlld01vZGVsPihcbiAgICAgICAgdHlwZTogQ2xhc3NUeXBlPFRhYmxldmlld01vZGVsPixcbiAgICAgICAgaWRQcm9wZXJ0eT86IGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICB0aXRsZVByb3BlcnR5Pzoga2V5b2YgVGFibGV2aWV3TW9kZWxcbiAgICApOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IE1vZGVsRGVzY3JpcHRvci5mcm9tQ2xhc3ModHlwZSwgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBUYWJsZXZpZXdEZXNjcmlwdG9yLmZyb21Nb2RlbChtb2RlbCk7XG4gICAgICAgIGRlc2NyaXB0b3Iud2l0aFRhYmxlRGVzY3JpcHRvcihUYWJsZURlc2NyaXB0b3IuZnJvbUNsYXNzV2l0aEF1dG9BdHRyc0RlZih0eXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5KSk7XG4gICAgICAgIGRlc2NyaXB0b3Iud2l0aEVkaXREZXNjcmlwdG9yKEVkaXRvckRlc2NyaXB0b3IuZnJvbUNsYXNzV2l0aEF1dG9BdHRyc0RlZih0eXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KSk7XG4gICAgICAgIGRlc2NyaXB0b3Iud2l0aERldGFpbHNEZXNjcmlwdG9yKEVkaXRvckRlc2NyaXB0b3IuZnJvbUNsYXNzV2l0aEF1dG9BdHRyc0RlZih0eXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKS53aXRoRGlzYWJsZWQoKSk7XG4gICAgICAgIGRlc2NyaXB0b3Iud2l0aEFkZERlc2NyaXB0b3IoRWRpdG9yRGVzY3JpcHRvci5mcm9tQ2xhc3NXaXRoQXV0b0F0dHJzRGVmKHR5cGUsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHksIFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCkpO1xuXG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdlbmVyYXRlcyBkZXNjcmlwdG9yIGZyb20gZ2l2ZW4gYXR0cmlidXRlIGRlZmluaXRpb25cbiAgICAgKiBAcGFyYW0gdHlwZSBjbGFzcyB0eXBlXG4gICAgICogQHBhcmFtIGNvbHVtbkF0dHJpYnV0ZXMgYXR0cmlidXRlIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgY29sdW1uc1xuICAgICAqIEBwYXJhbSBmaWVsZEF0dHJpYnV0ZXMgYXR0cmlidXRlIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgZmllbGRzLCBpZiB1bmRlZmluZWQgY29sdW1uRGVmaW5pdGlvbiBpcyB1c2VkLCBpZiBudWxsIGVkaXRvcnMgYXJlIG5vdCBnZW5lcmF0ZWRcbiAgICAgKiBAcGFyYW0gaWRQcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0aXRsZVByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ2xhc3NXaXRoQ3VzdG9tQXR0cnNEZWY8VGFibGV2aWV3TW9kZWw+KFxuICAgICAgICB0eXBlOiBDbGFzc1R5cGU8VGFibGV2aWV3TW9kZWw+LFxuICAgICAgICBjb2x1bW5BdHRyaWJ1dGVzOiBUYWJsZXZpZXdDbGFzc0F0dHJpYnV0ZURlZltdLFxuICAgICAgICBmaWVsZEF0dHJpYnV0ZXM/OiBUYWJsZXZpZXdDbGFzc0F0dHJpYnV0ZURlZltdIHwgbnVsbCxcbiAgICAgICAgaWRQcm9wZXJ0eT86IGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICB0aXRsZVByb3BlcnR5Pzoga2V5b2YgVGFibGV2aWV3TW9kZWxcbiAgICApOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbD4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gVGFibGV2aWV3RGVzY3JpcHRvci5mcm9tTW9kZWwoTW9kZWxEZXNjcmlwdG9yLmZyb21DbGFzcyh0eXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5KSk7XG4gICAgICAgIGRlc2NyaXB0b3Iud2l0aFRhYmxlRGVzY3JpcHRvcihUYWJsZURlc2NyaXB0b3IuZnJvbUNsYXNzV2l0aEN1c3RvbUF0dHJzRGVmKHR5cGUsIGNvbHVtbkF0dHJpYnV0ZXMsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHkpKTtcblxuICAgICAgICBpZiAoZmllbGRBdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLndpdGhFZGl0RGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICBFZGl0b3JEZXNjcmlwdG9yLmZyb21DbGFzc1dpdGhDdXN0b21BdHRyc0RlZih0eXBlLCBmaWVsZEF0dHJpYnV0ZXMgPz8gY29sdW1uQXR0cmlidXRlcywgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLndpdGhEZXRhaWxzRGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICBFZGl0b3JEZXNjcmlwdG9yLmZyb21DbGFzc1dpdGhDdXN0b21BdHRyc0RlZih0eXBlLCBmaWVsZEF0dHJpYnV0ZXMgPz8gY29sdW1uQXR0cmlidXRlcywgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRGV0YWlscylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLndpdGhBZGREZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIEVkaXRvckRlc2NyaXB0b3IuZnJvbUNsYXNzV2l0aEN1c3RvbUF0dHJzRGVmKHR5cGUsIGZpZWxkQXR0cmlidXRlcyA/PyBjb2x1bW5BdHRyaWJ1dGVzLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5BZGQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGV2aWV3RHluYW1pY0Rlc2NyaXB0b3JJbnQgZXh0ZW5kcyBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxhbnk+IHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3RhYmxlOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdDtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPGFueT4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwpO1xuICAgICAgICB0aGlzLl90YWJsZSA9IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3IuZnJvbU1vZGVsKHRoaXMubW9kZWwpO1xuICAgICAgICB0aGlzLl90YWJsZVRpdGxlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXRzIGN1c3RvbSB0YWJsZSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFRhYmxlRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZSA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgdmlzaWJpbGl0eSBoaWRkZW4gc3RhdGUgdG8gY29sdW1uIHdpdGggZ2l2ZW4gcHJvcGVydHlcbiAgICAgKiBlcXVhbHMgdG8gYmUgcmVtb3ZpbmcgaW4gYXV0byBhbmQgYmFzZSB0YWJsZXZpZXcgZGVzY3JpcHRvclxuICAgICAqICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbW92ZUNvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUNvbHVtbihwcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRW50aXR5Rm9yVHJhbnNsYXRpb25zKGkxOG5CYXNlS2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUubW9kZWwud2l0aEkxOG5CYXNlKGkxOG5CYXNlS2V5KTtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5tb2RlbC53aXRoSTE4bkJhc2UoaTE4bkJhc2VLZXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZXZpZXcgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZXZpZXdEeW5hbWljRGVzY3JpcHRvckludCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGV2aWV3RHluYW1pY0Rlc2NyaXB0b3JJbnQodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICBkZXNjcmlwdG9yLl90YWJsZSA9IHRoaXMuX3RhYmxlLmNvcHkoKTtcbiAgICAgICAgZGVzY3JpcHRvci5fdGFibGVUaXRsZSA9IHRoaXMuX3RhYmxlVGl0bGU7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxldmlld0R5bmFtaWNEZXNjcmlwdG9yIGV4dGVuZHMgVGFibGV2aWV3RHluYW1pY0Rlc2NyaXB0b3JJbnQge1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoTW9kZWxEZXNjcmlwdG9yLmNyZWF0ZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nLCBpMThuQmFzZUtleT86IHN0cmluZyB8IENsYXNzVHlwZTxhbnk+KTogVGFibGV2aWV3RHluYW1pY0Rlc2NyaXB0b3JJbnQge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxldmlld0R5bmFtaWNEZXNjcmlwdG9ySW50KE1vZGVsRGVzY3JpcHRvci5jcmVhdGU8YW55PihpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBpMThuQmFzZUtleSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU1vZGVsKG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8YW55Pik6IFRhYmxldmlld0R5bmFtaWNEZXNjcmlwdG9ySW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZXZpZXdEeW5hbWljRGVzY3JpcHRvckludChtb2RlbCk7XG4gICAgfVxufVxuIl19
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGV2aWV3LmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvYXBpL3NyYy90YWJsZXZpZXcvZGVzY3JpcHRvcnMvdGFibGV2aWV3LmRlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFnRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRWhLLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBT2hGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBR3pFLE1BQU0sT0FBTyx1QkFBdUI7SUFpQmhDLFlBQW1CLEtBQXNDO1FBRi9DLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBaUMsS0FBSyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxPQUFPLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLG9CQUFvQixDQUFvQyxLQUFLLEVBQUUsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksb0JBQW9CLENBQW9DLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksb0JBQW9CLENBQW9DLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lB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LEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFvQixLQUFLO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ2EsbUJBQW1CLENBQUMsVUFBc0M7UUFDdEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDYSxZQUFZLENBQUMsUUFBZ0I7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLHlCQUF5QixDQUFDLFdBQW1CO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ2EsSUFBSTtRQUNoQixNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUE2QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RSxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFDLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXJyYXlJdGVtVHlwZSwgRW51bUNvbnN0YW50VHlwZSwgSUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxldmlld0Rlc2NyaXB0b3IsIElkVHlwZSwgS2V5b2ZBbmRPZlR5cGUsIE51bGxhYmxlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2ZpbHRlcic7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3IsIFR5cGVEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL21vZGVsJztcbmltcG9ydCB7Q29sdW1uRGVzY3JpcHRvciwgSUNvbHVtbnNNYW5hZ2VJbnRlcmZhY2UsIElUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdCwgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3R9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGUvYXBpJztcblxuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9ySW5zdH0gZnJvbSAnLi4vLi4vZWRpdG9yL2Rlc2NyaXB0b3JzL2VkaXRvci5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRBY3Rpb25EZXNjcmlwdG9yfSBmcm9tICcuLi8uLi9lZGl0b3IvZGVzY3JpcHRvcnMvZmllbGQtYWN0aW9uLmRlc2NyaXB0b3InO1xuaW1wb3J0IHtBRmllbGREZXNjcmlwdG9yfSBmcm9tICcuLi8uLi9lZGl0b3IvZGVzY3JpcHRvcnMvZmllbGQtYmFzZS5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRMb29rdXBEZXNjcmlwdG9yLCBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZX0gZnJvbSAnLi4vLi4vZWRpdG9yL2Rlc2NyaXB0b3JzL2ZpZWxkLWxvb2t1cC5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvck9wdHNUeXBlfSBmcm9tICcuLi8uLi9lZGl0b3IvZGVzY3JpcHRvcnMvZmllbGQtdmFsaWRhdGlvbi5kZXNjcmlwdG9yJztcbmltcG9ydCB7RmllbGRJbnB1dERlc2NyaXB0b3JUeXBlfSBmcm9tICcuLi8uLi9lZGl0b3IvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvcic7XG5pbXBvcnQge0lGaWVsZHNNYW5hZ2VJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2VkaXRvci9tb2RlbHMvZWRpdG9yLWZpZWxkcy5tb2RlbCc7XG5pbXBvcnQge1RhYmxldmlld0VkaXRvclR5cGVFbnVtfSBmcm9tICcuLi8uLi9lZGl0b3IvbW9kZWxzL2VkaXRvci5tb2RlbCc7XG5pbXBvcnQge0Zvcm1WYWxpZGF0aW9uTWVzc2FnZSwgRm9ybVZhbGlkYXRvcn0gZnJvbSAnLi4vLi4vZWRpdG9yL21vZGVscy9maWVsZC12YWxpZGF0aW9uLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBTb3J0cyA9IGtleW9mIFRhYmxldmlld01vZGVsLCBGaWx0ZXJzID0ga2V5b2YgVGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsID0gdW5kZWZpbmVkPlxuICAgIGltcGxlbWVudHNcbiAgICAgICAgSVRhYmxldmlld0Rlc2NyaXB0b3I8VGFibGV2aWV3TW9kZWwsIFNvcnRzLCBGaWx0ZXJzLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgICAgIElDb2x1bW5zTWFuYWdlSW50ZXJmYWNlPFRhYmxldmlld01vZGVsLCBTb3J0cywgRmlsdGVycz4sXG4gICAgICAgIElGaWVsZHNNYW5hZ2VJbnRlcmZhY2U8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPlxue1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VGFibGV2aWV3TW9kZWw+O1xuXG4gICAgcHJvdGVjdGVkIF90YWJsZTogVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgU29ydHMsIEZpbHRlcnM+O1xuICAgIHByb3RlY3RlZCBfZGV0YWlsc0VkaXRvcjogRWRpdG9yRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPjtcbiAgICBwcm90ZWN0ZWQgX2FkZEVkaXRvcjogRWRpdG9yRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPjtcbiAgICBwcm90ZWN0ZWQgX2VkaXRFZGl0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD47XG5cbiAgICBwcm90ZWN0ZWQgX3RhYmxlVGl0bGU/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2lzTG9jYWxpemVkID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUYWJsZXZpZXdNb2RlbD4pIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fdGFibGUgPSBuZXcgVGFibGVEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgU29ydHMsIEZpbHRlcnM+KG1vZGVsKTtcbiAgICAgICAgdGhpcy5fdGFibGVUaXRsZSA9IGAke3RoaXMuX21vZGVsLmkxOG5CYXNlS2V5fS5uYW1lYDtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvciA9IG5ldyBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KG1vZGVsLCBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKTtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgdGhpcy5fYWRkRWRpdG9yID0gbmV3IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4obW9kZWwsIFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCk7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IgPSBuZXcgRWRpdG9yRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPihtb2RlbCwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV0YWlsc0VkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbHNFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhZGRFZGl0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0RWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxlVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZVRpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNMb2NhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhYmxlRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBTb3J0cywgRmlsdGVycz4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUgPSBkZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvckRlc2NyaXB0b3JzKGRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IgPSBkZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9hZGRFZGl0b3IgPSBkZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERldGFpbHNEZXNjcmlwdG9yKGRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFRhYmxldmlld01vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWRkRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUYWJsZXZpZXdNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdERlc2NyaXB0b3IoZGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBuZXcgY29weSBvZiBlZGl0b3IgZGVzY3JpcHRvciBhbmQgbWFrZXMgaXQgZGlzYWJsZWRcbiAgICAgKiB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCB0aGlzOjp3aXRoRWRpdG9yRGVzY3JpcHRvcnMsIHdoZXJlIGRldGFpbHNEZXNjcmlwdG9yIGlzIG1hZGUgbm9uLWRpc2FibGVkXG4gICAgICogQHBhcmFtIHR5cGUgd2hpY2ggZWRpdG9yIHR5cGUgdG8gc2V0IHRvIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZEVkaXRvckRlc2NyaXB0b3IodHlwZSA9IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkRldGFpbHMpOiB0aGlzIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRFZGl0b3IgPSB0aGlzLl9lZGl0RWRpdG9yLmNvcHkoKS53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yID0gdGhpcy5fZGV0YWlsc0VkaXRvci5jb3B5KCkud2l0aERpc2FibGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRFZGl0b3IgPSB0aGlzLl9hZGRFZGl0b3IuY29weSgpLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGFibGVUaXRsZSh0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0aW9uPFZhbHVlID0gVGFibGV2aWV3TW9kZWw+KFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGV4cHJlc3Npb246IEZvcm1WYWxpZGF0b3I8VmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICAgICAgbWVzc2FnZT86IEZvcm1WYWxpZGF0aW9uTWVzc2FnZTxWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+LFxuICAgICAgICBvcHRzPzogRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvck9wdHNUeXBlPGtleW9mIFRhYmxldmlld01vZGVsPlxuICAgICk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoVmFsaWRhdGlvblVuc2FmZShuYW1lLCBleHByZXNzaW9uLCBtZXNzYWdlLCBvcHRzIGFzIEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3JPcHRzVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0aW9uVW5zYWZlPFZhbHVlID0gVGFibGV2aWV3TW9kZWw+KFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGV4cHJlc3Npb246IEZvcm1WYWxpZGF0b3I8VmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICAgICAgbWVzc2FnZT86IEZvcm1WYWxpZGF0aW9uTWVzc2FnZTxWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+LFxuICAgICAgICBvcHRzPzogRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvck9wdHNUeXBlXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RldGFpbHNFZGl0b3Iud2l0aFZhbGlkYXRpb25VbnNhZmU8VmFsdWU+KG5hbWUsIGV4cHJlc3Npb24sIG1lc3NhZ2UsIG9wdHMpO1xuICAgICAgICB0aGlzLl9hZGRFZGl0b3Iud2l0aFZhbGlkYXRpb25VbnNhZmU8VmFsdWU+KG5hbWUsIGV4cHJlc3Npb24sIG1lc3NhZ2UsIG9wdHMpO1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yLndpdGhWYWxpZGF0aW9uVW5zYWZlPFZhbHVlPihuYW1lLCBleHByZXNzaW9uLCBtZXNzYWdlLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbihwcm9wZXJ0eToga2V5b2YgVGFibGV2aWV3TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmdldENvbHVtbihwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtblVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5nZXRDb2x1bW5VbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVDb2x1bW4ocHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUNvbHVtbihwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUNvbHVtblVuc2FmZShwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDb2x1bW48Q29sdW1uTW9kZWwsIENvbHVtblZhbHVlID0gQ29sdW1uTW9kZWw+KGNvbHVtbjogQ29sdW1uRGVzY3JpcHRvcjxDb2x1bW5Nb2RlbCwgVGFibGV2aWV3TW9kZWwsIENvbHVtblZhbHVlPik6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZS53aXRoQ29sdW1uPENvbHVtbk1vZGVsLCBDb2x1bW5WYWx1ZT4oY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsPihwcm9wZXJ0eTogUHJvcGVydHkpOiBDb2x1bW5EZXNjcmlwdG9yPE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sIFRhYmxldmlld01vZGVsLCBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZENvbHVtbihwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbkVudW08UHJvcGVydHlLZXkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCwgRW51bSBleHRlbmRzIE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5S2V5XT4+KHByb3BlcnR5OiBQcm9wZXJ0eUtleSwgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRDb2x1bW5FbnVtKHByb3BlcnR5LCBlbnVtRGVzYyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtblVuc2FmZTxDb2x1bW5Nb2RlbCA9IGFueT4ocHJvcGVydHk6IHN0cmluZyk6IENvbHVtbkRlc2NyaXB0b3I8Q29sdW1uTW9kZWwsIFRhYmxldmlld01vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29sdW1ucyguLi5wcm9wZXJ0aWVzOiAoa2V5b2YgVGFibGV2aWV3TW9kZWwpW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aENvbHVtbnMoLi4ucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTb3J0KHByb3BlcnR5OiBTb3J0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuZ2V0U29ydChwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNvcnRVbnNhZmUocHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuZ2V0U29ydFVuc2FmZShwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVNvcnQocHJvcGVydHk6IFNvcnRzKSB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZVNvcnQocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fdGFibGUucmVtb3ZlU29ydFVuc2FmZShwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvcnQocHJvcGVydHk6IFNvcnRzLCBpc0RlZmF1bHQgPSBmYWxzZSwgYXNjZW5kaW5nPzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkU29ydChwcm9wZXJ0eSwgaXNEZWZhdWx0LCBhc2NlbmRpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRTb3J0VW5zYWZlKHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTb3J0KHByb3BlcnR5OiBTb3J0cywgaXNEZWZhdWx0ID0gZmFsc2UsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aFNvcnQocHJvcGVydHksIGlzRGVmYXVsdCwgYXNjZW5kaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTb3J0VW5zYWZlKHByb3BlcnR5OiBzdHJpbmcsIGlzRGVmYXVsdCA9IGZhbHNlLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhTb3J0VW5zYWZlKHByb3BlcnR5LCBpc0RlZmF1bHQsIGFzY2VuZGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFNvcnQocHJvcGVydHk6IFNvcnRzLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aERlZmF1bHRTb3J0KHByb3BlcnR5LCBhc2NlbmRpbmcsIG9yZGVyLCBlbmFibGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0U29ydFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBhc2NlbmRpbmc/OiBib29sZWFuLCBvcmRlcj86IG51bWJlciwgZW5hYmxlZD86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aERlZmF1bHRTb3J0VW5zYWZlKHByb3BlcnR5LCBhc2NlbmRpbmcsIG9yZGVyLCBlbmFibGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTb3J0cyguLi5wcm9wZXJ0aWVzOiBTb3J0c1tdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLndpdGhTb3J0cyguLi5wcm9wZXJ0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTb3J0c1Vuc2FmZSguLi5wcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZS53aXRoU29ydHNVbnNhZmUoLi4ucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXIocHJvcGVydHk6IEZpbHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmdldEZpbHRlcihwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlclVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5nZXRGaWx0ZXJVbnNhZmUocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWx0ZXIocHJvcGVydHk6IEZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5fdGFibGUucmVtb3ZlRmlsdGVyKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fdGFibGUucmVtb3ZlRmlsdGVyVW5zYWZlKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsdGVyPEZpbHRlck1vZGVsID0gRmlsdGVycyBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsID8gVGFibGV2aWV3TW9kZWxbRmlsdGVyc10gOiBuZXZlcj4ocHJvcGVydHk6IEZpbHRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlcjxGaWx0ZXJNb2RlbD4ocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJVbnNhZmU8RmlsdGVyTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlLmFkZEZpbHRlclVuc2FmZTxGaWx0ZXJNb2RlbD4ocHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXA8RmlsdGVyTW9kZWwgPSBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwgPyBOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtGaWx0ZXJzXT4gOiBuZXZlciwgU2VydmljZSA9IHVuZGVmaW5lZD4oXG4gICAgICAgIHByb3BlcnR5OiBGaWx0ZXJzLFxuICAgICAgICBwcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8RmlsdGVyTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eT86IGtleW9mIEZpbHRlck1vZGVsXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRGaWx0ZXJMb29rdXA8RmlsdGVyTW9kZWwsIFNlcnZpY2U+KHByb3BlcnR5LCBwcm92aWRlciwgb3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBVbnNhZmU8RmlsdGVyTW9kZWwsIFNlcnZpY2UgPSB1bmRlZmluZWQ+KHByb3BlcnR5OiBzdHJpbmcsIHByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxGaWx0ZXJNb2RlbCwgU2VydmljZT4sIG9wdGlvbnNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5hZGRGaWx0ZXJMb29rdXBVbnNhZmU8RmlsdGVyTW9kZWwsIFNlcnZpY2U+KHByb3BlcnR5LCBwcm92aWRlciwgb3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBFbnVtPEVudW0+KHByb3BlcnR5OiBGaWx0ZXJzLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyTG9va3VwRW51bTxFbnVtPihwcm9wZXJ0eSwgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJMb29rdXBFbnVtVW5zYWZlPEVudW0gPSBFbnVtQ29uc3RhbnRUeXBlPihwcm9wZXJ0eTogc3RyaW5nLCBlbnVtRGVzYzogRW51bURlc2NyaXB0b3I8RW51bT4sIG9wdGlvbnM/OiBBcnJheTxFbnVtPikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyTG9va3VwRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSwgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWx0ZXJGcm9tQ29sdW1uKHByb3BlcnR5OiBFeHRyYWN0PEZpbHRlcnMsIGtleW9mIFRhYmxldmlld01vZGVsPiwgZm9yY2VTaW1wbGUgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyRnJvbUNvbHVtbihwcm9wZXJ0eSwgZm9yY2VTaW1wbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsdGVyc0Zyb21Db2x1bW5zKC4uLnByb3BlcnRpZXM6IEV4dHJhY3Q8RmlsdGVycywga2V5b2YgVGFibGV2aWV3TW9kZWw+W10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aEZpbHRlcnNGcm9tQ29sdW1ucyguLi5wcm9wZXJ0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWx0ZXJzRnJvbUNvbHVtbnNVbnNhZmUoLi4ucHJvcGVydGllczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aEZpbHRlcnNGcm9tQ29sdW1uc1Vuc2FmZSguLi5wcm9wZXJ0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpbHRlckZyb21Db2x1bW5VbnNhZmUocHJvcGVydHk6IHN0cmluZywgZm9yY2VTaW1wbGUgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGUuYWRkRmlsdGVyRnJvbUNvbHVtblVuc2FmZShwcm9wZXJ0eSwgZm9yY2VTaW1wbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsdGVyPEZpbHRlck1vZGVsPihwcm9wZXJ0eTogRmlsdGVycywgZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yPEZpbHRlck1vZGVsLCBUYWJsZXZpZXdNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aEZpbHRlcjxGaWx0ZXJNb2RlbD4ocHJvcGVydHksIGZpbHRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3I8RmlsdGVyTW9kZWwsIFRhYmxldmlld01vZGVsPik6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZS53aXRoRmlsdGVyVW5zYWZlPEZpbHRlck1vZGVsPihmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmllbGQocHJvcGVydHk6IGtleW9mIFRhYmxldmlld01vZGVsLCBlZGl0b3JUeXBlOiBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIGVkaXRvclR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nLCBlZGl0b3JUeXBlOiBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bSk6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBUYWJsZXZpZXdNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWw+IHwgbnVsbCB7XG4gICAgICAgIHN3aXRjaCAoZWRpdG9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lZGl0RWRpdG9yLmdldEZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGNhc2UgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRFZGl0b3IuZ2V0RmllbGRVbnNhZmUocHJvcGVydHkpO1xuICAgICAgICAgICAgY2FzZSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXRhaWxzRWRpdG9yLmdldEZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGNhc2UgVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uTm9uZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eToga2V5b2YgVGFibGV2aWV3TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGaWVsZFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWVsZFVuc2FmZShwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IucmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9hZGRFZGl0b3IucmVtb3ZlRmllbGRVbnNhZmUocHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9kZXRhaWxzRWRpdG9yLnJlbW92ZUZpZWxkVW5zYWZlKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsPihmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgdGhpcy5fYWRkRWRpdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIEZpZWxkTW9kZWwgPSBOb25OdWxsYWJsZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPihwcm9wZXJ0eTogUHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkVW5zYWZlPEZpZWxkTW9kZWwgPSBGaWVsZElucHV0RGVzY3JpcHRvclR5cGUsIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsPihwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZFVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkcyguLi5wcm9wZXJ0aWVzOiAoa2V5b2YgVGFibGV2aWV3TW9kZWwpW10pOiB0aGlzIHtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHAgPT4gdGhpcy5hZGRGaWVsZChwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZEFjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpOiBGaWVsZEFjdGlvbkRlc2NyaXB0b3I8VGFibGV2aWV3TW9kZWwsIFBhcmVudEVkaXRvck1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZEFjdGlvbihhY3Rpb25OYW1lKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZpZWxkVG9FZGl0QW5kQWRkPEZpZWxkTW9kZWwsIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsPihmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+KSB7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICB0aGlzLl9lZGl0RWRpdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBsb29rdXAgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsLCB1bmRlZmluZWQsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIExvb2t1cE1vZGVsID0gTm9uTnVsbGFibGU8VGFibGV2aWV3TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgdHlwZT86IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRMb29rdXA8UHJvcGVydHksIExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW1VOU0FGRV0gQWRkcyBsb29rdXAgZmllbGQuXG4gICAgICogVGhpcyBtZXRob2QgaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBNb2RlbCBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8RmllbGRNb2RlbD59IHR5cGUgLSBUaGUgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9va3VwIG1vZGVsIChkZWZpbmVzIDJuZCBnZW5lcmljKS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIHZhbHVlIHR5cGUgb2YgZmllbGQgb24gZWRpdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZSwgUGFyZW50RWRpdG9yTW9kZWw+fSAtIFRoZSBmaWVsZCBsb29rdXAgZGVzY3JpcHRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBVbnNhZmU8TG9va3VwTW9kZWwsIEZpZWxkVmFsdWUgPSBMb29rdXBNb2RlbD4ocHJvcGVydHk6IHN0cmluZywgdHlwZT86IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRMb29rdXBVbnNhZmU8TG9va3VwTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCB0eXBlKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggb3B0aW9ucyB2YWx1ZSBwcm9wZXJ0eSBmb3IgbG9va3VwIG1vZGVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFRoZSB2YWx1ZSBwcm9wZXJ0eSB1c2VkIGFzIHZhbHVlIGluIHRoZSBsb29rdXAgb3B0aW9ucy5cbiAgICAgKiBAdHlwZXBhcmFtIFByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgRWRpdG9yTW9kZWwuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwVmFsdWVQcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiBsb29rdXAgbW9kZWwgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgdW5kZWZpbmVkLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5PFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLFxuICAgICAgICBMb29rdXBNb2RlbCxcbiAgICAgICAgTG9va3VwVmFsdWVQcm9wZXJ0eSBleHRlbmRzIEtleW9mQW5kT2ZUeXBlPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldXG4gICAgPihwcm9wZXJ0eTogUHJvcGVydHksIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPiwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5PFByb3BlcnR5LCBMb29rdXBNb2RlbCwgTG9va3VwVmFsdWVQcm9wZXJ0eSwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtVTlNBRkVdIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBvcHRpb25zIHZhbHVlIHByb3BlcnR5IGZvciBsb29rdXAgbW9kZWwuXG4gICAgICogVGhpcyBtZXRob2QgaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8RmllbGRNb2RlbD59IHR5cGUgLSBUaGUgdHlwZSBkZXNjcmlwdG9yIGZvciB0aGUgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBUaGUgdmFsdWUgcHJvcGVydHkgdXNlZCBhcyB2YWx1ZSBpbiB0aGUgbG9va3VwIG9wdGlvbnMuXG4gICAgICogQHR5cGVwYXJhbSBQcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIEVkaXRvck1vZGVsLlxuICAgICAqIEB0eXBlcGFyYW0gTG9va3VwTW9kZWwgLSBUaGUgZmllbGQgbW9kZWwgdHlwZSwgZGVmYXVsdHMgdG8gdGhlIG5vbi1udWxsYWJsZSB0eXBlIG9mIHRoZSBlZGl0b3IncyBwcm9wZXJ0eS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cFZhbHVlUHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgbG9va3VwIG1vZGVsIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIHZhbHVlIHR5cGUgb2YgZmllbGQgb24gZWRpdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIHVuZGVmaW5lZCwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eVVuc2FmZTxMb29rdXBNb2RlbCwgRmllbGRWYWx1ZSA9IE51bGxhYmxlPElkVHlwZT4+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0eXBlOiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4sXG4gICAgICAgIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5VW5zYWZlPExvb2t1cE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBhIGRhdGEgcHJvdmlkZXIgb3Igc2VydmljZSB0byB0aGUgZWRpdG9yIG1vZGVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBlZGl0b3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gVGhlIGZpZWxkIGxvb2t1cCBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD59IFt0eXBlXSAtIFRoZSB0eXBlIG9mIGxvb2t1cCAtIGlmIGRhdGEgcHJvdmlkZXIgaXMgcGFzc2VkIGFzIHByZXZpb3VzIHBhcmFtZXRlciwgdHlwZSBjYW4gYmUgb21pdHRlZC4gSWYgc2VydmljZSBpcyBwcm92aWRlciwgdHlwZSBwYXJhbWV0ZXIgaXMgcHJvcG9zZWQgaW4gZmF2b3VyIG9mIGNvcnJlY3QgdHlwaW5nLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFNlcnZpY2UgLSBUaGUgbG9va3VwIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBGaWVsZFZhbHVlIC0gVGhlIGZpZWxkIHZhbHVlIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBlZGl0b3IncyBwcm9wZXJ0eSB0eXBlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgRWRpdG9yTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+fSBDcmVhdGVkIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLCBTZXJ2aWNlLCBMb29rdXBNb2RlbCA9IE5vbk51bGxhYmxlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU/OiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyPFByb3BlcnR5LCBTZXJ2aWNlLCBMb29rdXBNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHByb3ZpZGVyLCB0eXBlKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbVU5TQUZFXSBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggYSBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgdG8gdGhlIGVkaXRvciBtb2RlbC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBVTlNBRkUgYmVjYXVzZSBwcm9wZXJ0eSBpcyBub3QgdHlwZS1jaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBsb29rdXAgcHJvdmlkZXIgb3Igc2VydmljZSBmb3IgdGhlIGZpZWxkIGxvb2t1cC5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPj99IHR5cGUgLSBPcHRpb25hbCB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWVsZCBsb29rdXAuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBsb29rdXAgbW9kZWwgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIFNlcnZpY2UgLSBUaGUgbG9va3VwIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIEZpZWxkVmFsdWUgLSBUaGUgdmFsdWUgdHlwZSBvZiBmaWVsZCBvbiBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT59IC0gVGhlIGZpZWxkIGxvb2t1cCBkZXNjcmlwdG9yIGFkZGVkIHRvIHRoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJVbnNhZmU8TG9va3VwTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWUgPSBMb29rdXBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU/OiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyVW5zYWZlPExvb2t1cE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgcHJvdmlkZXIsIHR5cGUpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmaWVsZCBsb29rdXAgd2l0aCBkYXRhIHByb3ZpZGVyIG9yIHNlcnZpY2UgYW5kIG9wdGlvbnMgdmFsdWUgcHJvcGVydHkgZm9yIGxvb2t1cCBtb2RlbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8RmllbGRNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gVGhlIGxvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPEZpZWxkTW9kZWw+fSB0eXBlIC0gVGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgdGhlIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgYXMgdmFsdWUgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSBFZGl0b3JNb2RlbC5cbiAgICAgKiBAdHlwZXBhcmFtIFNlcnZpY2UgLSBUaGUgbG9va3VwIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAdHlwZXBhcmFtIExvb2t1cE1vZGVsIC0gVGhlIGZpZWxkIG1vZGVsIHR5cGUsIGRlZmF1bHRzIHRvIHRoZSBub24tbnVsbGFibGUgdHlwZSBvZiB0aGUgZWRpdG9yJ3MgcHJvcGVydHkuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBWYWx1ZVByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIGxvb2t1cCBtb2RlbCB0eXBlLlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIFRhYmxldmlld01vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBUYWJsZXZpZXdNb2RlbCxcbiAgICAgICAgU2VydmljZSxcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPixcbiAgICAgICAgRmllbGRWYWx1ZSA9IFRhYmxldmlld01vZGVsW1Byb3BlcnR5XVxuICAgID4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eVxuICAgICk6IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgVGFibGV2aWV3TW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHk8UHJvcGVydHksIFNlcnZpY2UsIExvb2t1cE1vZGVsLCBMb29rdXBWYWx1ZVByb3BlcnR5LCBGaWVsZFZhbHVlPihcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbVU5TQUZFXSBBZGRzIGEgZmllbGQgbG9va3VwIHdpdGggZGF0YSBwcm92aWRlciBvciBzZXJ2aWNlIGFuZCBvcHRpb25zIHZhbHVlIHByb3BlcnR5IGZvciBsb29rdXAgbW9kZWwuXG4gICAgICogVGhpcyBtZXRob2QgaXMgVU5TQUZFIGJlY2F1c2UgcHJvcGVydHkgaXMgbm90IHR5cGUtY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPEZpZWxkTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIFRoZSBsb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxGaWVsZE1vZGVsPn0gdHlwZSAtIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIHRoZSBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVGhlIHZhbHVlIHByb3BlcnR5IHVzZWQgaW4gdGhlIGxvb2t1cCBvcHRpb25zLlxuICAgICAqIEB0eXBlcGFyYW0gU2VydmljZSAtIFRoZSBzZXJ2aWNlIHR5cGUuXG4gICAgICogQHR5cGVwYXJhbSBMb29rdXBNb2RlbCAtIFRoZSBmaWVsZCBtb2RlbCB0eXBlLCBkZWZhdWx0cyB0byB0aGUgbm9uLW51bGxhYmxlIHR5cGUgb2YgdGhlIGVkaXRvcidzIHByb3BlcnR5LlxuICAgICAqIEB0eXBlcGFyYW0gRmllbGRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlIG9mIGZpZWxkIG9uIGVkaXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIEVkaXRvck1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlPn0gLSBUaGUgZmllbGQgbG9va3VwIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eVVuc2FmZTxTZXJ2aWNlLCBMb29rdXBNb2RlbCwgRmllbGRWYWx1ZSA9IExvb2t1cE1vZGVsPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogc3RyaW5nXG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBUYWJsZXZpZXdNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eVVuc2FmZTxTZXJ2aWNlLCBMb29rdXBNb2RlbCwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTG9va3VwRW51bTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLCBFbnVtIGV4dGVuZHMgTm9uTnVsbGFibGU8VGFibGV2aWV3TW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgZW51bURlc2M6IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgICAgICBvcHRpb25zPzogQXJyYXk8RW51bT5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTG9va3VwRW51bShwcm9wZXJ0eSwgZW51bURlc2MsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW1VbnNhZmU8RW51bSA9IEVudW1Db25zdGFudFR5cGU+KHByb3BlcnR5OiBzdHJpbmcsIGVudW1EZXNjOiBFbnVtRGVzY3JpcHRvcjxFbnVtPiwgb3B0aW9ucz86IEFycmF5PEVudW0+KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZExvb2t1cEVudW1VbnNhZmU8RW51bT4ocHJvcGVydHksIGVudW1EZXNjLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZFRvRWRpdEFuZEFkZChmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPFRhYmxldmlld01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBUYWJsZXZpZXdNb2RlbD5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkVG9FZGl0QW5kQWRkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlFZGl0b3JVbnNhZmU8RmllbGRNb2RlbCwgRmllbGRWYWx1ZSA9IEZpZWxkTW9kZWxbXT4ocHJvcGVydHk6IHN0cmluZywgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4pIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9kZXRhaWxzRWRpdG9yLmFkZEZpZWxkTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFRhYmxldmlld01vZGVsLCBTZXJ2aWNlLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gVGFibGV2aWV3TW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cERhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2U+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZGV0YWlsc0VkaXRvci5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHksIFNlcnZpY2UsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvclVuc2FmZTxGaWVsZE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbFtdPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2RldGFpbHNFZGl0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yVW5zYWZlPEZpZWxkTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IsIGxvb2t1cERhdGFQcm92aWRlcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUb0VkaXRBbmRBZGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5jcmVhdGVUYWJHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5jcmVhdGVUYWJHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2VkaXRFZGl0b3IuY3JlYXRlVGFiR3JvdXAobmFtZSwgdGl0bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RldGFpbHNFZGl0b3IuY3JlYXRlRmllbGRHcm91cChuYW1lLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuX2FkZEVkaXRvci5jcmVhdGVGaWVsZEdyb3VwKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5fZWRpdEVkaXRvci5jcmVhdGVGaWVsZEdyb3VwKG5hbWUsIHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRzLCBGaWx0ZXJzLCBQYXJlbnRFZGl0b3JNb2RlbD4ge1xuICAgICAgICBjb25zdCB0YWJsZXZpZXcgPSBuZXcgVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8VGFibGV2aWV3TW9kZWwsIFNvcnRzLCBGaWx0ZXJzLCBQYXJlbnRFZGl0b3JNb2RlbD4odGhpcy5fbW9kZWwuY29weSgpKTtcbiAgICAgICAgdGFibGV2aWV3Ll90YWJsZSA9IHRoaXMuX3RhYmxlLmNvcHkoKTtcbiAgICAgICAgdGFibGV2aWV3Ll9kZXRhaWxzRWRpdG9yID0gdGhpcy5fZGV0YWlsc0VkaXRvci5jb3B5KCk7XG4gICAgICAgIHRhYmxldmlldy5fYWRkRWRpdG9yID0gdGhpcy5fYWRkRWRpdG9yLmNvcHkoKTtcbiAgICAgICAgdGFibGV2aWV3Ll9lZGl0RWRpdG9yID0gdGhpcy5fZWRpdEVkaXRvci5jb3B5KCk7XG4gICAgICAgIHRhYmxldmlldy5fdGFibGVUaXRsZSA9IHRoaXMuX3RhYmxlVGl0bGU7XG4gICAgICAgIHRhYmxldmlldy5faXNMb2NhbGl6ZWQgPSB0aGlzLl9pc0xvY2FsaXplZDtcbiAgICAgICAgcmV0dXJuIHRhYmxldmlldztcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9jYWxpemVkPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgVGFibGV2aWV3TW9kZWwsIExvY2FsaXphdGlvbk1vZGVsID0gQXJyYXlJdGVtVHlwZTxUYWJsZXZpZXdNb2RlbFtQcm9wZXJ0eV0+PihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtb2RlbDogTW9kZWxEZXNjcmlwdG9yPExvY2FsaXphdGlvbk1vZGVsPixcbiAgICAgICAgbG9jYWxlUHJvcGVydHk6IGtleW9mIExvY2FsaXphdGlvbk1vZGVsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSBhcyBzdHJpbmcsIG1vZGVsLCBsb2NhbGVQcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2NhbGl6ZWRVbnNhZmU8TG9jYWxpemF0aW9uTW9kZWw+KHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8TG9jYWxpemF0aW9uTW9kZWw+LCBsb2NhbGVQcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdGFibGUud2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KGxvY2FsZVByb3BlcnR5IGFzIHN0cmluZyk7XG4gICAgICAgIHRoaXMuZGV0YWlsc0VkaXRvci5sb2NhbGl6ZWRVbnNhZmUocHJvcGVydHksIG1vZGVsLCBsb2NhbGVQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRWRpdG9yLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSwgbW9kZWwsIGxvY2FsZVByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5lZGl0RWRpdG9yLmxvY2FsaXplZFVuc2FmZShwcm9wZXJ0eSwgbW9kZWwsIGxvY2FsZVByb3BlcnR5KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZXZpZXdEeW5hbWljRGVzY3JpcHRvckludCBleHRlbmRzIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PGFueT4ge1xuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfdGFibGU6IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JJbnN0O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8YW55Pikge1xuICAgICAgICBzdXBlcihtb2RlbCk7XG4gICAgICAgIHRoaXMuX3RhYmxlID0gbmV3IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JJbnN0KHRoaXMubW9kZWwpO1xuICAgICAgICB0aGlzLl90YWJsZVRpdGxlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXRzIGN1c3RvbSB0YWJsZSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIGRlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFRhYmxlRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YWJsZSA9IGRlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHMgdmlzaWJpbGl0eSBoaWRkZW4gc3RhdGUgdG8gY29sdW1uIHdpdGggZ2l2ZW4gcHJvcGVydHlcbiAgICAgKiBlcXVhbHMgdG8gYmUgcmVtb3ZpbmcgaW4gYXV0byBhbmQgYmFzZSB0YWJsZXZpZXcgZGVzY3JpcHRvclxuICAgICAqICogQHBhcmFtIHByb3BlcnR5IGNvbHVtbidzIHByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbW92ZUNvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnJlbW92ZUNvbHVtbihwcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRW50aXR5Rm9yVHJhbnNsYXRpb25zKGkxOG5CYXNlS2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFibGUubW9kZWwud2l0aEkxOG5CYXNlKGkxOG5CYXNlS2V5KTtcbiAgICAgICAgdGhpcy5fZGV0YWlsc0VkaXRvci5tb2RlbC53aXRoSTE4bkJhc2UoaTE4bkJhc2VLZXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGVzIGRlZXAgY29weSBvZiB0YWJsZXZpZXcgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBUYWJsZXZpZXdEeW5hbWljRGVzY3JpcHRvckludCB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgVGFibGV2aWV3RHluYW1pY0Rlc2NyaXB0b3JJbnQodGhpcy5tb2RlbC5jb3B5KCkpO1xuICAgICAgICBkZXNjcmlwdG9yLl90YWJsZSA9IHRoaXMuX3RhYmxlLmNvcHkoKTtcbiAgICAgICAgZGVzY3JpcHRvci5fdGFibGVUaXRsZSA9IHRoaXMuX3RhYmxlVGl0bGU7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cbiJdfQ==