@sapui5/sap.fe.core 1.95.0 → 1.98.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 (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -0,0 +1,79 @@
1
+ /*!
2
+ * SAPUI5
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
+ */
5
+ sap.ui.define(
6
+ ["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/helpers/MassEditHelper", "sap/base/Log"],
7
+ function(ControllerExtension, OverrideExecution, MassEditHelper, Log) {
8
+ "use strict";
9
+ /**
10
+ * @class Controller extension providing hooks for the mass edit in a table
11
+ *
12
+ * @name sap.fe.core.controllerextensions.MassEdit
13
+ * @hideconstructor
14
+ * @private
15
+ */
16
+ return ControllerExtension.extend("sap.fe.core.controllerextensions.MassEdit", {
17
+ metadata: {
18
+ methods: {
19
+ openMassEditDialog: {
20
+ "final": true,
21
+ "public": true
22
+ },
23
+ fetchContextsForEdit: {
24
+ "final": false,
25
+ "public": false,
26
+ overrideExecution: OverrideExecution.After
27
+ }
28
+ }
29
+ },
30
+
31
+ /**
32
+ * The following operations are performed by method openMassEditDialog:
33
+ * => Opens the mass edit dialog.
34
+ * => Implements the save and cancel functionality.
35
+ * => Sets the runtime model to the dialog.
36
+ * => Sets the static model's context to the dialog.
37
+ *
38
+ * @param {object} oTable Instance of the table
39
+ * @returns {Promise} A promise that resolves on open of the mass edit dialog.
40
+ * @private
41
+ */
42
+ openMassEditDialog: function(oTable) {
43
+ var that = this,
44
+ oController = that.getView().getController(),
45
+ pContextsForEdit = that.fetchContextsForEdit(oTable);
46
+
47
+ return pContextsForEdit
48
+ .then(function(aContexts) {
49
+ if (aContexts && aContexts.length > 0) {
50
+ return MassEditHelper.createDialog(oTable, aContexts, oController);
51
+ }
52
+ })
53
+ .then(function(oDialog) {
54
+ if (oDialog) {
55
+ oDialog.open();
56
+ }
57
+ })
58
+ .catch(function(oError) {
59
+ Log.error("Mass Edit: Something went wrong in mass edit dialog creation.", oError);
60
+ });
61
+ },
62
+
63
+ /**
64
+ * Returns a promise that resolves to the contexts for mass edit.
65
+ * @function
66
+ * @param {string} oTable Table for mass edit.
67
+ * @alias sap.fe.core.contrllerextensions.MassEdit#fetchContextsForEdit
68
+ * @returns {Promise} A promise to be resolved with an array of context(s) which should be considered for mass edit.
69
+ * @private
70
+ **/
71
+ fetchContextsForEdit: function(oTable) {
72
+ //To be overridden by the application
73
+ var aSelectedContexts = oTable.getSelectedContexts();
74
+
75
+ return Promise.resolve(aSelectedContexts);
76
+ }
77
+ });
78
+ }
79
+ );
@@ -1,115 +1,239 @@
1
1
  /*!
2
2
  * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
 
6
- sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/fe/core/actions/messageHandling"], function(
7
- ControllerExtension,
8
- OverrideExecution,
9
- messageHandling
10
- ) {
11
- "use strict";
6
+ sap.ui.define(
7
+ [
8
+ "sap/ui/core/mvc/ControllerExtension",
9
+ "sap/ui/core/mvc/OverrideExecution",
10
+ "sap/fe/core/actions/messageHandling",
11
+ "sap/fe/core/CommonUtils",
12
+ "sap/fe/core/controllerextensions/ControllerExtensionMetadata"
13
+ ],
14
+ function(ControllerExtension, OverrideExecution, messageHandling, CommonUtils, ControllerExtensionMetadata) {
15
+ "use strict";
12
16
 
13
- /**
14
- * @class A controller extension offering message handling.
15
- *
16
- * @name sap.fe.core.controllerextensions.MessageHandler
17
- * @hideconstructor
18
- * @public
19
- * @experimental As of version 1.90.0
20
- * @since 1.90.0
21
- */
22
-
23
- var MessageHandler = ControllerExtension.extend("sap.fe.core.controllerextensions.MessageHandler", {
24
- metadata: {
25
- methods: {
26
- showMessageDialog: { "public": true, "final": true },
27
- getShowBoundMessagesInMessageDialog: { "public": false, "final": false, overrideExecution: OverrideExecution.Instead }
28
- }
29
- },
30
-
31
- /**
32
- * @private
33
- * @name sap.fe.core.controllerextensions.MessageHandler.getMetadata
34
- * @function
35
- */
36
- /**
37
- * @private
38
- * @name sap.fe.core.controllerextensions.MessageHandler.extend
39
- * @function
40
- */
41
17
  /**
42
- * Determines whether or not bound messages are shown in the message dialog.
43
- *
44
- * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
45
- * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
46
- *
47
- * If the bound messages are shown to the user with a different control like the (TODO:Link) MessageButton
48
- * this method has to be overridden.
18
+ * @class A controller extension offering message handling.
49
19
  *
50
- * @returns {boolean} Determines whether or not bound messages are shown in the message dialog.
51
- * @private
52
- */
53
- getShowBoundMessagesInMessageDialog: function() {
54
- return true;
55
- },
56
- // eslint-disable-next-line jsdoc/require-param
57
- /**
58
- * Shows a message dialog with transition messages if there are any.
59
- * The message dialog is shown as a modal dialog. Once the user confirms the dialog, all transition messages
60
- * are removed from the message model. If there is more than one message, a list of messages is shown. The user
61
- * can filter on message types and can display details as well as the long text. If there is one message,
62
- * the dialog immediately shows the details of the message. If there is just one success message, a message
63
- * toast is shown instead.
64
- * @returns {Promise} A promise that is resolved once the user closes the dialog. If there are no messages
65
- * to be shown, the promise is resolved immediately
66
- * @alias sap.fe.core.controllerextensions.MessageHandler#showMessageDialog
20
+ * @name sap.fe.core.controllerextensions.MessageHandler
21
+ * @hideconstructor
67
22
  * @public
68
23
  * @experimental As of version 1.90.0
69
24
  * @since 1.90.0
70
25
  */
71
- showMessageDialog: function(mParameters) {
72
- var customMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : undefined,
73
- oOPInternalBindingContext = this.base.getView().getBindingContext("internal");
74
- // set isActionParameterDialog open so that it can be used in the controller extension to decide whether message dialog should open or not
75
- if (mParameters && mParameters.isActionParameterDialogOpen && oOPInternalBindingContext) {
76
- oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", true);
77
- }
78
- var bShowBoundMessages = this.getShowBoundMessagesInMessageDialog();
79
- var oBindingContext = mParameters && mParameters.context ? mParameters.context : this.getView().getBindingContext();
80
- var bEtagMessage = mParameters && mParameters.bHasEtagMessage;
81
- // reset isActionParameterDialogOpen
82
- // cannot do this operations.js since it is not aware of the view
83
- if (oOPInternalBindingContext) {
84
- oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", false);
85
- }
86
- return new Promise(function(resolve, reject) {
87
- // we have to set a timeout to be able to access the most recent messages
88
- setTimeout(function() {
89
- // TODO: great API - will be changed later
90
- messageHandling
91
- .showUnboundMessages(customMessages, oBindingContext, bEtagMessage, bShowBoundMessages)
92
- .then(resolve)
93
- .catch(reject);
94
- }, 0);
95
- });
96
- },
97
26
 
98
- /**
99
- * You can remove the existing transition message from the message model with this method.
100
- * With every user interaction that causes server communication (like clicking on an action, changing data),
101
- * this method removes the existing transition messages from the message model.
102
- * @param {boolean} keepBoundMessage Checks if the bound transition messages are not to be removed
103
- *
104
- * @alias sap.fe.core.controllerextensions.MessageHandler#removesTransitionMessages
105
- * @private
106
- */
107
- removeTransitionMessages: function(keepBoundMessage) {
108
- if (!keepBoundMessage) {
109
- messageHandling.removeBoundTransitionMessages();
110
- }
111
- messageHandling.removeUnboundTransitionMessages();
112
- }
113
- });
114
- return MessageHandler;
115
- });
27
+ return ControllerExtension.extend(
28
+ "sap.fe.core.controllerextensions.MessageHandler",
29
+ {
30
+ metadata: {
31
+ methods: {
32
+ showMessageDialog: { "public": true, "final": true },
33
+ getShowBoundMessagesInMessageDialog: {
34
+ "public": false,
35
+ "final": false,
36
+ overrideExecution: OverrideExecution.Instead
37
+ }
38
+ }
39
+ },
40
+
41
+ /**
42
+ * @private
43
+ * @name sap.fe.core.controllerextensions.MessageHandler.getMetadata
44
+ * @function
45
+ */
46
+ /**
47
+ * @private
48
+ * @name sap.fe.core.controllerextensions.MessageHandler.extend
49
+ * @function
50
+ */
51
+ /**
52
+ * Determines whether or not bound messages are shown in the message dialog.
53
+ *
54
+ * This function is meant to be individually overridden by consuming controllers, but not to be called directly.
55
+ * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.Instead}.
56
+ *
57
+ * If the bound messages are shown to the user with a different control like the (TODO:Link) MessageButton
58
+ * this method has to be overridden.
59
+ *
60
+ * @returns {boolean} Determines whether or not bound messages are shown in the message dialog.
61
+ * @private
62
+ */
63
+ getShowBoundMessagesInMessageDialog: function() {
64
+ return true;
65
+ },
66
+ // eslint-disable-next-line jsdoc/require-param
67
+ /**
68
+ * Shows a message dialog with transition messages if there are any.
69
+ * The message dialog is shown as a modal dialog. Once the user confirms the dialog, all transition messages
70
+ * are removed from the message model. If there is more than one message, a list of messages is shown. The user
71
+ * can filter on message types and can display details as well as the long text. If there is one message,
72
+ * the dialog immediately shows the details of the message. If there is just one success message, a message
73
+ * toast is shown instead.
74
+ * @returns {Promise} A promise that is resolved once the user closes the dialog. If there are no messages
75
+ * to be shown, the promise is resolved immediately
76
+ * @alias sap.fe.core.controllerextensions.MessageHandler#showMessageDialog
77
+ * @public
78
+ * @experimental As of version 1.90.0
79
+ * @since 1.90.0
80
+ */
81
+ showMessageDialog: function(mParameters) {
82
+ var customMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : undefined,
83
+ oOPInternalBindingContext = this.base.getView().getBindingContext("internal");
84
+ // set isActionParameterDialog open so that it can be used in the controller extension to decide whether message dialog should open or not
85
+ if (mParameters && mParameters.isActionParameterDialogOpen && oOPInternalBindingContext) {
86
+ oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", true);
87
+ }
88
+ var bShowBoundMessages = this.getShowBoundMessagesInMessageDialog();
89
+ var oBindingContext = mParameters && mParameters.context ? mParameters.context : this.getView().getBindingContext();
90
+ var bEtagMessage = mParameters && mParameters.bHasEtagMessage;
91
+ // reset isActionParameterDialogOpen
92
+ // cannot do this operations.js since it is not aware of the view
93
+ if (oOPInternalBindingContext) {
94
+ oOPInternalBindingContext.setProperty("isActionParameterDialogOpen", false);
95
+ }
96
+ return new Promise(function(resolve, reject) {
97
+ // we have to set a timeout to be able to access the most recent messages
98
+ setTimeout(function() {
99
+ // TODO: great API - will be changed later
100
+ messageHandling
101
+ .showUnboundMessages(customMessages, oBindingContext, bEtagMessage, bShowBoundMessages)
102
+ .then(resolve)
103
+ .catch(reject);
104
+ }, 0);
105
+ });
106
+ },
107
+
108
+ /**
109
+ * You can remove the existing transition message from the message model with this method.
110
+ * With every user interaction that causes server communication (like clicking on an action, changing data),
111
+ * this method removes the existing transition messages from the message model.
112
+ * @param {boolean} keepBoundMessage Checks if the bound transition messages are not to be removed
113
+ *
114
+ * @alias sap.fe.core.controllerextensions.MessageHandler#removesTransitionMessages
115
+ * @private
116
+ */
117
+ removeTransitionMessages: function(keepBoundMessage) {
118
+ if (!keepBoundMessage) {
119
+ messageHandling.removeBoundTransitionMessages();
120
+ }
121
+ messageHandling.removeUnboundTransitionMessages();
122
+ },
123
+
124
+ _checkNavigationToMessagePage: function(mParameters) {
125
+ var aUnboundMessages = messageHandling.getMessages(),
126
+ bShowBoundTransitionMessages = this.getShowBoundMessagesInMessageDialog(),
127
+ aBoundTransitionMessages = bShowBoundTransitionMessages ? messageHandling.getMessages(true, true) : [],
128
+ aCustomMessages = mParameters && mParameters.customMessages ? mParameters.customMessages : [],
129
+ bIsStickyEditMode = CommonUtils.isStickyEditMode(this.base.getView()),
130
+ mMessagePageParameters;
131
+
132
+ // TODO: Stick mode check is okay as long as the controller extension is used with sap.fe.core and sap.fe.core.AppComponent.
133
+ // It might be better to provide an extension to the consumer of the controller extension to provide this value.
134
+
135
+ // The message page can only show 1 message today, so we navigate to it when :
136
+ // 1. There are no bound transition messages to show,
137
+ // 2. There are no custom messages to show, &
138
+ // 3. There is exactly 1 unbound message in the message model with statusCode=503 and retry-After available
139
+ // 4. retryAfter is greater than 120 seconds
140
+ //
141
+ // In Addition, navigating away from a sticky session will destroy the session so we do not navigate to message page for now.
142
+ // TODO: check if navigation should be done in sticky edit mode.
143
+ if (
144
+ !bIsStickyEditMode &&
145
+ !aBoundTransitionMessages.length &&
146
+ !aCustomMessages.length &&
147
+ aUnboundMessages.length === 1
148
+ ) {
149
+ var oMessage = aUnboundMessages[0],
150
+ oTechnicalDetails = oMessage.getTechnicalDetails();
151
+ var sRetryAfterMessage;
152
+ if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503) {
153
+ if (oTechnicalDetails.retryAfter) {
154
+ var iSecondsBeforeRetry = this._getSecondsBeforeRetryAfter(oTechnicalDetails.retryAfter);
155
+ if (iSecondsBeforeRetry > 120) {
156
+ // TODO: For now let's keep getRetryAfterMessage in messageHandling because it is needed also by the dialog.
157
+ // We can plan to move this and the dialog logic both to messageHandler controller extension if required.
158
+ sRetryAfterMessage = messageHandling.getRetryAfterMessage(oMessage);
159
+ mMessagePageParameters = {
160
+ description: sRetryAfterMessage
161
+ ? sRetryAfterMessage + " " + oMessage.getMessage()
162
+ : oMessage.getMessage(),
163
+ navigateBackToOrigin: true
164
+ };
165
+ }
166
+ } else {
167
+ sRetryAfterMessage = messageHandling.getRetryAfterMessage(oMessage);
168
+ mMessagePageParameters = {
169
+ description: sRetryAfterMessage
170
+ ? sRetryAfterMessage + " " + oMessage.getMessage()
171
+ : oMessage.getMessage(),
172
+ navigateBackToOrigin: true
173
+ };
174
+ }
175
+ }
176
+ }
177
+ return mMessagePageParameters;
178
+ },
179
+
180
+ _getSecondsBeforeRetryAfter: function(dRetryAfter) {
181
+ var dCurrentDateTime = new Date(),
182
+ iCurrentDateTimeInMilliSeconds = dCurrentDateTime.getTime(),
183
+ iRetryAfterDateTimeInMilliSeconds = dRetryAfter.getTime(),
184
+ iSecondsBeforeRetry = (iRetryAfterDateTimeInMilliSeconds - iCurrentDateTimeInMilliSeconds) / 1000;
185
+ return iSecondsBeforeRetry;
186
+ },
187
+ /**
188
+ * Shows a message page or a message dialog based on the messages in the message dialog.
189
+ * @param mParameters
190
+ * @returns {Promise} A promise that is resolved once the user closes the message dialog or when navigation to the message page is complete. If there are no messages
191
+ * to be shown, the promise is resolved immediately
192
+ * @private
193
+ */
194
+ showMessages: function(mParameters) {
195
+ var oAppComponent = CommonUtils.getAppComponent(this.getView());
196
+ var mMessagePageParameters;
197
+ if (!oAppComponent._isFclEnabled()) {
198
+ mMessagePageParameters = this._checkNavigationToMessagePage(mParameters);
199
+ }
200
+ if (mMessagePageParameters) {
201
+ // navigate to message page.
202
+ // handler before page navigation is triggered, for example to close the action parameter dialog
203
+ mParameters && mParameters.messagePageNavigationCallback && mParameters.messagePageNavigationCallback();
204
+
205
+ mMessagePageParameters.handleShellBack = true;
206
+ // TODO: Use Illustrated message instead of normal message page
207
+ // TODO: Return value needs to provided but since this function is private for now hence we can skip this.
208
+ this.removeTransitionMessages();
209
+ var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
210
+ if (this.base._routing) {
211
+ return new Promise(
212
+ function(resolve, reject) {
213
+ // we have to set a timeout to be able to access the most recent messages
214
+ setTimeout(
215
+ function() {
216
+ // TODO: great API - will be changed later
217
+ this.base._routing
218
+ .navigateToMessagePage(
219
+ oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE"),
220
+ mMessagePageParameters
221
+ )
222
+ .then(resolve)
223
+ .catch(reject);
224
+ }.bind(this),
225
+ 0
226
+ );
227
+ }.bind(this)
228
+ );
229
+ }
230
+ } else {
231
+ // navigate to message dialog
232
+ return this.showMessageDialog(mParameters);
233
+ }
234
+ }
235
+ },
236
+ ControllerExtensionMetadata
237
+ );
238
+ }
239
+ );
@@ -26,7 +26,7 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
26
26
 
27
27
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
28
28
 
29
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
29
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
30
30
 
31
31
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
32
32
 
@@ -414,4 +414,4 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideE
414
414
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitFor", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitFor"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "isPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "waitPageReady", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "waitPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEventOnce", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEventOnce"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "attachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "attachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "detachEvent", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "detachEvent"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isContextExpected", [Private, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "isContextExpected"), _class2.prototype)), _class2)) || _class);
415
415
  return PageReadyControllerExtension;
416
416
  }, false);
417
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9iU2VhY2hUcmlnZ2VyZWQiLCJfb0V2ZW50UHJvdmlkZXIiLCJFdmVudFByb3ZpZGVyIiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29QYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJhdHRhY2hDb250YWluZXJEZWZpbmVkIiwib0V2ZW50IiwicmVnaXN0ZXJDb250YWluZXIiLCJnZXRQYXJhbWV0ZXIiLCJvUGxhY2Vob2xkZXIiLCJnZXRSb290Q29udHJvbCIsImdldENvbnRyb2xsZXIiLCJnZXRQbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJEZWJ1Z0VuYWJsZWQiLCJhdHRhY2hFdmVudCIsImdldFBsYWNlaG9sZGVyRGVidWdTdGF0cyIsImlQYWdlUmVhZHlFdmVudFRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJpSGVyb2VzQmF0Y2hSZWNlaXZlZEV2ZW50VGltZXN0YW1wIiwiX29Db250YWluZXIiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiX2ZuQ29udGFpbmVyRGVsZWdhdGUiLCJvUHJvbWlzZSIsImZpbmFsbHkiLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJfYklzUGFnZVJlYWR5IiwiY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQiLCJvQmluZGluZ0NvbnRleHQiLCJfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkIiwiYUJvdW5kRWxlbWVudHMiLCJhTm90Qm91bmRNRENUYWJsZXMiLCJpUmVxdWVzdGVkIiwiaVJlY2VpdmVkIiwiZm5SZXF1ZXN0ZWQiLCJnZXRTb3VyY2UiLCJkZXRhY2hEYXRhUmVxdWVzdGVkIiwiYkRhdGFSZWNlaXZlZCIsImZuUmVjZWl2ZWQiLCJzR3JvdXBJZCIsImZpcmVFdmVudCIsImRldGFjaERhdGFSZWNlaXZlZCIsImZuU2VhcmNoIiwiYU1EQ1RhYmxlcyIsImZpbHRlciIsIm9FbGVtIiwic0lkIiwiZ2V0RmlsdGVyIiwiZ2V0VmlzaWJsZSIsImxlbmd0aCIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsImF0dGFjaEV2ZW50T25jZSIsImlzQ29udGV4dEV4cGVjdGVkIiwidW5kZWZpbmVkIiwiYkhhc0NvbnRleHQiLCJvRWxlbWVudCIsImRldGFjaEV2ZW50IiwibWFpbk9iamVjdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcyIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9PYmplY3RCaW5kaW5nIiwiZ2V0T2JqZWN0QmluZGluZyIsImFCaW5kaW5nS2V5cyIsIk9iamVjdCIsImtleXMiLCJtQmluZGluZ0luZm9zIiwic1Byb3BlcnR5TmFtZSIsIm9MaXN0QmluZGluZyIsImJpbmRpbmciLCJpc0EiLCJiVGFibGVzTG9hZGVkIiwiaW5pdGlhbGl6ZWQiLCJ0aGVuIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJQcm9taXNlIiwiYWxsIiwiaW5mbyIsInJlc29sdmUiLCJpc1BhZ2VSZWFkeSIsInNFdmVudElkIiwib0RhdGEiLCJmbkZ1bmN0aW9uIiwib0xpc3RlbmVyIiwib0NvbnRhaW5lciIsIm9uQmVmb3JlU2hvdyIsImJTaG93biIsIm9uQmVmb3JlSGlkZSIsIm9uQWZ0ZXJTaG93IiwiX2NoZWNrUGFnZVJlYWR5IiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeVRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiYkZyb21OYXYiLCJmblVJVXBkYXRlZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldFVJRGlydHkiLCJfYldhaXRpbmdGb3JSZWZyZXNoIiwiY2hlY2tVSVVwZGF0ZWQiLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlIiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIlB1YmxpYyIsIkZpbmFsIiwiUHJpdmF0ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFTTUEsNEIsV0FETEMsUUFBUSxDQUFDLDRDQUFELEVBQStDQywyQkFBL0MsQyxVQW9CUEMsUUFBUSxFLFVBdUNSQSxRQUFRLEUsVUFvQlJBLFFBQVEsQ0FBQyxVQUFELEMsVUFJUkEsUUFBUSxDQUFDLFVBQUQsQyxVQUtSQSxRQUFRLENBQUMsVUFBRCxDLFVBOE5SQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxPQUFuQixDOzs7Ozs7Ozs7Ozs7O2FBbFNYLGtCQUNnQjtBQUFBOztBQUNmLGFBQUtDLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDQSxhQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtBQUNBLGFBQUtDLGVBQUwsR0FBdUIsS0FBS0EsZUFBTCxHQUF1QixLQUFLQSxlQUE1QixHQUE4QyxJQUFJQyxhQUFKLEVBQXJFO0FBQ0EsYUFBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLGFBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLGFBQUtNLGVBQUwsR0FBdUJDLFNBQVMsQ0FBQ0Msb0JBQVYsQ0FBK0IsS0FBS1IsTUFBcEMsQ0FBdkI7O0FBRUEsWUFBSSxLQUFLTSxlQUFMLElBQXdCLEtBQUtBLGVBQUwsQ0FBcUJHLHNCQUFqRCxFQUF5RTtBQUN4RSxlQUFLSCxlQUFMLENBQXFC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QixDQUE2QixXQUE3QixFQUEwQzBGLFdBQTFDO0FBQ0EvRSxZQUFBQSxVQUFVLENBQUNxRixjQUFELEVBQWlCLEdBQWpCLENBQVY7QUFDQSxXQU5ELE1BTU8sSUFDTCxDQUFDLEtBQUtELG1CQUFOLElBQTZCSixHQUFHLENBQUNDLEVBQUosQ0FBT0MsT0FBUCxHQUFpQkMsVUFBakIsRUFBOUIsSUFDQSxLQUFLcEgsUUFBTCxLQUFrQixDQURsQixJQUVBdUgsMkJBQTJCLENBQUNDLCtCQUE1QixLQUFnRSxDQUZoRSxJQUdBLEtBQUt2SCxnQkFKQyxFQUtMO0FBQ0QsaUJBQUtvSCxtQkFBTCxHQUEyQixJQUEzQjtBQUNBSixZQUFBQSxHQUFHLENBQUNDLEVBQUosQ0FBT0MsT0FBUCxHQUFpQjdGLFdBQWpCLENBQTZCLFdBQTdCLEVBQTBDMEYsV0FBMUM7QUFDQS9FLFlBQUFBLFVBQVUsQ0FBQ3FGLGNBQUQsRUFBaUIsR0FBakIsQ0FBVjtBQUNBLFdBVE0sTUFTQSxJQUFJLENBQUMsS0FBS0QsbUJBQVYsRUFBK0I7QUFDckM7QUFDQTtBQUNBLGlCQUFLbEYsYUFBTCxHQUFxQixJQUFyQjs7QUFDQSxpQkFBS2pDLGVBQUwsQ0FBcUIrQyxTQUFyQixDQUErQixXQUEvQjtBQUNBO0FBQ0Q7QUFDRDs7OztJQXRYeUN3RSxtQixpV0FrRXpDQyxNLEVBQ0FDLEsseW9CQW1MQUQsTSxFQUNBQyxLLHlKQUtBRCxNLEVBQ0FDLEssNkpBa0JBRCxNLEVBQ0FDLEssMkpBS0FELE0sRUFDQUMsSyx1SkFLQUQsTSxFQUNBQyxLLDZKQXdCQUMsTztTQXFFYW5JLDRCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uLCBPdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvdWkvY29yZS9tdmNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBBcHBDb21wb25lbnQsIENvbW1vblV0aWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBNYW5hZ2VkT2JqZWN0LCBFdmVudFByb3ZpZGVyIH0gZnJvbSBcInNhcC91aS9iYXNlXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIEV4dGVuc2libGUsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlc1wiO1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5QYWdlUmVhZHlcIiwgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhKVxuY2xhc3MgUGFnZVJlYWR5Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vRXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogYW55O1xuXHRwcml2YXRlIF9vQ29udGFpbmVyITogYW55O1xuXHRwcml2YXRlIF9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQhOiBib29sZWFuO1xuXHRwcml2YXRlIF9mbkNvbnRhaW5lckRlbGVnYXRlOiBhbnk7XG5cdHByaXZhdGUgX25iV2FpdHMhOiBudW1iZXI7XG5cdHByaXZhdGUgX2JTZWFjaFRyaWdnZXJlZCE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JJc1BhZ2VSZWFkeSE6IGJvb2xlYW47XG5cdHByaXZhdGUgX2JXYWl0aW5nRm9yUmVmcmVzaCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYlNob3duITogYm9vbGVhbjtcblx0cHJpdmF0ZSBiSGFzQ29udGV4dCE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkRhdGFSZWNlaXZlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBiVGFibGVzTG9hZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHBhZ2VSZWFkeVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBfb1RlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTogYW55O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fbmJXYWl0cyA9IDA7XG5cdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkID0gZmFsc2U7XG5cdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIgPSB0aGlzLl9vRXZlbnRQcm92aWRlciA/IHRoaXMuX29FdmVudFByb3ZpZGVyIDogbmV3IEV2ZW50UHJvdmlkZXIoKTtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpO1xuXG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmF0dGFjaENvbnRhaW5lckRlZmluZWQpIHtcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmF0dGFjaENvbnRhaW5lckRlZmluZWQoKG9FdmVudDogVUk1RXZlbnQpID0+IHRoaXMucmVnaXN0ZXJDb250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRhaW5lclwiKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnJlZ2lzdGVyQ29udGFpbmVyKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRjb25zdCBvUGxhY2Vob2xkZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0Um9vdENvbnRyb2woKVxuXHRcdFx0LmdldENvbnRyb2xsZXIoKVxuXHRcdFx0LmdldFBsYWNlaG9sZGVyKCk7XG5cdFx0aWYgKG9QbGFjZWhvbGRlci5pc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRvUGxhY2Vob2xkZXIuZ2V0UGxhY2Vob2xkZXJEZWJ1Z1N0YXRzKCkuaVBhZ2VSZWFkeUV2ZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpc1xuXHRcdFx0KTtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0b1BsYWNlaG9sZGVyLmdldFBsYWNlaG9sZGVyRGVidWdTdGF0cygpLmlIZXJvZXNCYXRjaFJlY2VpdmVkRXZlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIXRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCkge1xuXHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gdHJ1ZTtcblx0XHRcdGxldCBhQm91bmRFbGVtZW50czogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IGFOb3RCb3VuZE1EQ1RhYmxlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBpUmVxdWVzdGVkID0gMDtcblx0XHRcdGxldCBpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0Y29uc3QgZm5SZXF1ZXN0ZWQgPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdGlSZXF1ZXN0ZWQrKztcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5SZWNlaXZlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdHN3aXRjaCAob0V2ZW50LmdldFNvdXJjZSgpLnNHcm91cElkKSB7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLldvcmtlcnNcIjpcblx0XHRcdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcIndvcmtlcnNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIiRhdXRvLkhlcm9lc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdH1cblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmRldGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0aVJlY2VpdmVkKys7XG5cdFx0XHRcdGlmIChpUmVjZWl2ZWQgPj0gaVJlcXVlc3RlZCAmJiBpUmVxdWVzdGVkICE9PSAwKSB7XG5cdFx0XHRcdFx0aVJlcXVlc3RlZCA9IDA7XG5cdFx0XHRcdFx0aVJlY2VpdmVkID0gMDtcblx0XHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGZuU2VhcmNoID0gKG9FdmVudDogVUk1RXZlbnQpID0+IHtcblx0XHRcdFx0Y29uc3QgYU1EQ1RhYmxlcyA9IGFOb3RCb3VuZE1EQ1RhYmxlcy5maWx0ZXIob0VsZW0gPT4ge1xuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuc0lkID09PSBvRWxlbS5nZXRGaWx0ZXIoKSAmJiBvRWxlbS5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoYU1EQ1RhYmxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhTURDVGFibGVzLmZvckVhY2goKG9NRENUYWJsZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBmbkF0dGFjaERhdGFFdmVudHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZCgob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0Zm5SZWNlaXZlZChvRXZlbnQpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGZuQXR0YWNoRGF0YUV2ZW50cygpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvTURDVGFibGUuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFx0XHRcImJpbmRpbmdVcGRhdGVkXCIsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRvUm93QmluZGluZyA9IG9NRENUYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG51bGxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIEZvcmNlIHRvIG1lbnRpb24gd2UgYXJlIGV4cGVjdGluZyBkYXRhXG5cdFx0XHRcdHRoaXMuYkhhc0NvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcInBhZ2VSZWFkeVwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVxdWVzdGVkXCIsIGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0XHRcdG9FbGVtZW50LmRldGFjaEV2ZW50KFwiZGF0YVJlY2VpdmVkXCIsIGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMuX2JBZnRlckJpbmRpbmdBbHJlYWR5QXBwbGllZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzID0gW107XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG1haW5PYmplY3RCaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdG1haW5PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChtYWluT2JqZWN0QmluZGluZyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cdFx0XHR0aGlzLl9vVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9FbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgb09iamVjdEJpbmRpbmcgPSBvRWxlbWVudC5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdGlmIChvT2JqZWN0QmluZGluZykge1xuXHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBvYmplY3QgYmluZGluZyAobW9zdGx5IHVzZWQgb24gb2JqZWN0IHBhZ2VzKVxuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdG9PYmplY3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9PYmplY3RCaW5kaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBhQmluZGluZ0tleXMgPSBPYmplY3Qua2V5cyhvRWxlbWVudC5tQmluZGluZ0luZm9zKTtcblx0XHRcdFx0XHRpZiAoYUJpbmRpbmdLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFCaW5kaW5nS2V5cy5mb3JFYWNoKHNQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvRWxlbWVudC5tQmluZGluZ0luZm9zW3NQcm9wZXJ0eU5hbWVdLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHRcdC8vIFJlZ2lzdGVyIG9uIGFsbCBsaXN0IGJpbmRpbmcsIGdvb2QgZm9yIGJhc2ljIHRhYmxlcywgcHJvYmxlbWF0aWMgZm9yIE1EQywgc2VlIGFib3ZlXG5cdFx0XHRcdFx0XHRcdGlmIChvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdG9MaXN0QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhpcyBpcyBkaXJ0eSBidXQgTURDIFRhYmxlIGhhcyBhIHdlaXJkIGxvYWRpbmcgbGlmZWN5Y2xlXG5cdFx0XHRcdGlmIChvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRcdGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdG9FbGVtZW50XG5cdFx0XHRcdFx0XHRcdC5pbml0aWFsaXplZCgpXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtZW50LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMucHVzaChvUm93QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFOb3RCb3VuZE1EQ1RhYmxlcy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGZpbmQgYSBib3VuZCB0YWJsZVwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9FbGVtZW50LmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbHRlckJhclwiKSkge1xuXHRcdFx0XHRcdG9FbGVtZW50LmF0dGFjaEV2ZW50KFwic2VhcmNoXCIsIGZuU2VhcmNoKTtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFByb21pc2UuYWxsKGFUYWJsZUluaXRpYWxpemVkUHJvbWlzZXMpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCBvbmUgb3IgbXVsdGlwbGUgdGFibGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGlzUGFnZVJlYWR5KCkge1xuXHRcdHJldHVybiB0aGlzLl9iSXNQYWdlUmVhZHk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgd2FpdFBhZ2VSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5pc1BhZ2VSZWFkeSgpKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRXZlbnRPbmNlKFxuXHRcdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0aGlzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkOiBzdHJpbmcsIG9EYXRhOiBhbnksIGZuRnVuY3Rpb246IEZ1bmN0aW9uLCBvTGlzdGVuZXI6IGFueSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0XHRyZXR1cm4gdGhpcy5fb0V2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnRPbmNlKHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgYXR0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChzRXZlbnRJZCwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGRldGFjaEV2ZW50KHNFdmVudElkOiBzdHJpbmcsIGZuRnVuY3Rpb246IEZ1bmN0aW9uKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5kZXRhY2hFdmVudChzRXZlbnRJZCwgZm5GdW5jdGlvbik7XG5cdH1cblx0cHJpdmF0ZSByZWdpc3RlckNvbnRhaW5lcihvQ29udGFpbmVyOiBNYW5hZ2VkT2JqZWN0KSB7XG5cdFx0dGhpcy5fb0NvbnRhaW5lciA9IG9Db250YWluZXI7XG5cdFx0dGhpcy5fZm5Db250YWluZXJEZWxlZ2F0ZSA9IHtcblx0XHRcdG9uQmVmb3JlU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkJlZm9yZUhpZGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0b25BZnRlclNob3c6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5iU2hvd24gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSh0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRoaXMuX29Db250YWluZXIuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQcml2YXRlXG5cdEBFeHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdHB1YmxpYyBpc0NvbnRleHRFeHBlY3RlZCgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKSB7XG5cdFx0aWYgKHRoaXMucGFnZVJlYWR5VGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnBhZ2VSZWFkeVRpbWVyKTtcblx0XHR9XG5cdFx0dGhpcy5wYWdlUmVhZHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHR9LCAyMDApO1xuXHR9XG5cblx0cHVibGljIF9jaGVja1BhZ2VSZWFkeShiRnJvbU5hdjogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgZm5VSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHQvLyBXYWl0IHVudGlsIHRoZSBVSSBpcyBubyBsb25nZXIgZGlydHlcblx0XHRcdGlmICghc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5kZXRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0XHR9LCAyMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEluIGNhc2UgVUlVcGRhdGUgZG9lcyBub3QgZ2V0IGNhbGxlZCwgY2hlY2sgaWYgVUkgaXMgbm90IGRpcnR5IGFuZCB0aGVuIGNhbGwgX2NoZWNrUGFnZVJlYWR5XG5cdFx0Y29uc3QgY2hlY2tVSVVwZGF0ZWQgPSAoKSA9PiB7XG5cdFx0XHRpZiAoc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IGZhbHNlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fY2hlY2tQYWdlUmVhZHkoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5iU2hvd24gJiZcblx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCAhPT0gZmFsc2UgJiZcblx0XHRcdHRoaXMuYlRhYmxlc0xvYWRlZCAhPT0gZmFsc2UgJiZcblx0XHRcdCghdGhpcy5pc0NvbnRleHRFeHBlY3RlZCgpIHx8IHRoaXMuYkhhc0NvbnRleHQpIC8vIEVpdGhlciBubyBjb250ZXh0IGlzIGV4cGVjdGVkIG9yIHRoZXJlIGlzIG9uZVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuYkRhdGFSZWNlaXZlZCA9PT0gdHJ1ZSAmJiAhYkZyb21OYXYgJiYgIXRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCAmJiBzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHQvLyBJZiB3ZSByZXF1ZXN0ZWQgZGF0YSB3ZSBnZXQgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBhcnJpdmVkLCBzbyBiZWZvcmUgdGhlIG5leHQgcmVuZGVyaW5nIHRpY2tcblx0XHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggPSB0cnVlO1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmF0dGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0c2V0VGltZW91dChjaGVja1VJVXBkYXRlZCwgNTAwKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdCghdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoICYmIHNhcC51aS5nZXRDb3JlKCkuZ2V0VUlEaXJ0eSgpKSB8fFxuXHRcdFx0XHR0aGlzLl9uYldhaXRzICE9PSAwIHx8XG5cdFx0XHRcdFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS5nZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlKCkgPiAwIHx8XG5cdFx0XHRcdHRoaXMuX2JTZWFjaFRyaWdnZXJlZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IHRydWU7XG5cdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoKSB7XG5cdFx0XHRcdC8vIEluIHRoZSBjYXNlIHdlJ3JlIG5vdCB3YWl0aW5nIGZvciBhbnkgZGF0YSAobmF2aWdhdGluZyBiYWNrIHRvIGEgcGFnZSB3ZSBhbHJlYWR5IGhhdmUgbG9hZGVkKVxuXHRcdFx0XHQvLyBqdXN0IHdhaXQgZm9yIGEgZnJhbWUgdG8gZmlyZSB0aGUgZXZlbnQuXG5cdFx0XHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX29FdmVudFByb3ZpZGVyLmZpcmVFdmVudChcInBhZ2VSZWFkeVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFnZVJlYWR5Q29udHJvbGxlckV4dGVuc2lvbjtcbiJdfQ==
417
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBhZ2VSZWFkeS50cyJdLCJuYW1lcyI6WyJQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uIiwiVUk1Q2xhc3MiLCJDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEiLCJPdmVycmlkZSIsIkV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkluc3RlYWQiLCJfbmJXYWl0cyIsIl9iU2VhY2hUcmlnZ2VyZWQiLCJfb0V2ZW50UHJvdmlkZXIiLCJFdmVudFByb3ZpZGVyIiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29QYWdlQ29tcG9uZW50IiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJhdHRhY2hDb250YWluZXJEZWZpbmVkIiwib0V2ZW50IiwicmVnaXN0ZXJDb250YWluZXIiLCJnZXRQYXJhbWV0ZXIiLCJvUGxhY2Vob2xkZXIiLCJnZXRSb290Q29udHJvbCIsImdldENvbnRyb2xsZXIiLCJnZXRQbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJEZWJ1Z0VuYWJsZWQiLCJhdHRhY2hFdmVudCIsImdldFBsYWNlaG9sZGVyRGVidWdTdGF0cyIsImlQYWdlUmVhZHlFdmVudFRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJpSGVyb2VzQmF0Y2hSZWNlaXZlZEV2ZW50VGltZXN0YW1wIiwiX29Db250YWluZXIiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiX2ZuQ29udGFpbmVyRGVsZWdhdGUiLCJvUHJvbWlzZSIsImZpbmFsbHkiLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJfYklzUGFnZVJlYWR5IiwiY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQiLCJvQmluZGluZ0NvbnRleHQiLCJfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkIiwiYUJvdW5kRWxlbWVudHMiLCJhTm90Qm91bmRNRENUYWJsZXMiLCJpUmVxdWVzdGVkIiwiaVJlY2VpdmVkIiwiZm5SZXF1ZXN0ZWQiLCJnZXRTb3VyY2UiLCJkZXRhY2hEYXRhUmVxdWVzdGVkIiwiYkRhdGFSZWNlaXZlZCIsImZuUmVjZWl2ZWQiLCJzR3JvdXBJZCIsImZpcmVFdmVudCIsImRldGFjaERhdGFSZWNlaXZlZCIsImZuU2VhcmNoIiwiYU1EQ1RhYmxlcyIsImZpbHRlciIsIm9FbGVtIiwic0lkIiwiZ2V0RmlsdGVyIiwiZ2V0VmlzaWJsZSIsImxlbmd0aCIsImZvckVhY2giLCJvTURDVGFibGUiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJmbkF0dGFjaERhdGFFdmVudHMiLCJhdHRhY2hEYXRhUmVxdWVzdGVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwicHVzaCIsImF0dGFjaEV2ZW50T25jZSIsImlzQ29udGV4dEV4cGVjdGVkIiwidW5kZWZpbmVkIiwiYkhhc0NvbnRleHQiLCJvRWxlbWVudCIsImRldGFjaEV2ZW50IiwibWFpbk9iamVjdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcyIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9PYmplY3RCaW5kaW5nIiwiZ2V0T2JqZWN0QmluZGluZyIsImFCaW5kaW5nS2V5cyIsIk9iamVjdCIsImtleXMiLCJtQmluZGluZ0luZm9zIiwic1Byb3BlcnR5TmFtZSIsIm9MaXN0QmluZGluZyIsImJpbmRpbmciLCJpc0EiLCJiVGFibGVzTG9hZGVkIiwiaW5pdGlhbGl6ZWQiLCJ0aGVuIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJQcm9taXNlIiwiYWxsIiwiaW5mbyIsInJlc29sdmUiLCJpc1BhZ2VSZWFkeSIsInNFdmVudElkIiwib0RhdGEiLCJmbkZ1bmN0aW9uIiwib0xpc3RlbmVyIiwib0NvbnRhaW5lciIsIm9uQmVmb3JlU2hvdyIsImJTaG93biIsIm9uQmVmb3JlSGlkZSIsIm9uQWZ0ZXJTaG93IiwiX2NoZWNrUGFnZVJlYWR5IiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeVRpbWVyIiwiY2xlYXJUaW1lb3V0IiwiYkZyb21OYXYiLCJmblVJVXBkYXRlZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldFVJRGlydHkiLCJfYldhaXRpbmdGb3JSZWZyZXNoIiwiY2hlY2tVSVVwZGF0ZWQiLCJUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkiLCJnZXROdW1iZXJPZlZpZXdzSW5DcmVhdGlvblN0YXRlIiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIlB1YmxpYyIsIkZpbmFsIiwiUHJpdmF0ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFTTUEsNEIsV0FETEMsUUFBUSxDQUFDLDRDQUFELEVBQStDQywyQkFBL0MsQyxVQW1CUEMsUUFBUSxFLFVBb0NSQSxRQUFRLEUsVUFvQlJBLFFBQVEsQ0FBQyxVQUFELEMsVUFJUkEsUUFBUSxDQUFDLFVBQUQsQyxVQUtSQSxRQUFRLENBQUMsVUFBRCxDLFVBOE5SQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxPQUFuQixDOzs7Ozs7Ozs7Ozs7O2FBL1JYLGtCQUNnQjtBQUFBOztBQUNmLGFBQUtDLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDQSxhQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtBQUNBLGFBQUtDLGVBQUwsR0FBdUIsS0FBS0EsZUFBTCxHQUF1QixLQUFLQSxlQUE1QixHQUE4QyxJQUFJQyxhQUFKLEVBQXJFO0FBQ0EsYUFBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLGFBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLGFBQUtNLGVBQUwsR0FBdUJDLFNBQVMsQ0FBQ0Msb0JBQVYsQ0FBK0IsS0FBS1IsTUFBcEMsQ0FBdkI7O0FBRUEsWUFBSSxLQUFLTSxlQUFMLElBQXdCLEtBQUtBLGVBQUwsQ0FBcUJHLHNCQUFqRCxFQUF5RTtBQUN4RSxlQUFLSCxlQUFMLENBQXFC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QWlCN0YsV0FBakIsQ0FBNkIsV0FBN0IsRUFBMEMwRixXQUExQztBQUNBL0UsWUFBQUEsVUFBVSxDQUFDcUYsY0FBRCxFQUFpQixHQUFqQixDQUFWO0FBQ0EsV0FORCxNQU1PLElBQ0wsQ0FBQyxLQUFLRCxtQkFBTixJQUE2QkosR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJDLFVBQWpCLEVBQTlCLElBQ0EsS0FBS3BILFFBQUwsS0FBa0IsQ0FEbEIsSUFFQXVILDJCQUEyQixDQUFDQywrQkFBNUIsS0FBZ0UsQ0FGaEUsSUFHQSxLQUFLdkgsZ0JBSkMsRUFLTDtBQUNELGlCQUFLb0gsbUJBQUwsR0FBMkIsSUFBM0I7QUFDQUosWUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUI3RixXQUFqQixDQUE2QixXQUE3QixFQUEwQzBGLFdBQTFDO0FBQ0EvRSxZQUFBQSxVQUFVLENBQUNxRixjQUFELEVBQWlCLEdBQWpCLENBQVY7QUFDQSxXQVRNLE1BU0EsSUFBSSxDQUFDLEtBQUtELG1CQUFWLEVBQStCO0FBQ3JDO0FBQ0E7QUFDQSxpQkFBS2xGLGFBQUwsR0FBcUIsSUFBckI7O0FBQ0EsaUJBQUtqQyxlQUFMLENBQXFCK0MsU0FBckIsQ0FBK0IsV0FBL0I7QUFDQTtBQUNEO0FBQ0Q7Ozs7SUFsWHlDd0UsbUIsaVdBOER6Q0MsTSxFQUNBQyxLLHlvQkFtTEFELE0sRUFDQUMsSyx5SkFLQUQsTSxFQUNBQyxLLDZKQWtCQUQsTSxFQUNBQyxLLDJKQUtBRCxNLEVBQ0FDLEssdUpBS0FELE0sRUFDQUMsSyw2SkF3QkFDLE87U0FxRWFuSSw0QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbiwgT3ZlcnJpZGVFeGVjdXRpb24sIFZpZXcgfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50LCBDb21tb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgTWFuYWdlZE9iamVjdCwgRXZlbnRQcm92aWRlciB9IGZyb20gXCJzYXAvdWkvYmFzZVwiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbFwiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMsIEZpbmFsLCBFeHRlbnNpYmxlLCBQcml2YXRlIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXNcIjtcblxuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuUGFnZVJlYWR5XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFBhZ2VSZWFkeUNvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb0V2ZW50UHJvdmlkZXIhOiBFdmVudFByb3ZpZGVyO1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IGFueTtcblx0cHJpdmF0ZSBfb0NvbnRhaW5lciE6IGFueTtcblx0cHJpdmF0ZSBfYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkITogYm9vbGVhbjtcblx0cHJpdmF0ZSBfZm5Db250YWluZXJEZWxlZ2F0ZTogYW55O1xuXHRwcml2YXRlIF9uYldhaXRzITogbnVtYmVyO1xuXHRwcml2YXRlIF9iU2VhY2hUcmlnZ2VyZWQhOiBib29sZWFuO1xuXHRwcml2YXRlIF9iSXNQYWdlUmVhZHkhOiBib29sZWFuO1xuXHRwcml2YXRlIF9iV2FpdGluZ0ZvclJlZnJlc2ghOiBib29sZWFuO1xuXHRwcml2YXRlIGJTaG93biE6IGJvb2xlYW47XG5cdHByaXZhdGUgYkhhc0NvbnRleHQhOiBib29sZWFuO1xuXHRwcml2YXRlIGJEYXRhUmVjZWl2ZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgYlRhYmxlc0xvYWRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBwYWdlUmVhZHlUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cblx0QE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9uYldhaXRzID0gMDtcblx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHR0aGlzLl9vRXZlbnRQcm92aWRlciA9IHRoaXMuX29FdmVudFByb3ZpZGVyID8gdGhpcy5fb0V2ZW50UHJvdmlkZXIgOiBuZXcgRXZlbnRQcm92aWRlcigpO1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldyk7XG5cblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuYXR0YWNoQ29udGFpbmVyRGVmaW5lZCgob0V2ZW50OiBVSTVFdmVudCkgPT4gdGhpcy5yZWdpc3RlckNvbnRhaW5lcihvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGFpbmVyXCIpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVnaXN0ZXJDb250YWluZXIodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9QbGFjZWhvbGRlciA9ICgodGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpIGFzIFZpZXcpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLmdldFBsYWNlaG9sZGVyKCk7XG5cdFx0aWYgKG9QbGFjZWhvbGRlci5pc1BsYWNlaG9sZGVyRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRvUGxhY2Vob2xkZXIuZ2V0UGxhY2Vob2xkZXJEZWJ1Z1N0YXRzKCkuaVBhZ2VSZWFkeUV2ZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpc1xuXHRcdFx0KTtcblx0XHRcdHRoaXMuYXR0YWNoRXZlbnQoXG5cdFx0XHRcdFwiaGVyb2VzQmF0Y2hSZWNlaXZlZFwiLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0b1BsYWNlaG9sZGVyLmdldFBsYWNlaG9sZGVyRGVidWdTdGF0cygpLmlIZXJvZXNCYXRjaFJlY2VpdmVkRXZlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRkZWxldGUgdGhpcy5fb0FwcENvbXBvbmVudDtcblx0XHR0aGlzLl9vQ29udGFpbmVyICYmIHRoaXMuX29Db250YWluZXIucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlKTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0Rm9yKG9Qcm9taXNlOiBhbnkpIHtcblx0XHR0aGlzLl9uYldhaXRzKys7XG5cdFx0b1Byb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fbmJXYWl0cy0tO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gobnVsbCk7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gZmFsc2U7XG5cdH1cblx0QE92ZXJyaWRlKFwiX3JvdXRpbmdcIilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpIHtcblx0XHR0aGlzLmNoZWNrUGFnZVJlYWR5RGVib3VuY2VkKCk7XG5cdH1cblxuXHRAT3ZlcnJpZGUoXCJfcm91dGluZ1wiKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IENvbnRleHQ8YW55Pikge1xuXHRcdGlmICghdGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkKSB7XG5cdFx0XHR0aGlzLl9iQWZ0ZXJCaW5kaW5nQWxyZWFkeUFwcGxpZWQgPSB0cnVlO1xuXHRcdFx0bGV0IGFCb3VuZEVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU5vdEJvdW5kTURDVGFibGVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0bGV0IGlSZXF1ZXN0ZWQgPSAwO1xuXHRcdFx0bGV0IGlSZWNlaXZlZCA9IDA7XG5cdFx0XHRjb25zdCBmblJlcXVlc3RlZCA9IChvRXZlbnQ6IFVJNUV2ZW50KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5kZXRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0aVJlcXVlc3RlZCsrO1xuXHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSBmYWxzZTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBmblJlY2VpdmVkID0gKG9FdmVudDogVUk1RXZlbnQpID0+IHtcblx0XHRcdFx0c3dpdGNoIChvRXZlbnQuZ2V0U291cmNlKCkuc0dyb3VwSWQpIHtcblx0XHRcdFx0XHRjYXNlIFwiJGF1dG8uV29ya2Vyc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwid29ya2Vyc0JhdGNoUmVjZWl2ZWRcIik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiJGF1dG8uSGVyb2VzXCI6XG5cdFx0XHRcdFx0XHR0aGlzLl9vRXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJoZXJvZXNCYXRjaFJlY2VpdmVkXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0fVxuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuZGV0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRpUmVjZWl2ZWQrKztcblx0XHRcdFx0aWYgKGlSZWNlaXZlZCA+PSBpUmVxdWVzdGVkICYmIGlSZXF1ZXN0ZWQgIT09IDApIHtcblx0XHRcdFx0XHRpUmVxdWVzdGVkID0gMDtcblx0XHRcdFx0XHRpUmVjZWl2ZWQgPSAwO1xuXHRcdFx0XHRcdHRoaXMuYkRhdGFSZWNlaXZlZCA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5jaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5TZWFyY2ggPSAob0V2ZW50OiBVSTVFdmVudCkgPT4ge1xuXHRcdFx0XHRjb25zdCBhTURDVGFibGVzID0gYU5vdEJvdW5kTURDVGFibGVzLmZpbHRlcihvRWxlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5zSWQgPT09IG9FbGVtLmdldEZpbHRlcigpICYmIG9FbGVtLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChhTURDVGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0aGlzLl9iU2VhY2hUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFNRENUYWJsZXMuZm9yRWFjaCgob01EQ1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRsZXQgb1Jvd0JpbmRpbmcgPSBvTURDVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGZuQXR0YWNoRGF0YUV2ZW50cyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaERhdGFSZXF1ZXN0ZWQoZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRmblJlY2VpdmVkKG9FdmVudCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2JTZWFjaFRyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9Sb3dCaW5kaW5nKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0Zm5BdHRhY2hEYXRhRXZlbnRzKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9NRENUYWJsZS5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFx0XHRcdFwiYmluZGluZ1VwZGF0ZWRcIixcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nID0gb01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRmbkF0dGFjaERhdGFFdmVudHMoKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0bnVsbFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdGlmICh0aGlzLmlzQ29udGV4dEV4cGVjdGVkKCkgJiYgb0JpbmRpbmdDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gRm9yY2UgdG8gbWVudGlvbiB3ZSBhcmUgZXhwZWN0aW5nIGRhdGFcblx0XHRcdFx0dGhpcy5iSGFzQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmJIYXNDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFwicGFnZVJlYWR5XCIsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5mb3JFYWNoKChvRWxlbWVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRvRWxlbWVudC5kZXRhY2hFdmVudChcImRhdGFSZXF1ZXN0ZWRcIiwgZm5SZXF1ZXN0ZWQpO1xuXHRcdFx0XHRcdFx0b0VsZW1lbnQuZGV0YWNoRXZlbnQoXCJkYXRhUmVjZWl2ZWRcIiwgZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRvRWxlbWVudC5kZXRhY2hFdmVudChcInNlYXJjaFwiLCBmblNlYXJjaCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5fYkFmdGVyQmluZGluZ0FscmVhZHlBcHBsaWVkID0gZmFsc2U7XG5cdFx0XHRcdFx0YUJvdW5kRWxlbWVudHMgPSBbXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbFxuXHRcdFx0KTtcblx0XHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgbWFpbk9iamVjdEJpbmRpbmcgPSAob0JpbmRpbmdDb250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRtYWluT2JqZWN0QmluZGluZy5hdHRhY2hEYXRhUmVxdWVzdGVkKGZuUmVxdWVzdGVkKTtcblx0XHRcdFx0bWFpbk9iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG1haW5PYmplY3RCaW5kaW5nKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcblx0XHRcdHRoaXMuX29WaWV3LmZpbmRBZ2dyZWdhdGVkT2JqZWN0cyh0cnVlLCAob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvT2JqZWN0QmluZGluZyA9IG9FbGVtZW50LmdldE9iamVjdEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9PYmplY3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gYWxsIG9iamVjdCBiaW5kaW5nIChtb3N0bHkgdXNlZCBvbiBvYmplY3QgcGFnZXMpXG5cdFx0XHRcdFx0b09iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0b09iamVjdEJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuUmVjZWl2ZWQpO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob09iamVjdEJpbmRpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGFCaW5kaW5nS2V5cyA9IE9iamVjdC5rZXlzKG9FbGVtZW50Lm1CaW5kaW5nSW5mb3MpO1xuXHRcdFx0XHRcdGlmIChhQmluZGluZ0tleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YUJpbmRpbmdLZXlzLmZvckVhY2goc1Byb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9FbGVtZW50Lm1CaW5kaW5nSW5mb3Nbc1Byb3BlcnR5TmFtZV0uYmluZGluZztcblx0XHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgb24gYWxsIGxpc3QgYmluZGluZywgZ29vZCBmb3IgYmFzaWMgdGFibGVzLCBwcm9ibGVtYXRpYyBmb3IgTURDLCBzZWUgYWJvdmVcblx0XHRcdFx0XHRcdFx0aWYgKG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmF0dGFjaERhdGFSZWNlaXZlZChmblJlY2VpdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBUaGlzIGlzIGRpcnR5IGJ1dCBNREMgVGFibGUgaGFzIGEgd2VpcmQgbG9hZGluZyBsaWZlY3ljbGVcblx0XHRcdFx0aWYgKG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHR0aGlzLmJUYWJsZXNMb2FkZWQgPSBmYWxzZTtcblx0XHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFx0YVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0b0VsZW1lbnRcblx0XHRcdFx0XHRcdFx0LmluaXRpYWxpemVkKClcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW1lbnQuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1Jvd0JpbmRpbmcuYXR0YWNoRGF0YVJlcXVlc3RlZChmblJlcXVlc3RlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRvUm93QmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5SZWNlaXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRhQm91bmRFbGVtZW50cy5wdXNoKG9Sb3dCaW5kaW5nKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0YU5vdEJvdW5kTURDVGFibGVzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgZmluZCBhIGJvdW5kIHRhYmxlXCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0VsZW1lbnQuaXNBKFwic2FwLmZlLmNvcmUuY29udHJvbHMuRmlsdGVyQmFyXCIpKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQuYXR0YWNoRXZlbnQoXCJzZWFyY2hcIiwgZm5TZWFyY2gpO1xuXHRcdFx0XHRcdGFCb3VuZEVsZW1lbnRzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhVGFibGVJbml0aWFsaXplZFByb21pc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYVRhYmxlSW5pdGlhbGl6ZWRQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJUYWJsZXNMb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dGhpcy5jaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcIlRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIG9uZSBvciBtdWx0aXBsZSB0YWJsZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRoaXMuY2hlY2tQYWdlUmVhZHlEZWJvdW5jZWQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaXNQYWdlUmVhZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2JJc1BhZ2VSZWFkeTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyB3YWl0UGFnZVJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGlmICh0aGlzLmlzUGFnZVJlYWR5KCkpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hdHRhY2hFdmVudE9uY2UoXG5cdFx0XHRcdFx0XCJwYWdlUmVhZHlcIixcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhdHRhY2hFdmVudE9uY2Uoc0V2ZW50SWQ6IHN0cmluZywgb0RhdGE6IGFueSwgZm5GdW5jdGlvbjogRnVuY3Rpb24sIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuXHRcdHJldHVybiB0aGlzLl9vRXZlbnRQcm92aWRlci5hdHRhY2hFdmVudE9uY2Uoc0V2ZW50SWQsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhdHRhY2hFdmVudChzRXZlbnRJZDogc3RyaW5nLCBvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBGdW5jdGlvbiwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmF0dGFjaEV2ZW50KHNFdmVudElkLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgZGV0YWNoRXZlbnQoc0V2ZW50SWQ6IHN0cmluZywgZm5GdW5jdGlvbjogRnVuY3Rpb24pIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG5cdFx0cmV0dXJuIHRoaXMuX29FdmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KHNFdmVudElkLCBmbkZ1bmN0aW9uKTtcblx0fVxuXHRwcml2YXRlIHJlZ2lzdGVyQ29udGFpbmVyKG9Db250YWluZXI6IE1hbmFnZWRPYmplY3QpIHtcblx0XHR0aGlzLl9vQ29udGFpbmVyID0gb0NvbnRhaW5lcjtcblx0XHR0aGlzLl9mbkNvbnRhaW5lckRlbGVnYXRlID0ge1xuXHRcdFx0b25CZWZvcmVTaG93OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuYlNob3duID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuX2JJc1BhZ2VSZWFkeSA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdG9uQmVmb3JlSGlkZTogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9iSXNQYWdlUmVhZHkgPSBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRvbkFmdGVyU2hvdzogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJTaG93biA9IHRydWU7XG5cdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGhpcy5fb0NvbnRhaW5lci5hZGRFdmVudERlbGVnYXRlKHRoaXMuX2ZuQ29udGFpbmVyRGVsZWdhdGUpO1xuXHR9XG5cblx0QFByaXZhdGVcblx0QEV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0cHVibGljIGlzQ29udGV4dEV4cGVjdGVkKCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBjaGVja1BhZ2VSZWFkeURlYm91bmNlZCgpIHtcblx0XHRpZiAodGhpcy5wYWdlUmVhZHlUaW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMucGFnZVJlYWR5VGltZXIpO1xuXHRcdH1cblx0XHR0aGlzLnBhZ2VSZWFkeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdH0sIDIwMCk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrUGFnZVJlYWR5KGJGcm9tTmF2OiBib29sZWFuID0gZmFsc2UpIHtcblx0XHRjb25zdCBmblVJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdC8vIFdhaXQgdW50aWwgdGhlIFVJIGlzIG5vIGxvbmdlciBkaXJ0eVxuXHRcdFx0aWYgKCFzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHRzYXAudWkuZ2V0Q29yZSgpLmRldGFjaEV2ZW50KFwiVUlVcGRhdGVkXCIsIGZuVUlVcGRhdGVkKTtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2NoZWNrUGFnZVJlYWR5KCk7XG5cdFx0XHRcdH0sIDIwKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gSW4gY2FzZSBVSVVwZGF0ZSBkb2VzIG5vdCBnZXQgY2FsbGVkLCBjaGVjayBpZiBVSSBpcyBub3QgZGlydHkgYW5kIHRoZW4gY2FsbCBfY2hlY2tQYWdlUmVhZHlcblx0XHRjb25zdCBjaGVja1VJVXBkYXRlZCA9ICgpID0+IHtcblx0XHRcdGlmIChzYXAudWkuZ2V0Q29yZSgpLmdldFVJRGlydHkoKSkge1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gZmFsc2U7XG5cdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuZGV0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHR0aGlzLl9jaGVja1BhZ2VSZWFkeSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmJTaG93biAmJlxuXHRcdFx0dGhpcy5iRGF0YVJlY2VpdmVkICE9PSBmYWxzZSAmJlxuXHRcdFx0dGhpcy5iVGFibGVzTG9hZGVkICE9PSBmYWxzZSAmJlxuXHRcdFx0KCF0aGlzLmlzQ29udGV4dEV4cGVjdGVkKCkgfHwgdGhpcy5iSGFzQ29udGV4dCkgLy8gRWl0aGVyIG5vIGNvbnRleHQgaXMgZXhwZWN0ZWQgb3IgdGhlcmUgaXMgb25lXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5iRGF0YVJlY2VpdmVkID09PSB0cnVlICYmICFiRnJvbU5hdiAmJiAhdGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoICYmIHNhcC51aS5nZXRDb3JlKCkuZ2V0VUlEaXJ0eSgpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHJlcXVlc3RlZCBkYXRhIHdlIGdldCBub3RpZmllZCBhcyBzb29uIGFzIHRoZSBkYXRhIGFycml2ZWQsIHNvIGJlZm9yZSB0aGUgbmV4dCByZW5kZXJpbmcgdGlja1xuXHRcdFx0XHR0aGlzLmJEYXRhUmVjZWl2ZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHRoaXMuX2JXYWl0aW5nRm9yUmVmcmVzaCA9IHRydWU7XG5cdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgZm5VSVVwZGF0ZWQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGNoZWNrVUlVcGRhdGVkLCA1MDApO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2ggJiYgc2FwLnVpLmdldENvcmUoKS5nZXRVSURpcnR5KCkpIHx8XG5cdFx0XHRcdHRoaXMuX25iV2FpdHMgIT09IDAgfHxcblx0XHRcdFx0VGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmdldE51bWJlck9mVmlld3NJbkNyZWF0aW9uU3RhdGUoKSA+IDAgfHxcblx0XHRcdFx0dGhpcy5fYlNlYWNoVHJpZ2dlcmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5fYldhaXRpbmdGb3JSZWZyZXNoID0gdHJ1ZTtcblx0XHRcdFx0c2FwLnVpLmdldENvcmUoKS5hdHRhY2hFdmVudChcIlVJVXBkYXRlZFwiLCBmblVJVXBkYXRlZCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoY2hlY2tVSVVwZGF0ZWQsIDUwMCk7XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9iV2FpdGluZ0ZvclJlZnJlc2gpIHtcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugd2UncmUgbm90IHdhaXRpbmcgZm9yIGFueSBkYXRhIChuYXZpZ2F0aW5nIGJhY2sgdG8gYSBwYWdlIHdlIGFscmVhZHkgaGF2ZSBsb2FkZWQpXG5cdFx0XHRcdC8vIGp1c3Qgd2FpdCBmb3IgYSBmcmFtZSB0byBmaXJlIHRoZSBldmVudC5cblx0XHRcdFx0dGhpcy5fYklzUGFnZVJlYWR5ID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fb0V2ZW50UHJvdmlkZXIuZmlyZUV2ZW50KFwicGFnZVJlYWR5XCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWdlUmVhZHlDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
@@ -1,4 +1,4 @@
1
- import { ControllerExtension, OverrideExecution } from "sap/ui/core/mvc";
1
+ import { ControllerExtension, OverrideExecution, View } from "sap/ui/core/mvc";
2
2
  import { ControllerExtensionMetadata } from "sap/fe/core/controllerextensions";
3
3
  import { Component } from "sap/ui/core";
4
4
  import { AppComponent, CommonUtils } from "sap/fe/core";
@@ -26,7 +26,6 @@ class PageReadyControllerExtension extends ControllerExtension {
26
26
  private bDataReceived: boolean | undefined;
27
27
  private bTablesLoaded: boolean | undefined;
28
28
  private pageReadyTimer: NodeJS.Timeout | undefined;
29
- private _oTemplatedViewServiceFactory: any;
30
29
 
31
30
  @Override()
32
31
  public onInit() {
@@ -43,10 +42,7 @@ class PageReadyControllerExtension extends ControllerExtension {
43
42
  this.registerContainer(this._oView);
44
43
  }
45
44
 
46
- const oPlaceholder = this._oAppComponent
47
- .getRootControl()
48
- .getController()
49
- .getPlaceholder();
45
+ const oPlaceholder = ((this._oAppComponent.getRootControl() as View).getController() as any).getPlaceholder();
50
46
  if (oPlaceholder.isPlaceholderDebugEnabled()) {
51
47
  this.attachEvent(
52
48
  "pageReady",
@@ -97,7 +93,7 @@ class PageReadyControllerExtension extends ControllerExtension {
97
93
  }
98
94
 
99
95
  @Override("_routing")
100
- onAfterBinding(oBindingContext: Context) {
96
+ onAfterBinding(oBindingContext: Context<any>) {
101
97
  if (!this._bAfterBindingAlreadyApplied) {
102
98
  this._bAfterBindingAlreadyApplied = true;
103
99
  let aBoundElements: any[] = [];