@sapui5/sap.fe.templates 1.100.0 → 1.102.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 (150) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +126 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +106 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +106 -58
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1196 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1088 -0
  18. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
  19. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
  20. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  21. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  22. package/src/sap/fe/templates/ListReport/overrides/Share.js +137 -137
  23. package/src/sap/fe/templates/ListReport/overrides/Share.ts +135 -0
  24. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +451 -428
  25. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +419 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  27. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  28. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  29. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +162 -22
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1534 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1454 -0
  37. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +872 -0
  38. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +837 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  42. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  43. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  44. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  46. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  49. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  50. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  53. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  54. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  56. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  60. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  62. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  64. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  65. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  66. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +26 -33
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -10
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +15 -15
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +31 -27
  71. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
  72. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
  73. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
  74. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
  75. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -4
  76. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
  77. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +3 -3
  78. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +3 -3
  79. package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
  80. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +71 -6
  81. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +114 -94
  82. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
  83. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  84. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +899 -817
  85. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +833 -0
  86. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  87. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  88. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  89. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  90. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  91. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  92. package/src/sap/fe/templates/TableScroller.js +45 -53
  93. package/src/sap/fe/templates/TableScroller.ts +48 -0
  94. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  95. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +23 -0
  96. package/src/sap/fe/templates/controls/Table.fragment.xml +3 -4
  97. package/src/sap/fe/templates/library.js +49 -63
  98. package/src/sap/fe/templates/library.ts +57 -0
  99. package/src/sap/fe/templates/messagebundle.properties +19 -7
  100. package/src/sap/fe/templates/messagebundle_ar.properties +12 -4
  101. package/src/sap/fe/templates/messagebundle_bg.properties +12 -4
  102. package/src/sap/fe/templates/messagebundle_ca.properties +12 -4
  103. package/src/sap/fe/templates/messagebundle_cs.properties +12 -4
  104. package/src/sap/fe/templates/messagebundle_cy.properties +12 -4
  105. package/src/sap/fe/templates/messagebundle_da.properties +12 -4
  106. package/src/sap/fe/templates/messagebundle_de.properties +12 -4
  107. package/src/sap/fe/templates/messagebundle_el.properties +12 -4
  108. package/src/sap/fe/templates/messagebundle_en.properties +12 -4
  109. package/src/sap/fe/templates/messagebundle_en_GB.properties +12 -4
  110. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
  111. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +13 -5
  112. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +13 -5
  113. package/src/sap/fe/templates/messagebundle_es.properties +12 -4
  114. package/src/sap/fe/templates/messagebundle_es_MX.properties +12 -4
  115. package/src/sap/fe/templates/messagebundle_et.properties +12 -4
  116. package/src/sap/fe/templates/messagebundle_fi.properties +12 -4
  117. package/src/sap/fe/templates/messagebundle_fr.properties +12 -4
  118. package/src/sap/fe/templates/messagebundle_fr_CA.properties +12 -4
  119. package/src/sap/fe/templates/messagebundle_hi.properties +12 -4
  120. package/src/sap/fe/templates/messagebundle_hr.properties +12 -4
  121. package/src/sap/fe/templates/messagebundle_hu.properties +12 -4
  122. package/src/sap/fe/templates/messagebundle_id.properties +12 -4
  123. package/src/sap/fe/templates/messagebundle_it.properties +12 -4
  124. package/src/sap/fe/templates/messagebundle_iw.properties +12 -4
  125. package/src/sap/fe/templates/messagebundle_ja.properties +12 -4
  126. package/src/sap/fe/templates/messagebundle_kk.properties +12 -4
  127. package/src/sap/fe/templates/messagebundle_ko.properties +12 -4
  128. package/src/sap/fe/templates/messagebundle_lt.properties +12 -4
  129. package/src/sap/fe/templates/messagebundle_lv.properties +12 -4
  130. package/src/sap/fe/templates/messagebundle_ms.properties +12 -4
  131. package/src/sap/fe/templates/messagebundle_nl.properties +12 -4
  132. package/src/sap/fe/templates/messagebundle_no.properties +12 -4
  133. package/src/sap/fe/templates/messagebundle_pl.properties +12 -4
  134. package/src/sap/fe/templates/messagebundle_pt.properties +13 -5
  135. package/src/sap/fe/templates/messagebundle_pt_PT.properties +12 -4
  136. package/src/sap/fe/templates/messagebundle_ro.properties +12 -4
  137. package/src/sap/fe/templates/messagebundle_ru.properties +12 -4
  138. package/src/sap/fe/templates/messagebundle_sh.properties +12 -4
  139. package/src/sap/fe/templates/messagebundle_sk.properties +12 -4
  140. package/src/sap/fe/templates/messagebundle_sl.properties +12 -4
  141. package/src/sap/fe/templates/messagebundle_sv.properties +12 -4
  142. package/src/sap/fe/templates/messagebundle_th.properties +12 -4
  143. package/src/sap/fe/templates/messagebundle_tr.properties +12 -4
  144. package/src/sap/fe/templates/messagebundle_uk.properties +12 -4
  145. package/src/sap/fe/templates/messagebundle_vi.properties +12 -4
  146. package/src/sap/fe/templates/messagebundle_zh_CN.properties +12 -4
  147. package/src/sap/fe/templates/messagebundle_zh_TW.properties +12 -4
  148. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -518
  149. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
  150. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +0 -138
@@ -1,462 +1,487 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/ui/model/json/JSONModel",
9
- "sap/fe/core/BaseController",
10
- "sap/ui/core/Component",
11
- "sap/ui/core/routing/HashChanger",
12
- "sap/fe/core/CommonUtils",
13
- "sap/fe/macros/SizeHelper",
14
- "sap/ui/model/odata/v4/AnnotationHelper",
15
- "sap/ui/base/BindingParser",
16
- "sap/base/Log",
17
- "sap/fe/core/controllerextensions/Placeholder"
18
- ],
19
- function(
20
- JSONModel,
21
- BaseController,
22
- Component,
23
- HashChanger,
24
- CommonUtils,
25
- SizeHelper,
26
- AnnotationHelper,
27
- BindingParser,
28
- Log,
29
- Placeholder
30
- ) {
31
- "use strict";
32
-
33
- /**
34
- @class Internal base controller class for SAP Fiori elements application.
35
- *
36
- * If you want to extend a base controller for your application, please use for sap.fe.templates.RootContainer.controller.Fcl or sap.fe.templates.RootContainer.controller.NavContainer
37
- *
38
- * @hideconstructor
39
- * @public
40
- * @name sap.fe.templates.RootContainer.controller.RootContainerBaseController
41
- */
42
- return BaseController.extend("sap.fe.templates.RootContainer.controller.RootContainerBaseController", {
43
- oPlaceholder: Placeholder,
44
- onInit: function() {
45
- SizeHelper.init();
46
-
47
- this._aHelperModels = [];
48
- },
49
-
50
- getPlaceholder: function() {
51
- return this.oPlaceholder;
52
- },
53
- attachRouteMatchers: function() {
54
- this.oPlaceholder.attachRouteMatchers();
55
- this.getAppComponent()
56
- .getRoutingService()
57
- .attachAfterRouteMatched(this._onAfterRouteMatched, this);
58
- },
59
- onExit: function() {
60
- this.getAppComponent()
61
- .getRoutingService()
62
- .detachAfterRouteMatched(this._onAfterRouteMatched, this);
63
- this.oRouter = null;
64
-
65
- SizeHelper.exit();
66
-
67
- // Destroy all JSON models created dynamically for the views
68
- this._aHelperModels.forEach(function(oModel) {
69
- oModel.destroy();
70
- });
71
- },
72
- /**
73
- * Convenience method for getting the resource bundle.
74
- *
75
- * @public
76
- * @returns {sap.ui.model.resource.ResourceModel} The resourceModel of the component
77
- */
78
- getResourceBundle: function() {
79
- return this.getOwnerComponent()
80
- .getModel("i18n")
81
- .getResourceBundle();
82
- },
83
- getRouter: function() {
84
- if (!this.oRouter) {
85
- this.oRouter = this.getAppComponent().getRouter();
86
- }
87
-
88
- return this.oRouter;
89
- },
90
-
91
- _createHelperModel: function() {
92
- // We keep a reference on the models created dynamically, as they don't get destroyed
93
- // automatically when the view is destroyed.
94
- // This is done during onExit
95
- var oModel = new JSONModel();
96
- this._aHelperModels.push(oModel);
97
-
98
- return oModel;
99
- },
100
-
101
- /**
102
- * Function waiting for the Right most view to be ready.
103
- *
104
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
105
- * @param {*} oEvent Reference an Event parameter coming from routeMatched event
106
- * @returns {Promise}
107
- */
108
- waitForRightMostViewReady: function(oEvent) {
109
- return new Promise(function(resolve) {
110
- var aContainers = oEvent.getParameter("views"),
111
- // There can also be reuse components in the view, remove them before processing.
112
- aFEContainers = [];
113
- aContainers.forEach(function(oContainer) {
114
- var oView = oContainer;
115
- if (oContainer && oContainer.getComponentInstance) {
116
- var oComponentInstance = oContainer.getComponentInstance();
117
- oView = oComponentInstance.getRootControl();
118
- }
119
- if (oView && oView.getController() && oView.getController().pageReady) {
120
- aFEContainers.push(oView);
121
- }
122
- });
123
- var oRightMostFEView = aFEContainers[aFEContainers.length - 1];
124
- if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
125
- resolve(oRightMostFEView);
126
- } else {
127
- oRightMostFEView &&
128
- oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function() {
129
- resolve(oRightMostFEView);
130
- });
131
- }
132
- });
133
- },
134
-
135
- /**
136
- * Callback when the navigation is done.
137
- * - update the shell title.
138
- * - update table scroll.
139
- * - call onPageReady on the rightMostView.
140
- *
141
- * @param oEvent
142
- * @name sap.fe.templates.RootContainer.controller.BaseController#_onAfterRouteMatched
143
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
144
- */
145
- _onAfterRouteMatched: function(oEvent) {
146
- var that = this;
147
- if (!that._oRouteMatchedPromise) {
148
- that._oRouteMatchedPromise = that
149
- .waitForRightMostViewReady(oEvent)
150
- .then(function(oView) {
151
- // The autoFocus is initially disabled on the navContainer or the FCL, so that the focus stays on the Shell menu
152
- // even if the app takes a long time to launch
153
- // The first time the view is displayed, we need to enable the autofocus so that it's managed properly during navigation
154
- var oRootControl = that.getView().getContent()[0];
155
- if (oRootControl && oRootControl.getAutoFocus && !oRootControl.getAutoFocus()) {
156
- oRootControl.setProperty("autoFocus", true, true); // Do not mark the container as invalid, otherwise it's re-rendered
157
- }
158
-
159
- var oAppComponent = that.getAppComponent();
160
- that._scrollTablesToLastNavigatedItems();
161
- if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
162
- that._computeTitleHierarchy(oView);
163
- }
164
- var bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
165
- oAppComponent.getRouterProxy().setFocusForced(false); // reset
166
- if (oView.getController() && oView.getController().onPageReady && oView.getParent().onPageReady) {
167
- oView.getParent().onPageReady({ forceFocus: bForceFocus });
168
- }
169
- if (that.onContainerReady) {
170
- that.onContainerReady();
171
- }
172
- })
173
- .catch(function(oError) {
174
- Log.error("An error occurs while computing the title hierarchy and calling focus method", oError);
175
- })
176
- .finally(function() {
177
- that._oRouteMatchedPromise = null;
178
- });
179
- }
180
- },
181
-
182
- /**
183
- * This function returns the TitleHierarchy cache ( or initializes it if undefined).
184
- *
185
- * @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
186
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
187
- *
188
- * @returns {object} The TitleHierarchy cache
189
- */
190
- _getTitleHierarchyCache: function() {
191
- if (!this.oTitleHierarchyCache) {
192
- this.oTitleHierarchyCache = {};
193
- }
194
- return this.oTitleHierarchyCache;
195
- },
196
-
197
- /**
198
- * This function returns a titleInfo object.
199
- *
200
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
201
- * @param {*} title
202
- * @param {*} subtitle
203
- * @param {*} sIntent The intent path to be redirected to
204
- * @returns {object} The title information
205
- */
206
- _computeTitleInfo: function(title, subtitle, sIntent) {
207
- var aParts = sIntent.split("/");
208
- if (aParts[aParts.length - 1].indexOf("?") === -1) {
209
- sIntent += "?restoreHistory=true";
210
- } else {
211
- sIntent += "&restoreHistory=true";
212
- }
213
- return {
214
- title: title,
215
- subtitle: subtitle,
216
- intent: sIntent,
217
- icon: ""
218
- };
219
- },
220
-
221
- /**
222
- * Fetches the value of the HeaderInfo title for a given path.
223
- *
224
- * @param {string} sPath The path to the entity
225
- * @returns {Promise} A promise containing the value of the title, or an empty string if no HeaderInfo title annotation is available
226
- */
227
- _fetchTitleValue: function(sPath) {
228
- var oAppComponent = this.getAppComponent(),
229
- oModel = this.getView().getModel(),
230
- oMetaModel = oAppComponent.getMetaModel(),
231
- sMetaPath = oMetaModel.getMetaPath(sPath);
232
-
233
- var sTitleExpression = AnnotationHelper.format(
234
- oMetaModel.getProperty(sMetaPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value"),
235
- { context: oMetaModel.createBindingContext("/") }
236
- );
237
- var oTitleExpression = BindingParser.complexParser(sTitleExpression);
238
-
239
- if (oTitleExpression) {
240
- var sTitlePath = oTitleExpression.parts ? oTitleExpression.parts[0].path : oTitleExpression.path;
241
- var fnTitleFormatter = oTitleExpression.formatter;
242
- var oBindingViewContext = oModel.createBindingContext(sPath);
243
- var oPropertyBinding = oModel.bindProperty(sTitlePath, oBindingViewContext);
244
-
245
- oPropertyBinding.initialize();
246
-
247
- return new Promise(function(resolve) {
248
- var fnChange = function(oEvent) {
249
- var sTargetValue = fnTitleFormatter
250
- ? fnTitleFormatter(oEvent.getSource().getValue())
251
- : oEvent.getSource().getValue();
252
-
253
- oPropertyBinding.detachChange(fnChange);
254
- resolve(sTargetValue);
255
- };
256
-
257
- oPropertyBinding.attachChange(fnChange);
258
- });
259
- } else {
260
- return Promise.resolve("");
261
- }
262
- },
263
-
264
- _getAppSpecificHash: function() {
265
- return HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
266
- },
267
-
268
- _getHash: function() {
269
- return HashChanger.getInstance().getHash();
270
- },
271
-
272
- /**
273
- * This function returns titleInformation from a path.
274
- * It updates the cache to store Title Information if necessary
275
- *
276
- * @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
277
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
278
- * @param {*} sPath path of the context to retrieve title information from MetaModel
279
- *
280
- * @returns {promise} oTitleinformation returned as promise
281
- */
282
-
283
- getTitleInfoFromPath: function(sPath) {
284
- var oTitleHierarchyCache = this._getTitleHierarchyCache();
285
-
286
- if (oTitleHierarchyCache[sPath]) {
287
- // The title info is already stored in the cache
288
- return Promise.resolve(oTitleHierarchyCache[sPath]);
289
- }
290
-
291
- var oMetaModel = this.getAppComponent().getMetaModel();
292
- var that = this;
293
- var sEntityPath = oMetaModel.getMetaPath(sPath);
294
- var sTypeName = oMetaModel.getProperty(sEntityPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName");
295
- var sAppSpecificHash = this._getAppSpecificHash();
296
- var sIntent = sAppSpecificHash + sPath.slice(1);
297
-
298
- return this._fetchTitleValue(sPath).then(function(sTitle) {
299
- var oTitleInfo = that._computeTitleInfo(sTypeName, sTitle, sIntent);
300
- oTitleHierarchyCache[sPath] = oTitleInfo;
301
- return oTitleInfo;
302
- });
303
- },
304
- /**
305
- * Ensure that the ushell service receives all elements
306
- * (title, subtitle, intent, icon) as strings.
307
- *
308
- * Annotation HeaderInfo allows for binding of title and description
309
- * (which are used here as title and subtitle) to any element in the entity
310
- * (being possibly types like boolean, timestamp, double, etc.)
311
- *
312
- * Creates a new hierarchy and converts non-string types to string.
313
- *
314
- * @param {*} aHierarchy Shell title hierarchy
315
- * @returns {*} Copy of shell title hierarchy containing all elements as strings
316
- */
317
- _ensureHierarchyElementsAreStrings: function(aHierarchy) {
318
- var aHierarchyShell = [];
319
- for (var level in aHierarchy) {
320
- var oHierarchy = aHierarchy[level];
321
- var oShellHierarchy = {};
322
- for (var key in oHierarchy) {
323
- oShellHierarchy[key] = typeof oHierarchy[key] !== "string" ? String(oHierarchy[key]) : oHierarchy[key];
324
- }
325
- aHierarchyShell.push(oShellHierarchy);
326
- }
327
- return aHierarchyShell;
328
- },
329
-
330
- _getTargetTypeFromHash: function(sHash) {
331
- var oAppComponent = this.getAppComponent();
332
- var sTargetType = "";
333
-
334
- var aRoutes = oAppComponent.getManifestEntry("/sap.ui5/routing/routes");
335
- for (var j = 0; j < aRoutes.length; j++) {
336
- var oRoute = oAppComponent.getRouter().getRoute(aRoutes[j].name);
337
- if (oRoute.match(sHash)) {
338
- var sTarget = Array.isArray(aRoutes[j].target) ? aRoutes[j].target[0] : aRoutes[j].target;
339
- sTargetType = oAppComponent.getRouter().getTarget(sTarget)._oOptions.name;
340
- break;
341
- }
342
- }
343
-
344
- return sTargetType;
345
- },
346
-
347
- /**
348
- * This function is updating the shell title after each navigation.
349
- *
350
- * @memberof sap.fe.templates.RootContainer.controller.BaseController
351
- * @param {*} oView The current view
352
- * @returns {*} A Promise that is resolved when the menu is filled properly
353
- */
354
- _computeTitleHierarchy: function(oView) {
355
- var that = this,
356
- oAppComponent = this.getAppComponent(),
357
- oContext = oView.getBindingContext(),
358
- oCurrentPage = oView.getParent(),
359
- aTitleInformationPromises = [],
360
- sAppSpecificHash = this._getAppSpecificHash(),
361
- sAppTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").title || "",
362
- sAppSubTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").appSubTitle || "",
363
- oPageTitleInformation,
364
- sNewPath;
365
-
366
- if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
367
- if (oContext) {
368
- // If the first page of the application is a LR, use the title and subtitle from the manifest
369
- if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
370
- aTitleInformationPromises.push(
371
- Promise.resolve(that._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash))
372
- );
373
- }
374
-
375
- // Then manage other pages
376
- sNewPath = oContext.getPath();
377
- var aPathParts = sNewPath.split("/"),
378
- sPath = "";
379
-
380
- aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
381
- aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
382
-
383
- aPathParts.forEach(function(sPathPart) {
384
- sPath += "/" + sPathPart;
385
- var oMetaModel = oAppComponent.getMetaModel(),
386
- sParameterPath = oMetaModel.getMetaPath(sPath),
387
- bIsParameterized = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
388
- if (!bIsParameterized) {
389
- aTitleInformationPromises.push(that.getTitleInfoFromPath(sPath));
390
- }
391
- });
392
- }
393
-
394
- // Current page
395
- oPageTitleInformation = oCurrentPage._getPageTitleInformation();
396
- oPageTitleInformation = that._computeTitleInfo(
397
- oPageTitleInformation.title,
398
- oPageTitleInformation.subtitle,
399
- sAppSpecificHash + this._getHash()
400
- );
401
-
402
- if (oContext) {
403
- that._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
404
- } else {
405
- that._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
406
- }
407
- } else {
408
- aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
409
- }
410
- return Promise.all(aTitleInformationPromises)
411
- .then(function(aTitleInfoHierarchy) {
412
- // workaround for shell which is expecting all elements being of type string
413
- var aTitleInfoHierarchyShell = that._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
414
- sTitle = oPageTitleInformation.title;
415
- oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
416
- oAppComponent.getShellServices().setTitle(sTitle);
417
- })
418
- .catch(function(sErrorMessage) {
419
- Log.error(sErrorMessage);
420
- })
421
- .finally(function() {
422
- that.bIsComputingTitleHierachy = false;
423
- })
424
- .catch(function(sErrorMessage) {
425
- Log.error(sErrorMessage);
426
- });
427
- },
428
-
429
- calculateLayout: function(iNextFCLLevel, sPath, sProposedLayout) {
430
- return null;
431
- },
432
-
433
- /**
434
- * Callback after a view has been bound to a context.
435
- *
436
- * @param {sap.ui.model.odata.v4.Context} oContext The context that has been bound to a view
437
- */
438
- onContextBoundToView: function(oContext) {
439
- if (oContext) {
440
- var sDeepestPath = this.getView()
441
- .getModel("internal")
442
- .getProperty("/deepestPath"),
443
- sViewContextPath = oContext.getPath();
444
-
445
- if (!sDeepestPath || sDeepestPath.indexOf(sViewContextPath) !== 0) {
446
- // There was no previous value for the deepest reached path, or the path
447
- // for the view isn't a subpath of the previous deepest path --> update
448
- this.getView()
449
- .getModel("internal")
450
- .setProperty("/deepestPath", sViewContextPath, undefined, true);
451
- }
452
- }
453
- },
454
-
455
- displayMessagePage: function(sErrorMessage, mParameters) {
456
- // To be overridden
457
- },
458
-
459
- updateUIStateForView: function(oView, FCLLevel) {}
460
- });
461
- }
462
- );
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/BaseController", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/SizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper"], function (Log, BaseController, Placeholder, ClassSupport, SizeHelper, BindingParser, HashChanger, JSONModel, AnnotationHelper) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _class, _class2, _descriptor;
9
+
10
+ var usingExtension = ClassSupport.usingExtension;
11
+ var defineUI5Class = ClassSupport.defineUI5Class;
12
+
13
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
14
+
15
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
16
+
17
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
18
+
19
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
+
21
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
22
+
23
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
24
+
25
+ var RootContainerBaseController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.RootContainerBaseController"), _dec2 = usingExtension(Placeholder), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
26
+ _inheritsLoose(RootContainerBaseController, _BaseController);
27
+
28
+ function RootContainerBaseController() {
29
+ var _this;
30
+
31
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
32
+ args[_key] = arguments[_key];
33
+ }
34
+
35
+ _this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
36
+
37
+ _initializerDefineProperty(_this, "oPlaceholder", _descriptor, _assertThisInitialized(_this));
38
+
39
+ _this.bIsComputingTitleHierachy = false;
40
+ return _this;
41
+ }
42
+
43
+ var _proto = RootContainerBaseController.prototype;
44
+
45
+ _proto.onInit = function onInit() {
46
+ SizeHelper.init();
47
+ this._aHelperModels = [];
48
+ };
49
+
50
+ _proto.getPlaceholder = function getPlaceholder() {
51
+ return this.oPlaceholder;
52
+ };
53
+
54
+ _proto.attachRouteMatchers = function attachRouteMatchers() {
55
+ this.oPlaceholder.attachRouteMatchers();
56
+ this.getAppComponent().getRoutingService().attachAfterRouteMatched(this._onAfterRouteMatched, this);
57
+ };
58
+
59
+ _proto.onExit = function onExit() {
60
+ this.getAppComponent().getRoutingService().detachAfterRouteMatched(this._onAfterRouteMatched, this);
61
+ this.oRouter = undefined;
62
+ SizeHelper.exit(); // Destroy all JSON models created dynamically for the views
63
+
64
+ this._aHelperModels.forEach(function (oModel) {
65
+ oModel.destroy();
66
+ });
67
+ }
68
+ /**
69
+ * Convenience method for getting the resource bundle.
70
+ *
71
+ * @public
72
+ * @returns {sap.ui.model.resource.ResourceModel} The resourceModel of the component
73
+ */
74
+ ;
75
+
76
+ _proto.getResourceBundle = function getResourceBundle() {
77
+ return this.getOwnerComponent().getModel("i18n").getResourceBundle();
78
+ };
79
+
80
+ _proto.getRouter = function getRouter() {
81
+ if (!this.oRouter) {
82
+ this.oRouter = this.getAppComponent().getRouter();
83
+ }
84
+
85
+ return this.oRouter;
86
+ };
87
+
88
+ _proto._createHelperModel = function _createHelperModel() {
89
+ // We keep a reference on the models created dynamically, as they don't get destroyed
90
+ // automatically when the view is destroyed.
91
+ // This is done during onExit
92
+ var oModel = new JSONModel();
93
+
94
+ this._aHelperModels.push(oModel);
95
+
96
+ return oModel;
97
+ }
98
+ /**
99
+ * Function waiting for the Right most view to be ready.
100
+ *
101
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
102
+ * @param {*} oEvent Reference an Event parameter coming from routeMatched event
103
+ * @returns {Promise}
104
+ */
105
+ ;
106
+
107
+ _proto.waitForRightMostViewReady = function waitForRightMostViewReady(oEvent) {
108
+ return new Promise(function (resolve) {
109
+ var aContainers = oEvent.getParameter("views"),
110
+ // There can also be reuse components in the view, remove them before processing.
111
+ aFEContainers = [];
112
+ aContainers.forEach(function (oContainer) {
113
+ var oView = oContainer;
114
+
115
+ if (oContainer && oContainer.getComponentInstance) {
116
+ var oComponentInstance = oContainer.getComponentInstance();
117
+ oView = oComponentInstance.getRootControl();
118
+ }
119
+
120
+ if (oView && oView.getController() && oView.getController().pageReady) {
121
+ aFEContainers.push(oView);
122
+ }
123
+ });
124
+ var oRightMostFEView = aFEContainers[aFEContainers.length - 1];
125
+
126
+ if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
127
+ resolve(oRightMostFEView);
128
+ } else {
129
+ oRightMostFEView && oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function () {
130
+ resolve(oRightMostFEView);
131
+ });
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * Callback when the navigation is done.
137
+ * - update the shell title.
138
+ * - update table scroll.
139
+ * - call onPageReady on the rightMostView.
140
+ *
141
+ * @param oEvent
142
+ * @name sap.fe.templates.RootContainer.controller.BaseController#_onAfterRouteMatched
143
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
144
+ */
145
+ ;
146
+
147
+ _proto._onAfterRouteMatched = function _onAfterRouteMatched(oEvent) {
148
+ var _this2 = this;
149
+
150
+ if (!this._oRouteMatchedPromise) {
151
+ this._oRouteMatchedPromise = this.waitForRightMostViewReady(oEvent).then(function (oView) {
152
+ // The autoFocus is initially disabled on the navContainer or the FCL, so that the focus stays on the Shell menu
153
+ // even if the app takes a long time to launch
154
+ // The first time the view is displayed, we need to enable the autofocus so that it's managed properly during navigation
155
+ var oRootControl = _this2.getView().getContent()[0];
156
+
157
+ if (oRootControl && oRootControl.getAutoFocus && !oRootControl.getAutoFocus()) {
158
+ oRootControl.setProperty("autoFocus", true, true); // Do not mark the container as invalid, otherwise it's re-rendered
159
+ }
160
+
161
+ var oAppComponent = _this2.getAppComponent();
162
+
163
+ _this2._scrollTablesToLastNavigatedItems();
164
+
165
+ if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
166
+ _this2._computeTitleHierarchy(oView);
167
+ }
168
+
169
+ var bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
170
+ oAppComponent.getRouterProxy().setFocusForced(false); // reset
171
+
172
+ if (oView.getController() && oView.getController().onPageReady && oView.getParent().onPageReady) {
173
+ oView.getParent().onPageReady({
174
+ forceFocus: bForceFocus
175
+ });
176
+ }
177
+
178
+ if (_this2.onContainerReady) {
179
+ _this2.onContainerReady();
180
+ }
181
+ }).catch(function (oError) {
182
+ Log.error("An error occurs while computing the title hierarchy and calling focus method", oError);
183
+ }).finally(function () {
184
+ _this2._oRouteMatchedPromise = null;
185
+ });
186
+ }
187
+ }
188
+ /**
189
+ * This function returns the TitleHierarchy cache ( or initializes it if undefined).
190
+ *
191
+ * @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
192
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
193
+ *
194
+ * @returns {object} The TitleHierarchy cache
195
+ */
196
+ ;
197
+
198
+ _proto._getTitleHierarchyCache = function _getTitleHierarchyCache() {
199
+ if (!this.oTitleHierarchyCache) {
200
+ this.oTitleHierarchyCache = {};
201
+ }
202
+
203
+ return this.oTitleHierarchyCache;
204
+ }
205
+ /**
206
+ * This function returns a titleInfo object.
207
+ *
208
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
209
+ * @param {*} title
210
+ * @param {*} subtitle
211
+ * @param {*} sIntent The intent path to be redirected to
212
+ * @returns {object} The title information
213
+ */
214
+ ;
215
+
216
+ _proto._computeTitleInfo = function _computeTitleInfo(title, subtitle, sIntent) {
217
+ var aParts = sIntent.split("/");
218
+
219
+ if (aParts[aParts.length - 1].indexOf("?") === -1) {
220
+ sIntent += "?restoreHistory=true";
221
+ } else {
222
+ sIntent += "&restoreHistory=true";
223
+ }
224
+
225
+ return {
226
+ title: title,
227
+ subtitle: subtitle,
228
+ intent: sIntent,
229
+ icon: ""
230
+ };
231
+ }
232
+ /**
233
+ * Fetches the value of the HeaderInfo title for a given path.
234
+ *
235
+ * @param {string} sPath The path to the entity
236
+ * @returns {Promise} A promise containing the value of the title, or an empty string if no HeaderInfo title annotation is available
237
+ */
238
+ ;
239
+
240
+ _proto._fetchTitleValue = function _fetchTitleValue(sPath) {
241
+ var oAppComponent = this.getAppComponent(),
242
+ oModel = this.getView().getModel(),
243
+ oMetaModel = oAppComponent.getMetaModel(),
244
+ sMetaPath = oMetaModel.getMetaPath(sPath);
245
+ var sTitleExpression = AnnotationHelper.format(oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value"), {
246
+ context: oMetaModel.createBindingContext("/")
247
+ });
248
+ var oTitleExpression = BindingParser.complexParser(sTitleExpression);
249
+
250
+ if (oTitleExpression) {
251
+ var sTitlePath = oTitleExpression.parts ? oTitleExpression.parts[0].path : oTitleExpression.path;
252
+ var fnTitleFormatter = oTitleExpression.formatter;
253
+ var oBindingViewContext = oModel.createBindingContext(sPath);
254
+ var oPropertyBinding = oModel.bindProperty(sTitlePath, oBindingViewContext);
255
+ oPropertyBinding.initialize();
256
+ return new Promise(function (resolve) {
257
+ var fnChange = function (oEvent) {
258
+ var sTargetValue = fnTitleFormatter ? fnTitleFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
259
+ oPropertyBinding.detachChange(fnChange);
260
+ resolve(sTargetValue);
261
+ };
262
+
263
+ oPropertyBinding.attachChange(fnChange);
264
+ });
265
+ } else {
266
+ return Promise.resolve("");
267
+ }
268
+ };
269
+
270
+ _proto._getAppSpecificHash = function _getAppSpecificHash() {
271
+ // HashChanged isShellNavigationHashChanger
272
+ return HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
273
+ };
274
+
275
+ _proto._getHash = function _getHash() {
276
+ return HashChanger.getInstance().getHash();
277
+ }
278
+ /**
279
+ * This function returns titleInformation from a path.
280
+ * It updates the cache to store Title Information if necessary
281
+ *
282
+ * @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
283
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
284
+ * @param {*} sPath path of the context to retrieve title information from MetaModel
285
+ *
286
+ * @returns {promise} oTitleinformation returned as promise
287
+ */
288
+ ;
289
+
290
+ _proto.getTitleInfoFromPath = function getTitleInfoFromPath(sPath) {
291
+ var _this3 = this;
292
+
293
+ var oTitleHierarchyCache = this._getTitleHierarchyCache();
294
+
295
+ if (oTitleHierarchyCache[sPath]) {
296
+ // The title info is already stored in the cache
297
+ return Promise.resolve(oTitleHierarchyCache[sPath]);
298
+ }
299
+
300
+ var oMetaModel = this.getAppComponent().getMetaModel();
301
+ var sEntityPath = oMetaModel.getMetaPath(sPath);
302
+ var sTypeName = oMetaModel.getObject(sEntityPath + "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName");
303
+
304
+ var sAppSpecificHash = this._getAppSpecificHash();
305
+
306
+ var sIntent = sAppSpecificHash + sPath.slice(1);
307
+ return this._fetchTitleValue(sPath).then(function (sTitle) {
308
+ var oTitleInfo = _this3._computeTitleInfo(sTypeName, sTitle, sIntent);
309
+
310
+ oTitleHierarchyCache[sPath] = oTitleInfo;
311
+ return oTitleInfo;
312
+ });
313
+ }
314
+ /**
315
+ * Ensure that the ushell service receives all elements
316
+ * (title, subtitle, intent, icon) as strings.
317
+ *
318
+ * Annotation HeaderInfo allows for binding of title and description
319
+ * (which are used here as title and subtitle) to any element in the entity
320
+ * (being possibly types like boolean, timestamp, double, etc.)
321
+ *
322
+ * Creates a new hierarchy and converts non-string types to string.
323
+ *
324
+ * @param {*} aHierarchy Shell title hierarchy
325
+ * @returns {*} Copy of shell title hierarchy containing all elements as strings
326
+ */
327
+ ;
328
+
329
+ _proto._ensureHierarchyElementsAreStrings = function _ensureHierarchyElementsAreStrings(aHierarchy) {
330
+ var aHierarchyShell = [];
331
+
332
+ for (var level in aHierarchy) {
333
+ var oHierarchy = aHierarchy[level];
334
+ var oShellHierarchy = {};
335
+
336
+ for (var key in oHierarchy) {
337
+ oShellHierarchy[key] = typeof oHierarchy[key] !== "string" ? String(oHierarchy[key]) : oHierarchy[key];
338
+ }
339
+
340
+ aHierarchyShell.push(oShellHierarchy);
341
+ }
342
+
343
+ return aHierarchyShell;
344
+ };
345
+
346
+ _proto._getTargetTypeFromHash = function _getTargetTypeFromHash(sHash) {
347
+ var oAppComponent = this.getAppComponent();
348
+ var sTargetType = "";
349
+ var aRoutes = oAppComponent.getManifestEntry("/sap.ui5/routing/routes");
350
+
351
+ for (var j = 0; j < aRoutes.length; j++) {
352
+ var oRoute = oAppComponent.getRouter().getRoute(aRoutes[j].name);
353
+
354
+ if (oRoute.match(sHash)) {
355
+ var sTarget = Array.isArray(aRoutes[j].target) ? aRoutes[j].target[0] : aRoutes[j].target;
356
+ sTargetType = oAppComponent.getRouter().getTarget(sTarget)._oOptions.name;
357
+ break;
358
+ }
359
+ }
360
+
361
+ return sTargetType;
362
+ }
363
+ /**
364
+ * This function is updating the shell title after each navigation.
365
+ *
366
+ * @memberof sap.fe.templates.RootContainer.controller.BaseController
367
+ * @param {*} oView The current view
368
+ * @returns {*} A Promise that is resolved when the menu is filled properly
369
+ */
370
+ ;
371
+
372
+ _proto._computeTitleHierarchy = function _computeTitleHierarchy(oView) {
373
+ var _this4 = this;
374
+
375
+ var oAppComponent = this.getAppComponent(),
376
+ oContext = oView.getBindingContext(),
377
+ oCurrentPage = oView.getParent(),
378
+ aTitleInformationPromises = [],
379
+ sAppSpecificHash = this._getAppSpecificHash(),
380
+ sAppTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").title || "",
381
+ sAppSubTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").appSubTitle || "";
382
+
383
+ var oPageTitleInformation, sNewPath;
384
+
385
+ if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
386
+ if (oContext) {
387
+ // If the first page of the application is a LR, use the title and subtitle from the manifest
388
+ if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
389
+ aTitleInformationPromises.push(Promise.resolve(this._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash)));
390
+ } // Then manage other pages
391
+
392
+
393
+ sNewPath = oContext.getPath();
394
+ var aPathParts = sNewPath.split("/");
395
+ var sPath = "";
396
+ aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
397
+
398
+ aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
399
+
400
+ aPathParts.forEach(function (sPathPart) {
401
+ sPath += "/" + sPathPart;
402
+ var oMetaModel = oAppComponent.getMetaModel(),
403
+ sParameterPath = oMetaModel.getMetaPath(sPath),
404
+ bIsParameterized = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
405
+
406
+ if (!bIsParameterized) {
407
+ aTitleInformationPromises.push(_this4.getTitleInfoFromPath(sPath));
408
+ }
409
+ });
410
+ } // Current page
411
+
412
+
413
+ oPageTitleInformation = oCurrentPage._getPageTitleInformation();
414
+ oPageTitleInformation = this._computeTitleInfo(oPageTitleInformation.title, oPageTitleInformation.subtitle, sAppSpecificHash + this._getHash());
415
+
416
+ if (oContext) {
417
+ this._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
418
+ } else {
419
+ this._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
420
+ }
421
+ } else {
422
+ aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
423
+ }
424
+
425
+ return Promise.all(aTitleInformationPromises).then(function (aTitleInfoHierarchy) {
426
+ // workaround for shell which is expecting all elements being of type string
427
+ var aTitleInfoHierarchyShell = _this4._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
428
+ sTitle = oPageTitleInformation.title;
429
+
430
+ oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
431
+ oAppComponent.getShellServices().setTitle(sTitle);
432
+ }).catch(function (sErrorMessage) {
433
+ Log.error(sErrorMessage);
434
+ }).finally(function () {
435
+ _this4.bIsComputingTitleHierachy = false;
436
+ }).catch(function (sErrorMessage) {
437
+ Log.error(sErrorMessage);
438
+ });
439
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
440
+ ;
441
+
442
+ _proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
443
+ return null;
444
+ }
445
+ /**
446
+ * Callback after a view has been bound to a context.
447
+ *
448
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that has been bound to a view
449
+ */
450
+ ;
451
+
452
+ _proto.onContextBoundToView = function onContextBoundToView(oContext) {
453
+ if (oContext) {
454
+ var sDeepestPath = this.getView().getModel("internal").getProperty("/deepestPath"),
455
+ sViewContextPath = oContext.getPath();
456
+
457
+ if (!sDeepestPath || sDeepestPath.indexOf(sViewContextPath) !== 0) {
458
+ // There was no previous value for the deepest reached path, or the path
459
+ // for the view isn't a subpath of the previous deepest path --> update
460
+ this.getView().getModel("internal").setProperty("/deepestPath", sViewContextPath, undefined, true);
461
+ }
462
+ }
463
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
464
+ ;
465
+
466
+ _proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
467
+ // To be overridden
468
+ return Promise.resolve(true);
469
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
470
+ ;
471
+
472
+ _proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {// To be overriden
473
+ };
474
+
475
+ _proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {// To be overriden
476
+ };
477
+
478
+ return RootContainerBaseController;
479
+ }(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "oPlaceholder", [_dec2], {
480
+ configurable: true,
481
+ enumerable: true,
482
+ writable: true,
483
+ initializer: null
484
+ })), _class2)) || _class);
485
+ return RootContainerBaseController;
486
+ }, false);
487
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJiSXNDb21wdXRpbmdUaXRsZUhpZXJhY2h5Iiwib25Jbml0IiwiU2l6ZUhlbHBlciIsImluaXQiLCJfYUhlbHBlck1vZGVscyIsImdldFBsYWNlaG9sZGVyIiwib1BsYWNlaG9sZGVyIiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJfb25BZnRlclJvdXRlTWF0Y2hlZCIsIm9uRXhpdCIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwib1JvdXRlciIsInVuZGVmaW5lZCIsImV4aXQiLCJmb3JFYWNoIiwib01vZGVsIiwiZGVzdHJveSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRNb2RlbCIsImdldFJvdXRlciIsIl9jcmVhdGVIZWxwZXJNb2RlbCIsIkpTT05Nb2RlbCIsInB1c2giLCJ3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5Iiwib0V2ZW50IiwiUHJvbWlzZSIsInJlc29sdmUiLCJhQ29udGFpbmVycyIsImdldFBhcmFtZXRlciIsImFGRUNvbnRhaW5lcnMiLCJvQ29udGFpbmVyIiwib1ZpZXciLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldFJvb3RDb250cm9sIiwiZ2V0Q29udHJvbGxlciIsInBhZ2VSZWFkeSIsIm9SaWdodE1vc3RGRVZpZXciLCJsZW5ndGgiLCJpc1BhZ2VSZWFkeSIsImF0dGFjaEV2ZW50T25jZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsInRoZW4iLCJvUm9vdENvbnRyb2wiLCJnZXRWaWV3IiwiZ2V0Q29udGVudCIsImdldEF1dG9Gb2N1cyIsInNldFByb3BlcnR5Iiwib0FwcENvbXBvbmVudCIsIl9zY3JvbGxUYWJsZXNUb0xhc3ROYXZpZ2F0ZWRJdGVtcyIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiVVNoZWxsIiwiX2NvbXB1dGVUaXRsZUhpZXJhcmNoeSIsImJGb3JjZUZvY3VzIiwiZ2V0Um91dGVyUHJveHkiLCJpc0ZvY3VzRm9yY2VkIiwic2V0Rm9jdXNGb3JjZWQiLCJvblBhZ2VSZWFkeSIsImdldFBhcmVudCIsImZvcmNlRm9jdXMiLCJvbkNvbnRhaW5lclJlYWR5IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImZpbmFsbHkiLCJfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9UaXRsZUhpZXJhcmNoeUNhY2hlIiwiX2NvbXB1dGVUaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwic0ludGVudCIsImFQYXJ0cyIsInNwbGl0IiwiaW5kZXhPZiIsImludGVudCIsImljb24iLCJfZmV0Y2hUaXRsZVZhbHVlIiwic1BhdGgiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzVGl0bGVFeHByZXNzaW9uIiwiQW5ub3RhdGlvbkhlbHBlciIsImZvcm1hdCIsImdldE9iamVjdCIsImNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9UaXRsZUV4cHJlc3Npb24iLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsInNUaXRsZVBhdGgiLCJwYXJ0cyIsInBhdGgiLCJmblRpdGxlRm9ybWF0dGVyIiwiZm9ybWF0dGVyIiwib0JpbmRpbmdWaWV3Q29udGV4dCIsIm9Qcm9wZXJ0eUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJpbml0aWFsaXplIiwiZm5DaGFuZ2UiLCJzVGFyZ2V0VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRWYWx1ZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJIYXNoQ2hhbmdlciIsImdldEluc3RhbmNlIiwiaHJlZkZvckFwcFNwZWNpZmljSGFzaCIsIl9nZXRIYXNoIiwiZ2V0SGFzaCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwic0VudGl0eVBhdGgiLCJzVHlwZU5hbWUiLCJzQXBwU3BlY2lmaWNIYXNoIiwic2xpY2UiLCJzVGl0bGUiLCJvVGl0bGVJbmZvIiwiX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyIsImFIaWVyYXJjaHkiLCJhSGllcmFyY2h5U2hlbGwiLCJsZXZlbCIsIm9IaWVyYXJjaHkiLCJvU2hlbGxIaWVyYXJjaHkiLCJrZXkiLCJTdHJpbmciLCJfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoIiwic0hhc2giLCJzVGFyZ2V0VHlwZSIsImFSb3V0ZXMiLCJnZXRNYW5pZmVzdEVudHJ5IiwiaiIsIm9Sb3V0ZSIsImdldFJvdXRlIiwibmFtZSIsIm1hdGNoIiwic1RhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsImdldFRhcmdldCIsIl9vT3B0aW9ucyIsIm9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ3VycmVudFBhZ2UiLCJhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzIiwic0FwcFRpdGxlIiwiZ2V0TWV0YWRhdGEiLCJzQXBwU3ViVGl0bGUiLCJhcHBTdWJUaXRsZSIsIm9QYWdlVGl0bGVJbmZvcm1hdGlvbiIsInNOZXdQYXRoIiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwiZ2V0UGF0aCIsImFQYXRoUGFydHMiLCJzaGlmdCIsInBvcCIsInNQYXRoUGFydCIsInNQYXJhbWV0ZXJQYXRoIiwiYklzUGFyYW1ldGVyaXplZCIsInJlamVjdCIsImFsbCIsImFUaXRsZUluZm9IaWVyYXJjaHkiLCJhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0SGllcmFyY2h5IiwicmV2ZXJzZSIsInNldFRpdGxlIiwic0Vycm9yTWVzc2FnZSIsImNhbGN1bGF0ZUxheW91dCIsImlOZXh0RkNMTGV2ZWwiLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9uQ29udGV4dEJvdW5kVG9WaWV3Iiwic0RlZXBlc3RQYXRoIiwiZ2V0UHJvcGVydHkiLCJzVmlld0NvbnRleHRQYXRoIiwiZGlzcGxheU1lc3NhZ2VQYWdlIiwibVBhcmFtZXRlcnMiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIkZDTExldmVsIiwiQmFzZUNvbnRyb2xsZXIiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQVlNQSwyQixXQURMQyxjQUFjLENBQUMsdUVBQUQsQyxVQUViQyxjQUFjLENBQUNDLFdBQUQsQzs7Ozs7Ozs7Ozs7Ozs7WUFNUEMseUIsR0FBcUMsSzs7Ozs7O1dBRTdDQyxNLEdBQUEsa0JBQVM7QUFDUkMsTUFBQUEsVUFBVSxDQUFDQyxJQUFYO0FBRUEsV0FBS0MsY0FBTCxHQUFzQixFQUF0QjtBQUNBLEs7O1dBRURDLGMsR0FBQSwwQkFBaUI7QUFDaEIsYUFBTyxLQUFLQyxZQUFaO0FBQ0EsSzs7V0FDREMsbUIsR0FBQSwrQkFBc0I7QUFDckIsV0FBS0QsWUFBTCxDQUFrQkMsbUJBQWxCO0FBQ0EsV0FBS0MsZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDQyx1QkFBM0MsQ0FBbUUsS0FBS0Msb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsSzs7V0FDREMsTSxHQUFBLGtCQUFTO0FBQ1IsV0FBS0osZUFBTCxHQUF1QkMsaUJBQXZCLEdBQTJDSSx1QkFBM0MsQ0FBbUUsS0FBS0Ysb0JBQXhFLEVBQThGLElBQTlGO0FBQ0EsV0FBS0csT0FBTCxHQUFlQyxTQUFmO0FBRUFiLE1BQUFBLFVBQVUsQ0FBQ2MsSUFBWCxHQUpRLENBTVI7O0FBQ0EsV0FBS1osY0FBTCxDQUFvQmEsT0FBcEIsQ0FBNEIsVUFBVUMsTUFBVixFQUF1QjtBQUNsREEsUUFBQUEsTUFBTSxDQUFDQyxPQUFQO0FBQ0EsT0FGRDtBQUdBO0FBQ0Q7QUFD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QyxFQUFnRCxDQUMvQztBQUNBLEs7O1dBQ0R0SSxpQyxHQUFBLDZDQUEwQyxDQUN6QztBQUNBLEs7OztJQWphd0N1SSxjOzs7Ozs7U0F1YTNCaE0sMkIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEJhc2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgU2l6ZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9TaXplSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlclwiKVxuY2xhc3MgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdG9QbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRwcml2YXRlIF9hSGVscGVyTW9kZWxzITogYW55W107XG5cdHByaXZhdGUgb1JvdXRlcj86IFJvdXRlcjtcblx0cHJpdmF0ZSBfb1JvdXRlTWF0Y2hlZFByb21pc2U6IGFueTtcblx0cHJpdmF0ZSBvVGl0bGVIaWVyYXJjaHlDYWNoZTogYW55O1xuXHRwcml2YXRlIGJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRvbkluaXQoKSB7XG5cdFx0U2l6ZUhlbHBlci5pbml0KCk7XG5cblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzID0gW107XG5cdH1cblxuXHRnZXRQbGFjZWhvbGRlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5vUGxhY2Vob2xkZXI7XG5cdH1cblx0YXR0YWNoUm91dGVNYXRjaGVycygpIHtcblx0XHR0aGlzLm9QbGFjZWhvbGRlci5hdHRhY2hSb3V0ZU1hdGNoZXJzKCk7XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHR9XG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5fb25BZnRlclJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyID0gdW5kZWZpbmVkO1xuXG5cdFx0U2l6ZUhlbHBlci5leGl0KCk7XG5cblx0XHQvLyBEZXN0cm95IGFsbCBKU09OIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5IGZvciB0aGUgdmlld3Ncblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKG9Nb2RlbDogYW55KSB7XG5cdFx0XHRvTW9kZWwuZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLnJlc291cmNlLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZU1vZGVsIG9mIHRoZSBjb21wb25lbnRcblx0ICovXG5cdGdldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldE1vZGVsKFwiaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHR9XG5cdGdldFJvdXRlcigpIHtcblx0XHRpZiAoIXRoaXMub1JvdXRlcikge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXIoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyO1xuXHR9XG5cblx0X2NyZWF0ZUhlbHBlck1vZGVsKCkge1xuXHRcdC8vIFdlIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5LCBhcyB0aGV5IGRvbid0IGdldCBkZXN0cm95ZWRcblx0XHQvLyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXcgaXMgZGVzdHJveWVkLlxuXHRcdC8vIFRoaXMgaXMgZG9uZSBkdXJpbmcgb25FeGl0XG5cdFx0Y29uc3Qgb01vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdHRoaXMuX2FIZWxwZXJNb2RlbHMucHVzaChvTW9kZWwpO1xuXG5cdFx0cmV0dXJuIG9Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3YWl0aW5nIGZvciB0aGUgUmlnaHQgbW9zdCB2aWV3IHRvIGJlIHJlYWR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBvRXZlbnQgUmVmZXJlbmNlIGFuIEV2ZW50IHBhcmFtZXRlciBjb21pbmcgZnJvbSByb3V0ZU1hdGNoZWQgZXZlbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9XG5cdCAqL1xuXHR3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudDogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgYUNvbnRhaW5lcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIiksXG5cdFx0XHRcdC8vIFRoZXJlIGNhbiBhbHNvIGJlIHJldXNlIGNvbXBvbmVudHMgaW4gdGhlIHZpZXcsIHJlbW92ZSB0aGVtIGJlZm9yZSBwcm9jZXNzaW5nLlxuXHRcdFx0XHRhRkVDb250YWluZXJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUNvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdFx0XHRcdGxldCBvVmlldyA9IG9Db250YWluZXI7XG5cdFx0XHRcdGlmIChvQ29udGFpbmVyICYmIG9Db250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29tcG9uZW50SW5zdGFuY2UgPSBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0b1ZpZXcgPSBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkpIHtcblx0XHRcdFx0XHRhRkVDb250YWluZXJzLnB1c2gob1ZpZXcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9SaWdodE1vc3RGRVZpZXcgPSBhRkVDb250YWluZXJzW2FGRUNvbnRhaW5lcnMubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAob1JpZ2h0TW9zdEZFVmlldyAmJiBvUmlnaHRNb3N0RkVWaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkuaXNQYWdlUmVhZHkoKSkge1xuXHRcdFx0XHRyZXNvbHZlKG9SaWdodE1vc3RGRVZpZXcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1JpZ2h0TW9zdEZFVmlldyAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvUmlnaHRNb3N0RkVWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmUuXG5cdCAqICAtIHVwZGF0ZSB0aGUgc2hlbGwgdGl0bGUuXG5cdCAqICAtIHVwZGF0ZSB0YWJsZSBzY3JvbGwuXG5cdCAqICAtIGNhbGwgb25QYWdlUmVhZHkgb24gdGhlIHJpZ2h0TW9zdFZpZXcuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX29uQWZ0ZXJSb3V0ZU1hdGNoZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqL1xuXHRfb25BZnRlclJvdXRlTWF0Y2hlZChvRXZlbnQ6IGFueSkge1xuXHRcdGlmICghdGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gdGhpcy53YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudClcblx0XHRcdFx0LnRoZW4oKG9WaWV3OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBUaGUgYXV0b0ZvY3VzIGlzIGluaXRpYWxseSBkaXNhYmxlZCBvbiB0aGUgbmF2Q29udGFpbmVyIG9yIHRoZSBGQ0wsIHNvIHRoYXQgdGhlIGZvY3VzIHN0YXlzIG9uIHRoZSBTaGVsbCBtZW51XG5cdFx0XHRcdFx0Ly8gZXZlbiBpZiB0aGUgYXBwIHRha2VzIGEgbG9uZyB0aW1lIHRvIGxhdW5jaFxuXHRcdFx0XHRcdC8vIFRoZSBmaXJzdCB0aW1lIHRoZSB2aWV3IGlzIGRpc3BsYXllZCwgd2UgbmVlZCB0byBlbmFibGUgdGhlIGF1dG9mb2N1cyBzbyB0aGF0IGl0J3MgbWFuYWdlZCBwcm9wZXJseSBkdXJpbmcgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGNvbnN0IG9Sb290Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRlbnQoKVswXSBhcyBhbnk7XG5cdFx0XHRcdFx0aWYgKG9Sb290Q29udHJvbCAmJiBvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzICYmICFvUm9vdENvbnRyb2wuZ2V0QXV0b0ZvY3VzKCkpIHtcblx0XHRcdFx0XHRcdG9Sb290Q29udHJvbC5zZXRQcm9wZXJ0eShcImF1dG9Gb2N1c1wiLCB0cnVlLCB0cnVlKTsgLy8gRG8gbm90IG1hcmsgdGhlIGNvbnRhaW5lciBhcyBpbnZhbGlkLCBvdGhlcndpc2UgaXQncyByZS1yZW5kZXJlZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdHRoaXMuX3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk7XG5cdFx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5VU2hlbGwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NvbXB1dGVUaXRsZUhpZXJhcmNoeShvVmlldyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJGb3JjZUZvY3VzID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmlzRm9jdXNGb3JjZWQoKTtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0Rm9jdXNGb3JjZWQoZmFsc2UpOyAvLyByZXNldFxuXHRcdFx0XHRcdGlmIChvVmlldy5nZXRDb250cm9sbGVyKCkgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpLm9uUGFnZVJlYWR5ICYmIG9WaWV3LmdldFBhcmVudCgpLm9uUGFnZVJlYWR5KSB7XG5cdFx0XHRcdFx0XHRvVmlldy5nZXRQYXJlbnQoKS5vblBhZ2VSZWFkeSh7IGZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5vbkNvbnRhaW5lclJlYWR5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tcHV0aW5nIHRoZSB0aXRsZSBoaWVyYXJjaHkgYW5kIGNhbGxpbmcgZm9jdXMgbWV0aG9kXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSA9IG51bGw7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRpdGxlSGllcmFyY2h5IGNhY2hlICggb3IgaW5pdGlhbGl6ZXMgaXQgaWYgdW5kZWZpbmVkKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXIjX2dldFRpdGxlSGllcmFyY2h5Q2FjaGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBUaGUgVGl0bGVIaWVyYXJjaHkgY2FjaGVcblx0ICovXG5cdF9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCkge1xuXHRcdGlmICghdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSkge1xuXHRcdFx0dGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZSA9IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5vVGl0bGVIaWVyYXJjaHlDYWNoZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0aXRsZUluZm8gb2JqZWN0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSB0aXRsZVxuXHQgKiBAcGFyYW0geyp9IHN1YnRpdGxlXG5cdCAqIEBwYXJhbSB7Kn0gc0ludGVudCBUaGUgaW50ZW50IHBhdGggdG8gYmUgcmVkaXJlY3RlZCB0b1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdGl0bGUgaW5mb3JtYXRpb25cblx0ICovXG5cdF9jb21wdXRlVGl0bGVJbmZvKHRpdGxlOiBhbnksIHN1YnRpdGxlOiBhbnksIHNJbnRlbnQ6IGFueSkge1xuXHRcdGNvbnN0IGFQYXJ0cyA9IHNJbnRlbnQuc3BsaXQoXCIvXCIpO1xuXHRcdGlmIChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLmluZGV4T2YoXCI/XCIpID09PSAtMSkge1xuXHRcdFx0c0ludGVudCArPSBcIj9yZXN0b3JlSGlzdG9yeT10cnVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNJbnRlbnQgKz0gXCImcmVzdG9yZUhpc3Rvcnk9dHJ1ZVwiO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3VidGl0bGU6IHN1YnRpdGxlLFxuXHRcdFx0aW50ZW50OiBzSW50ZW50LFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIEhlYWRlckluZm8gdGl0bGUgZm9yIGEgZ2l2ZW4gcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXRoIFRoZSBwYXRoIHRvIHRoZSBlbnRpdHlcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgdGl0bGUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBIZWFkZXJJbmZvIHRpdGxlIGFubm90YXRpb24gaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRfZmV0Y2hUaXRsZVZhbHVlKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXG5cdFx0Y29uc3Qgc1RpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWVcIiksXG5cdFx0XHR7IGNvbnRleHQ6IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQgfVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1RpdGxlRXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzVGl0bGVFeHByZXNzaW9uKTtcblxuXHRcdGlmIChvVGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRjb25zdCBzVGl0bGVQYXRoID0gb1RpdGxlRXhwcmVzc2lvbi5wYXJ0cyA/IG9UaXRsZUV4cHJlc3Npb24ucGFydHNbMF0ucGF0aCA6IG9UaXRsZUV4cHJlc3Npb24ucGF0aDtcblx0XHRcdGNvbnN0IGZuVGl0bGVGb3JtYXR0ZXIgPSBvVGl0bGVFeHByZXNzaW9uLmZvcm1hdHRlcjtcblx0XHRcdGNvbnN0IG9CaW5kaW5nVmlld0NvbnRleHQgPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpO1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5QmluZGluZyA9IG9Nb2RlbC5iaW5kUHJvcGVydHkoc1RpdGxlUGF0aCwgb0JpbmRpbmdWaWV3Q29udGV4dCk7XG5cblx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuaW5pdGlhbGl6ZSgpO1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RhcmdldFZhbHVlID0gZm5UaXRsZUZvcm1hdHRlciA/IGZuVGl0bGVGb3JtYXR0ZXIob0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogb0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0XHRvUHJvcGVydHlCaW5kaW5nLmRldGFjaENoYW5nZShmbkNoYW5nZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShzVGFyZ2V0VmFsdWUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9Qcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRBcHBTcGVjaWZpY0hhc2goKSB7XG5cdFx0Ly8gSGFzaENoYW5nZWQgaXNTaGVsbE5hdmlnYXRpb25IYXNoQ2hhbmdlclxuXHRcdHJldHVybiAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hcblx0XHRcdD8gKEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkgYXMgYW55KS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblxuXHRfZ2V0SGFzaCgpIHtcblx0XHRyZXR1cm4gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRpdGxlSW5mb3JtYXRpb24gZnJvbSBhIHBhdGguXG5cdCAqIEl0IHVwZGF0ZXMgdGhlIGNhY2hlIHRvIHN0b3JlIFRpdGxlIEluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeVxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNnZXRUaXRsZUluZm9Gcm9tUGF0aFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBzUGF0aCBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIHJldHJpZXZlIHRpdGxlIGluZm9ybWF0aW9uIGZyb20gTWV0YU1vZGVsXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSAgb1RpdGxlaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcHJvbWlzZVxuXHQgKi9cblxuXHRnZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aDogYW55KSB7XG5cdFx0Y29uc3Qgb1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk7XG5cblx0XHRpZiAob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKSB7XG5cdFx0XHQvLyBUaGUgdGl0bGUgaW5mbyBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY2FjaGVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IHNUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVHlwZU5hbWVcIik7XG5cdFx0Y29uc3Qgc0FwcFNwZWNpZmljSGFzaCA9IHRoaXMuX2dldEFwcFNwZWNpZmljSGFzaCgpO1xuXHRcdGNvbnN0IHNJbnRlbnQgPSBzQXBwU3BlY2lmaWNIYXNoICsgc1BhdGguc2xpY2UoMSk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZmV0Y2hUaXRsZVZhbHVlKHNQYXRoKS50aGVuKChzVGl0bGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb1RpdGxlSW5mbyA9IHRoaXMuX2NvbXB1dGVUaXRsZUluZm8oc1R5cGVOYW1lLCBzVGl0bGUsIHNJbnRlbnQpO1xuXHRcdFx0b1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdID0gb1RpdGxlSW5mbztcblx0XHRcdHJldHVybiBvVGl0bGVJbmZvO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgdXNoZWxsIHNlcnZpY2UgcmVjZWl2ZXMgYWxsIGVsZW1lbnRzXG5cdCAqICh0aXRsZSwgc3VidGl0bGUsIGludGVudCwgaWNvbikgYXMgc3RyaW5ncy5cblx0ICpcblx0ICogQW5ub3RhdGlvbiBIZWFkZXJJbmZvIGFsbG93cyBmb3IgYmluZGluZyBvZiB0aXRsZSBhbmQgZGVzY3JpcHRpb25cblx0ICogKHdoaWNoIGFyZSB1c2VkIGhlcmUgYXMgdGl0bGUgYW5kIHN1YnRpdGxlKSB0byBhbnkgZWxlbWVudCBpbiB0aGUgZW50aXR5XG5cdCAqIChiZWluZyBwb3NzaWJseSB0eXBlcyBsaWtlIGJvb2xlYW4sIHRpbWVzdGFtcCwgZG91YmxlLCBldGMuKVxuXHQgKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGhpZXJhcmNoeSBhbmQgY29udmVydHMgbm9uLXN0cmluZyB0eXBlcyB0byBzdHJpbmcuXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gYUhpZXJhcmNoeSBTaGVsbCB0aXRsZSBoaWVyYXJjaHlcblx0ICogQHJldHVybnMgeyp9IENvcHkgb2Ygc2hlbGwgdGl0bGUgaGllcmFyY2h5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGFzIHN0cmluZ3Ncblx0ICovXG5cdF9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MoYUhpZXJhcmNoeTogYW55KSB7XG5cdFx0Y29uc3QgYUhpZXJhcmNoeVNoZWxsID0gW107XG5cdFx0Zm9yIChjb25zdCBsZXZlbCBpbiBhSGllcmFyY2h5KSB7XG5cdFx0XHRjb25zdCBvSGllcmFyY2h5ID0gYUhpZXJhcmNoeVtsZXZlbF07XG5cdFx0XHRjb25zdCBvU2hlbGxIaWVyYXJjaHk6IGFueSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0hpZXJhcmNoeSkge1xuXHRcdFx0XHRvU2hlbGxIaWVyYXJjaHlba2V5XSA9IHR5cGVvZiBvSGllcmFyY2h5W2tleV0gIT09IFwic3RyaW5nXCIgPyBTdHJpbmcob0hpZXJhcmNoeVtrZXldKSA6IG9IaWVyYXJjaHlba2V5XTtcblx0XHRcdH1cblx0XHRcdGFIaWVyYXJjaHlTaGVsbC5wdXNoKG9TaGVsbEhpZXJhcmNoeSk7XG5cdFx0fVxuXHRcdHJldHVybiBhSGllcmFyY2h5U2hlbGw7XG5cdH1cblxuXHRfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoKHNIYXNoOiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRsZXQgc1RhcmdldFR5cGUgPSBcIlwiO1xuXG5cdFx0Y29uc3QgYVJvdXRlcyA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVJvdXRlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRSb3V0ZShhUm91dGVzW2pdLm5hbWUpO1xuXHRcdFx0aWYgKG9Sb3V0ZS5tYXRjaChzSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9IEFycmF5LmlzQXJyYXkoYVJvdXRlc1tqXS50YXJnZXQpID8gYVJvdXRlc1tqXS50YXJnZXRbMF0gOiBhUm91dGVzW2pdLnRhcmdldDtcblx0XHRcdFx0c1RhcmdldFR5cGUgPSAob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQoc1RhcmdldCkgYXMgYW55KS5fb09wdGlvbnMubmFtZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNUYXJnZXRUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXBkYXRpbmcgdGhlIHNoZWxsIHRpdGxlIGFmdGVyIGVhY2ggbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSB7Kn0gb1ZpZXcgVGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyB7Kn0gQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbWVudSBpcyBmaWxsZWQgcHJvcGVybHlcblx0ICovXG5cdF9jb21wdXRlVGl0bGVIaWVyYXJjaHkob1ZpZXc6IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0b0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0N1cnJlbnRQYWdlID0gb1ZpZXcuZ2V0UGFyZW50KCksXG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzID0gW10sXG5cdFx0XHRzQXBwU3BlY2lmaWNIYXNoID0gdGhpcy5fZ2V0QXBwU3BlY2lmaWNIYXNoKCksXG5cdFx0XHRzQXBwVGl0bGUgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIikudGl0bGUgfHwgXCJcIixcblx0XHRcdHNBcHBTdWJUaXRsZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmFwcFwiKS5hcHBTdWJUaXRsZSB8fCBcIlwiO1xuXHRcdGxldCBvUGFnZVRpdGxlSW5mb3JtYXRpb246IGFueSwgc05ld1BhdGg7XG5cblx0XHRpZiAob0N1cnJlbnRQYWdlICYmIG9DdXJyZW50UGFnZS5fZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24pIHtcblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHQvLyBJZiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgYXBwbGljYXRpb24gaXMgYSBMUiwgdXNlIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgZnJvbSB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0aWYgKHRoaXMuX2dldFRhcmdldFR5cGVGcm9tSGFzaChcIlwiKSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnRcIikge1xuXHRcdFx0XHRcdGFUaXRsZUluZm9ybWF0aW9uUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhzQXBwVGl0bGUsIHNBcHBTdWJUaXRsZSwgc0FwcFNwZWNpZmljSGFzaCkpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRoZW4gbWFuYWdlIG90aGVyIHBhZ2VzXG5cdFx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBhUGF0aFBhcnRzID0gc05ld1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXG5cdFx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50IChlbXB0eSBzdHJpbmcpIGFzIGl0IGhhcyBiZWVuIG1hbmFnZWQgYWJvdmVcblx0XHRcdFx0YVBhdGhQYXJ0cy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBsYXN0IHNlZ21lbnQgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcGFnZSBhbmQgc2hvdWxkbid0IGFwcGVhciBpbiB0aGUgbWVudVxuXG5cdFx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaCgoc1BhdGhQYXJ0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRzUGF0aCArPSBcIi9cIiArIHNQYXRoUGFydDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCksXG5cdFx0XHRcdFx0XHRiSXNQYXJhbWV0ZXJpemVkID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhcmFtZXRlclBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRcIik7XG5cdFx0XHRcdFx0aWYgKCFiSXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHRcdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2godGhpcy5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1cnJlbnQgcGFnZVxuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gb0N1cnJlbnRQYWdlLl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpO1xuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlLFxuXHRcdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24uc3VidGl0bGUsXG5cdFx0XHRcdHNBcHBTcGVjaWZpY0hhc2ggKyB0aGlzLl9nZXRIYXNoKClcblx0XHRcdCk7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKClbc05ld1BhdGhdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW3NBcHBTcGVjaWZpY0hhc2hdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZWplY3QoXCJUaXRsZSBpbmZvcm1hdGlvbiBtaXNzaW5nIGluIEhlYWRlckluZm9cIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcylcblx0XHRcdC50aGVuKChhVGl0bGVJbmZvSGllcmFyY2h5OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIGZvciBzaGVsbCB3aGljaCBpcyBleHBlY3RpbmcgYWxsIGVsZW1lbnRzIGJlaW5nIG9mIHR5cGUgc3RyaW5nXG5cdFx0XHRcdGNvbnN0IGFUaXRsZUluZm9IaWVyYXJjaHlTaGVsbCA9IHRoaXMuX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyhhVGl0bGVJbmZvSGllcmFyY2h5KSxcblx0XHRcdFx0XHRzVGl0bGUgPSBvUGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGU7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEhpZXJhcmNoeShhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwucmV2ZXJzZSgpKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0VGl0bGUoc1RpdGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgYWZ0ZXIgYSB2aWV3IGhhcyBiZWVuIGJvdW5kIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHZpZXdcblx0ICovXG5cdG9uQ29udGV4dEJvdW5kVG9WaWV3KG9Db250ZXh0OiBhbnkpIHtcblx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNEZWVwZXN0UGF0aCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCIvZGVlcGVzdFBhdGhcIiksXG5cdFx0XHRcdHNWaWV3Q29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHRcdGlmICghc0RlZXBlc3RQYXRoIHx8IHNEZWVwZXN0UGF0aC5pbmRleE9mKHNWaWV3Q29udGV4dFBhdGgpICE9PSAwKSB7XG5cdFx0XHRcdC8vIFRoZXJlIHdhcyBubyBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIGRlZXBlc3QgcmVhY2hlZCBwYXRoLCBvciB0aGUgcGF0aFxuXHRcdFx0XHQvLyBmb3IgdGhlIHZpZXcgaXNuJ3QgYSBzdWJwYXRoIG9mIHRoZSBwcmV2aW91cyBkZWVwZXN0IHBhdGggLS0+IHVwZGF0ZVxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIsIHNWaWV3Q29udGV4dFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHVwZGF0ZVVJU3RhdGVGb3JWaWV3KG9WaWV3OiBhbnksIEZDTExldmVsOiBhbnkpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTogdm9pZCB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cbn1cbmludGVyZmFjZSBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIge1xuXHRvbkNvbnRhaW5lclJlYWR5PygpOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXI7XG4iXX0=