@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
@@ -171,10 +171,19 @@ class InternalEditFlow extends ControllerExtension {
171
171
  const oTable = this.getView().byId(mParameters.controlId) as Table;
172
172
  if (!oTable || !oTable.isA("sap.ui.mdc.Table")) {
173
173
  throw new Error("parameter controlId missing or incorrect");
174
+ } else {
175
+ mParameters.parentControl = oTable;
174
176
  }
175
177
  const oListBinding = oTable.getRowBinding() as any;
176
178
  mParameters.bFindActiveContexts = true;
177
179
  BusyLocker.lock(oLockObject);
180
+
181
+ // Check if a displayed view can be impacted by the deletion, i.e. if there's an OP displaying a deleted object.
182
+ // We have to check this before the contexts are deleted (after, the contexts are invalid)
183
+ const navigateBackFromContext = aContexts.find((context: any) => {
184
+ return oRoutingListener.isCurrentStateImpactedBy(context);
185
+ });
186
+
178
187
  return this.deleteDocumentTransaction(aContexts, mParameters)
179
188
  .then(() => {
180
189
  let oResult;
@@ -213,13 +222,9 @@ class InternalEditFlow extends ControllerExtension {
213
222
  aContexts.map((context: Context) => context.getPath())
214
223
  );
215
224
 
216
- // Finally, check if the current state can be impacted by the deletion, i.e. if there's
217
- // an OP displaying a deleted object. If yes navigate back to dismiss the OP
218
- for (let index = 0; index < aContexts.length; index++) {
219
- if (oRoutingListener.isCurrentStateImpactedBy(aContexts[index])) {
220
- oRoutingListener.navigateBackFromContext(aContexts[index]);
221
- break;
222
- }
225
+ // Navigate back from a deleted context if needed
226
+ if (navigateBackFromContext) {
227
+ oRoutingListener.navigateBackFromContext(navigateBackFromContext);
223
228
  }
224
229
 
225
230
  return oResult;
@@ -244,45 +249,38 @@ class InternalEditFlow extends ControllerExtension {
244
249
 
245
250
  @publicExtension()
246
251
  @finalExtension()
247
- computeEditMode(oContext: any) {
252
+ async computeEditMode(oContext: any): Promise<void> {
248
253
  const sCustomAction = this.getInternalModel().getProperty("/sCustomAction");
249
- return Promise.resolve(
250
- (() => {
251
- const sProgrammingModel = this.getProgrammingModel(oContext);
252
-
253
- if (sProgrammingModel === ProgrammingModel.Draft) {
254
- this.setDraftStatus(DraftStatus.Clear);
255
-
256
- return oContext
257
- .requestObject("IsActiveEntity")
258
- .then((bIsActiveEntity: any) => {
259
- if (bIsActiveEntity === false) {
260
- // in case the document is draft set it in edit mode
261
- this.setEditMode(EditMode.Editable);
262
- return oContext.requestObject("HasActiveEntity").then((bHasActiveEntity: any) => {
263
- this.setEditMode(undefined, !bHasActiveEntity);
264
- });
265
- } else {
266
- // active document, stay on display mode
267
- this.setEditMode(EditMode.Display, false);
268
- }
269
- })
270
- .catch(function (oError: any) {
271
- Log.error("Error while determining the editMode for draft", oError);
272
- throw oError;
273
- });
274
- } else if (sProgrammingModel === ProgrammingModel.Sticky) {
275
- if (sCustomAction && sCustomAction !== "" && this._hasNewActionForSticky(oContext, this.getView(), sCustomAction)) {
276
- this.getTransactionHelper()._bCreateMode = true;
277
- this.getTransactionHelper().handleDocumentModifications();
278
- this.setEditMode(EditMode.Editable, true);
279
- EditState.setEditStateDirty();
280
- this.handleStickyOn(oContext);
281
- this.getInternalModel().setProperty("/sCustomAction", "");
282
- }
254
+ const sProgrammingModel = this.getProgrammingModel(oContext);
255
+
256
+ if (sProgrammingModel === ProgrammingModel.Draft) {
257
+ try {
258
+ this.setDraftStatus(DraftStatus.Clear);
259
+
260
+ const bIsActiveEntity = await oContext.requestObject("IsActiveEntity");
261
+ if (bIsActiveEntity === false) {
262
+ // in case the document is draft set it in edit mode
263
+ this.setEditMode(EditMode.Editable);
264
+ const bHasActiveEntity = await oContext.requestObject("HasActiveEntity");
265
+ this.setEditMode(undefined, !bHasActiveEntity);
266
+ } else {
267
+ // active document, stay on display mode
268
+ this.setEditMode(EditMode.Display, false);
283
269
  }
284
- })()
285
- );
270
+ } catch (oError: any) {
271
+ Log.error("Error while determining the editMode for draft", oError);
272
+ throw oError;
273
+ }
274
+ } else if (sProgrammingModel === ProgrammingModel.Sticky) {
275
+ if (sCustomAction && sCustomAction !== "" && this._hasNewActionForSticky(oContext, this.getView(), sCustomAction)) {
276
+ this.getTransactionHelper()._bCreateMode = true;
277
+ this.getTransactionHelper().handleDocumentModifications();
278
+ this.setEditMode(EditMode.Editable, true);
279
+ EditState.setEditStateDirty();
280
+ this.handleStickyOn(oContext);
281
+ this.getInternalModel().setProperty("/sCustomAction", "");
282
+ }
283
+ }
286
284
  }
287
285
 
288
286
  /**
@@ -16,7 +16,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
16
16
 
17
17
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
18
18
 
19
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
20
 
21
21
  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; }
22
22
 
@@ -175,8 +175,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
175
175
  var onError = function () {
176
176
  sap.ui.require(["sap/m/MessageBox"], function (MessageBox) {
177
177
  var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
178
- MessageBox.show(oResourceBundle.getText("C_COMMON_HELPER_NAVIGATION_ERROR_MESSAGE"), {
179
- title: oResourceBundle.getText("C_COMMON_NAVIGATION_ERROR_TITLE")
178
+ MessageBox.error(oResourceBundle.getText("C_COMMON_HELPER_NAVIGATION_ERROR_MESSAGE"), {
179
+ title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR")
180
180
  });
181
181
  });
182
182
  };
@@ -530,10 +530,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
530
530
  return this._oView.getViewData().entitySet;
531
531
  }
532
532
  /**
533
- * Removes sensitive data from the semantic attribute with respect to entitySet.
533
+ * Removes sensitive data from the semantic attribute with respect to the entitySet.
534
534
  *
535
535
  * @param oAttributes Context data
536
- * @param sMetaPath Meta path to reach the entityset in the MetaModel
536
+ * @param sMetaPath Meta path to reach the entitySet in the MetaModel
537
537
  * @returns Array of semantic Attributes
538
538
  * @private
539
539
  */
@@ -541,31 +541,33 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
541
541
  ;
542
542
 
543
543
  _proto.removeSensitiveData = function removeSensitiveData(oAttributes, sMetaPath) {
544
- var aProperties = Object.keys(oAttributes);
544
+ if (oAttributes) {
545
+ var aProperties = Object.keys(oAttributes);
545
546
 
546
- if (aProperties.length) {
547
- delete oAttributes["@odata.context"];
548
- delete oAttributes["@odata.metadataEtag"];
549
- delete oAttributes["SAP__Messages"];
547
+ if (aProperties.length) {
548
+ delete oAttributes["@odata.context"];
549
+ delete oAttributes["@odata.metadataEtag"];
550
+ delete oAttributes["SAP__Messages"];
550
551
 
551
- for (var j = 0; j < aProperties.length; j++) {
552
- if (oAttributes[aProperties[j]] && typeof oAttributes[aProperties[j]] === "object") {
553
- this.removeSensitiveData(oAttributes[aProperties[j]], "".concat(sMetaPath, "/").concat(aProperties[j]));
554
- }
555
-
556
- var sProp = aProperties[j],
557
- aPropertyAnnotations = this._oMetaModel.getObject("".concat(sMetaPath, "/").concat(sProp, "@"));
552
+ for (var j = 0; j < aProperties.length; j++) {
553
+ if (oAttributes[aProperties[j]] && typeof oAttributes[aProperties[j]] === "object") {
554
+ this.removeSensitiveData(oAttributes[aProperties[j]], "".concat(sMetaPath, "/").concat(aProperties[j]));
555
+ }
558
556
 
559
- if (aPropertyAnnotations) {
560
- if (aPropertyAnnotations["@com.sap.vocabularies.PersonalData.v1.IsPotentiallySensitive"] || aPropertyAnnotations["@com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] || aPropertyAnnotations["@com.sap.vocabularies.Analytics.v1.Measure"]) {
561
- delete oAttributes[sProp];
562
- } else if (aPropertyAnnotations["@com.sap.vocabularies.Common.v1.FieldControl"]) {
563
- var oFieldControl = aPropertyAnnotations["@com.sap.vocabularies.Common.v1.FieldControl"];
557
+ var sProp = aProperties[j],
558
+ aPropertyAnnotations = this._oMetaModel.getObject("".concat(sMetaPath, "/").concat(sProp, "@"));
564
559
 
565
- if (oFieldControl["$EnumMember"] && oFieldControl["$EnumMember"].split("/")[1] === "Inapplicable") {
566
- delete oAttributes[sProp];
567
- } else if (oFieldControl["$Path"] && this._isFieldControlPathInapplicable(oFieldControl["$Path"], oAttributes)) {
560
+ if (aPropertyAnnotations) {
561
+ if (aPropertyAnnotations["@com.sap.vocabularies.PersonalData.v1.IsPotentiallySensitive"] || aPropertyAnnotations["@com.sap.vocabularies.UI.v1.ExcludeFromNavigationContext"] || aPropertyAnnotations["@com.sap.vocabularies.Analytics.v1.Measure"]) {
568
562
  delete oAttributes[sProp];
563
+ } else if (aPropertyAnnotations["@com.sap.vocabularies.Common.v1.FieldControl"]) {
564
+ var oFieldControl = aPropertyAnnotations["@com.sap.vocabularies.Common.v1.FieldControl"];
565
+
566
+ if (oFieldControl["$EnumMember"] && oFieldControl["$EnumMember"].split("/")[1] === "Inapplicable") {
567
+ delete oAttributes[sProp];
568
+ } else if (oFieldControl["$Path"] && this._isFieldControlPathInapplicable(oFieldControl["$Path"], oAttributes)) {
569
+ delete oAttributes[sProp];
570
+ }
569
571
  }
570
572
  }
571
573
  }
@@ -575,7 +577,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
575
577
  return oAttributes;
576
578
  }
577
579
  /**
578
- * Check if Path based FieldControl Evaluates to inapplicable.
580
+ * Check if path-based FieldControl evaluates to inapplicable.
579
581
  *
580
582
  * @param sFieldControlPath Field control path
581
583
  * @param oAttribute SemanticAttributes
@@ -796,4 +798,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/controllerext
796
798
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigate", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "navigate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareContextForExternalNavigation", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareContextForExternalNavigation"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "prepareFiltersForExternalNavigation", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "prepareFiltersForExternalNavigation"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getNavigationMode", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "getNavigationMode"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateWithConfirmationDialog", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateWithConfirmationDialog"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getEntitySet", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getEntitySet"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeSensitiveData", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "removeSensitiveData"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateOutbound", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateOutbound"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getOutboundParams", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "getOutboundParams"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onChevronPressNavigateOutBound", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "onChevronPressNavigateOutBound"), _class2.prototype)), _class2)) || _class);
797
799
  return InternalIntentBasedNavigation;
798
800
  }, false);
799
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLnRzIl0sIm5hbWVzIjpbIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZGVmaW5lVUk1Q2xhc3MiLCJtZXRob2RPdmVycmlkZSIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiSW5zdGVhZCIsInByaXZhdGVFeHRlbnNpb24iLCJvbkluaXQiLCJfb0FwcENvbXBvbmVudCIsImJhc2UiLCJnZXRBcHBDb21wb25lbnQiLCJfb01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiX29OYXZpZ2F0aW9uU2VydmljZSIsImdldE5hdmlnYXRpb25TZXJ2aWNlIiwiX29WaWV3IiwiZ2V0VmlldyIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbiIsIm1OYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9kb05hdmlnYXRlIiwib0NvbnRleHQiLCJ2TmF2aWdhdGlvbkNvbnRleHRzIiwibmF2aWdhdGlvbkNvbnRleHRzIiwiYU5hdmlnYXRpb25Db250ZXh0cyIsIkFycmF5IiwiaXNBcnJheSIsInZTZW1hbnRpY09iamVjdE1hcHBpbmciLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJ2T3V0Ym91bmRQYXJhbXMiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvVGFyZ2V0SW5mbyIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwib1ZpZXciLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJzZXRCaW5kaW5nQ29udGV4dCIsImFTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJsZW5ndGgiLCJmb3JFYWNoIiwib05hdmlnYXRpb25Db250ZXh0IiwiaXNBIiwib1NlbWFudGljQXR0cmlidXRlcyIsImdldE9iamVjdCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvTmF2Q29udGV4dCIsInByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwicHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInB1c2giLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJkYXRhIiwibWV0YVBhdGgiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsInRvSlNPTlN0cmluZyIsIm9Nb2RlbCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFVybCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJ1bmRlZmluZWQiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiX2FwcGx5T3V0Ym91bmRQYXJhbXMiLCJpbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJhZGFwdE5hdmlnYXRpb25Db250ZXh0IiwiX2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyIsIl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzIiwic05hdk1vZGUiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJtUmVmcmVzaFN0cmF0ZWdpZXMiLCJyZWZyZXNoU3RyYXRlZ2llcyIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0Vmlld0RhdGEiLCJyZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUiLCJtVmlld1JlZnJlc2hTdHJhdGVnaWVzIiwibWVyZ2VPYmplY3RzIiwibVJlZnJlc2hTdHJhdGVneSIsIktlZXBBbGl2ZUhlbHBlciIsImdldFJlZnJlc2hTdHJhdGVneUZvckludGVudCIsInNldFByb3BlcnR5Iiwib25FcnJvciIsInNhcCIsInVpIiwicmVxdWlyZSIsIk1lc3NhZ2VCb3giLCJvUmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic2hvdyIsImdldFRleHQiLCJ0aXRsZSIsIkVycm9yIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvTWV0YU1vZGVsIiwiY29udmVydGVyVHlwZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsImJpbmQiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk5hdmlnYXRpb25UeXBlIiwiRm9yd2FyZE5hdmlnYXRpb24iLCJvRGlzdGluY3RLZXlzIiwic0NvbnRleHRQYXRoIiwiYU1ldGFQYXRoUGFydHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0IiwiTG9va1VwT2JqZWN0Iiwic0xvb2tVcE9iamVjdE1ldGFQYXRoIiwic0tleSIsIm9OZXdMb29rVXBPYmplY3QiLCJzTWFpbkVudGl0eVNldE5hbWUiLCJzTWFpbkVudGl0eVR5cGVOYW1lIiwib1Byb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJzTWFpbkVudGl0eVZhbHVlUGF0aCIsInNDdXJyZW50VmFsdWVQYXRoIiwic0xhc3RWYWx1ZVBhdGgiLCJzRGlzdGluY3RLZXkiLCJhQ29uZmxpY3RpbmdQYXRocyIsInNXaW5uZXJWYWx1ZVBhdGgiLCJpIiwic1BhdGgiLCJzUGF0aEluQ29udGV4dCIsInJlcGxhY2UiLCJzRW50aXR5VHlwZU5hbWUiLCJzVmFsdWUiLCJqb2luIiwiZ2V0UHJvcGVydHkiLCJzUHJvcGVydHkiLCJwcmVwYXJlRmlsdGVyc0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsIm9GaWx0ZXJCYXJDb25kaXRpb25zIiwic1Jvb3RQYXRoIiwiYVBhcmFtZXRlcnMiLCJvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdCIsInNGdWxsQ29udGV4dFBhdGgiLCJpbmNsdWRlcyIsImFQYXRoUGFydHMiLCJyZXBsYWNlQWxsIiwiZmlsdGVyQ29uZGl0aW9ucyIsImZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3QiLCJuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2ciLCJub3RBcHBsaWNhYmxlQ29udGV4dHMiLCJvQXBwbGljYWJsZUNvbnRleHREaWFsb2ciLCJvbkNsb3NlIiwiY2xvc2UiLCJvbkNvbnRpbnVlIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZm5PcGVuQW5kRmlsbERpYWxvZyIsIm9EaWFsb2dDb250ZW50Iiwibk5vdEFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZUl0ZW1zIiwib05vdEFwcGxpY2FibGVJdGVtc01vZGVsIiwiSlNPTk1vZGVsIiwib1RvdGFscyIsInRvdGFsIiwibGFiZWwiLCJzZXRNb2RlbCIsIm9wZW4iLCJzRnJhZ21lbnROYW1lIiwib0RpYWxvZ0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJzQ2Fub25pY2FsUGF0aCIsImdldENhbm9uaWNhbFBhdGgiLCJzdWJzdHIiLCJpbmRleE9mIiwiUHJvbWlzZSIsInJlc29sdmUiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVR5cGUiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm1vZGVscyIsIm1ldGFNb2RlbCIsInRoZW4iLCJvRnJhZ21lbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9Qb3BvdmVyIiwiYWRkRGVwZW5kZW50IiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsInJlbW92ZVNlbGVjdE9wdGlvbiIsImVudGl0eVNldCIsIm9BdHRyaWJ1dGVzIiwiYVByb3BlcnRpZXMiLCJPYmplY3QiLCJrZXlzIiwiaiIsInNQcm9wIiwiYVByb3BlcnR5QW5ub3RhdGlvbnMiLCJvRmllbGRDb250cm9sIiwiX2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsInNGaWVsZENvbnRyb2xQYXRoIiwib0F0dHJpYnV0ZSIsImJJbmFwcGxpY2FibGUiLCJhUGFydHMiLCJoYXNPd25Qcm9wZXJ0eSIsInZNYXBwaW5ncyIsIm9NYXBwaW5ncyIsIkpTT04iLCJwYXJzZSIsInNMb2NhbFByb3BlcnR5Iiwic1NlbWFudGljT2JqZWN0UHJvcGVydHkiLCJnZXRTZWxlY3RPcHRpb24iLCJvU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsIm5hdmlnYXRlT3V0Ym91bmQiLCJzT3V0Ym91bmQiLCJhTmF2UGFyYW1zIiwib01hbmlmZXN0RW50cnkiLCJnZXRNYW5pZmVzdEVudHJ5Iiwib091dGJvdW5kIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib3V0Ym91bmRQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiZ2V0T3V0Ym91bmRQYXJhbXMiLCJrZXkiLCJvUGFyYW1zIiwiYVZhbHVlcyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvT3V0Ym91bmRQYXJhbXMiLCJvUGFyYW1zTWFwcGluZyIsIm9NYXBwaW5nIiwidmFsdWUiLCJmb3JtYXQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9PdXRib3VuZHMiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9EaXNwbGF5T3V0Ym91bmQiLCJvUmVmcmVzaFN0cmF0ZWdpZXMiLCJpbnRlbnRzIiwib0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3kiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFFTUEsNkIsV0FETEMsY0FBYyxDQUFDLGtFQUFELEMsVUFPYkMsY0FBYyxFLFVBa0NkQyxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBK0pkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBbUhkRCxlQUFlLEUsVUFD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LGtCQUFrQixFQUFFRixRQURpRjtBQUVyR3VELFVBQUFBLGlCQUFpQixFQUFFZ0wsa0JBRmtGO0FBR3JHOU4sVUFBQUEsOEJBQThCLEVBQUVBO0FBSHFFLFNBQXRHLEVBOUJtRixDQW9DbkY7OztBQUNBLGVBQU9tSixPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBLE9BdENELE1Bc0NPO0FBQ04sY0FBTSxJQUFJakYsS0FBSiwyQkFBNkJxSixlQUE3QiwyREFBTjtBQUNBO0FBQ0QsSzs7O0lBandCMENVLG1CO1NBb3dCN0JwUSw2QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHtcblx0ZGVmaW5lVUk1Q2xhc3MsXG5cdGV4dGVuc2libGUsXG5cdGZpbmFsRXh0ZW5zaW9uLFxuXHRtZXRob2RPdmVycmlkZSxcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsSW50ZXJuYWxCYXNlZE5hdmlnYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS44NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsSW50ZXJuYWxCYXNlZE5hdmlnYXRpb25cIilcbmNsYXNzIEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX29NZXRhTW9kZWwhOiBPRGF0YU1ldGFNb2RlbDtcblx0cHJpdmF0ZSBfb05hdmlnYXRpb25TZXJ2aWNlITogTmF2aWdhdGlvblNlcnZpY2U7XG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dGhpcy5fb01ldGFNb2RlbCA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHR0aGlzLl9vTmF2aWdhdGlvblNlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldE5hdmlnYXRpb25TZXJ2aWNlKCk7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgaW50ZW50LWJhc2VkIG5hdmlnYXRpb24gKFNlbWFudGljT2JqZWN0LUFjdGlvbikgd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogSWYgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgaXMgcHJvdmlkZWQsIHRoaXMgaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciB0aGUgYWRhcHRhdGlvbiBieSBhIGNvbnN1bWVyLlxuXHQgKiBUaGlzIHRha2VzIGNhcmUgb2YgcmVtb3ZpbmcgYW55IHRlY2huaWNhbCBwYXJhbWV0ZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGFuIGV4cGxhY2Ugb3IgaW5wbGFjZSBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlIHBsYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb24gIEFjdGlvbiBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnNdIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBleHRlcm5hbCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLm5hdmlnYXRpb25Db250ZXh0c10gVXNlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudDpcblx0ICogICAgYSBzaW5nbGUgaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fVxuXHQgKiAgICBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fVxuXHQgKiAgICBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0c1xuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgY29udGV4dCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbWV0YVBhdGggYW5kIHRvIHJlbW92ZSBhbnkgc2Vuc2l0aXZlIGRhdGFcblx0ICpcdFx0ICBJZiBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHBhc3NlZCwgdGhlIGZvbGxvd2luZyBmb3JtYXQgaXggZXhwZWN0ZWQ6XG5cdCAqXHRcdCAge1xuXHQgKlx0XHRcdGRhdGE6IHtcblx0ICpcdCBcdFx0XHRQcm9kdWN0SUQ6IDc2MzQsXG5cdCAqXHRcdFx0XHROYW1lOiBcIkxhcHRvcFwiXG5cdCAqXHRcdFx0IH0sXG5cdCAqXHRcdFx0IG1ldGFQYXRoOiBcIi9TYWxlc09yZGVyTWFuYWdlXCJcblx0ICogICAgICAgIH1cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nXSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNlbWFudGljT2JqZWN0TWFwcGluZyBvciBTZW1hbnRpY09iamVjdE1hcHBpbmcgdGhhdCBhcHBsaWVzIHRvIHRoaXMgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5kZWZhdWx0UmVmcmVzaFN0cmF0ZWd5XSBEZWZhdWx0IHJlZnJlc2ggc3RyYXRlZ3kgdG8gYmUgdXNlZCBpbiBjYXNlIG5vIHJlZnJlc2ggc3RyYXRlZ3kgaXMgc3BlY2lmaWVkIGZvciB0aGUgaW50ZW50IGluIHRoZSB2aWV3LlxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWZyZXNoU3RyYXRlZ2llc11cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXSBBZGRpdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVycyBjb25maWd1cmVkIGluIHRoZSBjcm9zc0FwcE5hdmlnYXRpb24gb3V0Ym91bmQgcGFyYW1ldGVycy5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZShcblx0XHRzU2VtYW50aWNPYmplY3Q6IHN0cmluZyxcblx0XHRzQWN0aW9uOiBzdHJpbmcsXG5cdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzPzogb2JqZWN0IHwgYW55W10gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nPzogc3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGRlZmF1bHRSZWZyZXNoU3RyYXRlZ3k/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0cmVmcmVzaFN0cmF0ZWdpZXM/OiBhbnk7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZFxuXHQpIHtcblx0XHRjb25zdCBfZG9OYXZpZ2F0ZSA9IChvQ29udGV4dD86IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgdk5hdmlnYXRpb25Db250ZXh0cyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzLFxuXHRcdFx0XHRhTmF2aWdhdGlvbkNvbnRleHRzID1cblx0XHRcdFx0XHR2TmF2aWdhdGlvbkNvbnRleHRzICYmICFBcnJheS5pc0FycmF5KHZOYXZpZ2F0aW9uQ29udGV4dHMpID8gW3ZOYXZpZ2F0aW9uQ29udGV4dHNdIDogdk5hdmlnYXRpb25Db250ZXh0cyxcblx0XHRcdFx0dlNlbWFudGljT2JqZWN0TWFwcGluZyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMuc2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHR2T3V0Ym91bmRQYXJhbXMgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMgJiYgbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0b1RhcmdldEluZm86IGFueSA9IHtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdGFjdGlvbjogc0FjdGlvblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyO1xuXG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1ZpZXcuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1NlbWFudGljT2JqZWN0ICYmIHNBY3Rpb24pIHtcblx0XHRcdFx0bGV0IGFTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueVtdID0gW10sXG5cdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0XHQvLyAxLiBnZXQgU2VtYW50aWNBdHRyaWJ1dGVzIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvbkNvbnRleHRzICYmIGFOYXZpZ2F0aW9uQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Db250ZXh0cy5mb3JFYWNoKChvTmF2aWdhdGlvbkNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gMS4xLmEgaWYgbmF2aWdhdGlvbiBjb250ZXh0IGlzIGluc3RhbmNlIG9mIHNhcC51aS5tb2RlLm9kYXRhLnY0LkNvbnRleHRcblx0XHRcdFx0XHRcdC8vIGVsc2UgY2hlY2sgaWYgbmF2aWdhdGlvbiBjb250ZXh0IGlzIG9mIHR5cGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Db250ZXh0LmlzQSAmJiBvTmF2aWdhdGlvbkNvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRcdFx0Ly8gMS4xLmIgcmVtb3ZlIHNlbnNpdGl2ZSBkYXRhXG5cdFx0XHRcdFx0XHRcdGxldCBvU2VtYW50aWNBdHRyaWJ1dGVzID0gb05hdmlnYXRpb25Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSB0aGlzLl9vTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBhbHNvIHJlbW92ZSBzZW5zaXRpdmUgZGF0YSBmcm9tICBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0b1NlbWFudGljQXR0cmlidXRlcyA9IHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvU2VtYW50aWNBdHRyaWJ1dGVzLCBzTWV0YVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmF2Q29udGV4dCA9IHRoaXMucHJlcGFyZUNvbnRleHRGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1NlbWFudGljQXR0cmlidXRlcywgb05hdmlnYXRpb25Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0b1RhcmdldEluZm9bXCJwcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0XCJdID0gb05hdkNvbnRleHQucHJvcGVydGllc1dpdGhvdXRDb25mbGljdDtcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcy5wdXNoKG9OYXZDb250ZXh0LnNlbWFudGljQXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHQhKG9OYXZpZ2F0aW9uQ29udGV4dCAmJiBBcnJheS5pc0FycmF5KG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhKSkgJiZcblx0XHRcdFx0XHRcdFx0dHlwZW9mIG9OYXZpZ2F0aW9uQ29udGV4dCA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdC8vIDEuMS5iIHJlbW92ZSBzZW5zaXRpdmUgZGF0YSBmcm9tIG9iamVjdFxuXHRcdFx0XHRcdFx0XHRhU2VtYW50aWNBdHRyaWJ1dGVzLnB1c2godGhpcy5yZW1vdmVTZW5zaXRpdmVEYXRhKG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhLCBvTmF2aWdhdGlvbkNvbnRleHQubWV0YVBhdGgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25Db250ZXh0ICYmIEFycmF5LmlzQXJyYXkob05hdmlnYXRpb25Db250ZXh0LmRhdGEpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhIGNhbiBiZSBhcnJheSBhbHJlYWR5IGV4IDogW3tDdXN0b21lcjogXCIxMDAwMVwifSwge0N1c3RvbWVyOiBcIjEwMDkxXCJ9XVxuXHRcdFx0XHRcdFx0XHQvLyBoZW5jZSBhc3NpZ25pbmcgaXQgdG8gdGhlIGFTZW1hbnRpY0F0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcyA9IHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSwgb05hdmlnYXRpb25Db250ZXh0Lm1ldGFQYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyAyLjEgTWVyZ2UgYmFzZSBzZWxlY3Rpb24gdmFyaWFudCBhbmQgc2FuaXRpemVkIHNlbWFudGljIGF0dHJpYnV0ZXMgaW50byBvbmUgU2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHRpZiAoYVNlbWFudGljQXR0cmlidXRlcyAmJiBhU2VtYW50aWNBdHRyaWJ1dGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gdGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIDMuIEFkZCBmaWx0ZXJDb250ZXh0VXJsIHRvIFNWIHNvIHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBjYW4gcmVtb3ZlIGFueSBzZW5zaXRpdmUgZGF0YSBiYXNlZCBvbiB2aWV3IGVudGl0eVNldFxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdHNFbnRpdHlTZXQgPSB0aGlzLmdldEVudGl0eVNldCgpLFxuXHRcdFx0XHRcdHNDb250ZXh0VXJsID0gc0VudGl0eVNldCA/IHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZS5jb25zdHJ1Y3RDb250ZXh0VXJsKHNFbnRpdHlTZXQsIG9Nb2RlbCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChzQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnNldEZpbHRlckNvbnRleHRVcmwoc0NvbnRleHRVcmwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgT3V0Ym91bmQgUGFyYW1ldGVycyB0byB0aGUgU1Zcblx0XHRcdFx0aWYgKHZPdXRib3VuZFBhcmFtcykge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5T3V0Ym91bmRQYXJhbXMob1NlbGVjdGlvblZhcmlhbnQsIHZPdXRib3VuZFBhcmFtcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA0LiBnaXZlIGFuIG9wcG9ydHVuaXR5IGZvciB0aGUgYXBwbGljYXRpb24gdG8gaW5mbHVlbmNlIHRoZSBTZWxlY3Rpb25WYXJpYW50XG5cdFx0XHRcdG9Db250cm9sbGVyLmludGVudEJhc2VkTmF2aWdhdGlvbi5hZGFwdE5hdmlnYXRpb25Db250ZXh0KG9TZWxlY3Rpb25WYXJpYW50LCBvVGFyZ2V0SW5mbyk7XG5cblx0XHRcdFx0Ly8gNS4gQXBwbHkgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdzIHRvIHRoZSBTVlxuXHRcdFx0XHRpZiAodlNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5U2VtYW50aWNPYmplY3RNYXBwaW5ncyhvU2VsZWN0aW9uVmFyaWFudCwgdlNlbWFudGljT2JqZWN0TWFwcGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA2LiByZW1vdmUgdGVjaG5pY2FsIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb24gVmFyaWFudFxuXHRcdFx0XHR0aGlzLl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9TZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHQvLyA3LiBjaGVjayBpZiBwcm9ncmFtbWluZyBtb2RlbCBpcyBzdGlja3kgYW5kIHBhZ2UgaXMgZWRpdGFibGVcblx0XHRcdFx0Y29uc3Qgc05hdk1vZGUgPSBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLmdldE5hdmlnYXRpb25Nb2RlKCk7XG5cblx0XHRcdFx0Ly8gOC4gVXBkYXRpbmcgcmVmcmVzaCBzdHJhdGVneSBpbiBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0XHRjb25zdCBtUmVmcmVzaFN0cmF0ZWdpZXMgPSAobU5hdmlnYXRpb25QYXJhbWV0ZXJzICYmIG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWZyZXNoU3RyYXRlZ2llcykgfHwge30sXG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKChvVmlldyAmJiAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpKS5yZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1WaWV3UmVmcmVzaFN0cmF0ZWdpZXMgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnJlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZSB8fCB7fTtcblx0XHRcdFx0XHRcdG1lcmdlT2JqZWN0cyhtUmVmcmVzaFN0cmF0ZWdpZXMsIG1WaWV3UmVmcmVzaFN0cmF0ZWdpZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBtUmVmcmVzaFN0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldFJlZnJlc2hTdHJhdGVneUZvckludGVudChtUmVmcmVzaFN0cmF0ZWdpZXMsIHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbik7XG5cdFx0XHRcdFx0aWYgKG1SZWZyZXNoU3RyYXRlZ3kpIHtcblx0XHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3JlZnJlc2hTdHJhdGVneU9uQXBwUmVzdG9yZVwiLCBtUmVmcmVzaFN0cmF0ZWd5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyA5LiBOYXZpZ2F0ZSB2aWEgTmF2aWdhdGlvbkhhbmRsZXJcblx0XHRcdFx0Y29uc3Qgb25FcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvbS9NZXNzYWdlQm94XCJdLCBmdW5jdGlvbiAoTWVzc2FnZUJveDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fSEVMUEVSX05BVklHQVRJT05fRVJST1JfTUVTU0FHRVwiKSwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9OQVZJR0FUSU9OX0VSUk9SX1RJVExFXCIpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0dGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLm5hdmlnYXRlKFxuXHRcdFx0XHRcdHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdChvU2VsZWN0aW9uVmFyaWFudCBhcyBhbnkpLnRvSlNPTlN0cmluZygpLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzTmF2TW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2VtYW50aWMgT2JqZWN0L2FjdGlvbiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dCAmJiAob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCIgJiZcblx0XHRcdG9NZXRhTW9kZWwgJiZcblx0XHRcdCFNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob01ldGFNb2RlbClcblx0XHQpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRfZG9OYXZpZ2F0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfZG9OYXZpZ2F0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVwYXJlIGF0dHJpYnV0ZXMgdG8gYmUgcGFzc2VkIHRvIGV4dGVybmFsIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvU2VtYW50aWNBdHRyaWJ1dGVzIENvbnRleHQgZGF0YSBhZnRlciByZW1vdmluZyBhbGwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQWN0dWFsIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIHdlcmUgZGVyaXZlZC5cblx0ICogQHJldHVybnMgT2JqZWN0IG9mIHByZXBhcmVkIGF0dHJpYnV0ZXMgZm9yIGV4dGVybmFsIG5hdmlnYXRpb24gYW5kIG5vIGNvbmZsaWN0IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJlcGFyZUNvbnRleHRGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1NlbWFudGljQXR0cmlidXRlczogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdC8vIDEuIEZpbmQgYWxsIGRpc3RpbmN0IGtleXMgaW4gdGhlIG9iamVjdCBTZW1hbnRpY0F0dHJpYnV0ZXNcblx0XHQvLyBTdG9yZSBtZXRhIHBhdGggZm9yIGVhY2ggb2NjdXJlbmNlIG9mIHRoZSBrZXlcblx0XHRjb25zdCBvRGlzdGluY3RLZXlzOiBhbnkgPSB7fSxcblx0XHRcdHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzQ29udGV4dFBhdGgpLFxuXHRcdFx0YU1ldGFQYXRoUGFydHMgPSBzTWV0YVBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuXHRcdGZ1bmN0aW9uIF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3QoTG9va1VwT2JqZWN0OiBhbnksIHNMb29rVXBPYmplY3RNZXRhUGF0aDogYW55KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gTG9va1VwT2JqZWN0KSB7XG5cdFx0XHRcdC8vIG51bGwgY2FzZT8/XG5cdFx0XHRcdGlmIChMb29rVXBPYmplY3Rbc0tleV0gPT09IG51bGwgfHwgdHlwZW9mIExvb2tVcE9iamVjdFtzS2V5XSAhPT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0S2V5c1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYga2V5IGlzIGZvdW5kIGZvciB0aGUgZmlyc3QgdGltZSB0aGVuIGNyZWF0ZSBhcnJheVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XSA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBwdXNoIHBhdGggdG8gYXJyYXlcblx0XHRcdFx0XHRvRGlzdGluY3RLZXlzW3NLZXldLnB1c2goc0xvb2tVcE9iamVjdE1ldGFQYXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiBhIG5lc3RlZCBvYmplY3QgaXMgZm91bmRcblx0XHRcdFx0XHRjb25zdCBvTmV3TG9va1VwT2JqZWN0ID0gTG9va1VwT2JqZWN0W3NLZXldO1xuXHRcdFx0XHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob05ld0xvb2tVcE9iamVjdCwgYCR7c0xvb2tVcE9iamVjdE1ldGFQYXRofS8ke3NLZXl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KG9TZW1hbnRpY0F0dHJpYnV0ZXMsIHNNZXRhUGF0aCk7XG5cblx0XHQvLyAyLiBEZXRlcm1pbmUgZGlzdGluY3Qga2V5IHZhbHVlIGFuZCBhZGQgY29uZmxpY3RlZCBwYXRocyB0byBzZW1hbnRpYyBhdHRyaWJ1dGVzXG5cdFx0Y29uc3Qgc01haW5FbnRpdHlTZXROYW1lID0gYU1ldGFQYXRoUGFydHNbMF0sXG5cdFx0XHRzTWFpbkVudGl0eVR5cGVOYW1lID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NNYWluRW50aXR5U2V0TmFtZX0vQHNhcHVpLm5hbWVgKSxcblx0XHRcdG9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0OiBhbnkgPSB7fTtcblx0XHRsZXQgc01haW5FbnRpdHlWYWx1ZVBhdGgsIHNDdXJyZW50VmFsdWVQYXRoLCBzTGFzdFZhbHVlUGF0aDtcblx0XHRmb3IgKGNvbnN0IHNEaXN0aW5jdEtleSBpbiBvRGlzdGluY3RLZXlzKSB7XG5cdFx0XHRjb25zdCBhQ29uZmxpY3RpbmdQYXRocyA9IG9EaXN0aW5jdEtleXNbc0Rpc3RpbmN0S2V5XTtcblx0XHRcdGxldCBzV2lubmVyVmFsdWVQYXRoO1xuXHRcdFx0Ly8gRmluZCB3aW5uZXIgdmFsdWUgZm9yIGVhY2ggZGlzdGluY3Qga2V5IGluIGNhc2Ugb2YgY29uZmxpY3QgYnkgdGhlIGZvbGxvd2luZyBydWxlOlxuXG5cdFx0XHQvLyAtPiBBLiBpZiBhbnkgbWV0YSBwYXRoIGZvciBhIGRpc3RpbmN0IGtleSBpcyB0aGUgc2FtZSBhcyBtYWluIGVudGl0eSB0YWtlIHRoYXQgYXMgdGhlIHZhbHVlXG5cdFx0XHQvLyAtPiBCLiBpZiBBIGlzIG5vdCBtZXQga2VlcCB0aGUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IChzTWV0YVBhdGggPT09IHBhdGggb2YgZGlzdGluY2Uga2V5KVxuXHRcdFx0Ly8gLT4gQy4gaWYgQSwgQiBvciBDIGFyZSBub3QgbWV0IHRha2UgdGhlIGxhc3QgcGF0aCBmb3IgdmFsdWVcblx0XHRcdGlmIChhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdC8vIGNvbmZsaWN0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IGFDb25mbGljdGluZ1BhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbaV07XG5cdFx0XHRcdFx0bGV0IHNQYXRoSW5Db250ZXh0ID0gc1BhdGgucmVwbGFjZShzUGF0aCA9PT0gc01ldGFQYXRoID8gc01ldGFQYXRoIDogYCR7c01ldGFQYXRofS9gLCBcIlwiKTtcblx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IChzUGF0aEluQ29udGV4dCA9PT0gXCJcIiA/IHNQYXRoSW5Db250ZXh0IDogYCR7c1BhdGhJbkNvbnRleHR9L2ApICsgc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofS9Ac2FwdWkubmFtZWApO1xuXHRcdFx0XHRcdC8vIHJ1bGUgQVxuXG5cdFx0XHRcdFx0Ly8gcnVsZSBBXG5cdFx0XHRcdFx0aWYgKHNFbnRpdHlUeXBlTmFtZSA9PT0gc01haW5FbnRpdHlUeXBlTmFtZSkge1xuXHRcdFx0XHRcdFx0c01haW5FbnRpdHlWYWx1ZVBhdGggPSBzUGF0aEluQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBydWxlIEJcblx0XHRcdFx0XHRpZiAoc1BhdGggPT09IHNNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0c0N1cnJlbnRWYWx1ZVBhdGggPSBzUGF0aEluQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBydWxlIENcblx0XHRcdFx0XHRzTGFzdFZhbHVlUGF0aCA9IHNQYXRoSW5Db250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gYWRkIGNvbmZsaWN0ZWQgcGF0aCB0byBzZW1hbnRpYyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcGF0aCBwb2ludHMgdG8gbWFpbiBlbnRpdHkgYW5kIHByZWZpeCBhdHRyaWJ1dGUgbmFtZXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0XHRvU2VtYW50aWNBdHRyaWJ1dGVzW1xuXHRcdFx0XHRcdFx0YCR7c01ldGFQYXRofS8ke3NQYXRoSW5Db250ZXh0fWBcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCIuXCIpXG5cdFx0XHRcdFx0XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNQYXRoSW5Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBIHx8IEIgfHwgQ1xuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGggfHwgc0xhc3RWYWx1ZVBhdGg7XG5cdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbc0Rpc3RpbmN0S2V5XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNXaW5uZXJWYWx1ZVBhdGgpO1xuXHRcdFx0XHRzTWFpbkVudGl0eVZhbHVlUGF0aCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0c0N1cnJlbnRWYWx1ZVBhdGggPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHNMYXN0VmFsdWVQYXRoID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gbm8gY29uZmxpY3QsIGFkZCBkaXN0aW5jdCBrZXkgd2l0aG91dCBhZGRpbmcgcGF0aHNcblx0XHRcdFx0Y29uc3Qgc1BhdGggPSBhQ29uZmxpY3RpbmdQYXRoc1swXTsgLy8gYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBhbmQgaGVuY2Ugbm8gY29uZmxpY3Rcblx0XHRcdFx0bGV0IHNQYXRoSW5Db250ZXh0ID0gc1BhdGgucmVwbGFjZShzUGF0aCA9PT0gc01ldGFQYXRoID8gc01ldGFQYXRoIDogYCR7c01ldGFQYXRofS9gLCBcIlwiKTtcblx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSAoc1BhdGhJbkNvbnRleHQgPT09IFwiXCIgPyBzUGF0aEluQ29udGV4dCA6IGAke3NQYXRoSW5Db250ZXh0fS9gKSArIHNEaXN0aW5jdEtleTtcblx0XHRcdFx0b1NlbWFudGljQXR0cmlidXRlc1tzRGlzdGluY3RLZXldID0gb0NvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGhJbkNvbnRleHQpO1xuXHRcdFx0XHRvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdFtzRGlzdGluY3RLZXldID0gYCR7c01ldGFQYXRofS8ke3NQYXRoSW5Db250ZXh0fWBcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKFwiLlwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gMy4gUmVtb3ZlIGFsbCBOYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eSBpbiBvU2VtYW50aWNBdHRyaWJ1dGVzKSB7XG5cdFx0XHRpZiAob1NlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHldICE9PSBudWxsICYmIHR5cGVvZiBvU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0ZGVsZXRlIG9TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbWFudGljQXR0cmlidXRlczogb1NlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdHByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q6IG9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0XG5cdFx0fTtcblx0fVxuXHQvKipcblx0ICogUHJlcGFyZSBmaWx0ZXIgY29uZGl0aW9ucyB0byBiZSBwYXNzZWQgdG8gZXh0ZXJuYWwgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9GaWx0ZXJCYXJDb25kaXRpb25zIEZpbHRlciBjb25kaXRpb25zLlxuXHQgKiBAcGFyYW0gc1Jvb3RQYXRoIFJvb3QgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBhUGFyYW1ldGVycyBOYW1lcyBvZiBwYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQuXG5cdCAqIEByZXR1cm5zIE9iamVjdCBvZiBwcmVwYXJlZCBmaWx0ZXIgY29uZGl0aW9ucyBmb3IgZXh0ZXJuYWwgbmF2aWdhdGlvbiBhbmQgbm8gY29uZmxpY3QgZmlsdGVycy5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcmVwYXJlRmlsdGVyc0ZvckV4dGVybmFsTmF2aWdhdGlvbihvRmlsdGVyQmFyQ29uZGl0aW9uczogYW55LCBzUm9vdFBhdGg6IHN0cmluZywgYVBhcmFtZXRlcnM/OiBhbnlbXSkge1xuXHRcdGxldCBzUGF0aDtcblx0XHRjb25zdCBvRGlzdGluY3RLZXlzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdDogYW55ID0ge307XG5cdFx0bGV0IHNNYWluRW50aXR5VmFsdWVQYXRoLCBzQ3VycmVudFZhbHVlUGF0aCwgc0Z1bGxDb250ZXh0UGF0aCwgc1dpbm5lclZhbHVlUGF0aCwgc1BhdGhJbkNvbnRleHQ7XG5cblx0XHRmdW5jdGlvbiBfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KExvb2tVcE9iamVjdDogYW55KSB7XG5cdFx0XHRsZXQgc0xvb2tVcE9iamVjdE1ldGFQYXRoO1xuXHRcdFx0Zm9yIChsZXQgc0tleSBpbiBMb29rVXBPYmplY3QpIHtcblx0XHRcdFx0aWYgKExvb2tVcE9iamVjdFtzS2V5XSkge1xuXHRcdFx0XHRcdGlmIChzS2V5LmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0xvb2tVcE9iamVjdE1ldGFQYXRoID0gc0tleTsgLy8gXCIvU2FsZXNPcmRlcm1hbmFnZS9fSXRlbS9NYXRlcmlhbFwiXG5cdFx0XHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc0tleS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRzS2V5ID0gYVBhdGhQYXJ0c1thUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzTG9va1VwT2JqZWN0TWV0YVBhdGggPSBzUm9vdFBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0S2V5c1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYga2V5IGlzIGZvdW5kIGZvciB0aGUgZmlyc3QgdGltZSB0aGVuIGNyZWF0ZSBhcnJheVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XSA9IFtdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHB1c2ggcGF0aCB0byBhcnJheVxuXHRcdFx0XHRcdG9EaXN0aW5jdEtleXNbc0tleV0ucHVzaChzTG9va1VwT2JqZWN0TWV0YVBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0X2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdChvRmlsdGVyQmFyQ29uZGl0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBzRGlzdGluY3RLZXkgaW4gb0Rpc3RpbmN0S2V5cykge1xuXHRcdFx0Y29uc3QgYUNvbmZsaWN0aW5nUGF0aHMgPSBvRGlzdGluY3RLZXlzW3NEaXN0aW5jdEtleV07XG5cblx0XHRcdGlmIChhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdC8vIGNvbmZsaWN0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IGFDb25mbGljdGluZ1BhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbaV07XG5cdFx0XHRcdFx0aWYgKHNQYXRoID09PSBzUm9vdFBhdGgpIHtcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPSBgJHtzUm9vdFBhdGh9LyR7c0Rpc3RpbmN0S2V5fWA7XG5cdFx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IHNEaXN0aW5jdEtleTtcblx0XHRcdFx0XHRcdHNNYWluRW50aXR5VmFsdWVQYXRoID0gc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRcdFx0b0ZpbHRlckJhckNvbmRpdGlvbnNbYCRQYXJhbWV0ZXIuJHtzRGlzdGluY3RLZXl9YF0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzRGlzdGluY3RLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IHNQYXRoO1xuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IChgJHtzUm9vdFBhdGh9LyR7c1BhdGh9YCBhcyBhbnkpLnJlcGxhY2VBbGwoL1xcKi9nLCBcIlwiKTtcblx0XHRcdFx0XHRcdHNDdXJyZW50VmFsdWVQYXRoID0gc1BhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW1xuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aFxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNWYWx1ZSAhPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi5cIilcblx0XHRcdFx0XHRdID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc1BhdGhJbkNvbnRleHRdO1xuXHRcdFx0XHRcdGRlbGV0ZSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzUGF0aF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGg7XG5cdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzV2lubmVyVmFsdWVQYXRoXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG5vIGNvbmZsaWN0LCBhZGQgZGlzdGluY3Qga2V5IHdpdGhvdXQgYWRkaW5nIHBhdGhzXG5cdFx0XHRcdHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbMF07XG5cdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdHNQYXRoID09PSBzUm9vdFBhdGggPyBgJHtzUm9vdFBhdGh9LyR7c0Rpc3RpbmN0S2V5fWAgOiAoYCR7c1Jvb3RQYXRofS8ke3NQYXRofWAgYXMgYW55KS5yZXBsYWNlQWxsKFwiKlwiLCBcIlwiKTtcblx0XHRcdFx0b0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Rbc0Rpc3RpbmN0S2V5XSA9IHNGdWxsQ29udGV4dFBhdGhcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKFwiLlwiKTtcblx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRvRmlsdGVyQmFyQ29uZGl0aW9uc1tgJFBhcmFtZXRlci4ke3NEaXN0aW5jdEtleX1gXSA9IG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmlsdGVyQ29uZGl0aW9uczogb0ZpbHRlckJhckNvbmRpdGlvbnMsXG5cdFx0XHRmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0OiBvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IE5hdmlnYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gbW9kZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGdldE5hdmlnYXRpb25Nb2RlKCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0LyoqXG5cdCAqIEFsbG93cyBmb3IgbmF2aWdhdGlvbiB0byBhIGdpdmVuIGludGVudCAoU2VtYW50aWNPYmplY3QtQWN0aW9uKSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0LCB1c2luZyBhIGRpYWxvZyB0aGF0IHNob3dzIHRoZSBjb250ZXh0cyB3aGljaCBjYW5ub3QgYmUgcGFzc2VkXG5cdCAqIElmIHNlbWFudGljIG9iamVjdCBtYXBwaW5nIGlzIHByb3ZpZGVkLCB0aGlzIHNldHRpbmcgaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciBhZGFwdGF0aW9uIGJ5IGEgY29uc3VtZXIuXG5cdCAqIFRoaXMgc2V0dGluZyBhbHNvIHJlbW92ZXMgYW55IHRlY2huaWNhbCBwYXJhbWV0ZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGFuIGlucGxhY2Ugb3IgZXhwbGFjZSBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlIHBsYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb24gIEFjdGlvbiBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnNdIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBleHRlcm5hbCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsXVxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHNdIFNpbmdsZSBpbnN0YW5jZSBvciBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSwgb3IgYWx0ZXJuYXRpdmVseSBhbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnQuXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0c10gU2luZ2xlIGluc3RhbmNlIG9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9LCBvciBhbHRlcm5hdGl2ZWx5IGFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzLCB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudCBhbmQgZm9yIHdoaWNoIHRoZSBJQk4gYnV0dG9uIGlzIGVuYWJsZWRcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzXSBTaW5nbGUgaW5zdGFuY2Ugb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0sIG9yIGFsdGVybmF0aXZlbHkgYW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIHdoaWNoIGNhbm5vdCBiZSBwYXNzZWQgdG8gdGhlIGludGVudC5cblx0ICpcdFx0ICBpZiBhbiBhcnJheSBvZiBjb250ZXh0cyBpcyBwYXNzZWQgdGhlIGNvbnRleHQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1ldGEgcGF0aCBhbmQgYWNjb3JkaW5nbHkgcmVtb3ZlIHRoZSBzZW5zaXRpdmUgZGF0YVxuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgZm9sbG93aW5nIGZvcm1hdCBpcyBleHBlY3RlZDpcblx0ICpcdFx0ICB7XG5cdCAqXHRcdFx0ZGF0YToge1xuXHQgKlx0IFx0XHRcdFByb2R1Y3RJRDogNzYzNCxcblx0ICpcdFx0XHRcdE5hbWU6IFwiTGFwdG9wXCJcblx0ICpcdFx0XHQgfSxcblx0ICpcdFx0XHQgbWV0YVBhdGg6IFwiL1NhbGVzT3JkZXJNYW5hZ2VcIlxuXHQgKiAgICAgICAgfVxuXHQgKlx0XHRUaGUgbWV0YVBhdGggaXMgdXNlZCB0byByZW1vdmUgYW55IHNlbnNpdGl2ZSBkYXRhLlxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmddIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZW1hbnRpY09iamVjdE1hcHBpbmcgb3IgU2VtYW50aWNPYmplY3RNYXBwaW5nIHRoYXQgYXBwbGllcyB0byB0aGlzIG5hdmlnYXRpb25cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2coXG5cdFx0c1NlbWFudGljT2JqZWN0OiBzdHJpbmcsXG5cdFx0c0FjdGlvbjogc3RyaW5nLFxuXHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycz86IHtcblx0XHRcdG5hdmlnYXRpb25Db250ZXh0cz86IG9iamVjdCB8IGFueVtdO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogb2JqZWN0IHwgYW55W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBhbnk7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZz86IHN0cmluZyB8IG9iamVjdDtcblx0XHR9XG5cdCkge1xuXHRcdGlmIChtTmF2aWdhdGlvblBhcmFtZXRlcnM/Lm5vdEFwcGxpY2FibGVDb250ZXh0cyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzPy5sZW5ndGggPj0gMSkge1xuXHRcdFx0bGV0IG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZzogRGlhbG9nO1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBVc2VyIGNhbmNlbHMgYWN0aW9uXG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uQ29udGludWU6ICgpID0+IHtcblx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHMgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5PcGVuQW5kRmlsbERpYWxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRjb25zdCBuTm90QXBwbGljYWJsZSA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMgPSBbXTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0b0RpYWxvZ0NvbnRlbnQgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMucHVzaChvRGlhbG9nQ29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb05vdEFwcGxpY2FibGVJdGVtc01vZGVsID0gbmV3IEpTT05Nb2RlbChhTm90QXBwbGljYWJsZUl0ZW1zKTtcblx0XHRcdFx0Y29uc3Qgb1RvdGFscyA9IG5ldyBKU09OTW9kZWwoeyB0b3RhbDogbk5vdEFwcGxpY2FibGUsIGxhYmVsOiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwsIFwibm90QXBwbGljYWJsZVwiKTtcblx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cub3BlbigpO1xuXHRcdFx0fTtcblx0XHRcdC8vIFNob3cgdGhlIGNvbnRleHRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIGFuZCB3aWxsIG5vdCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkXG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5BY3Rpb25QYXJ0aWFsXCI7XG5cdFx0XHRjb25zdCBvRGlhbG9nRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzWzBdLmdldENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBgJHtzQ2Fub25pY2FsUGF0aC5zdWJzdHIoMCwgc0Nhbm9uaWNhbFBhdGguaW5kZXhPZihcIihcIikpfS9gO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldClcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZTogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9Qb3BvdmVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2coKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvclwiKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXHRfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvU2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLmNvbnRleHRcIik7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiKTtcblx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oXCJTQVBfX01lc3NhZ2VzXCIpO1xuXHR9XG5cdC8qKlxuXHQgKiBHZXQgdGFyZ2V0ZWQgRW50aXR5IHNldC5cblx0ICpcblx0ICogQHJldHVybnMgRW50aXR5IHNldCBuYW1lXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdGdldEVudGl0eVNldCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdH1cblx0LyoqXG5cdCAqIFJlbW92ZXMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIHdpdGggcmVzcGVjdCB0byBlbnRpdHlTZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQXR0cmlidXRlcyBDb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBNZXRhIHBhdGggdG8gcmVhY2ggdGhlIGVudGl0eXNldCBpbiB0aGUgTWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNlbWFudGljIEF0dHJpYnV0ZXNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdC8vIFRPLURPIGFkZCB1bml0IHRlc3RzIGZvciB0aGlzIGZ1bmN0aW9uIGluIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBxdW5pdC5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHJlbW92ZVNlbnNpdGl2ZURhdGEob0F0dHJpYnV0ZXM6IGFueSwgc01ldGFQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBhUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVzKTtcblx0XHRpZiAoYVByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0XHRkZWxldGUgb0F0dHJpYnV0ZXNbXCJTQVBfX01lc3NhZ2VzXCJdO1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhUHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAob0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dICYmIHR5cGVvZiBvQXR0cmlidXRlc1thUHJvcGVydGllc1tqXV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dLCBgJHtzTWV0YVBhdGh9LyR7YVByb3BlcnRpZXNbal19YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc1Byb3AgPSBhUHJvcGVydGllc1tqXSxcblx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9ucyA9IHRoaXMuX29NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcH1AYCk7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlBbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCJdIHx8XG5cdFx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVzW3NQcm9wXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tzUHJvcF07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSAmJiB0aGlzLl9pc0ZpZWxkQ29udHJvbFBhdGhJbmFwcGxpY2FibGUob0ZpZWxkQ29udHJvbFtcIiRQYXRoXCJdLCBvQXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVzW3NQcm9wXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9BdHRyaWJ1dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIFBhdGggYmFzZWQgRmllbGRDb250cm9sIEV2YWx1YXRlcyB0byBpbmFwcGxpY2FibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRmllbGRDb250cm9sUGF0aCBGaWVsZCBjb250cm9sIHBhdGhcblx0ICogQHBhcmFtIG9BdHRyaWJ1dGUgU2VtYW50aWNBdHRyaWJ1dGVzXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpbmFwcGxpY2FibGVcblx0ICovXG5cdF9pc0ZpZWxkQ29udHJvbFBhdGhJbmFwcGxpY2FibGUoc0ZpZWxkQ29udHJvbFBhdGg6IHN0cmluZywgb0F0dHJpYnV0ZTogYW55KSB7XG5cdFx0bGV0IGJJbmFwcGxpY2FibGUgPSBmYWxzZTtcblx0XHRjb25zdCBhUGFydHMgPSBzRmllbGRDb250cm9sUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Ly8gc2Vuc2l0aXZlIGRhdGEgaXMgcmVtb3ZlZCBvbmx5IGlmIHRoZSBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuXG5cdFx0aWYgKGFQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRiSW5hcHBsaWNhYmxlID1cblx0XHRcdFx0b0F0dHJpYnV0ZVthUGFydHNbMF1dICYmIG9BdHRyaWJ1dGVbYVBhcnRzWzBdXS5oYXNPd25Qcm9wZXJ0eShhUGFydHNbMV0pICYmIG9BdHRyaWJ1dGVbYVBhcnRzWzBdXVthUGFydHNbMV1dID09PSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiSW5hcHBsaWNhYmxlID0gb0F0dHJpYnV0ZVtzRmllbGRDb250cm9sUGF0aF0gPT09IDA7XG5cdFx0fVxuXHRcdHJldHVybiBiSW5hcHBsaWNhYmxlO1xuXHR9XG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmVwbGFjZSBMb2NhbCBQcm9wZXJ0aWVzIHdpdGggU2VtYW50aWMgT2JqZWN0IG1hcHBpbmdzLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnQgU2VsZWN0aW9uVmFyaWFudCBjb25zaXN0aW5nIG9mIGZpbHRlcmJhciwgVGFibGUgYW5kIFBhZ2UgQ29udGV4dFxuXHQgKiBAcGFyYW0gdk1hcHBpbmdzIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHNlbWFudGljIG9iamVjdCBtYXBwaW5nXG5cdCAqIEByZXR1cm5zIC0gTW9kaWZpZWQgU2VsZWN0aW9uVmFyaWFudCB3aXRoIExvY2FsUHJvcGVydHkgcmVwbGFjZWQgd2l0aCBTZW1hbnRpY09iamVjdFByb3BlcnRpZXMuXG5cdCAqL1xuXHRfYXBwbHlTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCB2TWFwcGluZ3M6IG9iamVjdCB8IHN0cmluZykge1xuXHRcdGNvbnN0IG9NYXBwaW5ncyA9IHR5cGVvZiB2TWFwcGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZNYXBwaW5ncykgOiB2TWFwcGluZ3M7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvTWFwcGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNMb2NhbFByb3BlcnR5ID1cblx0XHRcdFx0KG9NYXBwaW5nc1tpXVtcIkxvY2FsUHJvcGVydHlcIl0gJiYgb01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXVtcIiRQcm9wZXJ0eVBhdGhcIl0pIHx8XG5cdFx0XHRcdChvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl0gJiZcblx0XHRcdFx0XHRvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl1bXCIkUGF0aFwiXSk7XG5cdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSA9XG5cdFx0XHRcdG9NYXBwaW5nc1tpXVtcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl0gfHwgb01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdFx0aWYgKG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSkpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdE9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cblx0XHRcdFx0Ly9DcmVhdGUgYSBuZXcgU2VsZWN0T3B0aW9uIHdpdGggc1NlbWFudGljT2JqZWN0UHJvcGVydHkgYXMgdGhlIHByb3BlcnR5IE5hbWUgYW5kIHJlbW92ZSB0aGUgb2xkZXIgb25lXG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oc1NlbWFudGljT2JqZWN0UHJvcGVydHksIG9TZWxlY3RPcHRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhbiBPdXRib3VuZCBwcm92aWRlZCBpbiB0aGUgbWFuaWZlc3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc091dGJvdW5kIElkZW50aWZpZXIgdG8gbG9jYXRpb24gdGhlIG91dGJvdW5kIGluIHRoZSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzIE9wdGlvbmFsIG1hcCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZW50QmFzZWROYXZpZ2F0aW9uI25hdmlnYXRlT3V0Ym91bmRcblx0ICogQHNpbmNlIDEuODYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kOiBzdHJpbmcsIG1OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGFOYXZQYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9NYW5pZmVzdEVudHJ5ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpLFxuXHRcdFx0b091dGJvdW5kID0gb01hbmlmZXN0RW50cnkuY3Jvc3NOYXZpZ2F0aW9uICYmIG9NYW5pZmVzdEVudHJ5LmNyb3NzTmF2aWdhdGlvbi5vdXRib3VuZHNbc091dGJvdW5kXTtcblx0XHRpZiAoIW9PdXRib3VuZCkge1xuXHRcdFx0TG9nLmVycm9yKFwiT3V0Ym91bmQgaXMgbm90IGRlZmluZWQgaW4gbWFuaWZlc3QhIVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0ID0gb091dGJvdW5kLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0c0FjdGlvbiA9IG9PdXRib3VuZC5hY3Rpb24sXG5cdFx0XHRvdXRib3VuZFBhcmFtcyA9IG9PdXRib3VuZC5wYXJhbWV0ZXJzICYmIHRoaXMuZ2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kLnBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKG1OYXZpZ2F0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0YU5hdlBhcmFtcyA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb25QYXJhbWV0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0XHRsZXQgb1BhcmFtczogYW55O1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtTmF2aWdhdGlvblBhcmFtZXRlcnNba2V5XSkpIHtcblx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzW2tleV07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1zID0ge307XG5cdFx0XHRcdFx0XHRvUGFyYW1zW2tleV0gPSBhVmFsdWVzW2ldO1xuXHRcdFx0XHRcdFx0YU5hdlBhcmFtcz8ucHVzaChvUGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1BhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdG9QYXJhbXNba2V5XSA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVyc1trZXldO1xuXHRcdFx0XHRcdGFOYXZQYXJhbXM/LnB1c2gob1BhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYU5hdlBhcmFtcyB8fCBvdXRib3VuZFBhcmFtcykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IHtcblx0XHRcdFx0XHRkYXRhOiBhTmF2UGFyYW1zIHx8IG91dGJvdW5kUGFyYW1zXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gYXBwbHkgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvblZhcmlhbnQgY29uc2lzdGluZyBvZiBhIGZpbHRlciBiYXIsIGEgdGFibGUsIGFuZCBhIHBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0gdk91dGJvdW5kUGFyYW1zIE91dGJvdW5kIFByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0ICogQHJldHVybnMgLSBUaGUgbW9kaWZpZWQgU2VsZWN0aW9uVmFyaWFudCB3aXRoIG91dGJvdW5kIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRfYXBwbHlPdXRib3VuZFBhcmFtcyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk91dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKHZPdXRib3VuZFBhcmFtcyk7XG5cdFx0Y29uc3QgYVNlbGVjdFByb3BlcnRpZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWFTZWxlY3RQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKGtleSwgXCJJXCIsIFwiRVFcIiwgdk91dGJvdW5kUGFyYW1zW2tleV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvT3V0Ym91bmRQYXJhbXMgUGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBvdXRib3VuZHMuIE9ubHkgXCJwbGFpblwiIGlzIHN1cHBvcnRlZFxuXHQgKiBAcmV0dXJucyBQYXJhbWV0ZXJzIHdpdGggdGhlIGtleS1WYWx1ZSBwYWlyXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBvUGFyYW1zTWFwcGluZzogYW55ID0ge307XG5cdFx0aWYgKG9PdXRib3VuZFBhcmFtcykge1xuXHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvT3V0Ym91bmRQYXJhbXMpIHx8IFtdO1xuXHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IG9PdXRib3VuZFBhcmFtc1trZXldO1xuXHRcdFx0XHRcdGlmIChvTWFwcGluZy52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS5mb3JtYXQgPT09IFwicGxhaW5cIikge1xuXHRcdFx0XHRcdFx0aWYgKCFvUGFyYW1zTWFwcGluZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNNYXBwaW5nW2tleV0gPSBvTWFwcGluZy52YWx1ZS52YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1BhcmFtc01hcHBpbmc7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYW4gb3V0Ym91bmQgbmF2aWdhdGlvbiB3aGVuIGEgdXNlciBjaG9vc2VzIHRoZSBjaGV2cm9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsIG9Db250ZXh0OiBhbnksIHNDcmVhdGVQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvT3V0Ym91bmRzID0gKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpIGFzIGFueSkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKTtcblx0XHRjb25zdCBvRGlzcGxheU91dGJvdW5kID0gb091dGJvdW5kc1tzT3V0Ym91bmRUYXJnZXRdO1xuXHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0aWYgKG9EaXNwbGF5T3V0Ym91bmQgJiYgb0Rpc3BsYXlPdXRib3VuZC5zZW1hbnRpY09iamVjdCAmJiBvRGlzcGxheU91dGJvdW5kLmFjdGlvbikge1xuXHRcdFx0Y29uc3Qgb1JlZnJlc2hTdHJhdGVnaWVzOiBhbnkgPSB7XG5cdFx0XHRcdGludGVudHM6IHt9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3k6IGFueSA9IHt9O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDtcblxuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5pc0EgJiYgb0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gW29Db250ZXh0XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHRbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5W3NNZXRhUGF0aF0gPSBcInNlbGZcIjtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzW1wiX2ZlRGVmYXVsdFwiXSA9IG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc0NyZWF0ZVBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IGAke29EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3R9LSR7b0Rpc3BsYXlPdXRib3VuZC5hY3Rpb259YDtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzLmludGVudHNbc0tleV0gPSB7fTtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzLmludGVudHNbc0tleV1bc0NyZWF0ZVBhdGhdID0gXCJzZWxmXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0Rpc3BsYXlPdXRib3VuZCAmJiBvRGlzcGxheU91dGJvdW5kLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9EaXNwbGF5T3V0Ym91bmQucGFyYW1ldGVycyAmJiB0aGlzLmdldE91dGJvdW5kUGFyYW1zKG9EaXNwbGF5T3V0Ym91bmQucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3QsIG9EaXNwbGF5T3V0Ym91bmQuYWN0aW9uLCB7XG5cdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0czogb0NvbnRleHQsXG5cdFx0XHRcdHJlZnJlc2hTdHJhdGVnaWVzOiBvUmVmcmVzaFN0cmF0ZWdpZXMsXG5cdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyczogYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly9UT0RPOiBjaGVjayB3aHkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpcyByZXF1aXJlZFxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYG91dGJvdW5kIHRhcmdldCAke3NPdXRib3VuZFRhcmdldH0gbm90IGZvdW5kIGluIGNyb3NzIG5hdmlnYXRpb24gZGVmaW5pdGlvbiBvZiBtYW5pZmVzdGApO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcbiJdfQ==
801
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJwcml2YXRlRXh0ZW5zaW9uIiwib25Jbml0IiwiX29BcHBDb21wb25lbnQiLCJiYXNlIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29NZXRhTW9kZWwiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIl9vTmF2aWdhdGlvblNlcnZpY2UiLCJnZXROYXZpZ2F0aW9uU2VydmljZSIsIl9vVmlldyIsImdldFZpZXciLCJuYXZpZ2F0ZSIsInNTZW1hbnRpY09iamVjdCIsInNBY3Rpb24iLCJtTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJfZG9OYXZpZ2F0ZSIsIm9Db250ZXh0Iiwidk5hdmlnYXRpb25Db250ZXh0cyIsIm5hdmlnYXRpb25Db250ZXh0cyIsImFOYXZpZ2F0aW9uQ29udGV4dHMiLCJBcnJheSIsImlzQXJyYXkiLCJ2U2VtYW50aWNPYmplY3RNYXBwaW5nIiwic2VtYW50aWNPYmplY3RNYXBwaW5nIiwidk91dGJvdW5kUGFyYW1zIiwiYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwib1RhcmdldEluZm8iLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsIm9WaWV3Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwic2V0QmluZGluZ0NvbnRleHQiLCJhU2VtYW50aWNBdHRyaWJ1dGVzIiwib1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50IiwibGVuZ3RoIiwiZm9yRWFjaCIsIm9OYXZpZ2F0aW9uQ29udGV4dCIsImlzQSIsIm9TZW1hbnRpY0F0dHJpYnV0ZXMiLCJnZXRPYmplY3QiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib05hdkNvbnRleHQiLCJwcmVwYXJlQ29udGV4dEZvckV4dGVybmFsTmF2aWdhdGlvbiIsInByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3QiLCJwdXNoIiwic2VtYW50aWNBdHRyaWJ1dGVzIiwiZGF0YSIsIm1ldGFQYXRoIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJ0b0pTT05TdHJpbmciLCJvTW9kZWwiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRVcmwiLCJjb25zdHJ1Y3RDb250ZXh0VXJsIiwidW5kZWZpbmVkIiwic2V0RmlsdGVyQ29udGV4dFVybCIsIl9hcHBseU91dGJvdW5kUGFyYW1zIiwiaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiYWRhcHROYXZpZ2F0aW9uQ29udGV4dCIsIl9hcHBseVNlbWFudGljT2JqZWN0TWFwcGluZ3MiLCJfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyIsInNOYXZNb2RlIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwibVJlZnJlc2hTdHJhdGVnaWVzIiwicmVmcmVzaFN0cmF0ZWdpZXMiLCJvSW50ZXJuYWxNb2RlbCIsImdldFZpZXdEYXRhIiwicmVmcmVzaFN0cmF0ZWd5T25BcHBSZXN0b3JlIiwibVZpZXdSZWZyZXNoU3RyYXRlZ2llcyIsIm1lcmdlT2JqZWN0cyIsIm1SZWZyZXNoU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRSZWZyZXNoU3RyYXRlZ3lGb3JJbnRlbnQiLCJzZXRQcm9wZXJ0eSIsIm9uRXJyb3IiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJNZXNzYWdlQm94Iiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImVycm9yIiwiZ2V0VGV4dCIsInRpdGxlIiwiRXJyb3IiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJjb252ZXJ0ZXJUeXBlIiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiYmluZCIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJGb3J3YXJkTmF2aWdhdGlvbiIsIm9EaXN0aW5jdEtleXMiLCJzQ29udGV4dFBhdGgiLCJhTWV0YVBhdGhQYXJ0cyIsInNwbGl0IiwiZmlsdGVyIiwiQm9vbGVhbiIsIl9maW5kRGlzdGluY3RLZXlzSW5PYmplY3QiLCJMb29rVXBPYmplY3QiLCJzTG9va1VwT2JqZWN0TWV0YVBhdGgiLCJzS2V5Iiwib05ld0xvb2tVcE9iamVjdCIsInNNYWluRW50aXR5U2V0TmFtZSIsInNNYWluRW50aXR5VHlwZU5hbWUiLCJvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdCIsInNNYWluRW50aXR5VmFsdWVQYXRoIiwic0N1cnJlbnRWYWx1ZVBhdGgiLCJzTGFzdFZhbHVlUGF0aCIsInNEaXN0aW5jdEtleSIsImFDb25mbGljdGluZ1BhdGhzIiwic1dpbm5lclZhbHVlUGF0aCIsImkiLCJzUGF0aCIsInNQYXRoSW5Db250ZXh0IiwicmVwbGFjZSIsInNFbnRpdHlUeXBlTmFtZSIsInNWYWx1ZSIsImpvaW4iLCJnZXRQcm9wZXJ0eSIsInNQcm9wZXJ0eSIsInByZXBhcmVGaWx0ZXJzRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwib0ZpbHRlckJhckNvbmRpdGlvbnMiLCJzUm9vdFBhdGgiLCJhUGFyYW1ldGVycyIsIm9GaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0Iiwic0Z1bGxDb250ZXh0UGF0aCIsImluY2x1ZGVzIiwiYVBhdGhQYXJ0cyIsInJlcGxhY2VBbGwiLCJmaWx0ZXJDb25kaXRpb25zIiwiZmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdCIsIm5hdmlnYXRlV2l0aENvbmZpcm1hdGlvbkRpYWxvZyIsIm5vdEFwcGxpY2FibGVDb250ZXh0cyIsIm9BcHBsaWNhYmxlQ29udGV4dERpYWxvZyIsIm9uQ2xvc2UiLCJjbG9zZSIsIm9uQ29udGludWUiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsImFOb3RBcHBsaWNhYmxlSXRlbXMiLCJvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwiLCJKU09OTW9kZWwiLCJvVG90YWxzIiwidG90YWwiLCJsYWJlbCIsInNldE1vZGVsIiwib3BlbiIsInNGcmFnbWVudE5hbWUiLCJvRGlhbG9nRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsInNDYW5vbmljYWxQYXRoIiwiZ2V0Q2Fub25pY2FsUGF0aCIsInN1YnN0ciIsImluZGV4T2YiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwibW9kZWxzIiwibWV0YU1vZGVsIiwidGhlbiIsIm9GcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib1BvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJjYXRjaCIsIkxvZyIsInJlbW92ZVNlbGVjdE9wdGlvbiIsImVudGl0eVNldCIsIm9BdHRyaWJ1dGVzIiwiYVByb3BlcnRpZXMiLCJPYmplY3QiLCJrZXlzIiwiaiIsInNQcm9wIiwiYVByb3BlcnR5QW5ub3RhdGlvbnMiLCJvRmllbGRDb250cm9sIiwiX2lzRmllbGRDb250cm9sUGF0aEluYXBwbGljYWJsZSIsInNGaWVsZENvbnRyb2xQYXRoIiwib0F0dHJpYnV0ZSIsImJJbmFwcGxpY2FibGUiLCJhUGFydHMiLCJoYXNPd25Qcm9wZXJ0eSIsInZNYXBwaW5ncyIsIm9NYXBwaW5ncyIsIkpTT04iLCJwYXJzZSIsInNMb2NhbFByb3BlcnR5Iiwic1NlbWFudGljT2JqZWN0UHJvcGVydHkiLCJnZXRTZWxlY3RPcHRpb24iLCJvU2VsZWN0T3B0aW9uIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsIm5hdmlnYXRlT3V0Ym91bmQiLCJzT3V0Ym91bmQiLCJhTmF2UGFyYW1zIiwib01hbmlmZXN0RW50cnkiLCJnZXRNYW5pZmVzdEVudHJ5Iiwib091dGJvdW5kIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib3V0Ym91bmRQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiZ2V0T3V0Ym91bmRQYXJhbXMiLCJrZXkiLCJvUGFyYW1zIiwiYVZhbHVlcyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvT3V0Ym91bmRQYXJhbXMiLCJvUGFyYW1zTWFwcGluZyIsIm9NYXBwaW5nIiwidmFsdWUiLCJmb3JtYXQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9PdXRib3VuZHMiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9EaXNwbGF5T3V0Ym91bmQiLCJvUmVmcmVzaFN0cmF0ZWdpZXMiLCJpbnRlbnRzIiwib0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3kiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdG1ldGhvZE92ZXJyaWRlLFxuXHRwcml2YXRlRXh0ZW5zaW9uLFxuXHRwdWJsaWNFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvTmF2aWdhdGlvblNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IHR5cGUgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxJbnRlcm5hbEJhc2VkTmF2aWdhdGlvblxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjg0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxJbnRlcm5hbEJhc2VkTmF2aWdhdGlvblwiKVxuY2xhc3MgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfb01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRwcml2YXRlIF9vTmF2aWdhdGlvblNlcnZpY2UhOiBOYXZpZ2F0aW9uU2VydmljZTtcblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0aGlzLl9vTWV0YU1vZGVsID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBpbnRlbnQtYmFzZWQgbmF2aWdhdGlvbiAoU2VtYW50aWNPYmplY3QtQWN0aW9uKSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuXHQgKiBJZiBzZW1hbnRpYyBvYmplY3QgbWFwcGluZyBpcyBwcm92aWRlZCwgdGhpcyBpcyBhbHNvIGFwcGxpZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFmdGVyIHRoZSBhZGFwdGF0aW9uIGJ5IGEgY29uc3VtZXIuXG5cdCAqIFRoaXMgdGFrZXMgY2FyZSBvZiByZW1vdmluZyBhbnkgdGVjaG5pY2FsIHBhcmFtZXRlcnMgYW5kIGRldGVybWluZXMgaWYgYW4gZXhwbGFjZSBvciBpbnBsYWNlIG5hdmlnYXRpb24gc2hvdWxkIHRha2UgcGxhY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNPYmplY3QgU2VtYW50aWMgb2JqZWN0IGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gc0FjdGlvbiAgQWN0aW9uIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVyc10gT3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIGV4dGVybmFsIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMubmF2aWdhdGlvbkNvbnRleHRzXSBVc2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIGJlIHBhc3NlZCB0byB0aGUgaW50ZW50OlxuXHQgKiAgICBhIHNpbmdsZSBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9XG5cdCAqICAgIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9XG5cdCAqICAgIGFuIG9iamVjdCBvciBhbiBhcnJheSBvZiBvYmplY3RzXG5cdCAqXHRcdCAgSWYgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyBwYXNzZWQsIHRoZSBjb250ZXh0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtZXRhUGF0aCBhbmQgdG8gcmVtb3ZlIGFueSBzZW5zaXRpdmUgZGF0YVxuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgZm9sbG93aW5nIGZvcm1hdCBpeCBleHBlY3RlZDpcblx0ICpcdFx0ICB7XG5cdCAqXHRcdFx0ZGF0YToge1xuXHQgKlx0IFx0XHRcdFByb2R1Y3RJRDogNzYzNCxcblx0ICpcdFx0XHRcdE5hbWU6IFwiTGFwdG9wXCJcblx0ICpcdFx0XHQgfSxcblx0ICpcdFx0XHQgbWV0YVBhdGg6IFwiL1NhbGVzT3JkZXJNYW5hZ2VcIlxuXHQgKiAgICAgICAgfVxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmddIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgU2VtYW50aWNPYmplY3RNYXBwaW5nIG9yIFNlbWFudGljT2JqZWN0TWFwcGluZyB0aGF0IGFwcGxpZXMgdG8gdGhpcyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmRlZmF1bHRSZWZyZXNoU3RyYXRlZ3ldIERlZmF1bHQgcmVmcmVzaCBzdHJhdGVneSB0byBiZSB1c2VkIGluIGNhc2Ugbm8gcmVmcmVzaCBzdHJhdGVneSBpcyBzcGVjaWZpZWQgZm9yIHRoZSBpbnRlbnQgaW4gdGhlIHZpZXcuXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLnJlZnJlc2hTdHJhdGVnaWVzXVxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNdIEFkZGl0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQgaW4gdGhlIGNyb3NzQXBwTmF2aWdhdGlvbiBvdXRib3VuZCBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb246IHN0cmluZyxcblx0XHRtTmF2aWdhdGlvblBhcmFtZXRlcnM6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM/OiBvYmplY3QgfCBhbnlbXSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc/OiBzdHJpbmcgfCBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0ZGVmYXVsdFJlZnJlc2hTdHJhdGVneT86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRyZWZyZXNoU3RyYXRlZ2llcz86IGFueTtcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkXG5cdCkge1xuXHRcdGNvbnN0IF9kb05hdmlnYXRlID0gKG9Db250ZXh0PzogYW55KSA9PiB7XG5cdFx0XHRjb25zdCB2TmF2aWdhdGlvbkNvbnRleHRzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzICYmIG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHMsXG5cdFx0XHRcdGFOYXZpZ2F0aW9uQ29udGV4dHMgPVxuXHRcdFx0XHRcdHZOYXZpZ2F0aW9uQ29udGV4dHMgJiYgIUFycmF5LmlzQXJyYXkodk5hdmlnYXRpb25Db250ZXh0cykgPyBbdk5hdmlnYXRpb25Db250ZXh0c10gOiB2TmF2aWdhdGlvbkNvbnRleHRzLFxuXHRcdFx0XHR2U2VtYW50aWNPYmplY3RNYXBwaW5nID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzICYmIG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdHZPdXRib3VuZFBhcmFtcyA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvVGFyZ2V0SW5mbzogYW55ID0ge1xuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0YWN0aW9uOiBzQWN0aW9uXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vVmlldy5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzU2VtYW50aWNPYmplY3QgJiYgc0FjdGlvbikge1xuXHRcdFx0XHRsZXQgYVNlbWFudGljQXR0cmlidXRlczogYW55W10gPSBbXSxcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudDogYW55ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRcdFx0Ly8gMS4gZ2V0IFNlbWFudGljQXR0cmlidXRlcyBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Db250ZXh0cyAmJiBhTmF2aWdhdGlvbkNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uQ29udGV4dHMuZm9yRWFjaCgob05hdmlnYXRpb25Db250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIDEuMS5hIGlmIG5hdmlnYXRpb24gY29udGV4dCBpcyBpbnN0YW5jZSBvZiBzYXAudWkubW9kZS5vZGF0YS52NC5Db250ZXh0XG5cdFx0XHRcdFx0XHQvLyBlbHNlIGNoZWNrIGlmIG5hdmlnYXRpb24gY29udGV4dCBpcyBvZiB0eXBlIG9iamVjdFxuXHRcdFx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uQ29udGV4dC5pc0EgJiYgb05hdmlnYXRpb25Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIDEuMS5iIHJlbW92ZSBzZW5zaXRpdmUgZGF0YVxuXHRcdFx0XHRcdFx0XHRsZXQgb1NlbWFudGljQXR0cmlidXRlcyA9IG9OYXZpZ2F0aW9uQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gdGhpcy5fb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTmF2aWdhdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogYWxzbyByZW1vdmUgc2Vuc2l0aXZlIGRhdGEgZnJvbSAgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXMgPSB0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob1NlbWFudGljQXR0cmlidXRlcywgc01ldGFQYXRoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05hdkNvbnRleHQgPSB0aGlzLnByZXBhcmVDb250ZXh0Rm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKG9TZW1hbnRpY0F0dHJpYnV0ZXMsIG9OYXZpZ2F0aW9uQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRJbmZvW1wicHJvcGVydGllc1dpdGhvdXRDb25mbGljdFwiXSA9IG9OYXZDb250ZXh0LnByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q7XG5cdFx0XHRcdFx0XHRcdGFTZW1hbnRpY0F0dHJpYnV0ZXMucHVzaChvTmF2Q29udGV4dC5zZW1hbnRpY0F0dHJpYnV0ZXMpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0IShvTmF2aWdhdGlvbkNvbnRleHQgJiYgQXJyYXkuaXNBcnJheShvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSkpICYmXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBvTmF2aWdhdGlvbkNvbnRleHQgPT09IFwib2JqZWN0XCJcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHQvLyAxLjEuYiByZW1vdmUgc2Vuc2l0aXZlIGRhdGEgZnJvbSBvYmplY3Rcblx0XHRcdFx0XHRcdFx0YVNlbWFudGljQXR0cmlidXRlcy5wdXNoKHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSwgb05hdmlnYXRpb25Db250ZXh0Lm1ldGFQYXRoKSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uQ29udGV4dCAmJiBBcnJheS5pc0FycmF5KG9OYXZpZ2F0aW9uQ29udGV4dC5kYXRhKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBvTmF2aWdhdGlvbkNvbnRleHQuZGF0YSBjYW4gYmUgYXJyYXkgYWxyZWFkeSBleCA6IFt7Q3VzdG9tZXI6IFwiMTAwMDFcIn0sIHtDdXN0b21lcjogXCIxMDA5MVwifV1cblx0XHRcdFx0XHRcdFx0Ly8gaGVuY2UgYXNzaWduaW5nIGl0IHRvIHRoZSBhU2VtYW50aWNBdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdGFTZW1hbnRpY0F0dHJpYnV0ZXMgPSB0aGlzLnJlbW92ZVNlbnNpdGl2ZURhdGEob05hdmlnYXRpb25Db250ZXh0LmRhdGEsIG9OYXZpZ2F0aW9uQ29udGV4dC5tZXRhUGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gMi4xIE1lcmdlIGJhc2Ugc2VsZWN0aW9uIHZhcmlhbnQgYW5kIHNhbml0aXplZCBzZW1hbnRpYyBhdHRyaWJ1dGVzIGludG8gb25lIFNlbGVjdGlvblZhcmlhbnRcblx0XHRcdFx0aWYgKGFTZW1hbnRpY0F0dHJpYnV0ZXMgJiYgYVNlbWFudGljQXR0cmlidXRlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IHRoaXMuX29OYXZpZ2F0aW9uU2VydmljZS5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0XHRcdGFTZW1hbnRpY0F0dHJpYnV0ZXMsXG5cdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyAzLiBBZGQgZmlsdGVyQ29udGV4dFVybCB0byBTViBzbyB0aGUgTmF2aWdhdGlvbkhhbmRsZXIgY2FuIHJlbW92ZSBhbnkgc2Vuc2l0aXZlIGRhdGEgYmFzZWQgb24gdmlldyBlbnRpdHlTZXRcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRzRW50aXR5U2V0ID0gdGhpcy5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdFx0XHRzQ29udGV4dFVybCA9IHNFbnRpdHlTZXQgPyB0aGlzLl9vTmF2aWdhdGlvblNlcnZpY2UuY29uc3RydWN0Q29udGV4dFVybChzRW50aXR5U2V0LCBvTW9kZWwpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoc0NvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5zZXRGaWx0ZXJDb250ZXh0VXJsKHNDb250ZXh0VXJsKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IE91dGJvdW5kIFBhcmFtZXRlcnMgdG8gdGhlIFNWXG5cdFx0XHRcdGlmICh2T3V0Ym91bmRQYXJhbXMpIHtcblx0XHRcdFx0XHR0aGlzLl9hcHBseU91dGJvdW5kUGFyYW1zKG9TZWxlY3Rpb25WYXJpYW50LCB2T3V0Ym91bmRQYXJhbXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gNC4gZ2l2ZSBhbiBvcHBvcnR1bml0eSBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGluZmx1ZW5jZSB0aGUgU2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHRvQ29udHJvbGxlci5pbnRlbnRCYXNlZE5hdmlnYXRpb24uYWRhcHROYXZpZ2F0aW9uQ29udGV4dChvU2VsZWN0aW9uVmFyaWFudCwgb1RhcmdldEluZm8pO1xuXG5cdFx0XHRcdC8vIDUuIEFwcGx5IHNlbWFudGljIG9iamVjdCBtYXBwaW5ncyB0byB0aGUgU1Zcblx0XHRcdFx0aWYgKHZTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHR0aGlzLl9hcHBseVNlbWFudGljT2JqZWN0TWFwcGluZ3Mob1NlbGVjdGlvblZhcmlhbnQsIHZTZW1hbnRpY09iamVjdE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gNi4gcmVtb3ZlIHRlY2huaWNhbCBwYXJhbWV0ZXJzIGZyb20gU2VsZWN0aW9uIFZhcmlhbnRcblx0XHRcdFx0dGhpcy5fcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvU2VsZWN0aW9uVmFyaWFudCk7XG5cblx0XHRcdFx0Ly8gNy4gY2hlY2sgaWYgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5IGFuZCBwYWdlIGlzIGVkaXRhYmxlXG5cdFx0XHRcdGNvbnN0IHNOYXZNb2RlID0gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5nZXROYXZpZ2F0aW9uTW9kZSgpO1xuXG5cdFx0XHRcdC8vIDguIFVwZGF0aW5nIHJlZnJlc2ggc3RyYXRlZ3kgaW4gaW50ZXJuYWwgbW9kZWxcblx0XHRcdFx0Y29uc3QgbVJlZnJlc2hTdHJhdGVnaWVzID0gKG1OYXZpZ2F0aW9uUGFyYW1ldGVycyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMucmVmcmVzaFN0cmF0ZWdpZXMpIHx8IHt9LFxuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdGlmIChvSW50ZXJuYWxNb2RlbCkge1xuXHRcdFx0XHRcdGlmICgob1ZpZXcgJiYgKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KSkucmVmcmVzaFN0cmF0ZWd5T25BcHBSZXN0b3JlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtVmlld1JlZnJlc2hTdHJhdGVnaWVzID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5yZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmUgfHwge307XG5cdFx0XHRcdFx0XHRtZXJnZU9iamVjdHMobVJlZnJlc2hTdHJhdGVnaWVzLCBtVmlld1JlZnJlc2hTdHJhdGVnaWVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgbVJlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRSZWZyZXNoU3RyYXRlZ3lGb3JJbnRlbnQobVJlZnJlc2hTdHJhdGVnaWVzLCBzU2VtYW50aWNPYmplY3QsIHNBY3Rpb24pO1xuXHRcdFx0XHRcdGlmIChtUmVmcmVzaFN0cmF0ZWd5KSB7XG5cdFx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9yZWZyZXNoU3RyYXRlZ3lPbkFwcFJlc3RvcmVcIiwgbVJlZnJlc2hTdHJhdGVneSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gOS4gTmF2aWdhdGUgdmlhIE5hdmlnYXRpb25IYW5kbGVyXG5cdFx0XHRcdGNvbnN0IG9uRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL20vTWVzc2FnZUJveFwiXSwgZnVuY3Rpb24gKE1lc3NhZ2VCb3g6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Iob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9IRUxQRVJfTkFWSUdBVElPTl9FUlJPUl9NRVNTQUdFXCIpLCB7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0dGhpcy5fb05hdmlnYXRpb25TZXJ2aWNlLm5hdmlnYXRlKFxuXHRcdFx0XHRcdHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRzQWN0aW9uLFxuXHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRvbkVycm9yLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzTmF2TW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2VtYW50aWMgT2JqZWN0L2FjdGlvbiBpcyBub3QgcHJvdmlkZWRcIik7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dCAmJiAob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCIgJiZcblx0XHRcdG9NZXRhTW9kZWwgJiZcblx0XHRcdCFNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob01ldGFNb2RlbClcblx0XHQpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRfZG9OYXZpZ2F0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRfZG9OYXZpZ2F0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVwYXJlIGF0dHJpYnV0ZXMgdG8gYmUgcGFzc2VkIHRvIGV4dGVybmFsIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvU2VtYW50aWNBdHRyaWJ1dGVzIENvbnRleHQgZGF0YSBhZnRlciByZW1vdmluZyBhbGwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQWN0dWFsIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIHdlcmUgZGVyaXZlZC5cblx0ICogQHJldHVybnMgT2JqZWN0IG9mIHByZXBhcmVkIGF0dHJpYnV0ZXMgZm9yIGV4dGVybmFsIG5hdmlnYXRpb24gYW5kIG5vIGNvbmZsaWN0IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJlcGFyZUNvbnRleHRGb3JFeHRlcm5hbE5hdmlnYXRpb24ob1NlbWFudGljQXR0cmlidXRlczogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdC8vIDEuIEZpbmQgYWxsIGRpc3RpbmN0IGtleXMgaW4gdGhlIG9iamVjdCBTZW1hbnRpY0F0dHJpYnV0ZXNcblx0XHQvLyBTdG9yZSBtZXRhIHBhdGggZm9yIGVhY2ggb2NjdXJlbmNlIG9mIHRoZSBrZXlcblx0XHRjb25zdCBvRGlzdGluY3RLZXlzOiBhbnkgPSB7fSxcblx0XHRcdHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzQ29udGV4dFBhdGgpLFxuXHRcdFx0YU1ldGFQYXRoUGFydHMgPSBzTWV0YVBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuXHRcdGZ1bmN0aW9uIF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3QoTG9va1VwT2JqZWN0OiBhbnksIHNMb29rVXBPYmplY3RNZXRhUGF0aDogYW55KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gTG9va1VwT2JqZWN0KSB7XG5cdFx0XHRcdC8vIG51bGwgY2FzZT8/XG5cdFx0XHRcdGlmIChMb29rVXBPYmplY3Rbc0tleV0gPT09IG51bGwgfHwgdHlwZW9mIExvb2tVcE9iamVjdFtzS2V5XSAhPT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0S2V5c1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYga2V5IGlzIGZvdW5kIGZvciB0aGUgZmlyc3QgdGltZSB0aGVuIGNyZWF0ZSBhcnJheVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XSA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBwdXNoIHBhdGggdG8gYXJyYXlcblx0XHRcdFx0XHRvRGlzdGluY3RLZXlzW3NLZXldLnB1c2goc0xvb2tVcE9iamVjdE1ldGFQYXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiBhIG5lc3RlZCBvYmplY3QgaXMgZm91bmRcblx0XHRcdFx0XHRjb25zdCBvTmV3TG9va1VwT2JqZWN0ID0gTG9va1VwT2JqZWN0W3NLZXldO1xuXHRcdFx0XHRcdF9maW5kRGlzdGluY3RLZXlzSW5PYmplY3Qob05ld0xvb2tVcE9iamVjdCwgYCR7c0xvb2tVcE9iamVjdE1ldGFQYXRofS8ke3NLZXl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KG9TZW1hbnRpY0F0dHJpYnV0ZXMsIHNNZXRhUGF0aCk7XG5cblx0XHQvLyAyLiBEZXRlcm1pbmUgZGlzdGluY3Qga2V5IHZhbHVlIGFuZCBhZGQgY29uZmxpY3RlZCBwYXRocyB0byBzZW1hbnRpYyBhdHRyaWJ1dGVzXG5cdFx0Y29uc3Qgc01haW5FbnRpdHlTZXROYW1lID0gYU1ldGFQYXRoUGFydHNbMF0sXG5cdFx0XHRzTWFpbkVudGl0eVR5cGVOYW1lID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NNYWluRW50aXR5U2V0TmFtZX0vQHNhcHVpLm5hbWVgKSxcblx0XHRcdG9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0OiBhbnkgPSB7fTtcblx0XHRsZXQgc01haW5FbnRpdHlWYWx1ZVBhdGgsIHNDdXJyZW50VmFsdWVQYXRoLCBzTGFzdFZhbHVlUGF0aDtcblx0XHRmb3IgKGNvbnN0IHNEaXN0aW5jdEtleSBpbiBvRGlzdGluY3RLZXlzKSB7XG5cdFx0XHRjb25zdCBhQ29uZmxpY3RpbmdQYXRocyA9IG9EaXN0aW5jdEtleXNbc0Rpc3RpbmN0S2V5XTtcblx0XHRcdGxldCBzV2lubmVyVmFsdWVQYXRoO1xuXHRcdFx0Ly8gRmluZCB3aW5uZXIgdmFsdWUgZm9yIGVhY2ggZGlzdGluY3Qga2V5IGluIGNhc2Ugb2YgY29uZmxpY3QgYnkgdGhlIGZvbGxvd2luZyBydWxlOlxuXG5cdFx0XHQvLyAtPiBBLiBpZiBhbnkgbWV0YSBwYXRoIGZvciBhIGRpc3RpbmN0IGtleSBpcyB0aGUgc2FtZSBhcyBtYWluIGVudGl0eSB0YWtlIHRoYXQgYXMgdGhlIHZhbHVlXG5cdFx0XHQvLyAtPiBCLiBpZiBBIGlzIG5vdCBtZXQga2VlcCB0aGUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0IChzTWV0YVBhdGggPT09IHBhdGggb2YgZGlzdGluY2Uga2V5KVxuXHRcdFx0Ly8gLT4gQy4gaWYgQSwgQiBvciBDIGFyZSBub3QgbWV0IHRha2UgdGhlIGxhc3QgcGF0aCBmb3IgdmFsdWVcblx0XHRcdGlmIChhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdC8vIGNvbmZsaWN0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IGFDb25mbGljdGluZ1BhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbaV07XG5cdFx0XHRcdFx0bGV0IHNQYXRoSW5Db250ZXh0ID0gc1BhdGgucmVwbGFjZShzUGF0aCA9PT0gc01ldGFQYXRoID8gc01ldGFQYXRoIDogYCR7c01ldGFQYXRofS9gLCBcIlwiKTtcblx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IChzUGF0aEluQ29udGV4dCA9PT0gXCJcIiA/IHNQYXRoSW5Db250ZXh0IDogYCR7c1BhdGhJbkNvbnRleHR9L2ApICsgc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofS9Ac2FwdWkubmFtZWApO1xuXHRcdFx0XHRcdC8vIHJ1bGUgQVxuXG5cdFx0XHRcdFx0Ly8gcnVsZSBBXG5cdFx0XHRcdFx0aWYgKHNFbnRpdHlUeXBlTmFtZSA9PT0gc01haW5FbnRpdHlUeXBlTmFtZSkge1xuXHRcdFx0XHRcdFx0c01haW5FbnRpdHlWYWx1ZVBhdGggPSBzUGF0aEluQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBydWxlIEJcblx0XHRcdFx0XHRpZiAoc1BhdGggPT09IHNNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0c0N1cnJlbnRWYWx1ZVBhdGggPSBzUGF0aEluQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBydWxlIENcblx0XHRcdFx0XHRzTGFzdFZhbHVlUGF0aCA9IHNQYXRoSW5Db250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gYWRkIGNvbmZsaWN0ZWQgcGF0aCB0byBzZW1hbnRpYyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcGF0aCBwb2ludHMgdG8gbWFpbiBlbnRpdHkgYW5kIHByZWZpeCBhdHRyaWJ1dGUgbmFtZXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0XHRvU2VtYW50aWNBdHRyaWJ1dGVzW1xuXHRcdFx0XHRcdFx0YCR7c01ldGFQYXRofS8ke3NQYXRoSW5Db250ZXh0fWBcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChzVmFsdWU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCIuXCIpXG5cdFx0XHRcdFx0XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNQYXRoSW5Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBIHx8IEIgfHwgQ1xuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGggfHwgc0xhc3RWYWx1ZVBhdGg7XG5cdFx0XHRcdG9TZW1hbnRpY0F0dHJpYnV0ZXNbc0Rpc3RpbmN0S2V5XSA9IG9Db250ZXh0LmdldFByb3BlcnR5KHNXaW5uZXJWYWx1ZVBhdGgpO1xuXHRcdFx0XHRzTWFpbkVudGl0eVZhbHVlUGF0aCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0c0N1cnJlbnRWYWx1ZVBhdGggPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHNMYXN0VmFsdWVQYXRoID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gbm8gY29uZmxpY3QsIGFkZCBkaXN0aW5jdCBrZXkgd2l0aG91dCBhZGRpbmcgcGF0aHNcblx0XHRcdFx0Y29uc3Qgc1BhdGggPSBhQ29uZmxpY3RpbmdQYXRoc1swXTsgLy8gYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBhbmQgaGVuY2Ugbm8gY29uZmxpY3Rcblx0XHRcdFx0bGV0IHNQYXRoSW5Db250ZXh0ID0gc1BhdGgucmVwbGFjZShzUGF0aCA9PT0gc01ldGFQYXRoID8gc01ldGFQYXRoIDogYCR7c01ldGFQYXRofS9gLCBcIlwiKTtcblx0XHRcdFx0c1BhdGhJbkNvbnRleHQgPSAoc1BhdGhJbkNvbnRleHQgPT09IFwiXCIgPyBzUGF0aEluQ29udGV4dCA6IGAke3NQYXRoSW5Db250ZXh0fS9gKSArIHNEaXN0aW5jdEtleTtcblx0XHRcdFx0b1NlbWFudGljQXR0cmlidXRlc1tzRGlzdGluY3RLZXldID0gb0NvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGhJbkNvbnRleHQpO1xuXHRcdFx0XHRvUHJvcGVydGllc1dpdGhvdXRDb25mbGljdFtzRGlzdGluY3RLZXldID0gYCR7c01ldGFQYXRofS8ke3NQYXRoSW5Db250ZXh0fWBcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKFwiLlwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gMy4gUmVtb3ZlIGFsbCBOYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eSBpbiBvU2VtYW50aWNBdHRyaWJ1dGVzKSB7XG5cdFx0XHRpZiAob1NlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHldICE9PSBudWxsICYmIHR5cGVvZiBvU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0ZGVsZXRlIG9TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbWFudGljQXR0cmlidXRlczogb1NlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdHByb3BlcnRpZXNXaXRob3V0Q29uZmxpY3Q6IG9Qcm9wZXJ0aWVzV2l0aG91dENvbmZsaWN0XG5cdFx0fTtcblx0fVxuXHQvKipcblx0ICogUHJlcGFyZSBmaWx0ZXIgY29uZGl0aW9ucyB0byBiZSBwYXNzZWQgdG8gZXh0ZXJuYWwgbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG9GaWx0ZXJCYXJDb25kaXRpb25zIEZpbHRlciBjb25kaXRpb25zLlxuXHQgKiBAcGFyYW0gc1Jvb3RQYXRoIFJvb3QgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBhUGFyYW1ldGVycyBOYW1lcyBvZiBwYXJhbWV0ZXJzIHRvIGJlIGNvbnNpZGVyZWQuXG5cdCAqIEByZXR1cm5zIE9iamVjdCBvZiBwcmVwYXJlZCBmaWx0ZXIgY29uZGl0aW9ucyBmb3IgZXh0ZXJuYWwgbmF2aWdhdGlvbiBhbmQgbm8gY29uZmxpY3QgZmlsdGVycy5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcmVwYXJlRmlsdGVyc0ZvckV4dGVybmFsTmF2aWdhdGlvbihvRmlsdGVyQmFyQ29uZGl0aW9uczogYW55LCBzUm9vdFBhdGg6IHN0cmluZywgYVBhcmFtZXRlcnM/OiBhbnlbXSkge1xuXHRcdGxldCBzUGF0aDtcblx0XHRjb25zdCBvRGlzdGluY3RLZXlzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdDogYW55ID0ge307XG5cdFx0bGV0IHNNYWluRW50aXR5VmFsdWVQYXRoLCBzQ3VycmVudFZhbHVlUGF0aCwgc0Z1bGxDb250ZXh0UGF0aCwgc1dpbm5lclZhbHVlUGF0aCwgc1BhdGhJbkNvbnRleHQ7XG5cblx0XHRmdW5jdGlvbiBfZmluZERpc3RpbmN0S2V5c0luT2JqZWN0KExvb2tVcE9iamVjdDogYW55KSB7XG5cdFx0XHRsZXQgc0xvb2tVcE9iamVjdE1ldGFQYXRoO1xuXHRcdFx0Zm9yIChsZXQgc0tleSBpbiBMb29rVXBPYmplY3QpIHtcblx0XHRcdFx0aWYgKExvb2tVcE9iamVjdFtzS2V5XSkge1xuXHRcdFx0XHRcdGlmIChzS2V5LmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0xvb2tVcE9iamVjdE1ldGFQYXRoID0gc0tleTsgLy8gXCIvU2FsZXNPcmRlcm1hbmFnZS9fSXRlbS9NYXRlcmlhbFwiXG5cdFx0XHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc0tleS5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRzS2V5ID0gYVBhdGhQYXJ0c1thUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzTG9va1VwT2JqZWN0TWV0YVBhdGggPSBzUm9vdFBhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0S2V5c1tzS2V5XSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYga2V5IGlzIGZvdW5kIGZvciB0aGUgZmlyc3QgdGltZSB0aGVuIGNyZWF0ZSBhcnJheVxuXHRcdFx0XHRcdFx0b0Rpc3RpbmN0S2V5c1tzS2V5XSA9IFtdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHB1c2ggcGF0aCB0byBhcnJheVxuXHRcdFx0XHRcdG9EaXN0aW5jdEtleXNbc0tleV0ucHVzaChzTG9va1VwT2JqZWN0TWV0YVBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0X2ZpbmREaXN0aW5jdEtleXNJbk9iamVjdChvRmlsdGVyQmFyQ29uZGl0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBzRGlzdGluY3RLZXkgaW4gb0Rpc3RpbmN0S2V5cykge1xuXHRcdFx0Y29uc3QgYUNvbmZsaWN0aW5nUGF0aHMgPSBvRGlzdGluY3RLZXlzW3NEaXN0aW5jdEtleV07XG5cblx0XHRcdGlmIChhQ29uZmxpY3RpbmdQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdC8vIGNvbmZsaWN0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IGFDb25mbGljdGluZ1BhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbaV07XG5cdFx0XHRcdFx0aWYgKHNQYXRoID09PSBzUm9vdFBhdGgpIHtcblx0XHRcdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPSBgJHtzUm9vdFBhdGh9LyR7c0Rpc3RpbmN0S2V5fWA7XG5cdFx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IHNEaXN0aW5jdEtleTtcblx0XHRcdFx0XHRcdHNNYWluRW50aXR5VmFsdWVQYXRoID0gc0Rpc3RpbmN0S2V5O1xuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRcdFx0b0ZpbHRlckJhckNvbmRpdGlvbnNbYCRQYXJhbWV0ZXIuJHtzRGlzdGluY3RLZXl9YF0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzRGlzdGluY3RLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzUGF0aEluQ29udGV4dCA9IHNQYXRoO1xuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCA9IChgJHtzUm9vdFBhdGh9LyR7c1BhdGh9YCBhcyBhbnkpLnJlcGxhY2VBbGwoL1xcKi9nLCBcIlwiKTtcblx0XHRcdFx0XHRcdHNDdXJyZW50VmFsdWVQYXRoID0gc1BhdGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW1xuXHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aFxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNWYWx1ZSAhPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi5cIilcblx0XHRcdFx0XHRdID0gb0ZpbHRlckJhckNvbmRpdGlvbnNbc1BhdGhJbkNvbnRleHRdO1xuXHRcdFx0XHRcdGRlbGV0ZSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzUGF0aF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzV2lubmVyVmFsdWVQYXRoID0gc01haW5FbnRpdHlWYWx1ZVBhdGggfHwgc0N1cnJlbnRWYWx1ZVBhdGg7XG5cdFx0XHRcdG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV0gPSBvRmlsdGVyQmFyQ29uZGl0aW9uc1tzV2lubmVyVmFsdWVQYXRoXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG5vIGNvbmZsaWN0LCBhZGQgZGlzdGluY3Qga2V5IHdpdGhvdXQgYWRkaW5nIHBhdGhzXG5cdFx0XHRcdHNQYXRoID0gYUNvbmZsaWN0aW5nUGF0aHNbMF07XG5cdFx0XHRcdHNGdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdHNQYXRoID09PSBzUm9vdFBhdGggPyBgJHtzUm9vdFBhdGh9LyR7c0Rpc3RpbmN0S2V5fWAgOiAoYCR7c1Jvb3RQYXRofS8ke3NQYXRofWAgYXMgYW55KS5yZXBsYWNlQWxsKFwiKlwiLCBcIlwiKTtcblx0XHRcdFx0b0ZpbHRlckNvbmRpdGlvbnNXaXRob3V0Q29uZmxpY3Rbc0Rpc3RpbmN0S2V5XSA9IHNGdWxsQ29udGV4dFBhdGhcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoc1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzVmFsdWUgIT0gXCJcIjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKFwiLlwiKTtcblx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmluY2x1ZGVzKHNEaXN0aW5jdEtleSkpIHtcblx0XHRcdFx0XHRvRmlsdGVyQmFyQ29uZGl0aW9uc1tgJFBhcmFtZXRlci4ke3NEaXN0aW5jdEtleX1gXSA9IG9GaWx0ZXJCYXJDb25kaXRpb25zW3NEaXN0aW5jdEtleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmlsdGVyQ29uZGl0aW9uczogb0ZpbHRlckJhckNvbmRpdGlvbnMsXG5cdFx0XHRmaWx0ZXJDb25kaXRpb25zV2l0aG91dENvbmZsaWN0OiBvRmlsdGVyQ29uZGl0aW9uc1dpdGhvdXRDb25mbGljdFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IE5hdmlnYXRpb24gbW9kZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gbW9kZVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGdldE5hdmlnYXRpb25Nb2RlKCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0LyoqXG5cdCAqIEFsbG93cyBmb3IgbmF2aWdhdGlvbiB0byBhIGdpdmVuIGludGVudCAoU2VtYW50aWNPYmplY3QtQWN0aW9uKSB3aXRoIHRoZSBwcm92aWRlZCBjb250ZXh0LCB1c2luZyBhIGRpYWxvZyB0aGF0IHNob3dzIHRoZSBjb250ZXh0cyB3aGljaCBjYW5ub3QgYmUgcGFzc2VkXG5cdCAqIElmIHNlbWFudGljIG9iamVjdCBtYXBwaW5nIGlzIHByb3ZpZGVkLCB0aGlzIHNldHRpbmcgaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciBhZGFwdGF0aW9uIGJ5IGEgY29uc3VtZXIuXG5cdCAqIFRoaXMgc2V0dGluZyBhbHNvIHJlbW92ZXMgYW55IHRlY2huaWNhbCBwYXJhbWV0ZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGFuIGlucGxhY2Ugb3IgZXhwbGFjZSBuYXZpZ2F0aW9uIHNob3VsZCB0YWtlIHBsYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IFNlbWFudGljIG9iamVjdCBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb24gIEFjdGlvbiBmb3IgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnNdIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBleHRlcm5hbCBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmxhYmVsXVxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHNdIFNpbmdsZSBpbnN0YW5jZSBvciBtdWx0aXBsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSwgb3IgYWx0ZXJuYXRpdmVseSBhbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnRlbnQuXG5cdCAqIEBwYXJhbSBbbU5hdmlnYXRpb25QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0c10gU2luZ2xlIGluc3RhbmNlIG9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9LCBvciBhbHRlcm5hdGl2ZWx5IGFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzLCB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudCBhbmQgZm9yIHdoaWNoIHRoZSBJQk4gYnV0dG9uIGlzIGVuYWJsZWRcblx0ICogQHBhcmFtIFttTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzXSBTaW5nbGUgaW5zdGFuY2Ugb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0sIG9yIGFsdGVybmF0aXZlbHkgYW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIHdoaWNoIGNhbm5vdCBiZSBwYXNzZWQgdG8gdGhlIGludGVudC5cblx0ICpcdFx0ICBpZiBhbiBhcnJheSBvZiBjb250ZXh0cyBpcyBwYXNzZWQgdGhlIGNvbnRleHQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1ldGEgcGF0aCBhbmQgYWNjb3JkaW5nbHkgcmVtb3ZlIHRoZSBzZW5zaXRpdmUgZGF0YVxuXHQgKlx0XHQgIElmIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcGFzc2VkLCB0aGUgZm9sbG93aW5nIGZvcm1hdCBpcyBleHBlY3RlZDpcblx0ICpcdFx0ICB7XG5cdCAqXHRcdFx0ZGF0YToge1xuXHQgKlx0IFx0XHRcdFByb2R1Y3RJRDogNzYzNCxcblx0ICpcdFx0XHRcdE5hbWU6IFwiTGFwdG9wXCJcblx0ICpcdFx0XHQgfSxcblx0ICpcdFx0XHQgbWV0YVBhdGg6IFwiL1NhbGVzT3JkZXJNYW5hZ2VcIlxuXHQgKiAgICAgICAgfVxuXHQgKlx0XHRUaGUgbWV0YVBhdGggaXMgdXNlZCB0byByZW1vdmUgYW55IHNlbnNpdGl2ZSBkYXRhLlxuXHQgKiBAcGFyYW0gW21OYXZpZ2F0aW9uUGFyYW1ldGVycy5zZW1hbnRpY09iamVjdE1hcHBpbmddIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZW1hbnRpY09iamVjdE1hcHBpbmcgb3IgU2VtYW50aWNPYmplY3RNYXBwaW5nIHRoYXQgYXBwbGllcyB0byB0aGlzIG5hdmlnYXRpb25cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb25EaWFsb2coXG5cdFx0c1NlbWFudGljT2JqZWN0OiBzdHJpbmcsXG5cdFx0c0FjdGlvbjogc3RyaW5nLFxuXHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycz86IHtcblx0XHRcdG5hdmlnYXRpb25Db250ZXh0cz86IG9iamVjdCB8IGFueVtdO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogb2JqZWN0IHwgYW55W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBhbnk7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZz86IHN0cmluZyB8IG9iamVjdDtcblx0XHR9XG5cdCkge1xuXHRcdGlmIChtTmF2aWdhdGlvblBhcmFtZXRlcnM/Lm5vdEFwcGxpY2FibGVDb250ZXh0cyAmJiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzPy5sZW5ndGggPj0gMSkge1xuXHRcdFx0bGV0IG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZzogRGlhbG9nO1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBVc2VyIGNhbmNlbHMgYWN0aW9uXG5cdFx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uQ29udGludWU6ICgpID0+IHtcblx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5uYXZpZ2F0aW9uQ29udGV4dHMgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzO1xuXHRcdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5PcGVuQW5kRmlsbERpYWxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRjb25zdCBuTm90QXBwbGljYWJsZSA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMubGVuZ3RoLFxuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMgPSBbXTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0b0RpYWxvZ0NvbnRlbnQgPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdGFOb3RBcHBsaWNhYmxlSXRlbXMucHVzaChvRGlhbG9nQ29udGVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb05vdEFwcGxpY2FibGVJdGVtc01vZGVsID0gbmV3IEpTT05Nb2RlbChhTm90QXBwbGljYWJsZUl0ZW1zKTtcblx0XHRcdFx0Y29uc3Qgb1RvdGFscyA9IG5ldyBKU09OTW9kZWwoeyB0b3RhbDogbk5vdEFwcGxpY2FibGUsIGxhYmVsOiBtTmF2aWdhdGlvblBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdG9BcHBsaWNhYmxlQ29udGV4dERpYWxvZy5zZXRNb2RlbChvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwsIFwibm90QXBwbGljYWJsZVwiKTtcblx0XHRcdFx0b0FwcGxpY2FibGVDb250ZXh0RGlhbG9nLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cub3BlbigpO1xuXHRcdFx0fTtcblx0XHRcdC8vIFNob3cgdGhlIGNvbnRleHRzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIGFuZCB3aWxsIG5vdCB0aGVyZWZvcmUgYmUgcHJvY2Vzc2VkXG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5BY3Rpb25QYXJ0aWFsXCI7XG5cdFx0XHRjb25zdCBvRGlhbG9nRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBtTmF2aWdhdGlvblBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRzWzBdLmdldENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBgJHtzQ2Fub25pY2FsUGF0aC5zdWJzdHIoMCwgc0Nhbm9uaWNhbFBhdGguaW5kZXhPZihcIihcIikpfS9gO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhcblx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0VudGl0eVNldClcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZTogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogb0ZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKG9Qb3BvdmVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRvQXBwbGljYWJsZUNvbnRleHREaWFsb2cgPSBvUG9wb3Zlcjtcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQob1BvcG92ZXIpO1xuXHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2coKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvclwiKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uLCBtTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXHRfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvU2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLmNvbnRleHRcIik7XG5cdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiKTtcblx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oXCJTQVBfX01lc3NhZ2VzXCIpO1xuXHR9XG5cdC8qKlxuXHQgKiBHZXQgdGFyZ2V0ZWQgRW50aXR5IHNldC5cblx0ICpcblx0ICogQHJldHVybnMgRW50aXR5IHNldCBuYW1lXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdGdldEVudGl0eVNldCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdH1cblx0LyoqXG5cdCAqIFJlbW92ZXMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIHdpdGggcmVzcGVjdCB0byB0aGUgZW50aXR5U2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0F0dHJpYnV0ZXMgQ29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggTWV0YSBwYXRoIHRvIHJlYWNoIHRoZSBlbnRpdHlTZXQgaW4gdGhlIE1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzZW1hbnRpYyBBdHRyaWJ1dGVzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHQvLyBUTy1ETyBhZGQgdW5pdCB0ZXN0cyBmb3IgdGhpcyBmdW5jdGlvbiBpbiB0aGUgY29udHJvbGxlciBleHRlbnNpb24gcXVuaXQuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRyZW1vdmVTZW5zaXRpdmVEYXRhKG9BdHRyaWJ1dGVzOiBhbnksIHNNZXRhUGF0aDogc3RyaW5nKSB7XG5cdFx0aWYgKG9BdHRyaWJ1dGVzKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVzKTtcblx0XHRcdGlmIChhUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVzW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIl07XG5cdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tcIlNBUF9fTWVzc2FnZXNcIl07XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRpZiAob0F0dHJpYnV0ZXNbYVByb3BlcnRpZXNbal1dICYmIHR5cGVvZiBvQXR0cmlidXRlc1thUHJvcGVydGllc1tqXV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlU2Vuc2l0aXZlRGF0YShvQXR0cmlidXRlc1thUHJvcGVydGllc1tqXV0sIGAke3NNZXRhUGF0aH0vJHthUHJvcGVydGllc1tqXX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgc1Byb3AgPSBhUHJvcGVydGllc1tqXSxcblx0XHRcdFx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zID0gdGhpcy5fb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wfUBgKTtcblx0XHRcdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIl0gfHxcblx0XHRcdFx0XHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXSB8fFxuXHRcdFx0XHRcdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiXVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tzUHJvcF07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udHJvbCA9IGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl07XG5cdFx0XHRcdFx0XHRcdGlmIChvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0gJiYgb0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdLnNwbGl0KFwiL1wiKVsxXSA9PT0gXCJJbmFwcGxpY2FibGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tzUHJvcF07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0b0ZpZWxkQ29udHJvbFtcIiRQYXRoXCJdICYmXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5faXNGaWVsZENvbnRyb2xQYXRoSW5hcHBsaWNhYmxlKG9GaWVsZENvbnRyb2xbXCIkUGF0aFwiXSwgb0F0dHJpYnV0ZXMpXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlc1tzUHJvcF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9BdHRyaWJ1dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIHBhdGgtYmFzZWQgRmllbGRDb250cm9sIGV2YWx1YXRlcyB0byBpbmFwcGxpY2FibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRmllbGRDb250cm9sUGF0aCBGaWVsZCBjb250cm9sIHBhdGhcblx0ICogQHBhcmFtIG9BdHRyaWJ1dGUgU2VtYW50aWNBdHRyaWJ1dGVzXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpbmFwcGxpY2FibGVcblx0ICovXG5cdF9pc0ZpZWxkQ29udHJvbFBhdGhJbmFwcGxpY2FibGUoc0ZpZWxkQ29udHJvbFBhdGg6IHN0cmluZywgb0F0dHJpYnV0ZTogYW55KSB7XG5cdFx0bGV0IGJJbmFwcGxpY2FibGUgPSBmYWxzZTtcblx0XHRjb25zdCBhUGFydHMgPSBzRmllbGRDb250cm9sUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Ly8gc2Vuc2l0aXZlIGRhdGEgaXMgcmVtb3ZlZCBvbmx5IGlmIHRoZSBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuXG5cdFx0aWYgKGFQYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRiSW5hcHBsaWNhYmxlID1cblx0XHRcdFx0b0F0dHJpYnV0ZVthUGFydHNbMF1dICYmIG9BdHRyaWJ1dGVbYVBhcnRzWzBdXS5oYXNPd25Qcm9wZXJ0eShhUGFydHNbMV0pICYmIG9BdHRyaWJ1dGVbYVBhcnRzWzBdXVthUGFydHNbMV1dID09PSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiSW5hcHBsaWNhYmxlID0gb0F0dHJpYnV0ZVtzRmllbGRDb250cm9sUGF0aF0gPT09IDA7XG5cdFx0fVxuXHRcdHJldHVybiBiSW5hcHBsaWNhYmxlO1xuXHR9XG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmVwbGFjZSBMb2NhbCBQcm9wZXJ0aWVzIHdpdGggU2VtYW50aWMgT2JqZWN0IG1hcHBpbmdzLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnQgU2VsZWN0aW9uVmFyaWFudCBjb25zaXN0aW5nIG9mIGZpbHRlcmJhciwgVGFibGUgYW5kIFBhZ2UgQ29udGV4dFxuXHQgKiBAcGFyYW0gdk1hcHBpbmdzIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHNlbWFudGljIG9iamVjdCBtYXBwaW5nXG5cdCAqIEByZXR1cm5zIC0gTW9kaWZpZWQgU2VsZWN0aW9uVmFyaWFudCB3aXRoIExvY2FsUHJvcGVydHkgcmVwbGFjZWQgd2l0aCBTZW1hbnRpY09iamVjdFByb3BlcnRpZXMuXG5cdCAqL1xuXHRfYXBwbHlTZW1hbnRpY09iamVjdE1hcHBpbmdzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LCB2TWFwcGluZ3M6IG9iamVjdCB8IHN0cmluZykge1xuXHRcdGNvbnN0IG9NYXBwaW5ncyA9IHR5cGVvZiB2TWFwcGluZ3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZNYXBwaW5ncykgOiB2TWFwcGluZ3M7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvTWFwcGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNMb2NhbFByb3BlcnR5ID1cblx0XHRcdFx0KG9NYXBwaW5nc1tpXVtcIkxvY2FsUHJvcGVydHlcIl0gJiYgb01hcHBpbmdzW2ldW1wiTG9jYWxQcm9wZXJ0eVwiXVtcIiRQcm9wZXJ0eVBhdGhcIl0pIHx8XG5cdFx0XHRcdChvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl0gJiZcblx0XHRcdFx0XHRvTWFwcGluZ3NbaV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxvY2FsUHJvcGVydHlcIl1bXCIkUGF0aFwiXSk7XG5cdFx0XHRjb25zdCBzU2VtYW50aWNPYmplY3RQcm9wZXJ0eSA9XG5cdFx0XHRcdG9NYXBwaW5nc1tpXVtcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl0gfHwgb01hcHBpbmdzW2ldW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdFx0aWYgKG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSkpIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdE9wdGlvbiA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cblx0XHRcdFx0Ly9DcmVhdGUgYSBuZXcgU2VsZWN0T3B0aW9uIHdpdGggc1NlbWFudGljT2JqZWN0UHJvcGVydHkgYXMgdGhlIHByb3BlcnR5IE5hbWUgYW5kIHJlbW92ZSB0aGUgb2xkZXIgb25lXG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzTG9jYWxQcm9wZXJ0eSk7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50Lm1hc3NBZGRTZWxlY3RPcHRpb24oc1NlbWFudGljT2JqZWN0UHJvcGVydHksIG9TZWxlY3RPcHRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhbiBPdXRib3VuZCBwcm92aWRlZCBpbiB0aGUgbWFuaWZlc3QuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gc091dGJvdW5kIElkZW50aWZpZXIgdG8gbG9jYXRpb24gdGhlIG91dGJvdW5kIGluIHRoZSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzIE9wdGlvbmFsIG1hcCBjb250YWluaW5nIGtleS92YWx1ZSBwYWlycyB0byBiZSBwYXNzZWQgdG8gdGhlIGludGVudFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZW50QmFzZWROYXZpZ2F0aW9uI25hdmlnYXRlT3V0Ym91bmRcblx0ICogQHNpbmNlIDEuODYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlT3V0Ym91bmQoc091dGJvdW5kOiBzdHJpbmcsIG1OYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IGFOYXZQYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9NYW5pZmVzdEVudHJ5ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpLFxuXHRcdFx0b091dGJvdW5kID0gb01hbmlmZXN0RW50cnkuY3Jvc3NOYXZpZ2F0aW9uICYmIG9NYW5pZmVzdEVudHJ5LmNyb3NzTmF2aWdhdGlvbi5vdXRib3VuZHNbc091dGJvdW5kXTtcblx0XHRpZiAoIW9PdXRib3VuZCkge1xuXHRcdFx0TG9nLmVycm9yKFwiT3V0Ym91bmQgaXMgbm90IGRlZmluZWQgaW4gbWFuaWZlc3QhIVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0ID0gb091dGJvdW5kLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0c0FjdGlvbiA9IG9PdXRib3VuZC5hY3Rpb24sXG5cdFx0XHRvdXRib3VuZFBhcmFtcyA9IG9PdXRib3VuZC5wYXJhbWV0ZXJzICYmIHRoaXMuZ2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kLnBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKG1OYXZpZ2F0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0YU5hdlBhcmFtcyA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMobU5hdmlnYXRpb25QYXJhbWV0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0XHRsZXQgb1BhcmFtczogYW55O1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtTmF2aWdhdGlvblBhcmFtZXRlcnNba2V5XSkpIHtcblx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gbU5hdmlnYXRpb25QYXJhbWV0ZXJzW2tleV07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRvUGFyYW1zID0ge307XG5cdFx0XHRcdFx0XHRvUGFyYW1zW2tleV0gPSBhVmFsdWVzW2ldO1xuXHRcdFx0XHRcdFx0YU5hdlBhcmFtcz8ucHVzaChvUGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1BhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdG9QYXJhbXNba2V5XSA9IG1OYXZpZ2F0aW9uUGFyYW1ldGVyc1trZXldO1xuXHRcdFx0XHRcdGFOYXZQYXJhbXM/LnB1c2gob1BhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYU5hdlBhcmFtcyB8fCBvdXRib3VuZFBhcmFtcykge1xuXHRcdFx0bU5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IHtcblx0XHRcdFx0XHRkYXRhOiBhTmF2UGFyYW1zIHx8IG91dGJvdW5kUGFyYW1zXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdHRoaXMuYmFzZS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbiwgbU5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gYXBwbHkgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvblZhcmlhbnQgY29uc2lzdGluZyBvZiBhIGZpbHRlciBiYXIsIGEgdGFibGUsIGFuZCBhIHBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0gdk91dGJvdW5kUGFyYW1zIE91dGJvdW5kIFByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0ICogQHJldHVybnMgLSBUaGUgbW9kaWZpZWQgU2VsZWN0aW9uVmFyaWFudCB3aXRoIG91dGJvdW5kIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRfYXBwbHlPdXRib3VuZFBhcmFtcyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCwgdk91dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKHZPdXRib3VuZFBhcmFtcyk7XG5cdFx0Y29uc3QgYVNlbGVjdFByb3BlcnRpZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGFQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGtleTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWFTZWxlY3RQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKGtleSwgXCJJXCIsIFwiRVFcIiwgdk91dGJvdW5kUGFyYW1zW2tleV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgb3V0Ym91bmQgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvT3V0Ym91bmRQYXJhbXMgUGFyYW1ldGVycyBkZWZpbmVkIGluIHRoZSBvdXRib3VuZHMuIE9ubHkgXCJwbGFpblwiIGlzIHN1cHBvcnRlZFxuXHQgKiBAcmV0dXJucyBQYXJhbWV0ZXJzIHdpdGggdGhlIGtleS1WYWx1ZSBwYWlyXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0T3V0Ym91bmRQYXJhbXMob091dGJvdW5kUGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCBvUGFyYW1zTWFwcGluZzogYW55ID0ge307XG5cdFx0aWYgKG9PdXRib3VuZFBhcmFtcykge1xuXHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvT3V0Ym91bmRQYXJhbXMpIHx8IFtdO1xuXHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0YVBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IG9PdXRib3VuZFBhcmFtc1trZXldO1xuXHRcdFx0XHRcdGlmIChvTWFwcGluZy52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS52YWx1ZSAmJiBvTWFwcGluZy52YWx1ZS5mb3JtYXQgPT09IFwicGxhaW5cIikge1xuXHRcdFx0XHRcdFx0aWYgKCFvUGFyYW1zTWFwcGluZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNNYXBwaW5nW2tleV0gPSBvTWFwcGluZy52YWx1ZS52YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1BhcmFtc01hcHBpbmc7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYW4gb3V0Ym91bmQgbmF2aWdhdGlvbiB3aGVuIGEgdXNlciBjaG9vc2VzIHRoZSBjaGV2cm9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsIG9Db250ZXh0OiBhbnksIHNDcmVhdGVQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvT3V0Ym91bmRzID0gKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpIGFzIGFueSkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKTtcblx0XHRjb25zdCBvRGlzcGxheU91dGJvdW5kID0gb091dGJvdW5kc1tzT3V0Ym91bmRUYXJnZXRdO1xuXHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0aWYgKG9EaXNwbGF5T3V0Ym91bmQgJiYgb0Rpc3BsYXlPdXRib3VuZC5zZW1hbnRpY09iamVjdCAmJiBvRGlzcGxheU91dGJvdW5kLmFjdGlvbikge1xuXHRcdFx0Y29uc3Qgb1JlZnJlc2hTdHJhdGVnaWVzOiBhbnkgPSB7XG5cdFx0XHRcdGludGVudHM6IHt9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb0RlZmF1bHRSZWZyZXNoU3RyYXRlZ3k6IGFueSA9IHt9O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDtcblxuXHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5pc0EgJiYgb0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Db250ZXh0ID0gW29Db250ZXh0XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0NvbnRleHRbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5W3NNZXRhUGF0aF0gPSBcInNlbGZcIjtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzW1wiX2ZlRGVmYXVsdFwiXSA9IG9EZWZhdWx0UmVmcmVzaFN0cmF0ZWd5O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc0NyZWF0ZVBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IGAke29EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3R9LSR7b0Rpc3BsYXlPdXRib3VuZC5hY3Rpb259YDtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzLmludGVudHNbc0tleV0gPSB7fTtcblx0XHRcdFx0b1JlZnJlc2hTdHJhdGVnaWVzLmludGVudHNbc0tleV1bc0NyZWF0ZVBhdGhdID0gXCJzZWxmXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0Rpc3BsYXlPdXRib3VuZCAmJiBvRGlzcGxheU91dGJvdW5kLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9EaXNwbGF5T3V0Ym91bmQucGFyYW1ldGVycyAmJiB0aGlzLmdldE91dGJvdW5kUGFyYW1zKG9EaXNwbGF5T3V0Ym91bmQucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9EaXNwbGF5T3V0Ym91bmQuc2VtYW50aWNPYmplY3QsIG9EaXNwbGF5T3V0Ym91bmQuYWN0aW9uLCB7XG5cdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0czogb0NvbnRleHQsXG5cdFx0XHRcdHJlZnJlc2hTdHJhdGVnaWVzOiBvUmVmcmVzaFN0cmF0ZWdpZXMsXG5cdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyczogYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly9UT0RPOiBjaGVjayB3aHkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpcyByZXF1aXJlZFxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYG91dGJvdW5kIHRhcmdldCAke3NPdXRib3VuZFRhcmdldH0gbm90IGZvdW5kIGluIGNyb3NzIG5hdmlnYXRpb24gZGVmaW5pdGlvbiBvZiBtYW5pZmVzdGApO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFB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