@sapui5/sap.fe.core 1.99.0 → 1.100.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -13,698 +13,657 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
13
13
  var Override = ClassSupport.Override;
14
14
  var UI5Class = ClassSupport.UI5Class;
15
15
 
16
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
17
-
18
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
19
-
20
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
21
-
22
16
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
23
17
 
24
18
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
19
 
26
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
27
-
28
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
29
-
30
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
31
-
32
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
33
-
34
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
35
-
36
20
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
37
21
 
38
22
  var SideEffectsControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.SideEffects", ControllerExtensionMetadata), _dec2 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
39
23
  _inherits(SideEffectsControllerExtension, _ControllerExtension);
40
24
 
41
- var _super = _createSuper(SideEffectsControllerExtension);
42
-
43
25
  function SideEffectsControllerExtension() {
44
- _classCallCheck(this, SideEffectsControllerExtension);
45
-
46
- return _super.apply(this, arguments);
26
+ return _ControllerExtension.apply(this, arguments) || this;
47
27
  }
48
28
 
49
- _createClass(SideEffectsControllerExtension, [{
50
- key: "onInit",
51
- value: function onInit() {
52
- this._oView = this.base.getView();
53
- this._oAppComponent = CommonUtils.getAppComponent(this._oView);
54
- this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
55
- this._mFieldGroupQueue = {};
56
- this._aSourcePropertiesFailure = new Set();
57
- this._mFailedSideEffects = {};
58
- }
59
- /**
60
- * Clear recorded validation status for all properties.
61
- *
62
- * @function
63
- * @name clearPropertiesStatus
64
- */
65
-
66
- }, {
67
- key: "clearPropertiesStatus",
68
- value: function clearPropertiesStatus() {
69
- this._aSourcePropertiesFailure.clear();
70
- }
71
- /**
72
- * Gets failed SideEffects.
73
- *
74
- * @function
75
- * @name getRegisteredFailedRequests
76
- * @returns {object} Registered SideEffects requests that have failed
77
- */
78
-
79
- }, {
80
- key: "getRegisteredFailedRequests",
81
- value: function getRegisteredFailedRequests() {
82
- return this._mFailedSideEffects;
83
- }
84
- /**
85
- * Manages the workflow for SideEffects with related changes to a field
86
- * The following scenarios are managed:
87
- * - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
88
- * - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
89
- *
90
- * @function
91
- * @name handleFieldChange
92
- * @param {object} oEvent SAPUI5 event that comes from a field change
93
- * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
94
- * @returns {object} Promise on SideEffects request(s)
95
- */
96
-
97
- }, {
98
- key: "handleFieldChange",
99
- value: function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
100
- var _this = this;
101
-
102
- var mEventFieldProperties = this._getFieldProperties(oEvent),
103
- aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
104
-
105
- var bIsImmediateTriggered = false;
106
- return this._generateImmediatePromise(mEventFieldProperties).then(function () {
107
- bIsImmediateTriggered = true;
108
- return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
109
- return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
110
- }) || []);
111
- }).catch(function (oError) {
112
- if (bIsImmediateTriggered) {
113
- Log.debug("Error while processing Field SideEffects", oError);
114
- } else {
115
- /**
116
- * SideEffects have not been triggered since preRequisite validation fails so we need
117
- * to keep previously failed request as Failed request (to be retrigger on next change)
118
- */
119
- aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
120
- return mImmediateSideEffects.previouslyFailed === true;
121
- }).forEach(function (mImmediateSideEffects) {
122
- return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
123
- });
124
- }
125
- });
126
- }
127
- /**
128
- * Manages SideEffects with a related 'focus out' to a field group.
129
- *
130
- * @function
131
- * @name handleFieldGroupChange
132
- * @param {object} oEvent SAPUI5 Event
133
- * @returns {object} Promise on SideEffects request(s)
134
- */
135
-
136
- }, {
137
- key: "handleFieldGroupChange",
138
- value: function handleFieldGroupChange(oEvent) {
139
- // eslint-disable-next-line @typescript-eslint/no-this-alias
140
- var that = this,
141
- aDeferredSideEffects = [],
142
- aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
143
-
144
- var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
145
- var bIsRequestsTriggered = false;
146
- var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
147
- var oContext = oSideEffectProperty.context;
148
- var sContextPath = oContext.getPath();
149
-
150
- var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
151
-
152
- var mEntityType = that._getEntityTypeFromFQN(sEntityType);
153
-
154
- return Promise.all(oDeferredSideEffect.promises).then(function () {
155
- bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
156
-
157
- if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
158
- if (sourceProperty.type === "PropertyPath") {
159
- var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
160
-
161
- if (sId) {
162
- return !that._aSourcePropertiesFailure.has(sId);
163
- }
164
- }
165
-
166
- return true;
167
- })) {
168
- return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
169
- }
170
-
171
- return null;
172
- }).catch(function (oError) {
173
- if (bIsRequestsTriggered) {
174
- Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
175
- }
176
- }).finally(function () {
177
- delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
178
- });
179
- };
180
-
181
- aFieldGroupIds.forEach(function (sFieldGroupId) {
182
- var _that$_mFieldGroupQue;
29
+ var _proto = SideEffectsControllerExtension.prototype;
183
30
 
31
+ _proto.onInit = function onInit() {
32
+ this._oView = this.base.getView();
33
+ this._oAppComponent = CommonUtils.getAppComponent(this._oView);
34
+ this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
35
+ this._mFieldGroupQueue = {};
36
+ this._aSourcePropertiesFailure = new Set();
37
+ this._mFailedSideEffects = {};
38
+ }
39
+ /**
40
+ * Clear recorded validation status for all properties.
41
+ *
42
+ * @function
43
+ * @name clearPropertiesStatus
44
+ */
45
+ ;
46
+
47
+ _proto.clearPropertiesStatus = function clearPropertiesStatus() {
48
+ this._aSourcePropertiesFailure.clear();
49
+ }
50
+ /**
51
+ * Gets failed SideEffects.
52
+ *
53
+ * @function
54
+ * @name getRegisteredFailedRequests
55
+ * @returns {object} Registered SideEffects requests that have failed
56
+ */
57
+ ;
58
+
59
+ _proto.getRegisteredFailedRequests = function getRegisteredFailedRequests() {
60
+ return this._mFailedSideEffects;
61
+ }
62
+ /**
63
+ * Manages the workflow for SideEffects with related changes to a field
64
+ * The following scenarios are managed:
65
+ * - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
66
+ * - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
67
+ *
68
+ * @function
69
+ * @name handleFieldChange
70
+ * @param {object} oEvent SAPUI5 event that comes from a field change
71
+ * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
72
+ * @returns {object} Promise on SideEffects request(s)
73
+ */
74
+ ;
75
+
76
+ _proto.handleFieldChange = function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
77
+ var _this = this;
78
+
79
+ var mEventFieldProperties = this._getFieldProperties(oEvent),
80
+ aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
81
+
82
+ var bIsImmediateTriggered = false;
83
+ return this._generateImmediatePromise(mEventFieldProperties).then(function () {
84
+ bIsImmediateTriggered = true;
85
+ return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
86
+ return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
87
+ }) || []);
88
+ }).catch(function (oError) {
89
+ if (bIsImmediateTriggered) {
90
+ Log.debug("Error while processing Field SideEffects", oError);
91
+ } else {
184
92
  /**
185
- * string "$$ImmediateRequest" is added to the SideEffects name during templating to know
186
- * if this SideEffects must be immediately executed requested (on field change) or must
187
- * be deferred (on field group focus out)
188
- *
93
+ * SideEffects have not been triggered since preRequisite validation fails so we need
94
+ * to keep previously failed request as Failed request (to be retrigger on next change)
189
95
  */
190
- var sSideEffectName = sFieldGroupId.replace("$$ImmediateRequest", "");
191
- var mContextDeferredSideEffects = (_that$_mFieldGroupQue = that._mFieldGroupQueue) === null || _that$_mFieldGroupQue === void 0 ? void 0 : _that$_mFieldGroupQue[sSideEffectName];
192
-
193
- if (mContextDeferredSideEffects) {
194
- Object.keys(mContextDeferredSideEffects).forEach(function (sContextPath) {
195
- var oDeferredSideEffect = mContextDeferredSideEffects[sContextPath];
96
+ aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
97
+ return mImmediateSideEffects.previouslyFailed === true;
98
+ }).forEach(function (mImmediateSideEffects) {
99
+ return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
100
+ });
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Manages SideEffects with a related 'focus out' to a field group.
106
+ *
107
+ * @function
108
+ * @name handleFieldGroupChange
109
+ * @param {object} oEvent SAPUI5 Event
110
+ * @returns {object} Promise on SideEffects request(s)
111
+ */
112
+ ;
113
+
114
+ _proto.handleFieldGroupChange = function handleFieldGroupChange(oEvent) {
115
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
116
+ var that = this,
117
+ aDeferredSideEffects = [],
118
+ aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
119
+
120
+ var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
121
+ var bIsRequestsTriggered = false;
122
+ var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
123
+ var oContext = oSideEffectProperty.context;
124
+ var sContextPath = oContext.getPath();
196
125
 
197
- if (!oDeferredSideEffect.processStarted) {
198
- oDeferredSideEffect.processStarted = true;
199
- aDeferredSideEffects.push(oDeferredSideEffect);
200
- }
201
- });
202
- }
203
- });
204
- return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
205
- return getFieldGroupRequestPromise(oDeferredSideEffect);
206
- }));
207
- }
208
- /**
209
- * Adds a SideEffects control.
210
- *
211
- * @function
212
- * @name addControlSideEffects
213
- * @param {string} sEntityType Name of the entity where the SideEffects control will be registered
214
- * @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
215
- *
216
- */
217
-
218
- }, {
219
- key: "addControlSideEffects",
220
- value: function addControlSideEffects(sEntityType, oSideEffects) {
221
- this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
222
- }
223
- /**
224
- * Removes the queue containing the failed SideEffects.
225
- *
226
- * @function
227
- * @name removeFailedSideEffects
228
- */
229
-
230
- }, {
231
- key: "removeFailedSideEffects",
232
- value: function removeFailedSideEffects() {
233
- this._mFailedSideEffects = {};
234
- }
235
- /**
236
- * Request SideEffects on a specific context.
237
- *
238
- * @function
239
- * @name requestSideEffects
240
- * @param {object} oSideEffects SideEffects to be executed
241
- * @param {object} oContext Context where SideEffects need to be executed
242
- * @returns {object} SideEffects request on SAPUI5 context
243
- */
244
-
245
- }, {
246
- key: "requestSideEffects",
247
- value: function requestSideEffects(oSideEffects, oContext) {
248
- var _this2 = this;
249
-
250
- var fResolver, fRejector;
251
- var oPromise = new Promise(function (resolve, reject) {
252
- fResolver = resolve;
253
- fRejector = reject;
254
- });
255
- var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
256
- sTriggerAction = oSideEffects.TriggerAction;
126
+ var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
257
127
 
258
- if (sTriggerAction) {
259
- this._oSideEffectsService.executeAction(sTriggerAction, oContext);
260
- }
128
+ var mEntityType = that._getEntityTypeFromFQN(sEntityType);
261
129
 
262
- this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
263
- return fResolver();
264
- }).catch(function (oError) {
265
- _this2._addFailedSideEffects(oSideEffects, oContext);
130
+ return Promise.all(oDeferredSideEffect.promises).then(function () {
131
+ bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
266
132
 
267
- fRejector(oError);
268
- });
133
+ if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
134
+ if (sourceProperty.type === "PropertyPath") {
135
+ var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
269
136
 
270
- return oPromise;
271
- }
272
- /**
273
- * Removes SideEffects created by a control.
274
- *
275
- * @function
276
- * @name removeControlSideEffects
277
- * @param {object} oControl SAPUI5 Control
278
- */
279
-
280
- }, {
281
- key: "removeControlSideEffects",
282
- value: function removeControlSideEffects(oControl) {
283
- var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
284
-
285
- if (sControlId) {
286
- this._oSideEffectsService.removeControlSideEffects(sControlId);
287
- }
288
- }
289
- /**
290
- * Adds SideEffects to the queue of the failed SideEffects
291
- * The SideEffects will be retriggered on the next change on the same context.
292
- *
293
- * @function
294
- * @name _addFailedSideEffects
295
- * @param {object} oSideEffects SideEffects that need to be retriggered
296
- * @param {object} oContext Context where SideEffects have failed
297
- */
298
-
299
- }, {
300
- key: "_addFailedSideEffects",
301
- value: function _addFailedSideEffects(oSideEffects, oContext) {
302
- var sContextPath = oContext.getPath();
303
- this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
137
+ if (sId) {
138
+ return !that._aSourcePropertiesFailure.has(sId);
139
+ }
140
+ }
304
141
 
305
- var bIsNotAlreadyListed = this._mFailedSideEffects[sContextPath].every(function (mFailedSideEffects) {
306
- return oSideEffects.fullyQualifiedName !== mFailedSideEffects.fullyQualifiedName;
307
- });
142
+ return true;
143
+ })) {
144
+ return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
145
+ }
308
146
 
309
- if (bIsNotAlreadyListed) {
310
- this._mFailedSideEffects[sContextPath].push(oSideEffects);
311
- }
312
- }
313
- /**
314
- * Generates the promise for the field group that is required before requesting SideEffects.
315
- * If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
316
- * SideEffects queue.
317
- *
318
- * @function
319
- * @name _generateFieldGroupPromise
320
- * @param {object} mEventFieldProperties Field properties
321
- * @returns {object} Promise to be used for the validation of the field
322
- */
323
-
324
- }, {
325
- key: "_generateFieldGroupPromise",
326
- value: function _generateFieldGroupPromise(mEventFieldProperties) {
327
- // eslint-disable-next-line @typescript-eslint/no-this-alias
328
- var that = this;
329
- var bPromiseSuccess = true;
330
- return mEventFieldProperties.promise.then(function () {
331
- return bPromiseSuccess;
332
- }).catch(function () {
333
- bPromiseSuccess = false;
334
- return bPromiseSuccess;
147
+ return null;
148
+ }).catch(function (oError) {
149
+ if (bIsRequestsTriggered) {
150
+ Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
151
+ }
335
152
  }).finally(function () {
336
- /**
337
- * Need to store the status of properties related to this field for deferred SideEffects
338
- * since all SourceProperties for this kind of SideEffects must be valid
339
- */
340
- that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
153
+ delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
341
154
  });
155
+ };
156
+
157
+ aFieldGroupIds.forEach(function (sFieldGroupId) {
158
+ var _that$_mFieldGroupQue;
159
+
160
+ /**
161
+ * string "$$ImmediateRequest" is added to the SideEffects name during templating to know
162
+ * if this SideEffects must be immediately executed requested (on field change) or must
163
+ * be deferred (on field group focus out)
164
+ *
165
+ */
166
+ var sSideEffectName = sFieldGroupId.replace("$$ImmediateRequest", "");
167
+ var mContextDeferredSideEffects = (_that$_mFieldGroupQue = that._mFieldGroupQueue) === null || _that$_mFieldGroupQue === void 0 ? void 0 : _that$_mFieldGroupQue[sSideEffectName];
168
+
169
+ if (mContextDeferredSideEffects) {
170
+ Object.keys(mContextDeferredSideEffects).forEach(function (sContextPath) {
171
+ var oDeferredSideEffect = mContextDeferredSideEffects[sContextPath];
172
+
173
+ if (!oDeferredSideEffect.processStarted) {
174
+ oDeferredSideEffect.processStarted = true;
175
+ aDeferredSideEffects.push(oDeferredSideEffect);
176
+ }
177
+ });
178
+ }
179
+ });
180
+ return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
181
+ return getFieldGroupRequestPromise(oDeferredSideEffect);
182
+ }));
183
+ }
184
+ /**
185
+ * Adds a SideEffects control.
186
+ *
187
+ * @function
188
+ * @name addControlSideEffects
189
+ * @param {string} sEntityType Name of the entity where the SideEffects control will be registered
190
+ * @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
191
+ *
192
+ */
193
+ ;
194
+
195
+ _proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffects) {
196
+ this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
197
+ }
198
+ /**
199
+ * Removes the queue containing the failed SideEffects.
200
+ *
201
+ * @function
202
+ * @name removeFailedSideEffects
203
+ */
204
+ ;
205
+
206
+ _proto.removeFailedSideEffects = function removeFailedSideEffects() {
207
+ this._mFailedSideEffects = {};
208
+ }
209
+ /**
210
+ * Request SideEffects on a specific context.
211
+ *
212
+ * @function
213
+ * @name requestSideEffects
214
+ * @param {object} oSideEffects SideEffects to be executed
215
+ * @param {object} oContext Context where SideEffects need to be executed
216
+ * @returns {object} SideEffects request on SAPUI5 context
217
+ */
218
+ ;
219
+
220
+ _proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext) {
221
+ var _this2 = this;
222
+
223
+ var fResolver, fRejector;
224
+ var oPromise = new Promise(function (resolve, reject) {
225
+ fResolver = resolve;
226
+ fRejector = reject;
227
+ });
228
+ var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
229
+ sTriggerAction = oSideEffects.TriggerAction;
230
+
231
+ if (sTriggerAction) {
232
+ this._oSideEffectsService.executeAction(sTriggerAction, oContext);
342
233
  }
343
- /**
344
- * Generates the promise for the field that is required before requesting immediate SideEffects.
345
- *
346
- * @function
347
- * @name _generateImmediatePromise
348
- * @param {object} mEventFieldProperties Field properties
349
- * @returns {object} Promise to be used for the validation of the field
350
- */
351
-
352
- }, {
353
- key: "_generateImmediatePromise",
354
- value: function _generateImmediatePromise(mEventFieldProperties) {
355
- var oPromise = mEventFieldProperties.promise;
356
- return oPromise.then(function () {
357
- /**
358
- * If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
359
- * To achieve this, we ensure that all related bindings have been resolved.
360
- *
361
- * This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
362
- * and no request can be executed.
363
- */
364
- var oField = mEventFieldProperties.field;
365
- var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
366
234
 
367
- if (sFieldHelperId) {
368
- var oFilterHelp = sap.ui.getCore().byId(sFieldHelperId);
235
+ this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
236
+ return fResolver();
237
+ }).catch(function (oError) {
238
+ _this2._addFailedSideEffects(oSideEffects, oContext);
369
239
 
370
- if (oFilterHelp) {
371
- return Promise.all(oFilterHelp.getOutParameters().map(function (oOutParameter) {
372
- var oBinding = oOutParameter.getBinding("value");
373
- return oBinding ? oBinding.requestValue() : Promise.resolve();
374
- }));
375
- }
376
- }
240
+ fRejector(oError);
241
+ });
377
242
 
378
- return Promise.all([]);
379
- });
243
+ return oPromise;
244
+ }
245
+ /**
246
+ * Removes SideEffects created by a control.
247
+ *
248
+ * @function
249
+ * @name removeControlSideEffects
250
+ * @param {object} oControl SAPUI5 Control
251
+ */
252
+ ;
253
+
254
+ _proto.removeControlSideEffects = function removeControlSideEffects(oControl) {
255
+ var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
256
+
257
+ if (sControlId) {
258
+ this._oSideEffectsService.removeControlSideEffects(sControlId);
259
+ }
260
+ }
261
+ /**
262
+ * Adds SideEffects to the queue of the failed SideEffects
263
+ * The SideEffects will be retriggered on the next change on the same context.
264
+ *
265
+ * @function
266
+ * @name _addFailedSideEffects
267
+ * @param {object} oSideEffects SideEffects that need to be retriggered
268
+ * @param {object} oContext Context where SideEffects have failed
269
+ */
270
+ ;
271
+
272
+ _proto._addFailedSideEffects = function _addFailedSideEffects(oSideEffects, oContext) {
273
+ var sContextPath = oContext.getPath();
274
+ this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
275
+
276
+ var bIsNotAlreadyListed = this._mFailedSideEffects[sContextPath].every(function (mFailedSideEffects) {
277
+ return oSideEffects.fullyQualifiedName !== mFailedSideEffects.fullyQualifiedName;
278
+ });
279
+
280
+ if (bIsNotAlreadyListed) {
281
+ this._mFailedSideEffects[sContextPath].push(oSideEffects);
380
282
  }
381
- /**
382
- * Generates a status index.
383
- *
384
- * @function
385
- * @name _generateStatusIndex
386
- * @param {object} mEntityType The entity type
387
- * @param {string} sPropertyPath The property path
388
- * @param {object} oContext SAPUI5 Context
389
- * @returns {string | undefined} Index
390
- */
391
-
392
- }, {
393
- key: "_generateStatusIndex",
394
- value: function _generateStatusIndex(mEntityType, sPropertyPath, oContext) {
395
- var sContextPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath();
396
- var mProperty = mEntityType.resolvePath(sPropertyPath);
397
-
398
- if (mProperty) {
399
- if (mProperty && mProperty._type === "Property") {
400
- return [mProperty.fullyQualifiedName, sContextPath].join("__");
283
+ }
284
+ /**
285
+ * Generates the promise for the field group that is required before requesting SideEffects.
286
+ * If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
287
+ * SideEffects queue.
288
+ *
289
+ * @function
290
+ * @name _generateFieldGroupPromise
291
+ * @param {object} mEventFieldProperties Field properties
292
+ * @returns {object} Promise to be used for the validation of the field
293
+ */
294
+ ;
295
+
296
+ _proto._generateFieldGroupPromise = function _generateFieldGroupPromise(mEventFieldProperties) {
297
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
298
+ var that = this;
299
+ var bPromiseSuccess = true;
300
+ return mEventFieldProperties.promise.then(function () {
301
+ return bPromiseSuccess;
302
+ }).catch(function () {
303
+ bPromiseSuccess = false;
304
+ return bPromiseSuccess;
305
+ }).finally(function () {
306
+ /**
307
+ * Need to store the status of properties related to this field for deferred SideEffects
308
+ * since all SourceProperties for this kind of SideEffects must be valid
309
+ */
310
+ that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
311
+ });
312
+ }
313
+ /**
314
+ * Generates the promise for the field that is required before requesting immediate SideEffects.
315
+ *
316
+ * @function
317
+ * @name _generateImmediatePromise
318
+ * @param {object} mEventFieldProperties Field properties
319
+ * @returns {object} Promise to be used for the validation of the field
320
+ */
321
+ ;
322
+
323
+ _proto._generateImmediatePromise = function _generateImmediatePromise(mEventFieldProperties) {
324
+ var oPromise = mEventFieldProperties.promise;
325
+ return oPromise.then(function () {
326
+ /**
327
+ * If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
328
+ * To achieve this, we ensure that all related bindings have been resolved.
329
+ *
330
+ * This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
331
+ * and no request can be executed.
332
+ */
333
+ var oField = mEventFieldProperties.field;
334
+ var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
335
+
336
+ if (sFieldHelperId) {
337
+ var oFilterHelp = sap.ui.getCore().byId(sFieldHelperId);
338
+
339
+ if (oFilterHelp) {
340
+ return Promise.all(oFilterHelp.getOutParameters().map(function (oOutParameter) {
341
+ var oBinding = oOutParameter.getBinding("value");
342
+ return oBinding ? oBinding.requestValue() : Promise.resolve();
343
+ }));
401
344
  }
402
345
  }
403
346
 
404
- return undefined;
347
+ return Promise.all([]);
348
+ });
349
+ }
350
+ /**
351
+ * Generates a status index.
352
+ *
353
+ * @function
354
+ * @name _generateStatusIndex
355
+ * @param {object} mEntityType The entity type
356
+ * @param {string} sPropertyPath The property path
357
+ * @param {object} oContext SAPUI5 Context
358
+ * @returns {string | undefined} Index
359
+ */
360
+ ;
361
+
362
+ _proto._generateStatusIndex = function _generateStatusIndex(mEntityType, sPropertyPath, oContext) {
363
+ var sContextPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath();
364
+ var mProperty = mEntityType.resolvePath(sPropertyPath);
365
+
366
+ if (mProperty) {
367
+ if (mProperty && mProperty._type === "Property") {
368
+ return [mProperty.fullyQualifiedName, sContextPath].join("__");
369
+ }
405
370
  }
406
- /**
407
- * Gets the appropriate context on which SideEffects can be requested.
408
- * The correct one must have the binding parameter $$patchWithoutSideEffects.
409
- *
410
- * @function
411
- * @name _getContextForSideEffects
412
- * @param {object} oSourceField Field
413
- * @param {string} sSideEffectEntityType Target entity type of the SideEffects annotation
414
- * @returns {object} SAPUI5 Context
415
- */
416
-
417
- }, {
418
- key: "_getContextForSideEffects",
419
- value: function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
420
- var oBindingContext = oSourceField.getBindingContext();
421
-
422
- var oContextForSideEffects = oBindingContext,
423
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
424
-
425
- if (sSideEffectEntityType !== sEntityType) {
426
- oContextForSideEffects = oBindingContext.getBinding().getContext();
427
-
428
- if (oContextForSideEffects) {
429
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
430
-
431
- if (sSideEffectEntityType !== sEntityType) {
432
- oContextForSideEffects = oContextForSideEffects.getBinding().getContext();
433
-
434
- if (oContextForSideEffects) {
435
- sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
436
-
437
- if (sSideEffectEntityType !== sEntityType) {
438
- return undefined;
439
- }
371
+
372
+ return undefined;
373
+ }
374
+ /**
375
+ * Gets the appropriate context on which SideEffects can be requested.
376
+ * The correct one must have the binding parameter $$patchWithoutSideEffects.
377
+ *
378
+ * @function
379
+ * @name _getContextForSideEffects
380
+ * @param {object} oSourceField Field
381
+ * @param {string} sSideEffectEntityType Target entity type of the SideEffects annotation
382
+ * @returns {object} SAPUI5 Context
383
+ */
384
+ ;
385
+
386
+ _proto._getContextForSideEffects = function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
387
+ var oBindingContext = oSourceField.getBindingContext();
388
+
389
+ var oContextForSideEffects = oBindingContext,
390
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
391
+
392
+ if (sSideEffectEntityType !== sEntityType) {
393
+ oContextForSideEffects = oBindingContext.getBinding().getContext();
394
+
395
+ if (oContextForSideEffects) {
396
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
397
+
398
+ if (sSideEffectEntityType !== sEntityType) {
399
+ oContextForSideEffects = oContextForSideEffects.getBinding().getContext();
400
+
401
+ if (oContextForSideEffects) {
402
+ sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
403
+
404
+ if (sSideEffectEntityType !== sEntityType) {
405
+ return undefined;
440
406
  }
441
407
  }
442
408
  }
443
409
  }
444
-
445
- return oContextForSideEffects || undefined;
446
410
  }
447
- /**
448
- * Retrieves the EntityType based on its fully-qualified name.
449
- *
450
- * @param {string} sFullyQualifiedName The fully-qualified name
451
- * @returns {object} The entity type
452
- */
453
-
454
- }, {
455
- key: "_getEntityTypeFromFQN",
456
- value: function _getEntityTypeFromFQN(sFullyQualifiedName) {
457
- var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
458
- return oEntityType.fullyQualifiedName === sFullyQualifiedName;
459
- });
460
411
 
461
- return mEntityType;
462
- }
463
- /**
464
- * Gets the promise of the field validation that is required for the SideEffects process.
465
- *
466
- * @function
467
- * @name _getFieldPromise
468
- * @param {object} oEvent Field change event
469
- * @returns {object} Field promise
470
- */
471
-
472
- }, {
473
- key: "_getFieldPromise",
474
- value: function _getFieldPromise(oEvent) {
475
- var promise = oEvent.getParameter("promise") || Promise.resolve();
476
- return promise.then(function () {
477
- var oPromise = new Promise(function (resolve, reject) {
478
- if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
479
- reject();
480
- } else {
481
- resolve(true);
412
+ return oContextForSideEffects || undefined;
413
+ }
414
+ /**
415
+ * Retrieves the EntityType based on its fully-qualified name.
416
+ *
417
+ * @param {string} sFullyQualifiedName The fully-qualified name
418
+ * @returns {object} The entity type
419
+ */
420
+ ;
421
+
422
+ _proto._getEntityTypeFromFQN = function _getEntityTypeFromFQN(sFullyQualifiedName) {
423
+ var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
424
+ return oEntityType.fullyQualifiedName === sFullyQualifiedName;
425
+ });
426
+
427
+ return mEntityType;
428
+ }
429
+ /**
430
+ * Gets the promise of the field validation that is required for the SideEffects process.
431
+ *
432
+ * @function
433
+ * @name _getFieldPromise
434
+ * @param {object} oEvent Field change event
435
+ * @returns {object} Field promise
436
+ */
437
+ ;
438
+
439
+ _proto._getFieldPromise = function _getFieldPromise(oEvent) {
440
+ var promise = oEvent.getParameter("promise") || Promise.resolve();
441
+ return promise.then(function () {
442
+ var oPromise = new Promise(function (resolve, reject) {
443
+ if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
444
+ reject();
445
+ } else {
446
+ resolve(true);
447
+ }
448
+ });
449
+ return oPromise;
450
+ });
451
+ }
452
+ /**
453
+ * Gets the properties of the field that are required for the SideEffects process.
454
+ *
455
+ * @function
456
+ * @name _getFieldProperties
457
+ * @param {object} oEvent Field change event
458
+ * @returns {object} Field properties (event change promise, field, SideEffects related to this field)
459
+ */
460
+ ;
461
+
462
+ _proto._getFieldProperties = function _getFieldProperties(oEvent) {
463
+ var oField = oEvent.getSource();
464
+ return {
465
+ promise: this._getFieldPromise(oEvent),
466
+ field: oField,
467
+ sideEffectsMap: this._getFieldSideEffectsMap(oField)
468
+ };
469
+ }
470
+ /**
471
+ * Gets the SideEffects map
472
+ * These SideEffects are
473
+ * - listed into FieldGroupIds (coming from an OData Service)
474
+ * - generated by a control or controls and that configure this field as SourceProperties.
475
+ *
476
+ * @function
477
+ * @name _getFieldSideEffectsMap
478
+ * @param {object} oField Field
479
+ * @returns {object} SideEffects map
480
+ */
481
+ ;
482
+
483
+ _proto._getFieldSideEffectsMap = function _getFieldSideEffectsMap(oField) {
484
+ var _this3 = this;
485
+
486
+ var mSideEffectsMap = {},
487
+ aFieldGroupIds = oField.getFieldGroupIds(),
488
+ sViewEntitySetSetName = this._oView.getViewData().entitySet,
489
+ oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
490
+ return oEntitySet.name === sViewEntitySetSetName;
491
+ }); // SideEffects coming from an OData Service
492
+
493
+
494
+ aFieldGroupIds.forEach(function (sFieldGroupId) {
495
+ var _this3$_oSideEffectsS;
496
+
497
+ var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
498
+ sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
499
+ aSideEffectParts = sName.split("#"),
500
+ sSideEffectEntityType = aSideEffectParts[0],
501
+ sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
502
+ oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
503
+ oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
504
+
505
+ if (oSideEffect && oContext) {
506
+ mSideEffectsMap[sName] = {
507
+ name: sName,
508
+ immediate: bIsImmediate,
509
+ sideEffects: oSideEffect,
510
+ context: oContext
511
+ };
512
+ }
513
+ }); //SideEffects coming from control(s)
514
+
515
+ if (sViewEntitySetSetName && oViewEntitySet) {
516
+ var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
517
+ mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
518
+ return oCustomData.getKey() === "sourcePath";
519
+ }),
520
+ oContext = this._getContextForSideEffects(oField, sViewEntityType);
521
+
522
+ if (mFieldPath && oContext) {
523
+ var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
524
+ mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
525
+
526
+ Object.keys(mControlEntityType).forEach(function (sControlName) {
527
+ var oControlSideEffects = mControlEntityType[sControlName];
528
+
529
+ if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
530
+ var sName = sControlName + "::" + sViewEntityType;
531
+ mSideEffectsMap[sName] = {
532
+ name: sName,
533
+ immediate: true,
534
+ sideEffects: oControlSideEffects,
535
+ context: oContext
536
+ };
482
537
  }
483
538
  });
484
- return oPromise;
485
- });
486
- }
487
- /**
488
- * Gets the properties of the field that are required for the SideEffects process.
489
- *
490
- * @function
491
- * @name _getFieldProperties
492
- * @param {object} oEvent Field change event
493
- * @returns {object} Field properties (event change promise, field, SideEffects related to this field)
494
- */
495
-
496
- }, {
497
- key: "_getFieldProperties",
498
- value: function _getFieldProperties(oEvent) {
499
- var oField = oEvent.getSource();
500
- return {
501
- promise: this._getFieldPromise(oEvent),
502
- field: oField,
503
- sideEffectsMap: this._getFieldSideEffectsMap(oField)
504
- };
505
- }
506
- /**
507
- * Gets the SideEffects map
508
- * These SideEffects are
509
- * - listed into FieldGroupIds (coming from an OData Service)
510
- * - generated by a control or controls and that configure this field as SourceProperties.
511
- *
512
- * @function
513
- * @name _getFieldSideEffectsMap
514
- * @param {object} oField Field
515
- * @returns {object} SideEffects map
516
- */
517
-
518
- }, {
519
- key: "_getFieldSideEffectsMap",
520
- value: function _getFieldSideEffectsMap(oField) {
521
- var _this3 = this;
522
-
523
- var mSideEffectsMap = {},
524
- aFieldGroupIds = oField.getFieldGroupIds(),
525
- sViewEntitySetSetName = this._oView.getViewData().entitySet,
526
- oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
527
- return oEntitySet.name === sViewEntitySetSetName;
528
- }); // SideEffects coming from an OData Service
529
-
530
-
531
- aFieldGroupIds.forEach(function (sFieldGroupId) {
532
- var _this3$_oSideEffectsS;
533
-
534
- var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
535
- sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
536
- aSideEffectParts = sName.split("#"),
537
- sSideEffectEntityType = aSideEffectParts[0],
538
- sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
539
- oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
540
- oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
541
-
542
- if (oSideEffect && oContext) {
543
- mSideEffectsMap[sName] = {
544
- name: sName,
545
- immediate: bIsImmediate,
546
- sideEffects: oSideEffect,
547
- context: oContext
548
- };
549
- }
550
- }); //SideEffects coming from control(s)
551
-
552
- if (sViewEntitySetSetName && oViewEntitySet) {
553
- var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
554
- mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
555
- return oCustomData.getKey() === "sourcePath";
556
- }),
557
- oContext = this._getContextForSideEffects(oField, sViewEntityType);
558
-
559
- if (mFieldPath && oContext) {
560
- var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
561
- mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
562
-
563
- Object.keys(mControlEntityType).forEach(function (sControlName) {
564
- var oControlSideEffects = mControlEntityType[sControlName];
565
-
566
- if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
567
- var sName = sControlName + "::" + sViewEntityType;
568
- mSideEffectsMap[sName] = {
569
- name: sName,
570
- immediate: true,
571
- sideEffects: oControlSideEffects,
572
- context: oContext
573
- };
574
- }
575
- });
576
- }
577
539
  }
578
-
579
- return mSideEffectsMap;
580
540
  }
581
- /**
582
- * Manages the SideEffects with related changes to a field
583
- * List: gets immediate SideEffects requests
584
- * Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
585
- *
586
- * @function
587
- * @name _initializeFieldSideEffects
588
- * @param {object} mEventFieldProperties Field event properties
589
- * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
590
- * @returns {Array} Array of immediate SideEffects
591
- */
592
-
593
- }, {
594
- key: "_initializeFieldSideEffects",
595
- value: function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
596
- var _this4 = this;
597
-
598
- var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
599
- oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
600
- // Promise managing FieldGroup requests if Field promise fails
601
- mFailedSideEffectsName = {},
602
- aImmediateSideEffectsProperties = [];
603
-
604
- oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
605
- Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
606
- var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
607
- sSideEffectContextPath = oSideEffectProperty.context.getPath(),
608
- aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
609
-
610
- if (aFailedSideEffects) {
611
- delete _this4._mFailedSideEffects[sSideEffectContextPath];
612
- mFailedSideEffectsName[sSideEffectContextPath] = {};
613
- aFailedSideEffects.forEach(function (mFailedSideEffects) {
614
- mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
615
- aImmediateSideEffectsProperties.push({
616
- name: sSideEffectName,
617
- previouslyFailed: true,
618
- sideEffects: mFailedSideEffects,
619
- context: oSideEffectProperty.context
620
- });
541
+
542
+ return mSideEffectsMap;
543
+ }
544
+ /**
545
+ * Manages the SideEffects with related changes to a field
546
+ * List: gets immediate SideEffects requests
547
+ * Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
548
+ *
549
+ * @function
550
+ * @name _initializeFieldSideEffects
551
+ * @param {object} mEventFieldProperties Field event properties
552
+ * @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
553
+ * @returns {Array} Array of immediate SideEffects
554
+ */
555
+ ;
556
+
557
+ _proto._initializeFieldSideEffects = function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
558
+ var _this4 = this;
559
+
560
+ var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
561
+ oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
562
+ // Promise managing FieldGroup requests if Field promise fails
563
+ mFailedSideEffectsName = {},
564
+ aImmediateSideEffectsProperties = [];
565
+
566
+ oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
567
+ Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
568
+ var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
569
+ sSideEffectContextPath = oSideEffectProperty.context.getPath(),
570
+ aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
571
+
572
+ if (aFailedSideEffects) {
573
+ delete _this4._mFailedSideEffects[sSideEffectContextPath];
574
+ mFailedSideEffectsName[sSideEffectContextPath] = {};
575
+ aFailedSideEffects.forEach(function (mFailedSideEffects) {
576
+ mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
577
+ aImmediateSideEffectsProperties.push({
578
+ name: sSideEffectName,
579
+ previouslyFailed: true,
580
+ sideEffects: mFailedSideEffects,
581
+ context: oSideEffectProperty.context
621
582
  });
622
- }
583
+ });
584
+ }
623
585
 
624
- if (oSideEffectProperty.immediate) {
625
- var _mFailedSideEffectsNa;
586
+ if (oSideEffectProperty.immediate) {
587
+ var _mFailedSideEffectsNa;
626
588
 
627
- // SideEffects will be executed immediately after event promise validation
628
- if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
629
- aImmediateSideEffectsProperties.push({
630
- name: sSideEffectName,
631
- sideEffects: oSideEffectProperty.sideEffects,
632
- context: oSideEffectProperty.context
633
- });
634
- }
635
- } else {
636
- // Add deferred SideEffects to the related dictionary
637
- _this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
638
- var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
639
- promises: [],
640
- sideEffectProperty: oSideEffectProperty,
641
- processStarted: false
642
- };
643
- mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
644
- _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
589
+ // SideEffects will be executed immediately after event promise validation
590
+ if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
591
+ aImmediateSideEffectsProperties.push({
592
+ name: sSideEffectName,
593
+ sideEffects: oSideEffectProperty.sideEffects,
594
+ context: oSideEffectProperty.context
595
+ });
645
596
  }
646
- });
647
- return aImmediateSideEffectsProperties;
648
- }
649
- /**
650
- * Saves the validation status of properties related to a field control.
651
- *
652
- * @param {object} oField Field
653
- * @param {boolean} bSuccess Status of the field validation
654
- */
597
+ } else {
598
+ // Add deferred SideEffects to the related dictionary
599
+ _this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
600
+ var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
601
+ promises: [],
602
+ sideEffectProperty: oSideEffectProperty,
603
+ processStarted: false
604
+ };
605
+ mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
606
+ _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
607
+ }
608
+ });
609
+ return aImmediateSideEffectsProperties;
610
+ }
611
+ /**
612
+ * Saves the validation status of properties related to a field control.
613
+ *
614
+ * @param {object} oField Field
615
+ * @param {boolean} bSuccess Status of the field validation
616
+ */
617
+ ;
655
618
 
656
- }, {
657
- key: "_saveFieldPropertiesStatus",
658
- value: function _saveFieldPropertiesStatus(oField, bSuccess) {
659
- var _this5 = this;
619
+ _proto._saveFieldPropertiesStatus = function _saveFieldPropertiesStatus(oField, bSuccess) {
620
+ var _this5 = this;
660
621
 
661
- var oBindingContext = oField.getBindingContext();
622
+ var oBindingContext = oField.getBindingContext();
662
623
 
663
- var sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
624
+ var sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
664
625
 
665
- var mEntityType = this._getEntityTypeFromFQN(sEntityType);
626
+ var mEntityType = this._getEntityTypeFromFQN(sEntityType);
666
627
 
667
- if (mEntityType) {
668
- // Retrieves all properties used by the field
669
- var oFieldBinding = this._getBindingForField(oField);
628
+ if (mEntityType) {
629
+ // Retrieves all properties used by the field
630
+ var oFieldBinding = this._getBindingForField(oField);
670
631
 
671
- var aFieldPaths = oFieldBinding.isA("sap.ui.model.CompositeBinding") ? (oFieldBinding.getBindings() || []).map(function (oBinding) {
672
- return oBinding.sPath;
673
- }) : [oFieldBinding.getPath()]; // Stores status for all properties
632
+ var aFieldPaths = oFieldBinding.isA("sap.ui.model.CompositeBinding") ? (oFieldBinding.getBindings() || []).map(function (oBinding) {
633
+ return oBinding.sPath;
634
+ }) : [oFieldBinding.getPath()]; // Stores status for all properties
674
635
 
675
- aFieldPaths.forEach(function (sFieldPath) {
676
- var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
636
+ aFieldPaths.forEach(function (sFieldPath) {
637
+ var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
677
638
 
678
- if (sId) {
679
- _this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
680
- }
681
- });
682
- }
639
+ if (sId) {
640
+ _this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
641
+ }
642
+ });
683
643
  }
684
- /**
685
- * Retrieves the property binding to the value of the field.
686
- *
687
- * @param oField Field
688
- * @returns {Binding} Binding to the value
689
- */
690
-
691
- }, {
692
- key: "_getBindingForField",
693
- value: function _getBindingForField(oField) {
694
- var sBindingName = "value";
695
-
696
- if (oField.isA("sap.m.CheckBox")) {
697
- sBindingName = "selected";
698
- } else if (oField.isA("sap.ui.unified.FileUploader")) {
699
- sBindingName = "uploadUrl";
700
- }
701
-
702
- return oField.getBinding(sBindingName);
644
+ }
645
+ /**
646
+ * Retrieves the property binding to the value of the field.
647
+ *
648
+ * @param oField Field
649
+ * @returns {Binding} Binding to the value
650
+ */
651
+ ;
652
+
653
+ _proto._getBindingForField = function _getBindingForField(oField) {
654
+ var sBindingName = "value";
655
+
656
+ if (oField.isA("sap.m.CheckBox")) {
657
+ sBindingName = "selected";
658
+ } else if (oField.isA("sap.ui.unified.FileUploader")) {
659
+ sBindingName = "uploadUrl";
703
660
  }
704
- }]);
661
+
662
+ return oField.getBinding(sBindingName);
663
+ };
705
664
 
706
665
  return SideEffectsControllerExtension;
707
666
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_getContextForSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_getContextForSideEffects"), _class2.prototype)), _class2)) || _class);
708
667
  return SideEffectsControllerExtension;
709
668
  }, false);
710
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhciIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsIm9TaWRlRWZmZWN0cyIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFUYXJnZXRzIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwic1RyaWdnZXJBY3Rpb24iLCJUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsIm9Db250cm9sIiwic0NvbnRyb2xJZCIsImlzQSIsImdldElkIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiYklzTm90QWxyZWFkeUxpc3RlZCIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib0ZpZWxkIiwic0ZpZWxkSGVscGVySWQiLCJnZXRGaWVsZEhlbHAiLCJvRmlsdGVySGVscCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwiX2dldEZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImltbWVkaWF0ZSIsInNWaWV3RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJtRmllbGRQYXRoIiwiZ2V0QWdncmVnYXRpb24iLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInNGaWVsZFBhdGgiLCJnZXRWYWx1ZSIsIm1Db250cm9sRW50aXR5VHlwZSIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsInNDb250cm9sTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJpbmNsdWRlcyIsIm1GaWVsZFNpZGVFZmZlY3RzTWFwIiwib0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJzQmluZGluZ05hbWUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb0RNQSw4QixXQURMQyxRQUFRLENBQUMsOENBQUQsRUFBaURDLDJCQUFqRCxDLFVBU1BDLFFBQVEsRTs7Ozs7Ozs7Ozs7OzthQUFULGtCQUNnQjtBQUNmLGFBQUtDLE1BQUwsR0FBZSxJQUFELENBQWNDLElBQWQsQ0FBbUJDLE9BQW5CLEVBQWQ7QUFDQSxhQUFLQyxjQUFMLEdBQXNCQyxXQUFXLENBQUNDLGVBQVosQ0FBNEIsS0FBS0wsTUFBakMsQ0FBdEI7QUFDQSxhQUFLTSxvQkFBTCxHQUE2QixLQUFLSCxjQUFOLENBQTZCSSxxQkFBN0IsRUFBNUI7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLHlCQUFMLEdBQWlDLElBQUlDLEdBQUosRUFBakM7QUFDQSxhQUFLQyxtQkFBTCxHQUEyQixFQUEzQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBRXFDO0FBQ3BDLGFBQUtGLHlCQUFMLENBQStCRyxLQUEvQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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RyxXQUFmO0FBQ0E7O0FBQ0QsZUFBT25GLE1BQU0sQ0FBQ1csVUFBUCxDQUFrQndFLFlBQWxCLENBQVA7QUFDQTs7OztJQTVuQjJDQyxtQiw2TkF3QjNDQyxNLEVBQ0FDLEssaUxBWUFELE0sRUFDQUMsSyw2S0FpQkFELE0sRUFDQUMsSyx3S0E2Q0FELE0sRUFDQUMsSyw0S0FrRkFELE0sRUFDQUMsSyw2S0FXQUQsTSxFQUNBQyxLLDBLQWNBRCxNLEVBQ0FDLEssMktBZ0NBRCxNLEVBQ0FDLEssOEtBa0JBQyxPLEVBQ0FELEssK0tBOEdBQyxPLEVBQ0FELEs7U0F3UWE3TCw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB7XG5cdFNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzVHlwZSxcblx0T0RhdGFTaWRlRWZmZWN0c1R5cGUsXG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IEZpZWxkUnVudGltZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIFByb3BlcnR5UGF0aCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcIi4uL0NvbW1vblV0aWxzXCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb1ZpZXc6IGFueTtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfbUZpZWxkR3JvdXBRdWV1ZSE6IEZpZWxkR3JvdXBRdWV1ZU1hcFR5cGU7XG5cdHByaXZhdGUgX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSE6IFNldDxzdHJpbmc+O1xuXHRwcml2YXRlIF9vU2lkZUVmZmVjdHNTZXJ2aWNlITogYW55O1xuXHRwcml2YXRlIF9tRmFpbGVkU2lkZUVmZmVjdHMhOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlID0ge307XG5cdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlID0gbmV3IFNldCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHJlY29yZGVkIHZhbGlkYXRpb24gc3RhdHVzIGZvciBhbGwgcHJvcGVydGllcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGNsZWFyUHJvcGVydGllc1N0YXR1c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGNsZWFyUHJvcGVydGllc1N0YXR1cygpOiB2b2lkIHtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGZhaWxlZCBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBSZWdpc3RlcmVkIFNpZGVFZmZlY3RzIHJlcXVlc3RzIHRoYXQgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZFxuXHQgKiAgLSBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCwgb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPGFueT4pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG1FdmVudEZpZWxkUHJvcGVydGllcyA9IHRoaXMuX2dldEZpZWxkUHJvcGVydGllcyhvRXZlbnQpLFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSB0aGlzLl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyhcblx0XHRcdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZVxuXHRcdFx0KTtcblxuXHRcdGxldCBiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5tYXAobVNpZGVFZmZlY3RzUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKG1TaWRlRWZmZWN0c1Byb3BlcnR5LnNpZGVFZmZlY3RzLCBtU2lkZUVmZmVjdHNQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9KSB8fCBbXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRpZiAoYklzSW1tZWRpYXRlVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZCBTaWRlRWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFNpZGVFZmZlY3RzIGhhdmUgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHByZVJlcXVpc2l0ZSB2YWxpZGF0aW9uIGZhaWxzIHNvIHdlIG5lZWRcblx0XHRcdFx0XHQgKiB0byBrZWVwIHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgYXMgRmFpbGVkIHJlcXVlc3QgKHRvIGJlIHJldHJpZ2dlciBvbiBuZXh0IGNoYW5nZSlcblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdC5maWx0ZXIobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+IG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5wcmV2aW91c2x5RmFpbGVkID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0LmZvckVhY2gobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10gPSBbXSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpO1xuXG5cdFx0Y29uc3QgZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlID0gZnVuY3Rpb24ob0RlZmVycmVkU2lkZUVmZmVjdDogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlKSB7XG5cdFx0XHRsZXQgYklzUmVxdWVzdHNUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0UHJvcGVydHkgPSBvRGVmZXJyZWRTaWRlRWZmZWN0LnNpZGVFZmZlY3RQcm9wZXJ0eTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0O1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGF0Ll9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoYXQuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKG9EZWZlcnJlZFNpZGVFZmZlY3QucHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vRGVmZXJyZWQgU2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgaWYgYWxsIHNvdXJjZVByb3BlcnRpZXMgaGF2ZSBubyByZWdpc3RlcmVkIGZhaWx1cmUuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUgJiZcblx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW10pLmV2ZXJ5KHNvdXJjZVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHNvdXJjZVByb3BlcnR5LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzSWQgPSB0aGF0Ll9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzb3VyY2VQcm9wZXJ0eS52YWx1ZSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzSWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAhdGhhdC5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlLmhhcyhzSWQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cywgb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdGlmIChiSXNSZXF1ZXN0c1RyaWdnZXJlZCkge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgXCIgKyBzQ29udGV4dFBhdGgsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoYXQuX21GaWVsZEdyb3VwUXVldWVbb1NpZGVFZmZlY3RQcm9wZXJ0eS5uYW1lXVtzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdFx0ICpcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc1NpZGVFZmZlY3ROYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMgPSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlPy5bc1NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdGlmIChtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKS5mb3JFYWNoKHNDb250ZXh0UGF0aCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RlZmVycmVkU2lkZUVmZmVjdCA9IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdGlmICghb0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCkge1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5wdXNoKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5tYXAob0RlZmVycmVkU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2Uob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBhZGRDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgU2lkZUVmZmVjdHMgY29udHJvbCB3aWxsIGJlIHJlZ2lzdGVyZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byByZWdpc3Rlci4gRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3RzOiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGUsIG9TaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgcXVldWUgY29udGFpbmluZyB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHNcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVGYWlsZWRTaWRlRWZmZWN0cygpOiB2b2lkIHtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBmUmVzb2x2ZXI6IGFueSwgZlJlamVjdG9yOiBhbnk7XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYVRhcmdldHM6IGFueVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSksXG5cdFx0XHRzVHJpZ2dlckFjdGlvbjogU3RyaW5nIHwgdW5kZWZpbmVkID0gKG9TaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkuVHJpZ2dlckFjdGlvbjtcblxuXHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpXG5cdFx0XHQudGhlbigoKSA9PiBmUmVzb2x2ZXIoKSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLCBvQ29udGV4dCk7XG5cdFx0XHRcdGZSZWplY3RvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMob0NvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRjb25zdCBzQ29udHJvbElkID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIikgJiYgb0NvbnRyb2wuZ2V0SWQoKTtcblxuXHRcdGlmIChzQ29udHJvbElkKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLnJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhzQ29udHJvbElkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0c1xuXHQgKiBUaGUgU2lkZUVmZmVjdHMgd2lsbCBiZSByZXRyaWdnZXJlZCBvbiB0aGUgbmV4dCBjaGFuZ2Ugb24gdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9hZGRGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRoYXQgbmVlZCB0byBiZSByZXRyaWdnZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gfHwgW107XG5cdFx0Y29uc3QgYklzTm90QWxyZWFkeUxpc3RlZCA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzID0+IG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXHRcdGlmIChiSXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXS5wdXNoKG9TaWRlRWZmZWN0cyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGdyb3VwIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgU2lkZUVmZmVjdHMuXG5cdCAqIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGFuZCBvbmx5IHRoZSBmaWVsZCByZXF1aXJlcyB0aGUgU2lkZUVmZmVjdHMgb24gdGhpcyBjb250ZXh0LCB0aGUgU2lkZUVmZmVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGVcblx0ICogU2lkZUVmZmVjdHMgcXVldWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdGxldCBiUHJvbWlzZVN1Y2Nlc3MgPSB0cnVlO1xuXHRcdHJldHVybiBtRXZlbnRGaWVsZFByb3BlcnRpZXMucHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBiUHJvbWlzZVN1Y2Nlc3M7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJZiB0aGUgZmllbGQgZ2V0cyBhIEZpZWxkSGVscGVyLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIGZpZWxkcyBjaGFuZ2VkIGJ5IHRoaXMgRmllbGRIZWxwZXIgaGF2ZSBiZWVuIHNldC5cblx0XHRcdCAqIFRvIGFjaGlldmUgdGhpcywgd2UgZW5zdXJlIHRoYXQgYWxsIHJlbGF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIHJlc29sdmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBGaWVsZCBFdmVudCBQcm9taXNlLCBzbyBmb3IgZmFzdCB1c2VyIGFjdGlvbnMgKGxpa2UgYXV0b21hdGlvbikgaXQgY2FuIGxvY2sgdGhlIG1vZGVsXG5cdFx0XHQgKiBhbmQgbm8gcmVxdWVzdCBjYW4gYmUgZXhlY3V0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IG9GaWVsZCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZDtcblx0XHRcdGNvbnN0IHNGaWVsZEhlbHBlcklkID0gb0ZpZWxkLmdldEZpZWxkSGVscCAmJiBvRmllbGQuZ2V0RmllbGRIZWxwKCk7XG5cdFx0XHRpZiAoc0ZpZWxkSGVscGVySWQpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckhlbHA6IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzRmllbGRIZWxwZXJJZCk7XG5cdFx0XHRcdGlmIChvRmlsdGVySGVscCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcChvT3V0UGFyYW1ldGVyID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvT3V0UGFyYW1ldGVyLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gb0JpbmRpbmcucmVxdWVzdFZhbHVlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtdKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVTdGF0dXNJbmRleFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZTogRW50aXR5VHlwZSwgc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQgfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dD8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1Qcm9wZXJ0eSA9IG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChtUHJvcGVydHkpIHtcblx0XHRcdGlmIChtUHJvcGVydHkgJiYgbVByb3BlcnR5Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdFx0cmV0dXJuIFttUHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBzQ29udGV4dFBhdGhdLmpvaW4oXCJfX1wiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IG9uIHdoaWNoIFNpZGVFZmZlY3RzIGNhbiBiZSByZXF1ZXN0ZWQuXG5cdCAqIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTaWRlRWZmZWN0RW50aXR5VHlwZSBUYXJnZXQgZW50aXR5IHR5cGUgb2YgdGhlIFNpZGVFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gU0FQVUk1IENvbnRleHRcblx0ICovXG5cdEBQcml2YXRlXG5cdEBGaW5hbFxuXHRwcml2YXRlIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob1NvdXJjZUZpZWxkOiBGaWVsZENvbnRyb2wsIHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQmluZGluZ0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHRGb3JTaWRlRWZmZWN0cyB8fCB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBlbnRpdHkgdHlwZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GUU4oc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0Z1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbUVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvbWlzZSBvZiB0aGUgZmllbGQgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9taXNlKG9FdmVudDogVUk1RXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0aWYgKCFGaWVsZFJ1bnRpbWUuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCkuc3RhdGUudmFsaWRpdHkpIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBmaWVsZCB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEZpZWxkIHByb3BlcnRpZXMgKGV2ZW50IGNoYW5nZSBwcm9taXNlLCBmaWVsZCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byB0aGlzIGZpZWxkKVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudDogVUk1RXZlbnQpOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlIHtcblx0XHRjb25zdCBvRmllbGQ6IEZpZWxkQ29udHJvbCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVNldHMuZmluZChvRW50aXR5U2V0ID0+IHtcblx0XHRcdFx0cmV0dXJuIG9FbnRpdHlTZXQubmFtZSA9PT0gc1ZpZXdFbnRpdHlTZXRTZXROYW1lO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID1cblx0XHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGUgK1xuXHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1wiICtcblx0XHRcdFx0XHQoYVNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBcIiNcIiArIGFTaWRlRWZmZWN0UGFydHNbMV0gOiBcIlwiKSxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bXG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzVmlld0VudGl0eVR5cGUpO1xuXG5cdFx0XHRpZiAobUZpZWxkUGF0aCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzRmllbGRQYXRoID0gbUZpZWxkUGF0aC5nZXRWYWx1ZSgpLnJlcGxhY2UoXCIvXCIgKyBzVmlld0VudGl0eVNldFNldE5hbWUgKyBcIi9cIiwgXCJcIiksXG5cdFx0XHRcdFx0bUNvbnRyb2xFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRzVmlld0VudGl0eVR5cGVcblx0XHRcdFx0XHQpIGFzIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250cm9sRW50aXR5VHlwZSkuZm9yRWFjaChzQ29udHJvbE5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmICgob0NvbnRyb2xTaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhzRmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc05hbWUgPSBzQ29udHJvbE5hbWUgKyBcIjo6XCIgKyBzVmlld0VudGl0eVR5cGU7XG5cdFx0XHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb0NvbnRleHRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIExpc3Q6IGdldHMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzXG5cdCAqIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgZXZlbnQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9ICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaChzU2lkZUVmZmVjdE5hbWUgPT4ge1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gbUZpZWxkU2lkZUVmZmVjdHNNYXBbc1NpZGVFZmZlY3ROYW1lXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RDb250ZXh0UGF0aCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgZm9yIHRoaXMgY29udGV4dFxuXHRcdFx0aWYgKGFGYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cy5mb3JFYWNoKG1GYWlsZWRTaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXVttRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzbHlGYWlsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogbUZhaWxlZFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9TaWRlRWZmZWN0UHJvcGVydHkuaW1tZWRpYXRlKSB7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdGlmICghbUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXT8uW29TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gfHwge307XG5cdFx0XHRcdGNvbnN0IG1TaWRlRWZmZWN0Q29udGV4dFBhdGggPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gfHwge1xuXHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IG9TaWRlRWZmZWN0UHJvcGVydHksXG5cdFx0XHRcdFx0cHJvY2Vzc1N0YXJ0ZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMgPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzLmNvbmNhdChbXG5cdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAsXG5cdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IHNCaW5kaW5nTmFtZSA9IFwidmFsdWVcIjtcblx0XHRpZiAob0ZpZWxkLmlzQShcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBKFwic2FwLnVpLnVuaWZpZWQuRmlsZVVwbG9hZGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
669
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJjbGVhciIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwib0V2ZW50Iiwib0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJtRXZlbnRGaWVsZFByb3BlcnRpZXMiLCJfZ2V0RmllbGRQcm9wZXJ0aWVzIiwiYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcyIsIl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyIsImJJc0ltbWVkaWF0ZVRyaWdnZXJlZCIsIl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm1TaWRlRWZmZWN0c1Byb3BlcnR5IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImZpbHRlciIsIm1JbW1lZGlhdGVTaWRlRWZmZWN0cyIsInByZXZpb3VzbHlGYWlsZWQiLCJmb3JFYWNoIiwiX2FkZEZhaWxlZFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsIm9TaWRlRWZmZWN0cyIsInJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYVRhcmdldHMiLCJUYXJnZXRFbnRpdGllcyIsImNvbmNhdCIsIlRhcmdldFByb3BlcnRpZXMiLCJzVHJpZ2dlckFjdGlvbiIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwib0NvbnRyb2wiLCJzQ29udHJvbElkIiwiaXNBIiwiZ2V0SWQiLCJiSXNOb3RBbHJlYWR5TGlzdGVkIiwibUZhaWxlZFNpZGVFZmZlY3RzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UiLCJiUHJvbWlzZVN1Y2Nlc3MiLCJwcm9taXNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWVsZCIsIm9GaWVsZCIsInNGaWVsZEhlbHBlcklkIiwiZ2V0RmllbGRIZWxwIiwib0ZpbHRlckhlbHAiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJieUlkIiwiZ2V0T3V0UGFyYW1ldGVycyIsIm9PdXRQYXJhbWV0ZXIiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJyZXF1ZXN0VmFsdWUiLCJzUHJvcGVydHlQYXRoIiwibVByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImpvaW4iLCJ1bmRlZmluZWQiLCJfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwib1NvdXJjZUZpZWxkIiwic1NpZGVFZmZlY3RFbnRpdHlUeXBlIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ29udGV4dEZvclNpZGVFZmZlY3RzIiwiZ2V0Q29udGV4dCIsInNGdWxseVF1YWxpZmllZE5hbWUiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZpbmQiLCJvRW50aXR5VHlwZSIsIl9nZXRGaWVsZFByb21pc2UiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwic2lkZUVmZmVjdHNNYXAiLCJfZ2V0RmllbGRTaWRlRWZmZWN0c01hcCIsIm1TaWRlRWZmZWN0c01hcCIsImdldEZpZWxkR3JvdXBJZHMiLCJzVmlld0VudGl0eVNldFNldE5hbWUiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsIm9WaWV3RW50aXR5U2V0IiwiZW50aXR5U2V0cyIsIm9FbnRpdHlTZXQiLCJiSXNJbW1lZGlhdGUiLCJpbmRleE9mIiwic05hbWUiLCJhU2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzU2lkZUVmZmVjdFBhdGgiLCJsZW5ndGgiLCJvU2lkZUVmZmVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJpbW1lZGlhdGUiLCJzVmlld0VudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwibUZpZWxkUGF0aCIsImdldEFnZ3JlZ2F0aW9uIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJzRmllbGRQYXRoIiwiZ2V0VmFsdWUiLCJtQ29udHJvbEVudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJzQ29udHJvbE5hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwiaW5jbHVkZXMiLCJtRmllbGRTaWRlRWZmZWN0c01hcCIsIm9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwIiwibUZhaWxlZFNpZGVFZmZlY3RzTmFtZSIsInNTaWRlRWZmZWN0Q29udGV4dFBhdGgiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJtU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYlN1Y2Nlc3MiLCJvRmllbGRCaW5kaW5nIiwiX2dldEJpbmRpbmdGb3JGaWVsZCIsImFGaWVsZFBhdGhzIiwiZ2V0QmluZGluZ3MiLCJzUGF0aCIsInNCaW5kaW5nTmFtZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXFETUEsOEIsV0FETEMsUUFBUSxDQUFDLDhDQUFELEVBQWlEQywyQkFBakQsQyxVQVNQQyxRQUFRLEU7Ozs7Ozs7OztXQUNGQyxNLEdBRFAsa0JBQ2dCO0FBQ2YsV0FBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLFdBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLFdBQUtNLG9CQUFMLEdBQTZCLEtBQUtILGNBQU4sQ0FBNkJJLHFCQUE3QixFQUE1QjtBQUNBLFdBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsV0FBS0MseUJBQUwsR0FBaUMsSUFBSUMsR0FBSixFQUFqQztBQUNBLFdBQUtDLG1CQUFMLEdBQTJCLEVBQTNC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Q0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNTd0gsbUIsR0FBUiw2QkFBNEI5RSxNQUE1QixFQUEyRDtBQUMxRCxVQUFJa0YsWUFBWSxHQUFHLE9BQW5COztBQUNBLFVBQUlsRixNQUFNLENBQUNWLEdBQVAsQ0FBVyxnQkFBWCxDQUFKLEVBQWtDO0FBQ2pDNEYsUUFBQUEsWUFBWSxHQUFHLFVBQWY7QUFDQSxPQUZELE1BRU8sSUFBSWxGLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXLDZCQUFYLENBQUosRUFBK0M7QUFDckQ0RixRQUFBQSxZQUFZLEdBQUcsV0FBZjtBQUNBOztBQUNELGFBQU9sRixNQUFNLENBQUNXLFVBQVAsQ0FBa0J1RSxZQUFsQixDQUFQO0FBQ0EsSzs7O0lBNW5CMkNDLG1CLDZOQXdCM0NDLE0sRUFDQUMsSyxpTEFZQUQsTSxFQUNBQyxLLDZLQWlCQUQsTSxFQUNBQyxLLHdLQTZDQUQsTSxFQUNBQyxLLDRLQWtGQUQsTSxFQUNBQyxLLDZLQVdBRCxNLEVBQ0FDLEssMEtBY0FELE0sRUFDQUMsSywyS0FnQ0FELE0sRUFDQUMsSyw4S0FrQkFDLE8sRUFDQUQsSywrS0E4R0FDLE8sRUFDQUQsSztTQXdRYW5NLDhCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljLCBGaW5hbCwgUHJpdmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHtcblx0U2lkZUVmZmVjdHNUeXBlLFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgRmllbGRSdW50aW1lIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGRcIjtcbmltcG9ydCB7IENvbnZlcnRlck91dHB1dCwgUHJvcGVydHlQYXRoLCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcblxudHlwZSBGaWVsZENvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRGaWVsZEhlbHAoKTogc3RyaW5nO1xuXHRnZXRGaWVsZEdyb3VwSWRzKCk6IHN0cmluZ1tdO1xufTtcblxudHlwZSBGaWVsZEV2ZW50UHJvcGVydHlUeXBlID0ge1xuXHRwcm9taXNlOiBQcm9taXNlPGFueT47XG5cdGZpZWxkOiBGaWVsZENvbnRyb2w7XG5cdHNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0aW1tZWRpYXRlPzogYm9vbGVhbjtcblx0Y29udGV4dDogQ29udGV4dDtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0cHJldmlvdXNseUZhaWxlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG50eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXHRzaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblx0cHJvY2Vzc1N0YXJ0ZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZEdyb3VwUXVldWVNYXBUeXBlID0ge1xuXHRbc2lkZUVmZmVjdE5hbWU6IHN0cmluZ106IHtcblx0XHRbY29udGV4dFBhdGg6IHN0cmluZ106IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZTtcblx0fTtcbn07XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlNpZGVFZmZlY3RzXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9tRmllbGRHcm91cFF1ZXVlITogRmllbGRHcm91cFF1ZXVlTWFwVHlwZTtcblx0cHJpdmF0ZSBfYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlITogU2V0PHN0cmluZz47XG5cdHByaXZhdGUgX29TaWRlRWZmZWN0c1NlcnZpY2UhOiBhbnk7XG5cdHByaXZhdGUgX21GYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWUgPSB7fTtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cygpOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0cmV0dXJuIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkXG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaGFuZGxlRmllbGRDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Qocylcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IEV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcChtU2lkZUVmZmVjdHNQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMobVNpZGVFZmZlY3RzUHJvcGVydHkuc2lkZUVmZmVjdHMsIG1TaWRlRWZmZWN0c1Byb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH0pIHx8IFtdXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcihtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMobUltbWVkaWF0ZVNpZGVFZmZlY3RzLnNpZGVFZmZlY3RzLCBtSW1tZWRpYXRlU2lkZUVmZmVjdHMuY29udGV4dClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSA9IFtdLFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIik7XG5cblx0XHRjb25zdCBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2UgPSBmdW5jdGlvbihvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoc291cmNlUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0aWYgKGJJc1JlcXVlc3RzVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCBcIiArIHNDb250ZXh0UGF0aCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0XHQgKlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzU2lkZUVmZmVjdE5hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKTtcblx0XHRcdGNvbnN0IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyA9IHRoYXQuX21GaWVsZEdyb3VwUXVldWU/LltzU2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0aWYgKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpLmZvckVhY2goc0NvbnRleHRQYXRoID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcChvRGVmZXJyZWRTaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzKCk6IHZvaWQge1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGZSZXNvbHZlcjogYW55LCBmUmVqZWN0b3I6IGFueTtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KTtcblx0XHRjb25zdCBhVGFyZ2V0czogYW55W10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKSxcblx0XHRcdHNUcmlnZ2VyQWN0aW9uOiBTdHJpbmcgfCB1bmRlZmluZWQgPSAob1NpZGVFZmZlY3RzIGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXG5cdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9Db250ZXh0KTtcblx0XHR9XG5cblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlXG5cdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dClcblx0XHRcdC50aGVuKCgpID0+IGZSZXNvbHZlcigpKVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMsIG9Db250ZXh0KTtcblx0XHRcdFx0ZlJlamVjdG9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIFNpZGVFZmZlY3RzIGNyZWF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbCBTQVBVSTUgQ29udHJvbFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhvQ29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250cm9sSWQgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKSAmJiBvQ29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKHNDb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UucmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyB3aWxsIGJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IGNoYW5nZSBvbiB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0cHJpdmF0ZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsIG9Db250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHMgPT4gb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSAhPT0gbUZhaWxlZFNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdCk7XG5cdFx0aWYgKGJJc05vdEFscmVhZHlMaXN0ZWQpIHtcblx0XHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLnB1c2gob1NpZGVFZmZlY3RzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZ3JvdXAgdGhhdCBpcyByZXF1aXJlZCBiZWZvcmUgcmVxdWVzdGluZyBTaWRlRWZmZWN0cy5cblx0ICogSWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgYW5kIG9ubHkgdGhlIGZpZWxkIHJlcXVpcmVzIHRoZSBTaWRlRWZmZWN0cyBvbiB0aGlzIGNvbnRleHQsIHRoZSBTaWRlRWZmZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZVxuXHQgKiBTaWRlRWZmZWN0cyBxdWV1ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgcHJvcGVydGllc1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHRvIGJlIHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXG5cdFx0bGV0IGJQcm9taXNlU3VjY2VzcyA9IHRydWU7XG5cdFx0cmV0dXJuIG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGJQcm9taXNlU3VjY2VzcyA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gYlByb21pc2VTdWNjZXNzO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIE5lZWQgdG8gc3RvcmUgdGhlIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhpcyBmaWVsZCBmb3IgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogc2luY2UgYWxsIFNvdXJjZVByb3BlcnRpZXMgZm9yIHRoaXMga2luZCBvZiBTaWRlRWZmZWN0cyBtdXN0IGJlIHZhbGlkXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGF0Ll9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZCwgYlByb21pc2VTdWNjZXNzKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgaW1tZWRpYXRlIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2U7XG5cdFx0cmV0dXJuIG9Qcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIElmIHRoZSBmaWVsZCBnZXRzIGEgRmllbGRIZWxwZXIsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhbGwgZmllbGRzIGNoYW5nZWQgYnkgdGhpcyBGaWVsZEhlbHBlciBoYXZlIGJlZW4gc2V0LlxuXHRcdFx0ICogVG8gYWNoaWV2ZSB0aGlzLCB3ZSBlbnN1cmUgdGhhdCBhbGwgcmVsYXRlZCBiaW5kaW5ncyBoYXZlIGJlZW4gcmVzb2x2ZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyByZXNvbHV0aW9uIHByb2Nlc3MgaXMgbm90IG1hbmFnZWQgYnkgdGhlIEZpZWxkIEV2ZW50IFByb21pc2UsIHNvIGZvciBmYXN0IHVzZXIgYWN0aW9ucyAobGlrZSBhdXRvbWF0aW9uKSBpdCBjYW4gbG9jayB0aGUgbW9kZWxcblx0XHRcdCAqIGFuZCBubyByZXF1ZXN0IGNhbiBiZSBleGVjdXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgb0ZpZWxkID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLmZpZWxkO1xuXHRcdFx0Y29uc3Qgc0ZpZWxkSGVscGVySWQgPSBvRmllbGQuZ2V0RmllbGRIZWxwICYmIG9GaWVsZC5nZXRGaWVsZEhlbHAoKTtcblx0XHRcdGlmIChzRmllbGRIZWxwZXJJZCkge1xuXHRcdFx0XHRjb25zdCBvRmlsdGVySGVscDogYW55ID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNGaWVsZEhlbHBlcklkKTtcblx0XHRcdFx0aWYgKG9GaWx0ZXJIZWxwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0KG9GaWx0ZXJIZWxwLmdldE91dFBhcmFtZXRlcnMoKSBhcyBhbnlbXSkubWFwKG9PdXRQYXJhbWV0ZXIgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvU291cmNlRmllbGQ6IEZpZWxkQ29udHJvbCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvU291cmNlRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRsZXQgb0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblxuXHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSAob0NvbnRleHRGb3JTaWRlRWZmZWN0cyBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQ29udGV4dEZvclNpZGVFZmZlY3RzIHx8IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0Z1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZRTihzRnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9ICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlck91dHB1dCkuZW50aXR5VHlwZXMuZmluZChvRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRyZXR1cm4gb0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lID09PSBzRnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdH0pO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBGaWVsZCBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb21pc2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRpZiAoIUZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIEZpZWxkQ29udHJvbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVNldHMuZmluZChvRW50aXR5U2V0ID0+IHtcblx0XHRcdFx0cmV0dXJuIG9FbnRpdHlTZXQubmFtZSA9PT0gc1ZpZXdFbnRpdHlTZXRTZXROYW1lO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID1cblx0XHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGUgK1xuXHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1wiICtcblx0XHRcdFx0XHQoYVNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBcIiNcIiArIGFTaWRlRWZmZWN0UGFydHNbMV0gOiBcIlwiKSxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bXG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzVmlld0VudGl0eVR5cGUpO1xuXG5cdFx0XHRpZiAobUZpZWxkUGF0aCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzRmllbGRQYXRoID0gbUZpZWxkUGF0aC5nZXRWYWx1ZSgpLnJlcGxhY2UoXCIvXCIgKyBzVmlld0VudGl0eVNldFNldE5hbWUgKyBcIi9cIiwgXCJcIiksXG5cdFx0XHRcdFx0bUNvbnRyb2xFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRzVmlld0VudGl0eVR5cGVcblx0XHRcdFx0XHQpIGFzIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250cm9sRW50aXR5VHlwZSkuZm9yRWFjaChzQ29udHJvbE5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmICgob0NvbnRyb2xTaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhzRmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc05hbWUgPSBzQ29udHJvbE5hbWUgKyBcIjo6XCIgKyBzVmlld0VudGl0eVR5cGU7XG5cdFx0XHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb0NvbnRleHRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIExpc3Q6IGdldHMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzXG5cdCAqIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgZXZlbnQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9ICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaChzU2lkZUVmZmVjdE5hbWUgPT4ge1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gbUZpZWxkU2lkZUVmZmVjdHNNYXBbc1NpZGVFZmZlY3ROYW1lXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RDb250ZXh0UGF0aCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgZm9yIHRoaXMgY29udGV4dFxuXHRcdFx0aWYgKGFGYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cy5mb3JFYWNoKG1GYWlsZWRTaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXVttRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzbHlGYWlsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogbUZhaWxlZFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9TaWRlRWZmZWN0UHJvcGVydHkuaW1tZWRpYXRlKSB7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdGlmICghbUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXT8uW29TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gfHwge307XG5cdFx0XHRcdGNvbnN0IG1TaWRlRWZmZWN0Q29udGV4dFBhdGggPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gfHwge1xuXHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IG9TaWRlRWZmZWN0UHJvcGVydHksXG5cdFx0XHRcdFx0cHJvY2Vzc1N0YXJ0ZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMgPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzLmNvbmNhdChbXG5cdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAsXG5cdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IHNCaW5kaW5nTmFtZSA9IFwidmFsdWVcIjtcblx0XHRpZiAob0ZpZWxkLmlzQShcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBKFwic2FwLnVpLnVuaWZpZWQuRmlsZVVwbG9hZGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=