@sapui5/sap.fe.core 1.97.0 → 1.99.1

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 (249) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +6 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2379
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -807
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1579
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +560 -581
  27. package/src/sap/fe/core/actions/draft.ts +594 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -511
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1211
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +22 -8
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  108. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  113. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  114. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  118. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  120. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  121. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  122. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  123. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  124. package/src/sap/fe/core/fpm/Component.js +3 -2
  125. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  126. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  127. package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
  128. package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
  129. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  130. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  131. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  132. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  133. package/src/sap/fe/core/helpers/EditState.js +81 -84
  134. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  135. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  136. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  137. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  138. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  139. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  140. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  141. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  142. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  143. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  144. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  145. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  146. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  147. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  148. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  149. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  150. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  151. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  152. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  153. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  154. package/src/sap/fe/core/library.js +30 -3
  155. package/src/sap/fe/core/library.support.js +12 -5
  156. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  157. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  158. package/src/sap/fe/core/messagebundle.properties +61 -13
  159. package/src/sap/fe/core/messagebundle_ar.properties +33 -2
  160. package/src/sap/fe/core/messagebundle_bg.properties +33 -2
  161. package/src/sap/fe/core/messagebundle_ca.properties +33 -2
  162. package/src/sap/fe/core/messagebundle_cs.properties +34 -3
  163. package/src/sap/fe/core/messagebundle_cy.properties +33 -2
  164. package/src/sap/fe/core/messagebundle_da.properties +33 -2
  165. package/src/sap/fe/core/messagebundle_de.properties +33 -2
  166. package/src/sap/fe/core/messagebundle_el.properties +33 -2
  167. package/src/sap/fe/core/messagebundle_en.properties +32 -1
  168. package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
  169. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
  170. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
  171. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
  172. package/src/sap/fe/core/messagebundle_es.properties +33 -2
  173. package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
  174. package/src/sap/fe/core/messagebundle_et.properties +33 -2
  175. package/src/sap/fe/core/messagebundle_fi.properties +34 -3
  176. package/src/sap/fe/core/messagebundle_fr.properties +38 -7
  177. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
  178. package/src/sap/fe/core/messagebundle_hi.properties +33 -2
  179. package/src/sap/fe/core/messagebundle_hr.properties +33 -2
  180. package/src/sap/fe/core/messagebundle_hu.properties +34 -3
  181. package/src/sap/fe/core/messagebundle_id.properties +36 -5
  182. package/src/sap/fe/core/messagebundle_it.properties +33 -2
  183. package/src/sap/fe/core/messagebundle_iw.properties +33 -2
  184. package/src/sap/fe/core/messagebundle_ja.properties +33 -2
  185. package/src/sap/fe/core/messagebundle_kk.properties +33 -2
  186. package/src/sap/fe/core/messagebundle_ko.properties +33 -2
  187. package/src/sap/fe/core/messagebundle_lt.properties +33 -2
  188. package/src/sap/fe/core/messagebundle_lv.properties +33 -2
  189. package/src/sap/fe/core/messagebundle_ms.properties +33 -2
  190. package/src/sap/fe/core/messagebundle_nl.properties +33 -2
  191. package/src/sap/fe/core/messagebundle_no.properties +33 -2
  192. package/src/sap/fe/core/messagebundle_pl.properties +33 -2
  193. package/src/sap/fe/core/messagebundle_pt.properties +34 -3
  194. package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
  195. package/src/sap/fe/core/messagebundle_ro.properties +33 -2
  196. package/src/sap/fe/core/messagebundle_ru.properties +33 -2
  197. package/src/sap/fe/core/messagebundle_sh.properties +33 -2
  198. package/src/sap/fe/core/messagebundle_sk.properties +33 -2
  199. package/src/sap/fe/core/messagebundle_sl.properties +33 -2
  200. package/src/sap/fe/core/messagebundle_sv.properties +34 -3
  201. package/src/sap/fe/core/messagebundle_th.properties +33 -2
  202. package/src/sap/fe/core/messagebundle_tr.properties +33 -2
  203. package/src/sap/fe/core/messagebundle_uk.properties +33 -2
  204. package/src/sap/fe/core/messagebundle_vi.properties +33 -2
  205. package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
  206. package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
  207. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  208. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  209. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  210. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  211. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  212. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  213. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  214. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  215. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  216. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  217. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
  218. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  219. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  220. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  221. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
  222. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
  223. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  224. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  225. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  226. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  227. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  228. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  229. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  230. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  231. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  232. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  233. package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
  234. package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
  235. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  236. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  237. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  238. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  239. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  240. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  241. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  242. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  243. package/src/sap/fe/core/templating/UIFormatters.js +45 -110
  244. package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
  245. package/src/sap/fe/core/type/Email.js +1 -1
  246. package/src/sap/fe/core/type/Email.ts +4 -6
  247. package/ui5.yaml +0 -3
  248. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  249. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -0,0 +1,227 @@
1
+ /* This class contains helpers to be used at runtime to retrieve further information on the model */
2
+ import Context from "sap/ui/model/odata/v4/Context";
3
+ import BaseContext from "sap/ui/model/Context";
4
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
5
+
6
+ const ModelHelper = {
7
+ /**
8
+ * Method to determine if the programming model is sticky.
9
+ *
10
+ * @function
11
+ * @name isStickySessionSupported
12
+ * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
13
+ * @returns {boolean} Returns true if sticky, else false
14
+ */
15
+ isStickySessionSupported: function(oMetaModel: ODataMetaModel) {
16
+ const oEntityContainer = oMetaModel.getObject("/");
17
+ for (const sEntitySet in oEntityContainer) {
18
+ if (
19
+ oEntityContainer[sEntitySet].$kind === "EntitySet" &&
20
+ oMetaModel.getObject(`/${sEntitySet}@com.sap.vocabularies.Session.v1.StickySessionSupported`)
21
+ ) {
22
+ return true;
23
+ }
24
+ }
25
+ return false;
26
+ },
27
+
28
+ /**
29
+ * Method to determine if the programming model is draft.
30
+ *
31
+ * @function
32
+ * @name isDraftSupported
33
+ * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
34
+ * @param {string} sPath Path for which draft support shall be checked
35
+ * @returns {boolean} Returns true if draft, else false
36
+ */
37
+ isDraftSupported: function(oMetaModel: any, sPath: string) {
38
+ const oMetaContext = oMetaModel.getMetaContext(sPath);
39
+ let sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
40
+ oParentEntitySetContext,
41
+ aParts;
42
+
43
+ if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
44
+ aParts = oMetaModel
45
+ .getMetaPath(sPath)
46
+ .split("/")
47
+ .filter(Boolean);
48
+ if (aParts.length) {
49
+ for (let i = aParts.length - 1; i >= 0; i--) {
50
+ oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
51
+ if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
52
+ sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ } else {
58
+ sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
59
+ }
60
+ const oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
61
+ if (
62
+ oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") ||
63
+ oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")
64
+ ) {
65
+ return true;
66
+ }
67
+ return false;
68
+ },
69
+
70
+ /**
71
+ * Returns path to the target entity set via using navigation property binding.
72
+ *
73
+ * @function
74
+ * @name getTargetEntitySet
75
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
76
+ * @returns {string} Returns path to the target entity set
77
+ */
78
+ getTargetEntitySet: function(oContext: Context) {
79
+ const sPath = oContext.getPath();
80
+ if (
81
+ oContext.getObject("$kind") === "EntitySet" ||
82
+ oContext.getObject("$kind") === "Action" ||
83
+ oContext.getObject("0/$kind") === "Action"
84
+ ) {
85
+ return sPath;
86
+ }
87
+ const sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
88
+ return "/" + oContext.getObject(sEntitySetPath);
89
+ },
90
+
91
+ /**
92
+ * Returns complete path to the entity set via using navigation property binding.
93
+ *
94
+ * @function
95
+ * @name getEntitySetPath
96
+ * @param {string} sPath Path for which complete entitySet path needs to be determined
97
+ * @returns {string} Returns complete path to the entity set
98
+ */
99
+ getEntitySetPath: function(sPath: string) {
100
+ return (
101
+ "/" +
102
+ sPath
103
+ .split("/")
104
+ .filter(ModelHelper.filterOutNavPropBinding)
105
+ .join("/$NavigationPropertyBinding/")
106
+ );
107
+ },
108
+
109
+ /**
110
+ * Gets the path for the items property of MultiValueField parameters.
111
+ *
112
+ * @function
113
+ * @name getActionParameterItemsModelPath
114
+ * @param {object} oParameter Action Parameter
115
+ * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
116
+ */
117
+ getActionParameterItemsModelPath: function(oParameter: any) {
118
+ return oParameter && oParameter.$Name ? `{path: 'mvfview>/${oParameter.$Name}'}` : undefined;
119
+ },
120
+
121
+ filterOutNavPropBinding: function(sPathPart: any) {
122
+ return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
123
+ },
124
+
125
+ /**
126
+ * Adds a setProperty to the created binding contexts of the internal JSON model.
127
+ *
128
+ * @function
129
+ * @name enhanceInternalJSONModel
130
+ * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
131
+ */
132
+
133
+ enhanceInternalJSONModel: function(oInternalModel: any) {
134
+ const fnBindContext = oInternalModel.bindContext;
135
+ oInternalModel.bindContext = function(sPath: any, oContext: any, mParameters: any, ...args: any[]) {
136
+ oContext = fnBindContext.apply(this, [sPath, oContext, mParameters, ...args]);
137
+ const fnGetBoundContext = oContext.getBoundContext;
138
+
139
+ oContext.getBoundContext = function(...subArgs: any[]) {
140
+ const oBoundContext = fnGetBoundContext.apply(this, ...subArgs);
141
+ if (oBoundContext && !oBoundContext.setProperty) {
142
+ oBoundContext.setProperty = function(sSetPropPath: any, value: any) {
143
+ if (this.getObject() === undefined) {
144
+ // initialize
145
+ this.getModel().setProperty(this.getPath(), {});
146
+ }
147
+ this.getModel().setProperty(sSetPropPath, value, this);
148
+ };
149
+ }
150
+ return oBoundContext;
151
+ };
152
+ return oContext;
153
+ };
154
+ },
155
+
156
+ /**
157
+ * Returns whether filtering on the table is case sensitive.
158
+ *
159
+ * @param oMetaModel The instance of the meta model
160
+ * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
161
+ */
162
+ isFilteringCaseSensitive: function(oMetaModel: any) {
163
+ if (!oMetaModel) {
164
+ return undefined;
165
+ }
166
+ const aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
167
+ // Get filter functions defined at EntityContainer and check for existence of 'tolower'
168
+ return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
169
+ },
170
+
171
+ /**
172
+ * Get MetaPath for the context.
173
+ *
174
+ * @param {Context} oContext Context to be used
175
+ * @returns {string | undefined} Returns meta path for the context.
176
+ */
177
+ getMetaPathForContext: function(oContext: any) {
178
+ const oModel = oContext.getModel(),
179
+ oMetaModel = oModel.getMetaModel(),
180
+ sPath = oContext.getPath();
181
+ return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
182
+ },
183
+
184
+ /**
185
+ * Get MetaPath for the listbinding.
186
+ *
187
+ * @param {View} oView View of the control using listBinding
188
+ * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
189
+ * @returns {string | undefined} Returns meta path for the listbinding.
190
+ */
191
+ getAbsoluteMetaPathForListBinding: function(oView: any, vListBinding: any) {
192
+ const oMetaModel = oView.getModel().getMetaModel();
193
+ let sMetaPath;
194
+
195
+ if (typeof vListBinding === "string") {
196
+ if (vListBinding.startsWith("/")) {
197
+ // absolute path
198
+ sMetaPath = oMetaModel.getMetaPath(vListBinding);
199
+ } else {
200
+ // relative path
201
+ const oBindingContext = oView.getBindingContext();
202
+ const sRootContextPath = oBindingContext.getPath();
203
+ sMetaPath = oMetaModel.getMetaPath(`${sRootContextPath}/${vListBinding}`);
204
+ }
205
+ } else {
206
+ // we already get a list binding use this one
207
+ const oBinding = vListBinding;
208
+ const oRootBinding = oBinding.getRootBinding();
209
+ if (oBinding === oRootBinding) {
210
+ // absolute path
211
+ sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
212
+ } else {
213
+ // relative path
214
+ const sRootBindingPath = oRootBinding.getPath();
215
+ const sRelativePath = oBinding.getPath();
216
+ sMetaPath = oMetaModel.getMetaPath(`${sRootBindingPath}/${sRelativePath}`);
217
+ }
218
+ }
219
+ return sMetaPath;
220
+ }
221
+ };
222
+
223
+ export type InternalModelContext = BaseContext & {
224
+ setProperty(sPath: string, vValue: any): void;
225
+ };
226
+
227
+ export default ModelHelper;
@@ -1,135 +1,213 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
+ sap.ui.define(["sap/ui/core/util/PasteHelper", "sap/m/MessageBox", "sap/base/Log"], function (CorePasteHelper, MessageBox, Log) {
6
+ "use strict";
5
7
 
6
- sap.ui.define(["sap/ui/core/util/PasteHelper", "sap/m/MessageBox"], function(CorePasteHelper, MessageBox) {
7
- "use strict";
8
-
9
- var _createColumnInfoPerProperty = function(sPropertyPath, sRowBindingPath, oMetaContext, oMetaModel) {
10
- var oProperty = oMetaContext.getProperty(sPropertyPath),
11
- mFormatOptions = { parseKeepsEmptyString: true },
12
- oType = oMetaModel.getUI5Type(sRowBindingPath + "/" + sPropertyPath, mFormatOptions),
13
- bIgnore = !oProperty || oMetaContext.getProperty(sPropertyPath + "@Org.OData.Core.V1.Computed");
14
- return {
15
- property: sPropertyPath,
16
- ignore: bIgnore,
17
- type: oType
18
- };
19
- };
20
-
21
- var _getColumnInfoForPaste = function(oTable) {
22
- var oModel = oTable.getRowBinding().getModel(),
23
- oMetaModel = oModel.getMetaModel(),
24
- sRowBindingPath = oModel.resolve(oTable.getRowBinding().getPath(), oTable.getRowBinding().getContext()),
25
- oMetaContext = oMetaModel.getMetaContext(sRowBindingPath);
26
- return oTable
27
- .getControlDelegate()
28
- .fetchProperties(oTable)
29
- .then(function(aPropertyInfo) {
30
- var aColumnInfos = [];
31
- oTable.getColumns().forEach(function(oColumn) {
32
- var oInfoProperty = aPropertyInfo.find(function(property) {
33
- return property.name === oColumn.getDataProperty();
34
- });
35
- // Check if it's a complex property (property associated to multiple simple properties)
36
- if (oInfoProperty.propertyInfos) {
37
- oInfoProperty.propertyInfos.forEach(function(property) {
38
- // Get data from simple property
39
- var oDataProperty = aPropertyInfo.find(function(prop) {
40
- return prop.name === property;
41
- });
42
-
43
- // Check if there is a simple property associated to a Rating or Progress ComplexProperty --> ignore
44
- // Or check a navigation property within the current Complex property --> ignore
45
- // A fake property was created into the propertyInfos to include the Target Value
46
- // from the DataPoint (path includes the @com.sap.vocabularies.UI.v1.DataPoint annotation)
47
- if (
48
- (oDataProperty && oDataProperty.path.indexOf("@com.sap.vocabularies.UI.v1.DataPoint") > -1) ||
49
- property.indexOf("/") > -1
50
- ) {
51
- aColumnInfos.push({
52
- property: oDataProperty.path,
53
- ignore: true
54
- });
55
- } else {
56
- aColumnInfos.push(
57
- _createColumnInfoPerProperty(oDataProperty.path, sRowBindingPath, oMetaContext, oMetaModel)
58
- );
59
- }
60
- });
61
- } else if (oInfoProperty.path) {
62
- aColumnInfos.push(_createColumnInfoPerProperty(oInfoProperty.path, sRowBindingPath, oMetaContext, oMetaModel));
63
- } else {
64
- // Empty column --> ignore
65
- aColumnInfos.push({
66
- property: "unused",
67
- type: null,
68
- ignore: true
69
- });
70
- }
71
- });
72
- return aColumnInfos;
73
- });
74
- };
75
-
76
- var oPasteHelper = {
77
- /**
78
- *
79
- * @param aRawData
80
- * @param oTable
81
- * @returns {Promise<any>}
82
- */
83
- parseDataForTablePaste: function(aRawData, oTable) {
84
- return _getColumnInfoForPaste(oTable).then(function(oPasteInfos) {
85
- // Check if we have data for at least the first editable column
86
- var iPastedColumnCount = aRawData.length ? aRawData[0].length : 0;
87
- var iFirstEditableColumn = -1;
88
- for (var I = 0; I < oPasteInfos.length && iFirstEditableColumn < 0; I++) {
89
- if (!oPasteInfos[I].ignore) {
90
- iFirstEditableColumn = I;
91
- }
92
- }
93
- if (iFirstEditableColumn < 0 || iFirstEditableColumn > iPastedColumnCount - 1) {
94
- // We don't have data for an editable column --> return empty parsed data
95
- return Promise.resolve([]);
96
- } else {
97
- return CorePasteHelper.parse(aRawData, oPasteInfos).then(function(oParseResult) {
98
- if (oParseResult.errors) {
99
- var aErrorMessages = oParseResult.errors.map(function(oElement) {
100
- return oElement.message;
101
- });
102
-
103
- var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
104
- sPasteError,
105
- sErrorCorrection = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_MESSAGE"),
106
- sNote = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_NOTE");
107
-
108
- if (aErrorMessages.length > 1) {
109
- sPasteError = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_PLURAL", [
110
- aErrorMessages.length
111
- ]);
112
- } else {
113
- sPasteError = oResourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_SINGULAR");
114
- }
115
- aErrorMessages.unshift(""); // To show space between the short text and the list of errors
116
- aErrorMessages.unshift(sNote);
117
- aErrorMessages.unshift(sErrorCorrection);
118
- MessageBox.error(sPasteError, {
119
- icon: MessageBox.Icon.ERROR,
120
- title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR"),
121
- details: aErrorMessages.join("<br>")
122
- });
123
-
124
- return []; // Errors --> return nothing
125
- } else {
126
- return oParseResult.parsedData ? oParseResult.parsedData : [];
127
- }
128
- });
129
- }
130
- });
131
- }
132
- };
133
-
134
- return oPasteHelper;
135
- });
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
11
+
12
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+
14
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+
16
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
17
+
18
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
19
+
20
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
21
+
22
+ var getInfoForEntityProperty = function (propertyPath, rowBindingPath, metaContext, metaModel) {
23
+ var property = metaContext.getProperty(propertyPath),
24
+ formatOptions = {
25
+ parseKeepsEmptyString: true
26
+ },
27
+ type = metaModel.getUI5Type("".concat(rowBindingPath, "/").concat(propertyPath), formatOptions),
28
+ isIgnored = !property || metaContext.getProperty(propertyPath + "@Org.OData.Core.V1.Computed");
29
+ return {
30
+ property: propertyPath,
31
+ ignore: isIgnored,
32
+ type: type
33
+ };
34
+ };
35
+
36
+ var displayErrorMessages = function (errorMessages) {
37
+ var messageDetails = _toConsumableArray(errorMessages);
38
+
39
+ var resourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
40
+ errorCorrectionMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_MESSAGE"),
41
+ noteMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_CORRECTION_NOTE");
42
+ var pasteErrorMessage;
43
+
44
+ if (messageDetails.length > 1) {
45
+ pasteErrorMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_PLURAL", [messageDetails.length]);
46
+ } else {
47
+ pasteErrorMessage = resourceBundle.getText("C_PASTE_HELPER_SAPFE_PASTE_ERROR_MESSAGE_SINGULAR");
48
+ }
49
+
50
+ messageDetails.unshift(""); // To show space between the short text and the list of errors
51
+
52
+ messageDetails.unshift(noteMessage);
53
+ messageDetails.unshift(errorCorrectionMessage);
54
+ MessageBox.error(pasteErrorMessage, {
55
+ title: resourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR"),
56
+ details: messageDetails.join("<br>")
57
+ });
58
+ };
59
+
60
+ var PasteHelper = {
61
+ displayErrorMessages: displayErrorMessages,
62
+ formatCustomMessage: function (validationMessages, iRowNumber) {
63
+ var errorMessage = "";
64
+ var numberMessages = validationMessages.length;
65
+ var resourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
66
+ i18nRow = resourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW");
67
+
68
+ if (numberMessages > 0) {
69
+ errorMessage += "".concat(i18nRow, " ").concat(iRowNumber, ": ");
70
+ validationMessages.forEach(function (message, indexMessage) {
71
+ if (message.messageText) {
72
+ errorMessage += message.messageText + (indexMessage + 1 !== numberMessages ? " " : "");
73
+ }
74
+ });
75
+ }
76
+
77
+ return errorMessage;
78
+ },
79
+ getColumnInfo: function (table) {
80
+ var _this = this;
81
+
82
+ var model = table.getRowBinding().getModel(),
83
+ metaModel = model.getMetaModel(),
84
+ rowBindingPath = model.resolve(table.getRowBinding().getPath(), table.getRowBinding().getContext()),
85
+ metaContext = metaModel.getMetaContext(rowBindingPath);
86
+ return table.getControlDelegate().fetchProperties(table).then(function (propertyInfo) {
87
+ var PropertyInfoDict = Object.assign.apply(Object, [{}].concat(_toConsumableArray(propertyInfo.map(function (property) {
88
+ return _defineProperty({}, property.name, property);
89
+ }))));
90
+ var columnInfos = [];
91
+ table.getColumns().forEach(function (column) {
92
+ var infoProperty = PropertyInfoDict[column.getDataProperty()]; // Check if it's a complex property (property associated to multiple simple properties)
93
+
94
+ if (infoProperty.propertyInfos) {
95
+ // Get data from simple property
96
+ infoProperty.propertyInfos.forEach(function (property) {
97
+ var dataProperty = PropertyInfoDict[property]; // Check if there is a simple property associated to a Rating or Progress ComplexProperty --> ignore
98
+ // Or check a navigation property within the current Complex property --> ignore
99
+ // A fake property was created into the propertyInfos to include the Target Value
100
+ // from the DataPoint (path includes the @com.sap.vocabularies.UI.v1.DataPoint annotation)
101
+
102
+ if (dataProperty && dataProperty.path.indexOf("@com.sap.vocabularies.UI.v1.DataPoint") > -1 || property.indexOf("/") > -1) {
103
+ columnInfos.push({
104
+ property: dataProperty.path,
105
+ ignore: true
106
+ });
107
+ } else {
108
+ columnInfos.push(_this.getInfoForEntityProperty(dataProperty.path, rowBindingPath, metaContext, metaModel));
109
+ }
110
+ });
111
+ } else if (infoProperty.path) {
112
+ columnInfos.push(_this.getInfoForEntityProperty(infoProperty.path, rowBindingPath, metaContext, metaModel));
113
+ } else {
114
+ // Empty column --> ignore
115
+ columnInfos.push({
116
+ property: "unused",
117
+ type: null,
118
+ ignore: true
119
+ });
120
+ }
121
+ });
122
+ return columnInfos;
123
+ });
124
+ },
125
+ getInfoForEntityProperty: getInfoForEntityProperty,
126
+
127
+ /**
128
+ *
129
+ * @param rawData
130
+ * @param table
131
+ * @returns {Promise<any>}
132
+ */
133
+ parsePastedData: function (rawData, table) {
134
+ var _this2 = this;
135
+
136
+ return this.getColumnInfo(table).then(function (pasteInfos) {
137
+ // Check if we have data for at least the first editable column
138
+ var pastedColumnCount = rawData.length ? rawData[0].length : 0;
139
+ var firstEditableColumnIndex = -1;
140
+
141
+ for (var I = 0; I < pasteInfos.length && firstEditableColumnIndex < 0; I++) {
142
+ if (!pasteInfos[I].ignore) {
143
+ firstEditableColumnIndex = I;
144
+ }
145
+ }
146
+
147
+ return firstEditableColumnIndex < 0 || firstEditableColumnIndex > pastedColumnCount - 1 ? Promise.resolve({}) // We don't have data for an editable column --> return empty parsed data
148
+ : CorePasteHelper.parse(rawData, pasteInfos);
149
+ }).then(function (parseResult) {
150
+ if (parseResult.errors) {
151
+ var errorMessages = parseResult.errors.map(function (oElement) {
152
+ return oElement.message;
153
+ });
154
+
155
+ _this2.displayErrorMessages(errorMessages);
156
+
157
+ return []; // Errors --> return nothing
158
+ } else {
159
+ return parseResult.parsedData ? parseResult.parsedData : [];
160
+ }
161
+ });
162
+ },
163
+ pasteData: function (rawData, table, controller) {
164
+ var _this3 = this;
165
+
166
+ var oInternalEditFlow = controller._editFlow;
167
+ var tableDefinition = table.getParent().getTableDefinition();
168
+ var aData = [];
169
+ return this.parsePastedData(rawData, table).then(function (aParsedData) {
170
+ aData = aParsedData || [];
171
+ return Promise.all(aData.map(function (mData) {
172
+ var _tableDefinition$cont;
173
+
174
+ return oInternalEditFlow.getTransactionHelper().validateDocument(table.getBindingContext(), {
175
+ data: mData,
176
+ customValidationFunction: tableDefinition === null || tableDefinition === void 0 ? void 0 : (_tableDefinition$cont = tableDefinition.control) === null || _tableDefinition$cont === void 0 ? void 0 : _tableDefinition$cont.customValidationFunction
177
+ }, controller.getView());
178
+ }));
179
+ }).then(function (aValidationMessages) {
180
+ var aErrorMessages = aValidationMessages.reduce(function (aMessages, aCustomMessages, index) {
181
+ if (aCustomMessages.length > 0) {
182
+ aMessages.push({
183
+ messages: aCustomMessages,
184
+ row: index + 1
185
+ });
186
+ }
187
+
188
+ return aMessages;
189
+ }, []);
190
+
191
+ if (aErrorMessages.length > 0) {
192
+ var aRowMessages = aErrorMessages.map(function (mError) {
193
+ return _this3.formatCustomMessage(mError.messages, mError.row);
194
+ });
195
+
196
+ _this3.displayErrorMessages(aRowMessages);
197
+
198
+ return [];
199
+ }
200
+
201
+ return aData;
202
+ }).then(function (aValidatedData) {
203
+ var _tableDefinition$cont2;
204
+
205
+ return aValidatedData.length > 0 ? oInternalEditFlow.createMultipleDocuments(table.getRowBinding(), aValidatedData, tableDefinition === null || tableDefinition === void 0 ? void 0 : (_tableDefinition$cont2 = tableDefinition.control) === null || _tableDefinition$cont2 === void 0 ? void 0 : _tableDefinition$cont2.createAtEnd, true, controller.editFlow.onBeforeCreate) : undefined;
206
+ }).catch(function (oError) {
207
+ Log.error("Error while pasting data", oError);
208
+ });
209
+ }
210
+ };
211
+ return PasteHelper;
212
+ }, false);
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhc3RlSGVscGVyLnRzIl0sIm5hbWVzIjpbImdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eSIsInByb3BlcnR5UGF0aCIsInJvd0JpbmRpbmdQYXRoIiwibWV0YUNvbnRleHQiLCJtZXRhTW9kZWwiLCJwcm9wZXJ0eSIsImdldFByb3BlcnR5IiwiZm9ybWF0T3B0aW9ucyIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInR5cGUiLCJnZXRVSTVUeXBlIiwiaXNJZ25vcmVkIiwiaWdub3JlIiwiZGlzcGxheUVycm9yTWVzc2FnZXMiLCJlcnJvck1lc3NhZ2VzIiwibWVzc2FnZURldGFpbHMiLCJyZXNvdXJjZUJ1bmRsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImVycm9yQ29ycmVjdGlvbk1lc3NhZ2UiLCJnZXRUZXh0Iiwibm90ZU1lc3NhZ2UiLCJwYXN0ZUVycm9yTWVzc2FnZSIsImxlbmd0aCIsInVuc2hpZnQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJ0aXRsZSIsImRldGFpbHMiLCJqb2luIiwiUGFzdGVIZWxwZXIiLCJmb3JtYXRDdXN0b21NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwiaVJvd051bWJlciIsImVycm9yTWVzc2FnZSIsIm51bWJlck1lc3NhZ2VzIiwiaTE4blJvdyIsImZvckVhY2giLCJtZXNzYWdlIiwiaW5kZXhNZXNzYWdlIiwibWVzc2FnZVRleHQiLCJnZXRDb2x1bW5JbmZvIiwidGFibGUiLCJtb2RlbCIsImdldFJvd0JpbmRpbmciLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc29sdmUiLCJnZXRQYXRoIiwiZ2V0Q29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZmV0Y2hQcm9wZXJ0aWVzIiwidGhlbiIsInByb3BlcnR5SW5mbyIsIlByb3BlcnR5SW5mb0RpY3QiLCJPYmplY3QiLCJhc3NpZ24iLCJtYXAiLCJuYW1lIiwiY29sdW1uSW5mb3MiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiaW5mb1Byb3BlcnR5IiwiZ2V0RGF0YVByb3BlcnR5IiwicHJvcGVydHlJbmZvcyIsImRhdGFQcm9wZXJ0eSIsInBhdGgiLCJpbmRleE9mIiwicHVzaCIsInBhcnNlUGFzdGVkRGF0YSIsInJhd0RhdGEiLCJwYXN0ZUluZm9zIiwicGFzdGVkQ29sdW1uQ291bnQiLCJmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXgiLCJJIiwiUHJvbWlzZSIsIkNvcmVQYXN0ZUhlbHBlciIsInBhcnNlIiwicGFyc2VSZXN1bHQiLCJlcnJvcnMiLCJvRWxlbWVudCIsInBhcnNlZERhdGEiLCJwYXN0ZURhdGEiLCJjb250cm9sbGVyIiwib0ludGVybmFsRWRpdEZsb3ciLCJfZWRpdEZsb3ciLCJ0YWJsZURlZmluaXRpb24iLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhRGF0YSIsImFQYXJzZWREYXRhIiwiYWxsIiwibURhdGEiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsInZhbGlkYXRlRG9jdW1lbnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjb250cm9sIiwiZ2V0VmlldyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJhRXJyb3JNZXNzYWdlcyIsInJlZHVjZSIsImFNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsImluZGV4IiwibWVzc2FnZXMiLCJyb3ciLCJhUm93TWVzc2FnZXMiLCJtRXJyb3IiLCJhVmFsaWRhdGVkRGF0YSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiY3JlYXRlQXRFbmQiLCJlZGl0RmxvdyIsIm9uQmVmb3JlQ3JlYXRlIiwidW5kZWZpbmVkIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLE1BQU1BLHdCQUF3QixHQUFHLFVBQVNDLFlBQVQsRUFBNEJDLGNBQTVCLEVBQWlEQyxX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QUFELENBQW9COEIsUUFBcEIsQ0FBNkJDLGNBTDdCLENBREksR0FRSkMsU0FSSDtBQVNBLE9BeENLLEVBeUNMQyxLQXpDSyxDQXlDQyxVQUFBQyxNQUFNLEVBQUk7QUFDaEJDLFFBQUFBLEdBQUcsQ0FBQzdGLEtBQUosQ0FBVSwwQkFBVixFQUFzQzRGLE1BQXRDO0FBQ0EsT0EzQ0ssQ0FBUDtBQTRDQTtBQXBKa0IsR0FBcEI7U0F1SmV4RixXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDb3JlUGFzdGVIZWxwZXIgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvUGFzdGVIZWxwZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21WYWxpZGF0aW9uTWVzc2FnZSA9IHtcblx0bWVzc2FnZVRleHQ/OiBzdHJpbmc7XG5cdG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBnZXRJbmZvRm9yRW50aXR5UHJvcGVydHkgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IGFueSwgcm93QmluZGluZ1BhdGg6IGFueSwgbWV0YUNvbnRleHQ6IGFueSwgbWV0YU1vZGVsOiBhbnkpOiBhbnkge1xuXHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCksXG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgcGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlIH0sXG5cdFx0dHlwZSA9IG1ldGFNb2RlbC5nZXRVSTVUeXBlKGAke3Jvd0JpbmRpbmdQYXRofS8ke3Byb3BlcnR5UGF0aH1gLCBmb3JtYXRPcHRpb25zKSxcblx0XHRpc0lnbm9yZWQgPSAhcHJvcGVydHkgfHwgbWV0YUNvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHlQYXRoICsgXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIik7XG5cdHJldHVybiB7XG5cdFx0cHJvcGVydHk6IHByb3BlcnR5UGF0aCxcblx0XHRpZ25vcmU6IGlzSWdub3JlZCxcblx0XHR0eXBlOiB0eXBlXG5cdH07XG59O1xuXG5jb25zdCBkaXNwbGF5RXJyb3JNZXNzYWdlcyA9IGZ1bmN0aW9uKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdGNvbnN0IG1lc3NhZ2VEZXRhaWxzID0gWy4uLmVycm9yTWVzc2FnZXNdO1xuXHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGUsXG5cdFx0ZXJyb3JDb3JyZWN0aW9uTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9DT1JSRUNUSU9OX01FU1NBR0VcIiksXG5cdFx0bm90ZU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19QQVNURV9IRUxQRVJfU0FQRkVfUEFTVEVfRVJST1JfQ09SUkVDVElPTl9OT1RFXCIpO1xuXHRsZXQgcGFzdGVFcnJvck1lc3NhZ2U7XG5cblx0aWYgKG1lc3NhZ2VEZXRhaWxzLmxlbmd0aCA+IDEpIHtcblx0XHRwYXN0ZUVycm9yTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX1BBU1RFX0hFTFBFUl9TQVBGRV9QQVNURV9FUlJPUl9NRVNTQUdFX1BMVVJBTFwiLCBbbWVzc2FnZURldGFpbHMubGVuZ3RoXSk7XG5cdH0gZWxzZSB7XG5cdFx0cGFzdGVFcnJvck1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19QQVNURV9IRUxQRVJfU0FQRkVfUEFTVEVfRVJST1JfTUVTU0FHRV9TSU5HVUxBUlwiKTtcblx0fVxuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KFwiXCIpOyAvLyBUbyBzaG93IHNwYWNlIGJldHdlZW4gdGhlIHNob3J0IHRleHQgYW5kIHRoZSBsaXN0IG9mIGVycm9yc1xuXHRtZXNzYWdlRGV0YWlscy51bnNoaWZ0KG5vdGVNZXNzYWdlKTtcblx0bWVzc2FnZURldGFpbHMudW5zaGlmdChlcnJvckNvcnJlY3Rpb25NZXNzYWdlKTtcblx0TWVzc2FnZUJveC5lcnJvcihwYXN0ZUVycm9yTWVzc2FnZSwge1xuXHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9FUlJPUlwiKSxcblx0XHRkZXRhaWxzOiBtZXNzYWdlRGV0YWlscy5qb2luKFwiPGJyPlwiKVxuXHR9KTtcbn07XG5cbmNvbnN0IFBhc3RlSGVscGVyID0ge1xuXHRkaXNwbGF5RXJyb3JNZXNzYWdlczogZGlzcGxheUVycm9yTWVzc2FnZXMsXG5cdGZvcm1hdEN1c3RvbU1lc3NhZ2U6IGZ1bmN0aW9uKHZhbGlkYXRpb25NZXNzYWdlczogY3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VbXSwgaVJvd051bWJlcjogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcblx0XHRjb25zdCBudW1iZXJNZXNzYWdlcyA9IHZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0aTE4blJvdyA9IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX01FU1NBR0VfR1JPVVBfREVTQ1JJUFRJT05fVEFCTEVfUk9XXCIpO1xuXHRcdGlmIChudW1iZXJNZXNzYWdlcyA+IDApIHtcblx0XHRcdGVycm9yTWVzc2FnZSArPSBgJHtpMThuUm93fSAke2lSb3dOdW1iZXJ9OiBgO1xuXHRcdFx0dmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UsIGluZGV4TWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRpZiAobWVzc2FnZS5tZXNzYWdlVGV4dCkge1xuXHRcdFx0XHRcdGVycm9yTWVzc2FnZSArPSBtZXNzYWdlLm1lc3NhZ2VUZXh0ICsgKGluZGV4TWVzc2FnZSArIDEgIT09IG51bWJlck1lc3NhZ2VzID8gXCIgXCIgOiBcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBlcnJvck1lc3NhZ2U7XG5cdH0sXG5cdGdldENvbHVtbkluZm86IGZ1bmN0aW9uKHRhYmxlOiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TW9kZWwoKSxcblx0XHRcdG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0cm93QmluZGluZ1BhdGggPSBtb2RlbC5yZXNvbHZlKHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCksIHRhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRDb250ZXh0KCkpLFxuXHRcdFx0bWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocm93QmluZGluZ1BhdGgpO1xuXHRcdHJldHVybiB0YWJsZVxuXHRcdFx0LmdldENvbnRyb2xEZWxlZ2F0ZSgpXG5cdFx0XHQuZmV0Y2hQcm9wZXJ0aWVzKHRhYmxlKVxuXHRcdFx0LnRoZW4oKHByb3BlcnR5SW5mbzogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IFByb3BlcnR5SW5mb0RpY3QgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5wcm9wZXJ0eUluZm8ubWFwKChwcm9wZXJ0eTogYW55KSA9PiAoeyBbcHJvcGVydHkubmFtZV06IHByb3BlcnR5IH0pKSk7XG5cdFx0XHRcdGNvbnN0IGNvbHVtbkluZm9zOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHR0YWJsZS5nZXRDb2x1bW5zKCkuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBpbmZvUHJvcGVydHkgPSBQcm9wZXJ0eUluZm9EaWN0W2NvbHVtbi5nZXREYXRhUHJvcGVydHkoKV07XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIGNvbXBsZXggcHJvcGVydHkgKHByb3BlcnR5IGFzc29jaWF0ZWQgdG8gbXVsdGlwbGUgc2ltcGxlIHByb3BlcnRpZXMpXG5cdFx0XHRcdFx0aWYgKGluZm9Qcm9wZXJ0eS5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0XHQvLyBHZXQgZGF0YSBmcm9tIHNpbXBsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdFx0aW5mb1Byb3BlcnR5LnByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhUHJvcGVydHkgPSBQcm9wZXJ0eUluZm9EaWN0W3Byb3BlcnR5XTtcblxuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNpbXBsZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHRvIGEgUmF0aW5nIG9yIFByb2dyZXNzIENvbXBsZXhQcm9wZXJ0eSAtLT4gaWdub3JlXG5cdFx0XHRcdFx0XHRcdC8vIE9yIGNoZWNrIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoaW4gdGhlIGN1cnJlbnQgQ29tcGxleCBwcm9wZXJ0eSAtLT4gaWdub3JlXG5cdFx0XHRcdFx0XHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBpbnRvIHRoZSBwcm9wZXJ0eUluZm9zIHRvIGluY2x1ZGUgdGhlIFRhcmdldCBWYWx1ZVxuXHRcdFx0XHRcdFx0XHQvLyBmcm9tIHRoZSBEYXRhUG9pbnQgKHBhdGggaW5jbHVkZXMgdGhlIEBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnQgYW5ub3RhdGlvbilcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdChkYXRhUHJvcGVydHkgJiYgZGF0YVByb3BlcnR5LnBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikgPiAtMSkgfHxcblx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGRhdGFQcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaCh0aGlzLmdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eShkYXRhUHJvcGVydHkucGF0aCwgcm93QmluZGluZ1BhdGgsIG1ldGFDb250ZXh0LCBtZXRhTW9kZWwpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbmZvUHJvcGVydHkucGF0aCkge1xuXHRcdFx0XHRcdFx0Y29sdW1uSW5mb3MucHVzaCh0aGlzLmdldEluZm9Gb3JFbnRpdHlQcm9wZXJ0eShpbmZvUHJvcGVydHkucGF0aCwgcm93QmluZGluZ1BhdGgsIG1ldGFDb250ZXh0LCBtZXRhTW9kZWwpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gRW1wdHkgY29sdW1uIC0tPiBpZ25vcmVcblx0XHRcdFx0XHRcdGNvbHVtbkluZm9zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogXCJ1bnVzZWRcIixcblx0XHRcdFx0XHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0aWdub3JlOiB0cnVlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gY29sdW1uSW5mb3M7XG5cdFx0XHR9KTtcblx0fSxcblx0Z2V0SW5mb0ZvckVudGl0eVByb3BlcnR5OiBnZXRJbmZvRm9yRW50aXR5UHJvcGVydHksXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gcmF3RGF0YVxuXHQgKiBAcGFyYW0gdGFibGVcblx0ICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cblx0ICovXG5cdHBhcnNlUGFzdGVkRGF0YTogZnVuY3Rpb24ocmF3RGF0YTogYW55LCB0YWJsZTogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuXHRcdHJldHVybiB0aGlzLmdldENvbHVtbkluZm8odGFibGUpXG5cdFx0XHQudGhlbihmdW5jdGlvbihwYXN0ZUluZm9zOiBhbnlbXSkge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBoYXZlIGRhdGEgZm9yIGF0IGxlYXN0IHRoZSBmaXJzdCBlZGl0YWJsZSBjb2x1bW5cblx0XHRcdFx0Y29uc3QgcGFzdGVkQ29sdW1uQ291bnQgPSByYXdEYXRhLmxlbmd0aCA/IHJhd0RhdGFbMF0ubGVuZ3RoIDogMDtcblx0XHRcdFx0bGV0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA9IC0xO1xuXHRcdFx0XHRmb3IgKGxldCBJID0gMDsgSSA8IHBhc3RlSW5mb3MubGVuZ3RoICYmIGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA8IDA7IEkrKykge1xuXHRcdFx0XHRcdGlmICghcGFzdGVJbmZvc1tJXS5pZ25vcmUpIHtcblx0XHRcdFx0XHRcdGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA9IEk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXggPCAwIHx8IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCA+IHBhc3RlZENvbHVtbkNvdW50IC0gMVxuXHRcdFx0XHRcdD8gUHJvbWlzZS5yZXNvbHZlKHt9KSAvLyBXZSBkb24ndCBoYXZlIGRhdGEgZm9yIGFuIGVkaXRhYmxlIGNvbHVtbiAtLT4gcmV0dXJuIGVtcHR5IHBhcnNlZCBkYXRhXG5cdFx0XHRcdFx0OiAoQ29yZVBhc3RlSGVscGVyIGFzIGFueSkucGFyc2UocmF3RGF0YSwgcGFzdGVJbmZvcyk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHBhcnNlUmVzdWx0OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHBhcnNlUmVzdWx0LmVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZXMgPSBwYXJzZVJlc3VsdC5lcnJvcnMubWFwKGZ1bmN0aW9uKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5tZXNzYWdlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGxheUVycm9yTWVzc2FnZXMoZXJyb3JNZXNzYWdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIFtdOyAvLyBFcnJvcnMgLS0+IHJldHVybiBub3RoaW5nXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlUmVzdWx0LnBhcnNlZERhdGEgPyBwYXJzZVJlc3VsdC5wYXJzZWREYXRhIDogW107XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9LFxuXHRwYXN0ZURhdGE6IGZ1bmN0aW9uKHJhd0RhdGE6IGFueSwgdGFibGU6IGFueSwgY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9JbnRlcm5hbEVkaXRGbG93ID0gKGNvbnRyb2xsZXIgYXMgYW55KS5fZWRpdEZsb3c7XG5cdFx0Y29uc3QgdGFibGVEZWZpbml0aW9uID0gdGFibGUuZ2V0UGFyZW50KCkuZ2V0VGFibGVEZWZpbml0aW9uKCk7XG5cdFx0bGV0IGFEYXRhOiBhbnlbXSA9IFtdO1xuXHRcdHJldHVybiB0aGlzLnBhcnNlUGFzdGVkRGF0YShyYXdEYXRhLCB0YWJsZSlcblx0XHRcdC50aGVuKGFQYXJzZWREYXRhID0+IHtcblx0XHRcdFx0YURhdGEgPSBhUGFyc2VkRGF0YSB8fCBbXTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFEYXRhLm1hcChtRGF0YSA9PlxuXHRcdFx0XHRcdFx0b0ludGVybmFsRWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHR0YWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTogbURhdGEsXG5cdFx0XHRcdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiB0YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihhVmFsaWRhdGlvbk1lc3NhZ2VzID0+IHtcblx0XHRcdFx0Y29uc3QgYUVycm9yTWVzc2FnZXMgPSBhVmFsaWRhdGlvbk1lc3NhZ2VzLnJlZHVjZShmdW5jdGlvbihhTWVzc2FnZXMsIGFDdXN0b21NZXNzYWdlcywgaW5kZXgpIHtcblx0XHRcdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFNZXNzYWdlcy5wdXNoKHsgbWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlcywgcm93OiBpbmRleCArIDEgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBhTWVzc2FnZXM7XG5cdFx0XHRcdH0sIFtdKTtcblx0XHRcdFx0aWYgKGFFcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBhUm93TWVzc2FnZXMgPSBhRXJyb3JNZXNzYWdlcy5tYXAoKG1FcnJvcjogYW55KSA9PiB0aGlzLmZvcm1hdEN1c3RvbU1lc3NhZ2UobUVycm9yLm1lc3NhZ2VzLCBtRXJyb3Iucm93KSk7XG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhhUm93TWVzc2FnZXMpO1xuXHRcdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYURhdGE7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oYVZhbGlkYXRlZERhdGEgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYVZhbGlkYXRlZERhdGEubGVuZ3RoID4gMFxuXHRcdFx0XHRcdD8gb0ludGVybmFsRWRpdEZsb3cuY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0XHRcdFx0XHRcdHRhYmxlLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRcdFx0YVZhbGlkYXRlZERhdGEsXG5cdFx0XHRcdFx0XHRcdHRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdChjb250cm9sbGVyIGFzIGFueSkuZWRpdEZsb3cub25CZWZvcmVDcmVhdGVcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gob0Vycm9yID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcGFzdGluZyBkYXRhXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzdGVIZWxwZXI7XG4iXX0=