@sapui5/sap.fe.core 1.103.0 → 1.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +121 -0
  4. package/src/sap/fe/core/ActionRuntime.ts +122 -0
  5. package/src/sap/fe/core/AppComponent.js +24 -11
  6. package/src/sap/fe/core/AppComponent.ts +17 -5
  7. package/src/sap/fe/core/AppStateHandler.js +74 -62
  8. package/src/sap/fe/core/AppStateHandler.ts +24 -29
  9. package/src/sap/fe/core/BaseController.js +2 -2
  10. package/src/sap/fe/core/CommonUtils.js +147 -180
  11. package/src/sap/fe/core/CommonUtils.ts +166 -193
  12. package/src/sap/fe/core/ExtensionAPI.js +2 -2
  13. package/src/sap/fe/core/PageController.js +2 -2
  14. package/src/sap/fe/core/TemplateComponent.js +21 -10
  15. package/src/sap/fe/core/TemplateComponent.ts +3 -0
  16. package/src/sap/fe/core/TemplateModel.js +2 -2
  17. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
  18. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +7 -1
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +194 -43
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +162 -24
  21. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
  22. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
  23. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -227
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +268 -119
  25. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +111 -76
  26. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +96 -76
  27. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  28. package/src/sap/fe/core/controllerextensions/EditFlow.js +723 -637
  29. package/src/sap/fe/core/controllerextensions/EditFlow.ts +361 -398
  30. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
  31. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +83 -55
  32. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +42 -44
  33. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +29 -27
  34. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -30
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +171 -74
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +167 -76
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +5 -21
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -17
  39. package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -3
  40. package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
  41. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  43. package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -1
  44. package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
  45. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -11
  46. package/src/sap/fe/core/controllerextensions/Placeholder.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
  48. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  49. package/src/sap/fe/core/controllerextensions/Share.js +154 -123
  50. package/src/sap/fe/core/controllerextensions/Share.ts +93 -95
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +157 -97
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +151 -95
  53. package/src/sap/fe/core/controllerextensions/ViewState.js +151 -80
  54. package/src/sap/fe/core/controllerextensions/ViewState.ts +95 -93
  55. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +9 -9
  57. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +6 -7
  58. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +26 -11
  59. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +30 -11
  60. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -40
  61. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +55 -47
  62. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +31 -32
  63. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1376 -914
  64. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +654 -714
  65. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +372 -326
  66. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +210 -276
  67. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
  68. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
  69. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +670 -521
  70. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +537 -535
  71. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +85 -65
  72. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +16 -21
  73. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +25 -13
  74. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +53 -43
  75. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +18 -27
  76. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +9 -15
  77. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +19 -3
  78. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
  79. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +26 -16
  80. package/src/sap/fe/core/controls/Any.js +1 -1
  81. package/src/sap/fe/core/controls/CommandExecution.js +2 -2
  82. package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
  83. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +5 -5
  84. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -3
  85. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
  86. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
  87. package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
  88. package/src/sap/fe/core/controls/FileWrapper.js +8 -3
  89. package/src/sap/fe/core/controls/FileWrapper.ts +5 -1
  90. package/src/sap/fe/core/controls/FilterBar.js +2 -2
  91. package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
  92. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  93. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  94. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +48 -17
  95. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -2
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -2
  98. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -3
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
  100. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -2
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +1 -1
  103. package/src/sap/fe/core/converters/ConverterContext.js +23 -2
  104. package/src/sap/fe/core/converters/ConverterContext.ts +34 -9
  105. package/src/sap/fe/core/converters/ManifestSettings.js +19 -18
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +53 -47
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  108. package/src/sap/fe/core/converters/MetaModelConverter.js +32 -10
  109. package/src/sap/fe/core/converters/MetaModelConverter.ts +42 -19
  110. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  111. package/src/sap/fe/core/converters/annotations/DataField.js +5 -2
  112. package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
  113. package/src/sap/fe/core/converters/common/AnnotationConverter.js +69 -23
  114. package/src/sap/fe/core/converters/controls/Common/Action.js +98 -51
  115. package/src/sap/fe/core/converters/controls/Common/Action.ts +121 -44
  116. package/src/sap/fe/core/converters/controls/Common/Chart.js +31 -34
  117. package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -34
  118. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  119. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +43 -7
  120. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -33
  121. package/src/sap/fe/core/converters/controls/Common/Form.js +8 -6
  122. package/src/sap/fe/core/converters/controls/Common/Form.ts +11 -14
  123. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  124. package/src/sap/fe/core/converters/controls/Common/KPI.ts +16 -15
  125. package/src/sap/fe/core/converters/controls/Common/Table.js +188 -157
  126. package/src/sap/fe/core/converters/controls/Common/Table.ts +279 -230
  127. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  128. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -4
  129. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +57 -21
  130. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +71 -18
  131. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +30 -8
  132. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -7
  133. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  134. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +43 -34
  135. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +37 -25
  136. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +85 -49
  137. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +74 -50
  138. package/src/sap/fe/core/converters/helpers/Aggregation.js +54 -4
  139. package/src/sap/fe/core/converters/helpers/Aggregation.ts +56 -8
  140. package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
  141. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +6 -4
  142. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +10 -2
  143. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +182 -0
  144. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +167 -0
  145. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  146. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  147. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  148. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  149. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  150. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -3
  151. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  152. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +8 -14
  153. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +6 -9
  154. package/src/sap/fe/core/converters/templates/ListReportConverter.js +31 -31
  155. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +54 -47
  156. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +44 -15
  157. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +64 -30
  158. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  159. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  160. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  161. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  162. package/src/sap/fe/core/formatters/StandardFormatter.js +13 -6
  163. package/src/sap/fe/core/formatters/StandardFormatter.ts +20 -14
  164. package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  165. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
  166. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  167. package/src/sap/fe/core/fpm/Component.js +33 -7
  168. package/src/sap/fe/core/fpm/Component.ts +14 -0
  169. package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
  170. package/src/sap/fe/core/helpers/AppStartupHelper.js +5 -4
  171. package/src/sap/fe/core/helpers/AppStartupHelper.ts +4 -3
  172. package/src/sap/fe/core/helpers/BindingToolkit.js +56 -24
  173. package/src/sap/fe/core/helpers/BindingToolkit.ts +67 -21
  174. package/src/sap/fe/core/helpers/ClassSupport.js +31 -3
  175. package/src/sap/fe/core/helpers/ClassSupport.ts +24 -1
  176. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  177. package/src/sap/fe/core/helpers/EditState.js +1 -1
  178. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  179. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  180. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  181. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  182. package/src/sap/fe/core/helpers/LoaderUtils.js +39 -0
  183. package/src/sap/fe/core/helpers/LoaderUtils.ts +14 -0
  184. package/src/sap/fe/core/helpers/MassEditHelper.js +475 -99
  185. package/src/sap/fe/core/helpers/MassEditHelper.ts +468 -155
  186. package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
  187. package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
  188. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  189. package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
  190. package/src/sap/fe/core/helpers/SemanticDateOperators.js +82 -36
  191. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +52 -36
  192. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  193. package/src/sap/fe/core/helpers/SideEffectsHelper.js +146 -0
  194. package/src/sap/fe/core/helpers/SideEffectsHelper.ts +128 -0
  195. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  196. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  197. package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
  198. package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
  199. package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
  200. package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
  201. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
  202. package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
  203. package/src/sap/fe/core/jsx-runtime/jsx-control.js +119 -0
  204. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +98 -0
  205. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
  206. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
  207. package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
  208. package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
  209. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  210. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
  211. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
  212. package/src/sap/fe/core/library.js +2 -2
  213. package/src/sap/fe/core/library.support.js +1 -1
  214. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  215. package/src/sap/fe/core/messagebundle.properties +4 -41
  216. package/src/sap/fe/core/messagebundle_ar.properties +22 -45
  217. package/src/sap/fe/core/messagebundle_bg.properties +22 -45
  218. package/src/sap/fe/core/messagebundle_ca.properties +22 -45
  219. package/src/sap/fe/core/messagebundle_cs.properties +22 -45
  220. package/src/sap/fe/core/messagebundle_cy.properties +21 -44
  221. package/src/sap/fe/core/messagebundle_da.properties +22 -45
  222. package/src/sap/fe/core/messagebundle_de.properties +22 -45
  223. package/src/sap/fe/core/messagebundle_el.properties +22 -45
  224. package/src/sap/fe/core/messagebundle_en.properties +21 -44
  225. package/src/sap/fe/core/messagebundle_en_GB.properties +21 -44
  226. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +21 -42
  227. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -40
  228. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -42
  229. package/src/sap/fe/core/messagebundle_es.properties +22 -45
  230. package/src/sap/fe/core/messagebundle_es_MX.properties +22 -45
  231. package/src/sap/fe/core/messagebundle_et.properties +22 -45
  232. package/src/sap/fe/core/messagebundle_fi.properties +22 -45
  233. package/src/sap/fe/core/messagebundle_fr.properties +21 -44
  234. package/src/sap/fe/core/messagebundle_fr_CA.properties +20 -43
  235. package/src/sap/fe/core/messagebundle_hi.properties +22 -45
  236. package/src/sap/fe/core/messagebundle_hr.properties +22 -45
  237. package/src/sap/fe/core/messagebundle_hu.properties +22 -45
  238. package/src/sap/fe/core/messagebundle_id.properties +22 -45
  239. package/src/sap/fe/core/messagebundle_it.properties +22 -45
  240. package/src/sap/fe/core/messagebundle_iw.properties +22 -45
  241. package/src/sap/fe/core/messagebundle_ja.properties +22 -45
  242. package/src/sap/fe/core/messagebundle_kk.properties +22 -45
  243. package/src/sap/fe/core/messagebundle_ko.properties +27 -50
  244. package/src/sap/fe/core/messagebundle_lt.properties +22 -45
  245. package/src/sap/fe/core/messagebundle_lv.properties +22 -45
  246. package/src/sap/fe/core/messagebundle_ms.properties +22 -45
  247. package/src/sap/fe/core/messagebundle_nl.properties +24 -47
  248. package/src/sap/fe/core/messagebundle_no.properties +22 -45
  249. package/src/sap/fe/core/messagebundle_pl.properties +23 -46
  250. package/src/sap/fe/core/messagebundle_pt.properties +23 -46
  251. package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -45
  252. package/src/sap/fe/core/messagebundle_ro.properties +22 -45
  253. package/src/sap/fe/core/messagebundle_ru.properties +22 -45
  254. package/src/sap/fe/core/messagebundle_sh.properties +22 -45
  255. package/src/sap/fe/core/messagebundle_sk.properties +22 -45
  256. package/src/sap/fe/core/messagebundle_sl.properties +22 -45
  257. package/src/sap/fe/core/messagebundle_sv.properties +22 -45
  258. package/src/sap/fe/core/messagebundle_th.properties +20 -43
  259. package/src/sap/fe/core/messagebundle_tr.properties +22 -45
  260. package/src/sap/fe/core/messagebundle_uk.properties +22 -45
  261. package/src/sap/fe/core/messagebundle_vi.properties +22 -45
  262. package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -45
  263. package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -45
  264. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  265. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +102 -74
  266. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +62 -63
  267. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
  268. package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -8
  269. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -7
  270. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
  271. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
  272. package/src/sap/fe/core/services/ShellServicesFactory.js +22 -2
  273. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
  274. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
  275. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +2 -2
  276. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +251 -200
  277. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +160 -144
  278. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
  279. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  280. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  281. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  282. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  283. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  284. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  285. package/src/sap/fe/core/templating/CommonFormatters.js +4 -3
  286. package/src/sap/fe/core/templating/CommonFormatters.ts +5 -1
  287. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  288. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  289. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -1
  290. package/src/sap/fe/core/templating/DataModelPathHelper.ts +5 -2
  291. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  292. package/src/sap/fe/core/templating/EntitySetHelper.js +4 -5
  293. package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -3
  294. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  295. package/src/sap/fe/core/templating/FilterHelper.js +34 -15
  296. package/src/sap/fe/core/templating/FilterHelper.ts +28 -12
  297. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  298. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  299. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  300. package/src/sap/fe/core/templating/UIFormatters.js +5 -3
  301. package/src/sap/fe/core/templating/UIFormatters.ts +7 -5
  302. package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
  303. package/src/sap/fe/core/type/Email.js +2 -2
@@ -5,7 +5,7 @@
5
5
  sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/Core", "sap/ui/core/mvc/ControllerExtension", "../CommonUtils", "../helpers/ClassSupport"], function (Log, FieldRuntime, Core, ControllerExtension, CommonUtils, ClassSupport) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _class, _class2;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _class, _class2;
9
9
 
10
10
  var publicExtension = ClassSupport.publicExtension;
11
11
  var privateExtension = ClassSupport.privateExtension;
@@ -15,11 +15,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
15
15
 
16
16
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
17
17
 
18
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
18
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
19
 
20
20
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
21
21
 
22
- var SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = privateExtension(), _dec20 = finalExtension(), _dec21 = privateExtension(), _dec22 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
22
+ var SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = publicExtension(), _dec20 = finalExtension(), _dec21 = privateExtension(), _dec22 = finalExtension(), _dec23 = publicExtension(), _dec24 = finalExtension(), _dec25 = publicExtension(), _dec26 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
23
23
  _inheritsLoose(SideEffectsControllerExtension, _ControllerExtension);
24
24
 
25
25
  function SideEffectsControllerExtension() {
@@ -58,6 +58,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
58
58
 
59
59
  _proto.getRegisteredFailedRequests = function getRegisteredFailedRequests() {
60
60
  return this._mFailedSideEffects;
61
+ };
62
+
63
+ _proto.deleteFailedRequestsForAContext = function deleteFailedRequestsForAContext(contextPath) {
64
+ delete this._mFailedSideEffects[contextPath];
61
65
  }
62
66
  /**
63
67
  * Manages the workflow for SideEffects with related changes to a field
@@ -96,7 +100,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
96
100
  aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
97
101
  return mImmediateSideEffects.previouslyFailed === true;
98
102
  }).forEach(function (mImmediateSideEffects) {
99
- return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
103
+ _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
100
104
  });
101
105
  }
102
106
  });
@@ -212,34 +216,46 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
212
216
  * @name requestSideEffects
213
217
  * @param oSideEffects SideEffects to be executed
214
218
  * @param oContext Context where SideEffects need to be executed
219
+ * @param groupId
220
+ * @param fnGetTargets The callback function which will give us the targets and actions if it was coming through some specific handling.
215
221
  * @returns SideEffects request on SAPUI5 context
216
222
  */
217
223
  ;
218
224
 
219
- _proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext) {
220
- var _this2 = this;
225
+ _proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext, groupId, fnGetTargets) {
226
+ try {
227
+ var _this3 = this;
221
228
 
222
- var fResolver, fRejector;
223
- var oPromise = new Promise(function (resolve, reject) {
224
- fResolver = resolve;
225
- fRejector = reject;
226
- });
227
- var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
228
- sTriggerAction = oSideEffects.TriggerAction;
229
+ function _temp3() {
230
+ if (sTriggerAction) {
231
+ _this3._oSideEffectsService.executeAction(sTriggerAction, oContext, groupId);
232
+ }
229
233
 
230
- if (sTriggerAction) {
231
- this._oSideEffectsService.executeAction(sTriggerAction, oContext);
232
- }
234
+ return aTargets.length ? _this3._oSideEffectsService.requestSideEffects(aTargets, oContext, groupId).catch(function (oError) {
235
+ _this3._addFailedSideEffects(oSideEffects, oContext);
233
236
 
234
- this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
235
- return fResolver();
236
- }).catch(function (oError) {
237
- _this2._addFailedSideEffects(oSideEffects, oContext);
237
+ return Promise.reject(oError);
238
+ }) : Promise.resolve();
239
+ }
238
240
 
239
- fRejector(oError);
240
- });
241
+ var aTargets, sTriggerAction;
241
242
 
242
- return oPromise;
243
+ var _temp4 = function () {
244
+ if (fnGetTargets) {
245
+ return Promise.resolve(fnGetTargets(oSideEffects)).then(function (targetsAndActionData) {
246
+ aTargets = targetsAndActionData["aTargets"];
247
+ sTriggerAction = targetsAndActionData["TriggerAction"];
248
+ });
249
+ } else {
250
+ aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []);
251
+ sTriggerAction = oSideEffects.TriggerAction;
252
+ }
253
+ }();
254
+
255
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
256
+ } catch (e) {
257
+ return Promise.reject(e);
258
+ }
243
259
  }
244
260
  /**
245
261
  * Removes SideEffects created by a control.
@@ -372,19 +388,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
372
388
  }
373
389
  /**
374
390
  * Gets the appropriate context on which SideEffects can be requested.
375
- * The correct one must have the binding parameter $$patchWithoutSideEffects.
391
+ * The correct one must have the binding parameter $$patchWithoutSideEffects.
376
392
  *
377
- * @function
378
- * @name _getContextForSideEffects
379
- * @param oSourceField Field
380
- * @param sSideEffectEntityType Target entity type of the SideEffects annotation
381
- * @returns SAPUI5 Context
393
+ * @param oBindingContext
394
+ * @param sSideEffectEntityType
395
+ * @returns SAPUI5 Context or undefined
382
396
  */
383
397
  ;
384
398
 
385
- _proto._getContextForSideEffects = function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
386
- var oBindingContext = oSourceField.getBindingContext();
387
-
399
+ _proto.getContextForSideEffects = function getContextForSideEffects(oBindingContext, sSideEffectEntityType) {
388
400
  var oContextForSideEffects = oBindingContext,
389
401
  sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
390
402
 
@@ -435,9 +447,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
435
447
 
436
448
  _proto._getFieldPromise = function _getFieldPromise(oEvent) {
437
449
  var promise = oEvent.getParameter("promise") || Promise.resolve();
450
+ var validity = FieldRuntime.getFieldStateOnChange(oEvent).state.validity;
438
451
  return promise.then(function () {
439
452
  return new Promise(function (resolve, reject) {
440
- if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
453
+ if (!validity) {
441
454
  reject();
442
455
  } else {
443
456
  resolve(true);
@@ -477,43 +490,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
477
490
  ;
478
491
 
479
492
  _proto._getFieldSideEffectsMap = function _getFieldSideEffectsMap(oField) {
480
- var _this3 = this;
493
+ var mSideEffectsMap = {};
481
494
 
482
- var mSideEffectsMap = {},
483
- aFieldGroupIds = oField.getFieldGroupIds(),
495
+ var aFieldGroupIds = oField.getFieldGroupIds(),
484
496
  sViewEntitySetSetName = this._oView.getViewData().entitySet,
485
497
  oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
486
498
  return oEntitySet.name === sViewEntitySetSetName;
487
499
  }); // SideEffects coming from an OData Service
488
500
 
489
501
 
490
- aFieldGroupIds.forEach(function (sFieldGroupId) {
491
- var _this3$_oSideEffectsS;
492
-
493
- var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
494
- sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
495
- aSideEffectParts = sName.split("#"),
496
- sSideEffectEntityType = aSideEffectParts[0],
497
- sSideEffectPath = "".concat(sSideEffectEntityType, "@com.sap.vocabularies.Common.v1.SideEffects").concat(aSideEffectParts.length === 2 ? "#".concat(aSideEffectParts[1]) : ""),
498
- oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
499
- oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
500
-
501
- if (oSideEffect && oContext) {
502
- mSideEffectsMap[sName] = {
503
- name: sName,
504
- immediate: bIsImmediate,
505
- sideEffects: oSideEffect,
506
- context: oContext
507
- };
508
- }
509
- }); //SideEffects coming from control(s)
502
+ mSideEffectsMap = this.generateSideEffectsMapFromSideEffectId(aFieldGroupIds, oField); //SideEffects coming from control(s)
510
503
 
511
504
  if (sViewEntitySetSetName && oViewEntitySet) {
512
505
  var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
513
506
  mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
514
507
  return oCustomData.getKey() === "sourcePath";
515
508
  }),
516
- oContext = this._getContextForSideEffects(oField, sViewEntityType);
509
+ oContext = this.getContextForSideEffects(oField.getBindingContext(), sViewEntityType);
517
510
 
518
511
  if (mFieldPath && oContext) {
519
512
  var sFieldPath = mFieldPath.getValue().replace("/".concat(sViewEntitySetSetName, "/"), ""),
@@ -537,6 +530,68 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
537
530
 
538
531
  return mSideEffectsMap;
539
532
  }
533
+ /**
534
+ * Get side effect Name, sideeffect obj and entity type from a given fieldGroupId.
535
+ *
536
+ * @param sFieldGroupId
537
+ * @returns Data about sideeffect name, entitytype, side effect object and if it is immediate.
538
+ */
539
+ ;
540
+
541
+ _proto._getDataToGenerateSideEffectsMapFromSideEffectId = function _getDataToGenerateSideEffectsMapFromSideEffectId(sFieldGroupId) {
542
+ var _this$_oSideEffectsSe;
543
+
544
+ var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
545
+ sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
546
+ aSideEffectParts = sName.split("#"),
547
+ sSideEffectEntityType = aSideEffectParts[0],
548
+ sSideEffectPath = "".concat(sSideEffectEntityType, "@com.sap.vocabularies.Common.v1.SideEffects").concat(aSideEffectParts.length === 2 ? "#".concat(aSideEffectParts[1]) : ""),
549
+ oSideEffect = (_this$_oSideEffectsSe = this._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this$_oSideEffectsSe === void 0 ? void 0 : _this$_oSideEffectsSe[sSideEffectPath];
550
+ return {
551
+ sName: sName,
552
+ bIsImmediate: bIsImmediate,
553
+ oSideEffect: oSideEffect,
554
+ sSideEffectEntityType: sSideEffectEntityType
555
+ };
556
+ }
557
+ /**
558
+ * Generate the side effects map from id which is the entity and qualifier
559
+ * for the given entity.
560
+ *
561
+ * @function
562
+ * @param aFieldGroupIds
563
+ * @param oField
564
+ * @returns Side effect map with data
565
+ */
566
+ ;
567
+
568
+ _proto.generateSideEffectsMapFromSideEffectId = function generateSideEffectsMapFromSideEffectId(aFieldGroupIds, oField) {
569
+ var _this4 = this;
570
+
571
+ var mSideEffectsMap = {};
572
+ aFieldGroupIds.forEach(function (sFieldGroupId) {
573
+ var _this4$_getDataToGene = _this4._getDataToGenerateSideEffectsMapFromSideEffectId(sFieldGroupId),
574
+ sName = _this4$_getDataToGene.sName,
575
+ bIsImmediate = _this4$_getDataToGene.bIsImmediate,
576
+ oSideEffect = _this4$_getDataToGene.oSideEffect,
577
+ sSideEffectEntityType = _this4$_getDataToGene.sSideEffectEntityType;
578
+
579
+ var oContext = oField ? _this4.getContextForSideEffects(oField.getBindingContext(), sSideEffectEntityType) : undefined;
580
+
581
+ if (oSideEffect && (!oField || oField && oContext)) {
582
+ mSideEffectsMap[sName] = {
583
+ name: sName,
584
+ immediate: bIsImmediate,
585
+ sideEffects: oSideEffect
586
+ };
587
+
588
+ if (oField) {
589
+ mSideEffectsMap[sName].context = oContext;
590
+ }
591
+ }
592
+ });
593
+ return mSideEffectsMap;
594
+ }
540
595
  /**
541
596
  * Manages the SideEffects with related changes to a field
542
597
  * List: gets immediate SideEffects requests
@@ -551,7 +606,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
551
606
  ;
552
607
 
553
608
  _proto._initializeFieldSideEffects = function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
554
- var _this4 = this;
609
+ var _this5 = this;
555
610
 
556
611
  var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
557
612
  oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
@@ -561,45 +616,50 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
561
616
 
562
617
  oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
563
618
  Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
619
+ var _oSideEffectProperty$;
620
+
564
621
  var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
565
- sSideEffectContextPath = oSideEffectProperty.context.getPath(),
566
- aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
567
-
568
- if (aFailedSideEffects) {
569
- delete _this4._mFailedSideEffects[sSideEffectContextPath];
570
- mFailedSideEffectsName[sSideEffectContextPath] = {};
571
- aFailedSideEffects.forEach(function (mFailedSideEffects) {
572
- mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
573
- aImmediateSideEffectsProperties.push({
574
- name: sSideEffectName,
575
- previouslyFailed: true,
576
- sideEffects: mFailedSideEffects,
577
- context: oSideEffectProperty.context
622
+ sSideEffectContextPath = (_oSideEffectProperty$ = oSideEffectProperty.context) === null || _oSideEffectProperty$ === void 0 ? void 0 : _oSideEffectProperty$.getPath();
623
+
624
+ if (sSideEffectContextPath) {
625
+ var aFailedSideEffects = _this5._mFailedSideEffects[sSideEffectContextPath];
626
+
627
+ if (aFailedSideEffects) {
628
+ delete _this5._mFailedSideEffects[sSideEffectContextPath];
629
+ mFailedSideEffectsName[sSideEffectContextPath] = {};
630
+ aFailedSideEffects.forEach(function (mFailedSideEffects) {
631
+ mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
632
+ aImmediateSideEffectsProperties.push({
633
+ name: sSideEffectName,
634
+ previouslyFailed: true,
635
+ sideEffects: mFailedSideEffects,
636
+ context: oSideEffectProperty.context
637
+ });
578
638
  });
579
- });
580
- }
639
+ }
581
640
 
582
- if (oSideEffectProperty.immediate) {
583
- var _mFailedSideEffectsNa;
641
+ if (oSideEffectProperty.immediate) {
642
+ var _mFailedSideEffectsNa;
584
643
 
585
- // SideEffects will be executed immediately after event promise validation
586
- if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
587
- aImmediateSideEffectsProperties.push({
588
- name: sSideEffectName,
589
- sideEffects: oSideEffectProperty.sideEffects,
590
- context: oSideEffectProperty.context
591
- });
644
+ // SideEffects will be executed immediately after event promise validation
645
+ if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
646
+ aImmediateSideEffectsProperties.push({
647
+ name: sSideEffectName,
648
+ sideEffects: oSideEffectProperty.sideEffects,
649
+ context: oSideEffectProperty.context
650
+ });
651
+ }
652
+ } else {
653
+ // Add deferred SideEffects to the related dictionary
654
+ _this5._mFieldGroupQueue[sSideEffectName] = _this5._mFieldGroupQueue[sSideEffectName] || {};
655
+ var mSideEffectContextPath = _this5._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
656
+ promises: [],
657
+ sideEffectProperty: oSideEffectProperty,
658
+ processStarted: false
659
+ };
660
+ mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
661
+ _this5._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
592
662
  }
593
- } else {
594
- // Add deferred SideEffects to the related dictionary
595
- _this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
596
- var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
597
- promises: [],
598
- sideEffectProperty: oSideEffectProperty,
599
- processStarted: false
600
- };
601
- mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
602
- _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
603
663
  }
604
664
  });
605
665
  return aImmediateSideEffectsProperties;
@@ -613,7 +673,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
613
673
  ;
614
674
 
615
675
  _proto._saveFieldPropertiesStatus = function _saveFieldPropertiesStatus(oField, bSuccess) {
616
- var _this5 = this;
676
+ var _this6 = this;
617
677
 
618
678
  var oBindingContext = oField.getBindingContext();
619
679
 
@@ -630,10 +690,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
630
690
  }) : [oFieldBinding.getPath()]; // Stores status for all properties
631
691
 
632
692
  aFieldPaths.forEach(function (sFieldPath) {
633
- var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
693
+ var sId = _this6._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
634
694
 
635
695
  if (sId) {
636
- _this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
696
+ _this6._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
637
697
  }
638
698
  });
639
699
  }
@@ -659,7 +719,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
659
719
  };
660
720
 
661
721
  return SideEffectsControllerExtension;
662
- }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_getContextForSideEffects", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "_getContextForSideEffects"), _class2.prototype)), _class2)) || _class);
722
+ }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteFailedRequestsForAContext", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteFailedRequestsForAContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getContextForSideEffects", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "getContextForSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "generateSideEffectsMapFromSideEffectId", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "generateSideEffectsMapFromSideEffectId"), _class2.prototype)), _class2)) || _class);
663
723
  return SideEffectsControllerExtension;
664
724
  }, false);
665
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJjbGVhciIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwib0V2ZW50Iiwib0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJtRXZlbnRGaWVsZFByb3BlcnRpZXMiLCJfZ2V0RmllbGRQcm9wZXJ0aWVzIiwiYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcyIsIl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyIsImJJc0ltbWVkaWF0ZVRyaWdnZXJlZCIsIl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm1TaWRlRWZmZWN0c1Byb3BlcnR5IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImZpbHRlciIsIm1JbW1lZGlhdGVTaWRlRWZmZWN0cyIsInByZXZpb3VzbHlGYWlsZWQiLCJmb3JFYWNoIiwiX2FkZEZhaWxlZFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsIm9TaWRlRWZmZWN0cyIsInJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYVRhcmdldHMiLCJUYXJnZXRFbnRpdGllcyIsImNvbmNhdCIsIlRhcmdldFByb3BlcnRpZXMiLCJzVHJpZ2dlckFjdGlvbiIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwib0NvbnRyb2wiLCJzQ29udHJvbElkIiwiaXNBIiwiZ2V0SWQiLCJiSXNOb3RBbHJlYWR5TGlzdGVkIiwibUZhaWxlZFNpZGVFZmZlY3RzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UiLCJiUHJvbWlzZVN1Y2Nlc3MiLCJwcm9taXNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWVsZCIsIm9GaWVsZCIsInNGaWVsZEhlbHBlcklkIiwiZ2V0RmllbGRIZWxwIiwib0ZpbHRlckhlbHAiLCJDb3JlIiwiYnlJZCIsImdldE91dFBhcmFtZXRlcnMiLCJvT3V0UGFyYW1ldGVyIiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwicmVxdWVzdFZhbHVlIiwic1Byb3BlcnR5UGF0aCIsIm1Qcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJqb2luIiwidW5kZWZpbmVkIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJfZ2V0RmllbGRQcm9taXNlIiwiRmllbGRSdW50aW1lIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwic3RhdGUiLCJ2YWxpZGl0eSIsImdldFNvdXJjZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiaW1tZWRpYXRlIiwic1ZpZXdFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsIm1GaWVsZFBhdGgiLCJnZXRBZ2dyZWdhdGlvbiIsIm9DdXN0b21EYXRhIiwiZ2V0S2V5Iiwic0ZpZWxkUGF0aCIsImdldFZhbHVlIiwibUNvbnRyb2xFbnRpdHlUeXBlIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwic0NvbnRyb2xOYW1lIiwib0NvbnRyb2xTaWRlRWZmZWN0cyIsImluY2x1ZGVzIiwibUZpZWxkU2lkZUVmZmVjdHNNYXAiLCJvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJzQmluZGluZ05hbWUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFxRE1BLDhCLFdBRExDLGNBQWMsQ0FBQyw4Q0FBRCxDLFVBU2JDLGNBQWMsRSxVQWdCZEMsZUFBZSxFLFVBQ2ZDLGNBQWMsRSxVQVlkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBaUJkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBNkNkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBaUZkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBV2RELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FjZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWdDZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWtCZEMsZ0JBQWdCLEUsV0FDaEJELGNBQWMsRSxXQThHZEMsZ0JBQWdCLEUsV0FDaEJELGNBQWMsRTs7Ozs7Ozs7O1dBN1dSRSxNLEdBRFAsa0JBQ2dCO0FBQ2YsV0FBS0MsTUFB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QzhHLFVBQXZDLEVBQW1EekMsZUFBbkQsQ0FBWjs7QUFDQSxjQUFJOUQsR0FBSixFQUFTO0FBQ1IsWUFBQSxNQUFJLENBQUN0RCx5QkFBTCxDQUErQjBLLFFBQVEsR0FBRyxRQUFILEdBQWMsS0FBckQsRUFBNERwSCxHQUE1RDtBQUNBO0FBQ0QsU0FMRDtBQU1BO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNTc0gsbUIsR0FBUiw2QkFBNEI1RSxNQUE1QixFQUEyRDtBQUMxRCxVQUFJZ0YsWUFBWSxHQUFHLE9BQW5COztBQUNBLFVBQUloRixNQUFNLENBQUNWLEdBQVAsQ0FBVyxnQkFBWCxDQUFKLEVBQWtDO0FBQ2pDMEYsUUFBQUEsWUFBWSxHQUFHLFVBQWY7QUFDQSxPQUZELE1BRU8sSUFBSWhGLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXLGtDQUFYLENBQUosRUFBb0Q7QUFDMUQwRixRQUFBQSxZQUFZLEdBQUcsV0FBZjtBQUNBOztBQUNELGFBQU9oRixNQUFNLENBQUNTLFVBQVAsQ0FBa0J1RSxZQUFsQixDQUFQO0FBQ0EsSzs7O0lBdm5CMkNDLG1CO1NBMG5COUJqTSw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSwgRW50aXR5VHlwZSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7XG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnksXG5cdENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsXG5cdE9EYXRhU2lkZUVmZmVjdHNUeXBlLFxuXHRTaWRlRWZmZWN0c1R5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBGaWVsZFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRSdW50aW1lXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCIuLi9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHJpdmF0ZUV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX21GaWVsZEdyb3VwUXVldWUhOiBGaWVsZEdyb3VwUXVldWVNYXBUeXBlO1xuXHRwcml2YXRlIF9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUhOiBTZXQ8c3RyaW5nPjtcblx0cHJpdmF0ZSBfb1NpZGVFZmZlY3RzU2VydmljZSE6IGFueTtcblx0cHJpdmF0ZSBfbUZhaWxlZFNpZGVFZmZlY3RzITogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZSA9IHt9O1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSA9IG5ldyBTZXQoKTtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBjbGVhclByb3BlcnRpZXNTdGF0dXNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZFxuXHQgKiAgLSBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGhhbmRsZUZpZWxkQ2hhbmdlKG9FdmVudDogRXZlbnQsIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBtRXZlbnRGaWVsZFByb3BlcnRpZXMgPSB0aGlzLl9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50KSxcblx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXM6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdID0gdGhpcy5faW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0XHRcdG1FdmVudEZpZWxkUHJvcGVydGllcyxcblx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGVcblx0XHRcdCk7XG5cblx0XHRsZXQgYklzSW1tZWRpYXRlVHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5fZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllcylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0YklzSW1tZWRpYXRlVHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMubWFwKChtU2lkZUVmZmVjdHNQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKG1TaWRlRWZmZWN0c1Byb3BlcnR5LnNpZGVFZmZlY3RzLCBtU2lkZUVmZmVjdHNQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9KSB8fCBbXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yKSA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcigobUltbWVkaWF0ZVNpZGVFZmZlY3RzKSA9PiBtSW1tZWRpYXRlU2lkZUVmZmVjdHMucHJldmlvdXNseUZhaWxlZCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChtSW1tZWRpYXRlU2lkZUVmZmVjdHMpID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlKG9FdmVudDogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzLFxuXHRcdFx0YURlZmVycmVkU2lkZUVmZmVjdHM6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZVtdID0gW10sXG5cdFx0XHRhRmllbGRHcm91cElkczogc3RyaW5nW10gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZmllbGRHcm91cElkc1wiKTtcblxuXHRcdGNvbnN0IGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZSA9IGZ1bmN0aW9uIChvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vRGVmZXJyZWQgU2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgaWYgYWxsIHNvdXJjZVByb3BlcnRpZXMgaGF2ZSBubyByZWdpc3RlcmVkIGZhaWx1cmUuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUgJiZcblx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW10pLmV2ZXJ5KChzb3VyY2VQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3IpID0+IHtcblx0XHRcdFx0XHRpZiAoYklzUmVxdWVzdHNUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgJHtzQ29udGV4dFBhdGh9YCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKChzRmllbGRHcm91cElkKSA9PiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIHN0cmluZyBcIiQkSW1tZWRpYXRlUmVxdWVzdFwiIGlzIGFkZGVkIHRvIHRoZSBTaWRlRWZmZWN0cyBuYW1lIGR1cmluZyB0ZW1wbGF0aW5nIHRvIGtub3dcblx0XHRcdCAqIGlmIHRoaXMgU2lkZUVmZmVjdHMgbXVzdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCByZXF1ZXN0ZWQgKG9uIGZpZWxkIGNoYW5nZSkgb3IgbXVzdFxuXHRcdFx0ICogYmUgZGVmZXJyZWQgKG9uIGZpZWxkIGdyb3VwIGZvY3VzIG91dClcblx0XHRcdCAqXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNTaWRlRWZmZWN0TmFtZTogc3RyaW5nID0gc0ZpZWxkR3JvdXBJZC5yZXBsYWNlKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIsIFwiXCIpO1xuXHRcdFx0Y29uc3QgbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzID0gdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZT8uW3NTaWRlRWZmZWN0TmFtZV07XG5cdFx0XHRpZiAobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykuZm9yRWFjaCgoc0NvbnRleHRQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RlZmVycmVkU2lkZUVmZmVjdCA9IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdGlmICghb0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCkge1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5wdXNoKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5tYXAoKG9EZWZlcnJlZFNpZGVFZmZlY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3RzOiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGUsIG9TaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgcXVldWUgY29udGFpbmluZyB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHMoKTogdm9pZCB7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGZSZXNvbHZlcjogYW55LCBmUmVqZWN0b3I6IGFueTtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYVRhcmdldHM6IGFueVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSksXG5cdFx0XHRzVHJpZ2dlckFjdGlvbjogU3RyaW5nIHwgdW5kZWZpbmVkID0gKG9TaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkuVHJpZ2dlckFjdGlvbjtcblxuXHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpXG5cdFx0XHQudGhlbigoKSA9PiBmUmVzb2x2ZXIoKSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLCBvQ29udGV4dCk7XG5cdFx0XHRcdGZSZWplY3RvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb0NvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKG9Db250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpICYmIG9Db250cm9sLmdldElkKCk7XG5cblx0XHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5yZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHNcblx0ICogVGhlIFNpZGVFZmZlY3RzIHdpbGwgYmUgcmV0cmlnZ2VyZWQgb24gdGhlIG5leHQgY2hhbmdlIG9uIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0aGF0IG5lZWQgdG8gYmUgcmV0cmlnZ2VyZWRcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJpdmF0ZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsIG9Db250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lICE9PSBtRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblx0XHRpZiAoYklzTm90QWxyZWFkeUxpc3RlZCkge1xuXHRcdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0ucHVzaChvU2lkZUVmZmVjdHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBncm91cCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIFNpZGVFZmZlY3RzLlxuXHQgKiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBhbmQgb25seSB0aGUgZmllbGQgcmVxdWlyZXMgdGhlIFNpZGVFZmZlY3RzIG9uIHRoaXMgY29udGV4dCwgdGhlIFNpZGVFZmZlY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlXG5cdCAqIFNpZGVFZmZlY3RzIHF1ZXVlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cblx0XHRsZXQgYlByb21pc2VTdWNjZXNzID0gdHJ1ZTtcblx0XHRyZXR1cm4gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdGhlIGZpZWxkIGdldHMgYSBGaWVsZEhlbHBlciwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGFsbCBmaWVsZHMgY2hhbmdlZCBieSB0aGlzIEZpZWxkSGVscGVyIGhhdmUgYmVlbiBzZXQuXG5cdFx0XHQgKiBUbyBhY2hpZXZlIHRoaXMsIHdlIGVuc3VyZSB0aGF0IGFsbCByZWxhdGVkIGJpbmRpbmdzIGhhdmUgYmVlbiByZXNvbHZlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIHJlc29sdXRpb24gcHJvY2VzcyBpcyBub3QgbWFuYWdlZCBieSB0aGUgRmllbGQgRXZlbnQgUHJvbWlzZSwgc28gZm9yIGZhc3QgdXNlciBhY3Rpb25zIChsaWtlIGF1dG9tYXRpb24pIGl0IGNhbiBsb2NrIHRoZSBtb2RlbFxuXHRcdFx0ICogYW5kIG5vIHJlcXVlc3QgY2FuIGJlIGV4ZWN1dGVkLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBvRmllbGQgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQ7XG5cdFx0XHRjb25zdCBzRmllbGRIZWxwZXJJZCA9IG9GaWVsZC5nZXRGaWVsZEhlbHAgJiYgb0ZpZWxkLmdldEZpZWxkSGVscCgpO1xuXHRcdFx0aWYgKHNGaWVsZEhlbHBlcklkKSB7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJIZWxwOiBhbnkgPSBDb3JlLmJ5SWQoc0ZpZWxkSGVscGVySWQpO1xuXHRcdFx0XHRpZiAob0ZpbHRlckhlbHAgJiYgb0ZpbHRlckhlbHAuZ2V0T3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcCgob091dFBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcml2YXRlIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob1NvdXJjZUZpZWxkOiBGaWVsZENvbnRyb2wsIHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQmluZGluZ0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHRGb3JTaWRlRWZmZWN0cyB8fCB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHNGdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdHlwZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GUU4oc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlZE1ldGFkYXRhKS5lbnRpdHlUeXBlcy5maW5kKChvRW50aXR5VHlwZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0Z1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvbWlzZVxuXHQgKiBAcGFyYW0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyBGaWVsZCBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb21pc2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRpZiAoIUZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMgRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIEZpZWxkQ29udHJvbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5U2V0cy5maW5kKChvRW50aXR5U2V0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goKHNGaWVsZEdyb3VwSWQpID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID0gYCR7c1NpZGVFZmZlY3RFbnRpdHlUeXBlfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMke1xuXHRcdFx0XHRcdGFTaWRlRWZmZWN0UGFydHMubGVuZ3RoID09PSAyID8gYCMke2FTaWRlRWZmZWN0UGFydHNbMV19YCA6IFwiXCJcblx0XHRcdFx0fWAsXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPVxuXHRcdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bc1NpZGVFZmZlY3RQYXRoXSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzU2lkZUVmZmVjdEVudGl0eVR5cGUpO1xuXHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogc05hbWUsXG5cdFx0XHRcdFx0aW1tZWRpYXRlOiBiSXNJbW1lZGlhdGUsXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdGNvbnRleHQ6IG9Db250ZXh0XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvL1NpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGNvbnRyb2wocylcblx0XHRpZiAoc1ZpZXdFbnRpdHlTZXRTZXROYW1lICYmIG9WaWV3RW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBzVmlld0VudGl0eVR5cGUgPSBvVmlld0VudGl0eVNldC5lbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0bUZpZWxkUGF0aDogYW55ID0gKG9GaWVsZC5nZXRBZ2dyZWdhdGlvbihcImN1c3RvbURhdGFcIikgYXMgYW55W10pLmZpbmQoKG9DdXN0b21EYXRhKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcInNvdXJjZVBhdGhcIjtcblx0XHRcdFx0fSksXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1ZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0aWYgKG1GaWVsZFBhdGggJiYgb0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkUGF0aCA9IG1GaWVsZFBhdGguZ2V0VmFsdWUoKS5yZXBsYWNlKGAvJHtzVmlld0VudGl0eVNldFNldE5hbWV9L2AsIFwiXCIpLFxuXHRcdFx0XHRcdG1Db250cm9sRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0c1ZpZXdFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSBhcyBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udHJvbEVudGl0eVR5cGUpLmZvckVhY2goKHNDb250cm9sTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMuaW5jbHVkZXMoc0ZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNOYW1lID0gYCR7c0NvbnRyb2xOYW1lfTo6JHtzVmlld0VudGl0eVR5cGV9YDtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogTGlzdDogZ2V0cyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHNcblx0ICogUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBldmVudCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaCgoc1NpZGVFZmZlY3ROYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBtRmllbGRTaWRlRWZmZWN0c01hcFtzU2lkZUVmZmVjdE5hbWVdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdENvbnRleHRQYXRoID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBmb3IgdGhpcyBjb250ZXh0XG5cdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF07XG5cdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2goKG1GYWlsZWRTaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF1bbUZhaWxlZFNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0cnVlO1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRwcmV2aW91c2x5RmFpbGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG1GYWlsZWRTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvU2lkZUVmZmVjdFByb3BlcnR5LmltbWVkaWF0ZSkge1xuXHRcdFx0XHQvLyBTaWRlRWZmZWN0cyB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZW50IHByb21pc2UgdmFsaWRhdGlvblxuXHRcdFx0XHRpZiAoIW1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0/LltvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogc1NpZGVFZmZlY3ROYW1lLFxuXHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRvIHRoZSByZWxhdGVkIGRpY3Rpb25hcnlcblx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtU2lkZUVmZmVjdENvbnRleHRQYXRoID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdIHx8IHtcblx0XHRcdFx0XHRwcm9taXNlczogW10sXG5cdFx0XHRcdFx0c2lkZUVmZmVjdFByb3BlcnR5OiBvU2lkZUVmZmVjdFByb3BlcnR5LFxuXHRcdFx0XHRcdHByb2Nlc3NTdGFydGVkOiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcy5jb25jYXQoW1xuXHRcdFx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwLFxuXHRcdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIGFzIFByb21pc2U8YW55PlxuXHRcdFx0XHRdKTtcblx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIGEgZmllbGQgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMgIEJpbmRpbmcgdG8gdGhlIHZhbHVlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBCaW5kaW5nIHtcblx0XHRsZXQgc0JpbmRpbmdOYW1lID0gXCJ2YWx1ZVwiO1xuXHRcdGlmIChvRmllbGQuaXNBKFwic2FwLm0uQ2hlY2tCb3hcIikpIHtcblx0XHRcdHNCaW5kaW5nTmFtZSA9IFwic2VsZWN0ZWRcIjtcblx0XHR9IGVsc2UgaWYgKG9GaWVsZC5pc0EoXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWxlV3JhcHBlclwiKSkge1xuXHRcdFx0c0JpbmRpbmdOYW1lID0gXCJ1cGxvYWRVcmxcIjtcblx0XHR9XG5cdFx0cmV0dXJuIG9GaWVsZC5nZXRCaW5kaW5nKHNCaW5kaW5nTmFtZSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
725
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJwcml2YXRlRXh0ZW5zaW9uIiwib25Jbml0IiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJfbUZpZWxkR3JvdXBRdWV1ZSIsIl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUiLCJTZXQiLCJfbUZhaWxlZFNpZGVFZmZlY3RzIiwiY2xlYXJQcm9wZXJ0aWVzU3RhdHVzIiwiY2xlYXIiLCJnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMiLCJkZWxldGVGYWlsZWRSZXF1ZXN0c0ZvckFDb250ZXh0IiwiY29udGV4dFBhdGgiLCJoYW5kbGVGaWVsZENoYW5nZSIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UiLCJ0aGF0IiwiYURlZmVycmVkU2lkZUVmZmVjdHMiLCJhRmllbGRHcm91cElkcyIsImdldFBhcmFtZXRlciIsImdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZSIsIm9EZWZlcnJlZFNpZGVFZmZlY3QiLCJiSXNSZXF1ZXN0c1RyaWdnZXJlZCIsIm9TaWRlRWZmZWN0UHJvcGVydHkiLCJzaWRlRWZmZWN0UHJvcGVydHkiLCJvQ29udGV4dCIsInNDb250ZXh0UGF0aCIsImdldFBhdGgiLCJzRW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsIm1FbnRpdHlUeXBlIiwiX2dldEVudGl0eVR5cGVGcm9tRlFOIiwicHJvbWlzZXMiLCJTb3VyY2VQcm9wZXJ0aWVzIiwiZXZlcnkiLCJzb3VyY2VQcm9wZXJ0eSIsInR5cGUiLCJzSWQiLCJfZ2VuZXJhdGVTdGF0dXNJbmRleCIsInZhbHVlIiwiaGFzIiwiZmluYWxseSIsIm5hbWUiLCJzRmllbGRHcm91cElkIiwic1NpZGVFZmZlY3ROYW1lIiwicmVwbGFjZSIsIm1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyIsIk9iamVjdCIsImtleXMiLCJwcm9jZXNzU3RhcnRlZCIsInB1c2giLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJvU2lkZUVmZmVjdHMiLCJyZW1vdmVGYWlsZWRTaWRlRWZmZWN0cyIsImdyb3VwSWQiLCJmbkdldFRhcmdldHMiLCJzVHJpZ2dlckFjdGlvbiIsImV4ZWN1dGVBY3Rpb24iLCJhVGFyZ2V0cyIsImxlbmd0aCIsInJlamVjdCIsInJlc29sdmUiLCJ0YXJnZXRzQW5kQWN0aW9uRGF0YSIsIlRhcmdldEVudGl0aWVzIiwiY29uY2F0IiwiVGFyZ2V0UHJvcGVydGllcyIsIlRyaWdnZXJBY3Rpb24iLCJyZW1vdmVDb250cm9sU2lkZUVmZmVjdHMiLCJvQ29udHJvbCIsInNDb250cm9sSWQiLCJpc0EiLCJnZXRJZCIsImJJc05vdEFscmVhZHlMaXN0ZWQiLCJtRmFpbGVkU2lkZUVmZmVjdHMiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib1Byb21pc2UiLCJvRmllbGQiLCJzRmllbGRIZWxwZXJJZCIsImdldEZpZWxkSGVscCIsIm9GaWx0ZXJIZWxwIiwiQ29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsImdldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsIm9CaW5kaW5nQ29udGV4dCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9Db250ZXh0Rm9yU2lkZUVmZmVjdHMiLCJnZXRDb250ZXh0Iiwic0Z1bGx5UXVhbGlmaWVkTmFtZSIsImdldENvbnZlcnRlZE1ldGFNb2RlbCIsImVudGl0eVR5cGVzIiwiZmluZCIsIm9FbnRpdHlUeXBlIiwiX2dldEZpZWxkUHJvbWlzZSIsInZhbGlkaXR5IiwiRmllbGRSdW50aW1lIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwic3RhdGUiLCJnZXRTb3VyY2UiLCJzaWRlRWZmZWN0c01hcCIsIl9nZXRGaWVsZFNpZGVFZmZlY3RzTWFwIiwibVNpZGVFZmZlY3RzTWFwIiwiZ2V0RmllbGRHcm91cElkcyIsInNWaWV3RW50aXR5U2V0U2V0TmFtZSIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwib1ZpZXdFbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwib0VudGl0eVNldCIsImdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkIiwic1ZpZXdFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsIm1GaWVsZFBhdGgiLCJnZXRBZ2dyZWdhdGlvbiIsIm9DdXN0b21EYXRhIiwiZ2V0S2V5IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzRmllbGRQYXRoIiwiZ2V0VmFsdWUiLCJtQ29udHJvbEVudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJzQ29udHJvbE5hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwiaW5jbHVkZXMiLCJzTmFtZSIsImltbWVkaWF0ZSIsIl9nZXREYXRhVG9HZW5lcmF0ZVNpZGVFZmZlY3RzTWFwRnJvbVNpZGVFZmZlY3RJZCIsImJJc0ltbWVkaWF0ZSIsImluZGV4T2YiLCJhU2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzU2lkZUVmZmVjdFBhdGgiLCJvU2lkZUVmZmVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJtRmllbGRTaWRlRWZmZWN0c01hcCIsIm9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwIiwibUZhaWxlZFNpZGVFZmZlY3RzTmFtZSIsInNTaWRlRWZmZWN0Q29udGV4dFBhdGgiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJtU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYlN1Y2Nlc3MiLCJvRmllbGRCaW5kaW5nIiwiX2dldEJpbmRpbmdGb3JGaWVsZCIsImFGaWVsZFBhdGhzIiwiZ2V0QmluZGluZ3MiLCJzUGF0aCIsInNCaW5kaW5nTmFtZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVR5cGUsIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuXHRDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5LFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0U2lkZUVmZmVjdHNUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgRmllbGRSdW50aW1lIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuXG50eXBlIEZpZWxkQ29udHJvbCA9IENvbnRyb2wgJiB7XG5cdGdldEZpZWxkSGVscCgpOiBzdHJpbmc7XG5cdGdldEZpZWxkR3JvdXBJZHMoKTogc3RyaW5nW107XG59O1xuXG50eXBlIEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUgPSB7XG5cdHByb21pc2U6IFByb21pc2U8YW55Pjtcblx0ZmllbGQ6IEZpZWxkQ29udHJvbDtcblx0c2lkZUVmZmVjdHNNYXA6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblxuZXhwb3J0IHR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gQmFzZVNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgJiB7XG5cdGNvbnRleHQ6IENvbnRleHQ7XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX21GaWVsZEdyb3VwUXVldWUhOiBGaWVsZEdyb3VwUXVldWVNYXBUeXBlO1xuXHRwcml2YXRlIF9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUhOiBTZXQ8c3RyaW5nPjtcblx0cHJpdmF0ZSBfb1NpZGVFZmZlY3RzU2VydmljZSE6IGFueTtcblx0cHJpdmF0ZSBfbUZhaWxlZFNpZGVFZmZlY3RzITogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZSA9IHt9O1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSA9IG5ldyBTZXQoKTtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBjbGVhclByb3BlcnRpZXNTdGF0dXNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGRlbGV0ZUZhaWxlZFJlcXVlc3RzRm9yQUNvbnRleHQoY29udGV4dFBhdGg6IHN0cmluZykge1xuXHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIHdvcmtmbG93IGZvciBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zIGFyZSBtYW5hZ2VkOlxuXHQgKiAgLSBFeGVjdXRlOiB0cmlnZ2VycyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHMgaWYgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBldmVudCBpcyBmdWxmaWxsZWRcblx0ICogIC0gUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZENoYW5nZVxuXHQgKiBAcGFyYW0gb0V2ZW50IFNBUFVJNSBldmVudCB0aGF0IGNvbWVzIGZyb20gYSBmaWVsZCBjaGFuZ2Vcblx0ICogQHBhcmFtIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IEV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcCgobVNpZGVFZmZlY3RzUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhtU2lkZUVmZmVjdHNQcm9wZXJ0eS5zaWRlRWZmZWN0cywgbVNpZGVFZmZlY3RzUHJvcGVydHkuY29udGV4dCk7XG5cdFx0XHRcdFx0fSkgfHwgW11cblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcikgPT4ge1xuXHRcdFx0XHRpZiAoYklzSW1tZWRpYXRlVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZCBTaWRlRWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFNpZGVFZmZlY3RzIGhhdmUgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHByZVJlcXVpc2l0ZSB2YWxpZGF0aW9uIGZhaWxzIHNvIHdlIG5lZWRcblx0XHRcdFx0XHQgKiB0byBrZWVwIHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgYXMgRmFpbGVkIHJlcXVlc3QgKHRvIGJlIHJldHJpZ2dlciBvbiBuZXh0IGNoYW5nZSlcblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdC5maWx0ZXIoKG1JbW1lZGlhdGVTaWRlRWZmZWN0cykgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaCgobUltbWVkaWF0ZVNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10gPSBbXSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpO1xuXG5cdFx0Y29uc3QgZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlID0gZnVuY3Rpb24gKG9EZWZlcnJlZFNpZGVFZmZlY3Q6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSkge1xuXHRcdFx0bGV0IGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gZmFsc2U7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5ID0gb0RlZmVycmVkU2lkZUVmZmVjdC5zaWRlRWZmZWN0UHJvcGVydHk7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dDtcblx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhhdC5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3QgbUVudGl0eVR5cGUgPSB0aGF0Ll9nZXRFbnRpdHlUeXBlRnJvbUZRTihzRW50aXR5VHlwZSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChvRGVmZXJyZWRTaWRlRWZmZWN0LnByb21pc2VzKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoKHNvdXJjZVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChzb3VyY2VQcm9wZXJ0eS50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0lkID0gdGhhdC5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc291cmNlUHJvcGVydHkudmFsdWUsIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gIXRoYXQuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5oYXMoc0lkKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoYXQucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMsIG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKG9FcnJvcikgPT4ge1xuXHRcdFx0XHRcdGlmIChiSXNSZXF1ZXN0c1RyaWdnZXJlZCkge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCAke3NDb250ZXh0UGF0aH1gLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlW29TaWRlRWZmZWN0UHJvcGVydHkubmFtZV1bc0NvbnRleHRQYXRoXTtcblx0XHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goKHNGaWVsZEdyb3VwSWQpID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdFx0ICpcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc1NpZGVFZmZlY3ROYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMgPSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlPy5bc1NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdGlmIChtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKS5mb3JFYWNoKChzQ29udGV4dFBhdGgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcCgob0RlZmVycmVkU2lkZUVmZmVjdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgYWRkQ29udHJvbFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlIFNpZGVFZmZlY3RzIGNvbnRyb2wgd2lsbCBiZSByZWdpc3RlcmVkXG5cdCAqIEBwYXJhbSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gcmVnaXN0ZXIuIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyByZW1vdmVGYWlsZWRTaWRlRWZmZWN0cygpOiB2b2lkIHtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHBhcmFtIGZuR2V0VGFyZ2V0cyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBnaXZlIHVzIHRoZSB0YXJnZXRzIGFuZCBhY3Rpb25zIGlmIGl0IHdhcyBjb21pbmcgdGhyb3VnaCBzb21lIHNwZWNpZmljIGhhbmRsaW5nLlxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSxcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRncm91cElkPzogc3RyaW5nLFxuXHRcdGZuR2V0VGFyZ2V0cz86IEZ1bmN0aW9uXG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGFUYXJnZXRzOiBhbnlbXSwgc1RyaWdnZXJBY3Rpb247XG5cdFx0aWYgKGZuR2V0VGFyZ2V0cykge1xuXHRcdFx0Y29uc3QgdGFyZ2V0c0FuZEFjdGlvbkRhdGEgPSBhd2FpdCBmbkdldFRhcmdldHMob1NpZGVFZmZlY3RzKTtcblx0XHRcdGFUYXJnZXRzID0gdGFyZ2V0c0FuZEFjdGlvbkRhdGFbXCJhVGFyZ2V0c1wiXTtcblx0XHRcdHNUcmlnZ2VyQWN0aW9uID0gdGFyZ2V0c0FuZEFjdGlvbkRhdGFbXCJUcmlnZ2VyQWN0aW9uXCJdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGFyZ2V0cyA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0c1RyaWdnZXJBY3Rpb24gPSAob1NpZGVFZmZlY3RzIGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXHRcdH1cblx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQsIGdyb3VwSWQpO1xuXHRcdH1cblxuXHRcdGlmIChhVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQsIGdyb3VwSWQpLmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgU2lkZUVmZmVjdHMgY3JlYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9Db250cm9sIFNBUFVJNSBDb250cm9sXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhvQ29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250cm9sSWQgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKSAmJiBvQ29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKHNDb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UucmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyB3aWxsIGJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IGNoYW5nZSBvbiB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHByaXZhdGUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lICE9PSBtRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblx0XHRpZiAoYklzTm90QWxyZWFkeUxpc3RlZCkge1xuXHRcdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0ucHVzaChvU2lkZUVmZmVjdHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBncm91cCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIFNpZGVFZmZlY3RzLlxuXHQgKiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBhbmQgb25seSB0aGUgZmllbGQgcmVxdWlyZXMgdGhlIFNpZGVFZmZlY3RzIG9uIHRoaXMgY29udGV4dCwgdGhlIFNpZGVFZmZlY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlXG5cdCAqIFNpZGVFZmZlY3RzIHF1ZXVlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cblx0XHRsZXQgYlByb21pc2VTdWNjZXNzID0gdHJ1ZTtcblx0XHRyZXR1cm4gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdGhlIGZpZWxkIGdldHMgYSBGaWVsZEhlbHBlciwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGFsbCBmaWVsZHMgY2hhbmdlZCBieSB0aGlzIEZpZWxkSGVscGVyIGhhdmUgYmVlbiBzZXQuXG5cdFx0XHQgKiBUbyBhY2hpZXZlIHRoaXMsIHdlIGVuc3VyZSB0aGF0IGFsbCByZWxhdGVkIGJpbmRpbmdzIGhhdmUgYmVlbiByZXNvbHZlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIHJlc29sdXRpb24gcHJvY2VzcyBpcyBub3QgbWFuYWdlZCBieSB0aGUgRmllbGQgRXZlbnQgUHJvbWlzZSwgc28gZm9yIGZhc3QgdXNlciBhY3Rpb25zIChsaWtlIGF1dG9tYXRpb24pIGl0IGNhbiBsb2NrIHRoZSBtb2RlbFxuXHRcdFx0ICogYW5kIG5vIHJlcXVlc3QgY2FuIGJlIGV4ZWN1dGVkLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBvRmllbGQgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQ7XG5cdFx0XHRjb25zdCBzRmllbGRIZWxwZXJJZCA9IG9GaWVsZC5nZXRGaWVsZEhlbHAgJiYgb0ZpZWxkLmdldEZpZWxkSGVscCgpO1xuXHRcdFx0aWYgKHNGaWVsZEhlbHBlcklkKSB7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJIZWxwOiBhbnkgPSBDb3JlLmJ5SWQoc0ZpZWxkSGVscGVySWQpO1xuXHRcdFx0XHRpZiAob0ZpbHRlckhlbHAgJiYgb0ZpbHRlckhlbHAuZ2V0T3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcCgob091dFBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHRcblx0ICogQHBhcmFtIHNTaWRlRWZmZWN0RW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBTQVBVSTUgQ29udGV4dCBvciB1bmRlZmluZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9CaW5kaW5nQ29udGV4dDogYW55LCBzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gb0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgRW50aXR5VHlwZSBiYXNlZCBvbiBpdHMgZnVsbHktcXVhbGlmaWVkIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBUaGUgZW50aXR5IHR5cGVcblx0ICovXG5cdHByaXZhdGUgX2dldEVudGl0eVR5cGVGcm9tRlFOKHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5VHlwZXMuZmluZCgob0VudGl0eVR5cGUpID0+IHtcblx0XHRcdHJldHVybiBvRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPT09IHNGdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvbWlzZSBvZiB0aGUgZmllbGQgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb21pc2Vcblx0ICogQHBhcmFtIG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMgRmllbGQgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9taXNlKG9FdmVudDogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRjb25zdCB2YWxpZGl0eSA9IEZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eTtcblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGlmICghdmFsaWRpdHkpIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBmaWVsZCB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIEZpZWxkIHByb3BlcnRpZXMgKGV2ZW50IGNoYW5nZSBwcm9taXNlLCBmaWVsZCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byB0aGlzIGZpZWxkKVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudDogRXZlbnQpOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlIHtcblx0XHRjb25zdCBvRmllbGQ6IEZpZWxkQ29udHJvbCA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBGaWVsZENvbnRyb2w7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvbWlzZTogdGhpcy5fZ2V0RmllbGRQcm9taXNlKG9FdmVudCksXG5cdFx0XHRmaWVsZDogb0ZpZWxkLFxuXHRcdFx0c2lkZUVmZmVjdHNNYXA6IHRoaXMuX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgbWFwXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGFyZVxuXHQgKiAtIGxpc3RlZCBpbnRvIEZpZWxkR3JvdXBJZHMgKGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2UpXG5cdCAqIC0gZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCBvciBjb250cm9scyBhbmQgdGhhdCBjb25maWd1cmUgdGhpcyBmaWVsZCBhcyBTb3VyY2VQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXBcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBtYXBcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRsZXQgbVNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge307XG5cdFx0Y29uc3QgYUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5U2V0cy5maW5kKChvRW50aXR5U2V0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdG1TaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2VuZXJhdGVTaWRlRWZmZWN0c01hcEZyb21TaWRlRWZmZWN0SWQoYUZpZWxkR3JvdXBJZHMsIG9GaWVsZCkgYXMgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRcdC8vU2lkZUVmZmVjdHMgY29taW5nIGZyb20gY29udHJvbChzKVxuXHRcdGlmIChzVmlld0VudGl0eVNldFNldE5hbWUgJiYgb1ZpZXdFbnRpdHlTZXQpIHtcblx0XHRcdGNvbnN0IHNWaWV3RW50aXR5VHlwZSA9IG9WaWV3RW50aXR5U2V0LmVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRtRmllbGRQYXRoOiBhbnkgPSAob0ZpZWxkLmdldEFnZ3JlZ2F0aW9uKFwiY3VzdG9tRGF0YVwiKSBhcyBhbnlbXSkuZmluZCgob0N1c3RvbURhdGEpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSwgc1ZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0aWYgKG1GaWVsZFBhdGggJiYgb0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkUGF0aCA9IG1GaWVsZFBhdGguZ2V0VmFsdWUoKS5yZXBsYWNlKGAvJHtzVmlld0VudGl0eVNldFNldE5hbWV9L2AsIFwiXCIpLFxuXHRcdFx0XHRcdG1Db250cm9sRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0c1ZpZXdFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSBhcyBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udHJvbEVudGl0eVR5cGUpLmZvckVhY2goKHNDb250cm9sTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMuaW5jbHVkZXMoc0ZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNOYW1lID0gYCR7c0NvbnRyb2xOYW1lfTo6JHtzVmlld0VudGl0eVR5cGV9YDtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBzaWRlIGVmZmVjdCBOYW1lLCBzaWRlZWZmZWN0IG9iaiBhbmQgZW50aXR5IHR5cGUgZnJvbSBhIGdpdmVuIGZpZWxkR3JvdXBJZC5cblx0ICpcblx0ICogQHBhcmFtIHNGaWVsZEdyb3VwSWRcblx0ICogQHJldHVybnMgRGF0YSBhYm91dCBzaWRlZWZmZWN0IG5hbWUsIGVudGl0eXR5cGUsIHNpZGUgZWZmZWN0IG9iamVjdCBhbmQgaWYgaXQgaXMgaW1tZWRpYXRlLlxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RGF0YVRvR2VuZXJhdGVTaWRlRWZmZWN0c01hcEZyb21TaWRlRWZmZWN0SWQoc0ZpZWxkR3JvdXBJZDogYW55KSB7XG5cdFx0Y29uc3QgYklzSW1tZWRpYXRlOiBib29sZWFuID0gc0ZpZWxkR3JvdXBJZC5pbmRleE9mKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIpICE9PSAtMSxcblx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRhU2lkZUVmZmVjdFBhcnRzOiBzdHJpbmdbXSA9IHNOYW1lLnNwbGl0KFwiI1wiKSxcblx0XHRcdHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nID0gYVNpZGVFZmZlY3RQYXJ0c1swXSxcblx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID0gYCR7c1NpZGVFZmZlY3RFbnRpdHlUeXBlfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMke1xuXHRcdFx0XHRhU2lkZUVmZmVjdFBhcnRzLmxlbmd0aCA9PT0gMiA/IGAjJHthU2lkZUVmZmVjdFBhcnRzWzFdfWAgOiBcIlwiXG5cdFx0XHR9YCxcblx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPVxuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc1NpZGVFZmZlY3RFbnRpdHlUeXBlKT8uW3NTaWRlRWZmZWN0UGF0aF07XG5cdFx0cmV0dXJuIHsgc05hbWUsIGJJc0ltbWVkaWF0ZSwgb1NpZGVFZmZlY3QsIHNTaWRlRWZmZWN0RW50aXR5VHlwZSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlIHRoZSBzaWRlIGVmZmVjdHMgbWFwIGZyb20gaWQgd2hpY2ggaXMgdGhlIGVudGl0eSBhbmQgcXVhbGlmaWVyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gZW50aXR5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGFGaWVsZEdyb3VwSWRzXG5cdCAqIEBwYXJhbSBvRmllbGRcblx0ICogQHJldHVybnMgU2lkZSBlZmZlY3QgbWFwIHdpdGggZGF0YVxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkKFxuXHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSxcblx0XHRvRmllbGQ/OiBGaWVsZENvbnRyb2xcblx0KTogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHwgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzTWFwOiBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfCBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge307XG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaCgoc0ZpZWxkR3JvdXBJZDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCB7IHNOYW1lLCBiSXNJbW1lZGlhdGUsIG9TaWRlRWZmZWN0LCBzU2lkZUVmZmVjdEVudGl0eVR5cGUgfSA9XG5cdFx0XHRcdHRoaXMuX2dldERhdGFUb0dlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkKHNGaWVsZEdyb3VwSWQpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvRmllbGRcblx0XHRcdFx0PyB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiAoIW9GaWVsZCB8fCAob0ZpZWxkICYmIG9Db250ZXh0KSkpIHtcblx0XHRcdFx0bVNpZGVFZmZlY3RzTWFwW3NOYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRpbW1lZGlhdGU6IGJJc0ltbWVkaWF0ZSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3Rcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKG9GaWVsZCkge1xuXHRcdFx0XHRcdChtU2lkZUVmZmVjdHNNYXBbc05hbWVdIGFzIEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSkuY29udGV4dCA9IG9Db250ZXh0ITtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBtU2lkZUVmZmVjdHNNYXA7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBMaXN0OiBnZXRzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0c1xuXHQgKiBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIGV2ZW50IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgIEFycmF5IG9mIGltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlLFxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+XG5cdCk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdIHtcblx0XHRjb25zdCBtRmllbGRTaWRlRWZmZWN0c01hcCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5zaWRlRWZmZWN0c01hcCxcblx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwID0gdGhpcy5fZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpLCAvLyBQcm9taXNlIG1hbmFnaW5nIEZpZWxkR3JvdXAgcmVxdWVzdHMgaWYgRmllbGQgcHJvbWlzZSBmYWlsc1xuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZTogYW55ID0ge30sXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IFtdO1xuXG5cdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdE9iamVjdC5rZXlzKG1GaWVsZFNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKChzU2lkZUVmZmVjdE5hbWUpID0+IHtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSA9IG1GaWVsZFNpZGVFZmZlY3RzTWFwW3NTaWRlRWZmZWN0TmFtZV0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0Q29udGV4dFBhdGggPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ/LmdldFBhdGgoKTtcblx0XHRcdGlmIChzU2lkZUVmZmVjdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2goKG1GYWlsZWRTaWRlRWZmZWN0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdW21GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXNseUZhaWxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG1GYWlsZWRTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvU2lkZUVmZmVjdFByb3BlcnR5LmltbWVkaWF0ZSkge1xuXHRcdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdFx0aWYgKCFtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdPy5bb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBtU2lkZUVmZmVjdENvbnRleHRQYXRoID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdIHx8IHtcblx0XHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogb1NpZGVFZmZlY3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdHByb2Nlc3NTdGFydGVkOiBmYWxzZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0bVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcyA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMuY29uY2F0KFtcblx0XHRcdFx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwLFxuXHRcdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSBiU3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMob0ZpZWxkOiBGaWVsZENvbnRyb2wsIGJTdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb0ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0Ly8gUmV0cmlldmVzIGFsbCBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGZpZWxkXG5cdFx0XHRjb25zdCBvRmllbGRCaW5kaW5nOiBhbnkgPSB0aGlzLl9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkKTtcblx0XHRcdGNvbnN0IGFGaWVsZFBhdGhzID0gb0ZpZWxkQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiKVxuXHRcdFx0XHQ/IChvRmllbGRCaW5kaW5nLmdldEJpbmRpbmdzKCkgfHwgW10pLm1hcCgob0JpbmRpbmc6IGFueSkgPT4gb0JpbmRpbmcuc1BhdGgpXG5cdFx0XHRcdDogW29GaWVsZEJpbmRpbmcuZ2V0UGF0aCgpXTtcblxuXHRcdFx0Ly8gU3RvcmVzIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXNcblx0XHRcdGFGaWVsZFBhdGhzLmZvckVhY2goKHNGaWVsZFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBzSWQgPSB0aGlzLl9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzRmllbGRQYXRoLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlW2JTdWNjZXNzID8gXCJkZWxldGVcIiA6IFwiYWRkXCJdKHNJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IGJpbmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyAgQmluZGluZyB0byB0aGUgdmFsdWVcblx0ICovXG5cdHByaXZhdGUgX2dldEJpbmRpbmdGb3JGaWVsZChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEJpbmRpbmcge1xuXHRcdGxldCBzQmluZGluZ05hbWUgPSBcInZhbHVlXCI7XG5cdFx0aWYgKG9GaWVsZC5pc0EoXCJzYXAubS5DaGVja0JveFwiKSkge1xuXHRcdFx0c0JpbmRpbmdOYW1lID0gXCJzZWxlY3RlZFwiO1xuXHRcdH0gZWxzZSBpZiAob0ZpZWxkLmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbGVXcmFwcGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQThETUEsOEIsV0FETEMsY0FBYyxDQUFDLDhDQUFELEMsVUFTYkMsY0FBYyxFLFVBZ0JkQyxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBWWRELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFLZEQsZUFBZSxFLFVBQ2ZDLGNBQWMsRSxVQWlCZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQTZDZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWlGZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQVdkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBZ0JkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBb0NkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBa0JkQyxnQkFBZ0IsRSxXQUNoQkQsY0FBYyxFLFdBNkdkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBNkpkRCxlQUFlLEUsV0FDZkMsY0FBYyxFOzs7Ozs7Ozs7V0F0aEJSRSxNLEdBRFAsa0JBQ2dCO01BQ2YsS0FBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtNQUNBLEtBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtNQUNBLEtBQUtNLG9CQUFMLEdBQTZCLEtBQUtILGNBQU4sQ0FBNkJJLHFCQUE3QixFQUE1QjtNQUNBLEtBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO01BQ0EsS0FBS0MseUJBQUwsR0FBaUMsSUFBSUMsR0FBSixFQUFqQztNQUNBLEtBQUtDLG1CQUFMLEdBQTJCLEVBQTNCO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdRQyxxQixHQUZQLGlDQUVxQztNQUNwQyxLQUFLSCx5QkFBTCxDQUErQkksS0FBL0I7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