@sapui5/sap.fe.templates 1.109.0 → 1.110.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -8
  3. package/src/sap/fe/templates/.library +26 -27
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
  6. package/src/sap/fe/templates/ListComponent.js +45 -62
  7. package/src/sap/fe/templates/ListComponent.ts +43 -43
  8. package/src/sap/fe/templates/ListReport/Component.js +11 -19
  9. package/src/sap/fe/templates/ListReport/Component.ts +6 -0
  10. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +11 -37
  11. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
  12. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +196 -0
  13. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +216 -0
  14. package/src/sap/fe/templates/ListReport/ListReport.view.xml +31 -0
  15. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +140 -247
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +49 -14
  17. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
  18. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
  21. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
  22. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
  23. package/src/sap/fe/templates/ObjectPage/Component.js +19 -40
  24. package/src/sap/fe/templates/ObjectPage/Component.ts +9 -2
  25. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.js +64 -0
  26. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.ts +80 -0
  27. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +21 -58
  28. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +4 -4
  29. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +2 -1
  30. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +173 -459
  31. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +13 -18
  32. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +129 -208
  33. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +62 -14
  34. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
  35. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
  36. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
  37. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
  38. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  39. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
  40. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  41. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
  42. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +4 -4
  43. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +3 -3
  44. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +4 -4
  45. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +3 -3
  46. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +16 -21
  47. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  48. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +19 -1
  49. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +21 -0
  50. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  51. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
  52. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +19 -69
  53. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  54. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
  55. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +6 -6
  56. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +4 -3
  57. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +3 -3
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -1
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +1 -1
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +4 -3
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +7 -5
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +1 -1
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +3 -2
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +2 -1
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/SideContentCustomContainer.fragment.xml +7 -7
  67. package/src/sap/fe/templates/TableScroller.js +1 -6
  68. package/src/sap/fe/templates/library.js +4 -7
  69. package/src/sap/fe/templates/library.ts +1 -2
  70. package/src/sap/fe/templates/messagebundle.properties +30 -29
  71. package/src/sap/fe/templates/messagebundle_bg.properties +2 -2
  72. package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
  73. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +1 -1
  74. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
  75. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -1
  76. package/src/sap/fe/templates/messagebundle_no.properties +3 -3
  77. package/src/sap/fe/templates/messagebundle_sl.properties +7 -7
  78. package/ui5.yaml +0 -1
  79. package/src/sap/fe/templates/Feedback.js +0 -80
  80. package/src/sap/fe/templates/Feedback.ts +0 -64
  81. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +0 -82
  82. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +0 -20
  83. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +0 -20
@@ -2,19 +2,15 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/LRMessageStrip", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/filter/FilterUtils", "sap/ui/core/InvisibleMessage", "sap/ui/core/library"], function (ExtensionAPI, ClassSupport, $LRMessageStrip, ChartUtils, FilterUtils, InvisibleMessage, library) {
5
+ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/filter/FilterUtils", "sap/fe/templates/ListReport/LRMessageStrip", "sap/ui/core/InvisibleMessage", "sap/ui/core/library"], function (ExtensionAPI, ClassSupport, ChartUtils, FilterUtils, $LRMessageStrip, InvisibleMessage, library) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _class;
9
-
10
9
  var InvisibleMessageMode = library.InvisibleMessageMode;
11
10
  var LRMessageStrip = $LRMessageStrip.LRMessageStrip;
12
11
  var defineUI5Class = ClassSupport.defineUI5Class;
13
-
14
12
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
15
-
16
13
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
17
-
18
14
  /**
19
15
  * Extension API for list reports in SAP Fiori elements for OData V4.
20
16
  *
@@ -26,13 +22,10 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
26
22
  */
27
23
  var ListReportExtensionAPI = (_dec = defineUI5Class("sap.fe.templates.ListReport.ExtensionAPI"), _dec(_class = /*#__PURE__*/function (_ExtensionAPI) {
28
24
  _inheritsLoose(ListReportExtensionAPI, _ExtensionAPI);
29
-
30
25
  function ListReportExtensionAPI() {
31
26
  return _ExtensionAPI.apply(this, arguments) || this;
32
27
  }
33
-
34
28
  var _proto = ListReportExtensionAPI.prototype;
35
-
36
29
  /**
37
30
  * Refreshes the List Report.
38
31
  * This method currently only supports triggering the search (by clicking on the GO button)
@@ -46,7 +39,6 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
46
39
  */
47
40
  _proto.refresh = function refresh() {
48
41
  var oFilterBar = this._controller._getFilterBarControl();
49
-
50
42
  if (oFilterBar) {
51
43
  return oFilterBar.waitForInitialization().then(function () {
52
44
  oFilterBar.triggerSearch();
@@ -56,36 +48,31 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
56
48
  return Promise.resolve();
57
49
  }
58
50
  }
51
+
59
52
  /**
60
53
  * Gets the list entries currently selected for the displayed control.
61
54
  *
62
55
  * @alias sap.fe.templates.ListReport.ExtensionAPI#getSelectedContexts
63
56
  * @returns Array containing the selected contexts
64
57
  * @public
65
- */
66
- ;
67
-
58
+ */;
68
59
  _proto.getSelectedContexts = function getSelectedContexts() {
69
60
  var _this$_controller$_ge, _this$_controller$_ge2;
70
-
71
61
  var oControl = this._controller._isMultiMode() && ((_this$_controller$_ge = this._controller._getMultiModeControl()) === null || _this$_controller$_ge === void 0 ? void 0 : (_this$_controller$_ge2 = _this$_controller$_ge.getSelectedInnerControl()) === null || _this$_controller$_ge2 === void 0 ? void 0 : _this$_controller$_ge2.content) || this._controller._getTable();
72
-
73
62
  if (oControl.isA("sap.ui.mdc.Chart")) {
74
63
  var aSelectedContexts = [];
75
-
76
64
  if (oControl && oControl.get_chart()) {
77
65
  var aSelectedDataPoints = ChartUtils.getChartSelectedData(oControl.get_chart());
78
-
79
66
  for (var i = 0; i < aSelectedDataPoints.length; i++) {
80
67
  aSelectedContexts.push(aSelectedDataPoints[i].context);
81
68
  }
82
69
  }
83
-
84
70
  return aSelectedContexts;
85
71
  } else {
86
72
  return oControl && oControl.getSelectedContexts() || [];
87
73
  }
88
74
  }
75
+
89
76
  /**
90
77
  * Set the filter values for the given property in the filter bar.
91
78
  * The filter values can be either a single value or an array of values.
@@ -97,21 +84,18 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
97
84
  * @alias sap.fe.templates.ListReport.ExtensionAPI#setFilterValues
98
85
  * @returns A promise for asynchronous handling
99
86
  * @public
100
- */
101
- ;
102
-
87
+ */;
103
88
  _proto.setFilterValues = function setFilterValues(sConditionPath, sOperator, vValues) {
104
89
  // The List Report has two filter bars: The filter bar in the header and the filter bar in the "Adapt Filter" dialog;
105
90
  // when the dialog is opened, the user is working with that active control: Pass it to the setFilterValues method!
106
91
  var filterBar = this._controller._getAdaptationFilterBarControl() || this._controller._getFilterBarControl();
107
-
108
92
  if (arguments.length === 2) {
109
93
  vValues = sOperator;
110
94
  return FilterUtils.setFilterValues(filterBar, sConditionPath, vValues);
111
95
  }
112
-
113
96
  return FilterUtils.setFilterValues(filterBar, sConditionPath, sOperator, vValues);
114
97
  }
98
+
115
99
  /**
116
100
  * This method converts filter conditions to filters.
117
101
  *
@@ -119,12 +103,9 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
119
103
  * @alias sap.fe.templates.ListReport.ExtensionAPI#createFiltersFromFilterConditions
120
104
  * @returns Object containing the converted FilterBar filters.
121
105
  * @public
122
- */
123
- ;
124
-
106
+ */;
125
107
  _proto.createFiltersFromFilterConditions = function createFiltersFromFilterConditions(mFilterConditions) {
126
108
  var oFilterBar = this._controller._getFilterBarControl();
127
-
128
109
  return FilterUtils.getFilterInfo(oFilterBar, undefined, mFilterConditions);
129
110
  }
130
111
  /**
@@ -134,14 +115,12 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
134
115
  * @alias sap.fe.templates.ListReport.ExtensionAPI#getFilters
135
116
  * @returns {{filters: sap.ui.model.Filter[]|undefined, search: string|undefined}} An array of active filters and the search expression.
136
117
  * @public
137
- */
138
- ;
139
-
118
+ */;
140
119
  _proto.getFilters = function getFilters() {
141
120
  var oFilterBar = this._controller._getFilterBarControl();
142
-
143
121
  return FilterUtils.getFilters(oFilterBar);
144
122
  }
123
+
145
124
  /**
146
125
  * Provide an option for showing a custom message in the message strip above the list report table.
147
126
  *
@@ -151,23 +130,18 @@ sap.ui.define(["sap/fe/core/ExtensionAPI", "sap/fe/core/helpers/ClassSupport", "
151
130
  * @param {string[]|string} [tabKey] The tabKey identifying the table where the custom message is displayed. If tabKey is empty, the message is displayed in all tabs . If tabKey = ['1','2'], the message is displayed in tabs 1 and 2 only
152
131
  * @param {Function} [onClose] A function that is called when the user closes the message bar.
153
132
  * @public
154
- */
155
- ;
156
-
133
+ */;
157
134
  _proto.setCustomMessage = function setCustomMessage(message, tabKey, onClose) {
158
135
  if (!this.ListReportMessageStrip) {
159
136
  this.ListReportMessageStrip = new LRMessageStrip();
160
137
  }
161
-
162
138
  this.ListReportMessageStrip.showCustomMessage(message, this._controller, tabKey, onClose);
163
-
164
139
  if (message !== null && message !== void 0 && message.message) {
165
140
  InvisibleMessage.getInstance().announce(message.message, InvisibleMessageMode.Assertive);
166
141
  }
167
142
  };
168
-
169
143
  return ListReportExtensionAPI;
170
144
  }(ExtensionAPI)) || _class);
171
145
  return ListReportExtensionAPI;
172
146
  }, false);
173
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJIiwiZGVmaW5lVUk1Q2xhc3MiLCJyZWZyZXNoIiwib0ZpbHRlckJhciIsIl9jb250cm9sbGVyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJ3YWl0Rm9ySW5pdGlhbGl6YXRpb24iLCJ0aGVuIiwidHJpZ2dlclNlYXJjaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIm9Db250cm9sIiwiX2lzTXVsdGlNb2RlIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJfZ2V0VGFibGUiLCJpc0EiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldF9jaGFydCIsImFTZWxlY3RlZERhdGFQb2ludHMiLCJDaGFydFV0aWxzIiwiZ2V0Q2hhcnRTZWxlY3RlZERhdGEiLCJpIiwibGVuZ3RoIiwicHVzaCIsImNvbnRleHQiLCJzZXRGaWx0ZXJWYWx1ZXMiLCJzQ29uZGl0aW9uUGF0aCIsInNPcGVyYXRvciIsInZWYWx1ZXMiLCJmaWx0ZXJCYXIiLCJfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2wiLCJhcmd1bWVudHMiLCJGaWx0ZXJVdGlscyIsImNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyIsIm1GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVySW5mbyIsInVuZGVmaW5lZCIsImdldEZpbHRlcnMiLCJzZXRDdXN0b21NZXNzYWdlIiwibWVzc2FnZSIsInRhYktleSIsIm9uQ2xvc2UiLCJMaXN0UmVwb3J0TWVzc2FnZVN0cmlwIiwiTFJNZXNzYWdlU3RyaXAiLCJzaG93Q3VzdG9tTWVzc2FnZSIsIkludmlzaWJsZU1lc3NhZ2UiLCJnZXRJbnN0YW5jZSIsImFubm91bmNlIiwiSW52aXNpYmxlTWVzc2FnZU1vZGUiLCJBc3NlcnRpdmUiLCJFeHRlbnNpb25BUEkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkV4dGVuc2lvbkFQSS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvY29yZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBMUkN1c3RvbU1lc3NhZ2UsIExSTWVzc2FnZVN0cmlwIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTFJNZXNzYWdlU3RyaXBcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB0eXBlIExpc3RSZXBvcnRDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IEludmlzaWJsZU1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZU1lc3NhZ2VcIjtcbmltcG9ydCB7IEludmlzaWJsZU1lc3NhZ2VNb2RlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcblxuLyoqXG4gKiBFeHRlbnNpb24gQVBJIGZvciBsaXN0IHJlcG9ydHMgaW4gU0FQIEZpb3JpIGVsZW1lbnRzIGZvciBPRGF0YSBWNC5cbiAqXG4gKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSVxuICogQHB1YmxpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQGZpbmFsXG4gKiBAc2luY2UgMS43OS4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUElcIilcbmNsYXNzIExpc3RSZXBvcnRFeHRlbnNpb25BUEkgZXh0ZW5kcyBFeHRlbnNpb25BUEkge1xuXHRwcm90ZWN0ZWQgX2NvbnRyb2xsZXIhOiBMaXN0UmVwb3J0Q29udHJvbGxlcjtcblx0TGlzdFJlcG9ydE1lc3NhZ2VTdHJpcCE6IExSTWVzc2FnZVN0cmlwO1xuXHQvKipcblx0ICogUmVmcmVzaGVzIHRoZSBMaXN0IFJlcG9ydC5cblx0ICogVGhpcyBtZXRob2QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdHJpZ2dlcmluZyB0aGUgc2VhcmNoIChieSBjbGlja2luZyBvbiB0aGUgR08gYnV0dG9uKVxuXHQgKiBpbiB0aGUgTGlzdCBSZXBvcnQgRmlsdGVyIEJhci4gSXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgaW5pdGlhbCBsb2FkIG9yIHRvIHJlZnJlc2ggdGhlXG5cdCAqIGN1cnJlbnRseSBzaG93biBkYXRhIGJhc2VkIG9uIHRoZSBmaWx0ZXJzIGVudGVyZWQgYnkgdGhlIHVzZXIuXG5cdCAqIFBsZWFzZSBub3RlOiBUaGUgUHJvbWlzZSBpcyByZXNvbHZlZCBvbmNlIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkIGFuZCBub3Qgb25jZSB0aGUgZGF0YSBpcyByZXR1cm5lZC5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjcmVmcmVzaFxuXHQgKiBAcmV0dXJucyBSZXNvbHZlZCBvbmNlIHRoZSBkYXRhIGlzIHJlZnJlc2hlZCBvciByZWplY3RlZCBpZiB0aGUgcmVxdWVzdCBmYWlsZWRcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0cmVmcmVzaCgpIHtcblx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fY29udHJvbGxlci5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueTtcblx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0cmV0dXJuIG9GaWx0ZXJCYXIud2FpdEZvckluaXRpYWxpemF0aW9uKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdG9GaWx0ZXJCYXIudHJpZ2dlclNlYXJjaCgpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRPRE86IGlmIHRoZXJlIGlzIG5vIGZpbHRlciBiYXIsIG1ha2UgcmVmcmVzaCB3b3JrXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGxpc3QgZW50cmllcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSBkaXNwbGF5ZWQgY29udHJvbC5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjZ2V0U2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0c1xuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRnZXRTZWxlY3RlZENvbnRleHRzKCkge1xuXHRcdGNvbnN0IG9Db250cm9sID0gKCh0aGlzLl9jb250cm9sbGVyLl9pc011bHRpTW9kZSgpICYmXG5cdFx0XHR0aGlzLl9jb250cm9sbGVyLl9nZXRNdWx0aU1vZGVDb250cm9sKCk/LmdldFNlbGVjdGVkSW5uZXJDb250cm9sKCk/LmNvbnRlbnQpIHx8XG5cdFx0XHR0aGlzLl9jb250cm9sbGVyLl9nZXRUYWJsZSgpKSBhcyBhbnk7XG5cdFx0aWYgKG9Db250cm9sLmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRcdGNvbnN0IGFTZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRpZiAob0NvbnRyb2wgJiYgb0NvbnRyb2wuZ2V0X2NoYXJ0KCkpIHtcblx0XHRcdFx0Y29uc3QgYVNlbGVjdGVkRGF0YVBvaW50cyA9IENoYXJ0VXRpbHMuZ2V0Q2hhcnRTZWxlY3RlZERhdGEob0NvbnRyb2wuZ2V0X2NoYXJ0KCkpO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFTZWxlY3RlZERhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cy5wdXNoKGFTZWxlY3RlZERhdGFQb2ludHNbaV0uY29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhU2VsZWN0ZWRDb250ZXh0cztcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRTZWxlY3RlZENvbnRleHRzKCkpIHx8IFtdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGZpbHRlciB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBpbiB0aGUgZmlsdGVyIGJhci5cblx0ICogVGhlIGZpbHRlciB2YWx1ZXMgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZXMuXG5cdCAqIEVhY2ggZmlsdGVyIHZhbHVlIG11c3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBwcmltaXRpdmUgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQ29uZGl0aW9uUGF0aCBUaGUgcGF0aCB0byB0aGUgcHJvcGVydHkgYXMgYSBjb25kaXRpb24gcGF0aFxuXHQgKiBAcGFyYW0gW3NPcGVyYXRvcl0gVGhlIG9wZXJhdG9yIHRvIGJlIHVzZWQgKG9wdGlvbmFsKSAtIGlmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IG9wZXJhdG9yIChFUSkgd2lsbCBiZSB1c2VkXG5cdCAqIEBwYXJhbSB2VmFsdWVzIFRoZSB2YWx1ZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNzZXRGaWx0ZXJWYWx1ZXNcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGZvciBhc3luY2hyb25vdXMgaGFuZGxpbmdcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0c2V0RmlsdGVyVmFsdWVzKFxuXHRcdHNDb25kaXRpb25QYXRoOiBzdHJpbmcsXG5cdFx0c09wZXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0dlZhbHVlcz86IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXSB8IG51bWJlcltdIHwgYm9vbGVhbltdXG5cdCkge1xuXHRcdC8vIFRoZSBMaXN0IFJlcG9ydCBoYXMgdHdvIGZpbHRlciBiYXJzOiBUaGUgZmlsdGVyIGJhciBpbiB0aGUgaGVhZGVyIGFuZCB0aGUgZmlsdGVyIGJhciBpbiB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2c7XG5cdFx0Ly8gd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZCwgdGhlIHVzZXIgaXMgd29ya2luZyB3aXRoIHRoYXQgYWN0aXZlIGNvbnRyb2w6IFBhc3MgaXQgdG8gdGhlIHNldEZpbHRlclZhbHVlcyBtZXRob2QhXG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gdGhpcy5fY29udHJvbGxlci5fZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2woKSB8fCB0aGlzLl9jb250cm9sbGVyLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcblx0XHRcdHZWYWx1ZXMgPSBzT3BlcmF0b3I7XG5cdFx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuc2V0RmlsdGVyVmFsdWVzKGZpbHRlckJhciwgc0NvbmRpdGlvblBhdGgsIHZWYWx1ZXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBGaWx0ZXJVdGlscy5zZXRGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyLCBzQ29uZGl0aW9uUGF0aCwgc09wZXJhdG9yLCB2VmFsdWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjb252ZXJ0cyBmaWx0ZXIgY29uZGl0aW9ucyB0byBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUZpbHRlckNvbmRpdGlvbnMgTWFwIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBjb25kaXRpb25zIG9mIHRoZSBGaWx0ZXJCYXIuXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI2NyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9uc1xuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgY29udmVydGVkIEZpbHRlckJhciBmaWx0ZXJzLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRjcmVhdGVGaWx0ZXJzRnJvbUZpbHRlckNvbmRpdGlvbnMobUZpbHRlckNvbmRpdGlvbnM6IGFueSkge1xuXHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0cmV0dXJuIEZpbHRlclV0aWxzLmdldEZpbHRlckluZm8ob0ZpbHRlckJhciwgdW5kZWZpbmVkLCBtRmlsdGVyQ29uZGl0aW9ucyk7XG5cdH1cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGFsbCB0aGUgbW9kZWwgZmlsdGVycyBmcm9tIHRoZSBmaWx0ZXIgYmFyIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmVcblx0ICogYWxvbmcgd2l0aCB0aGUgc2VhcmNoIGV4cHJlc3Npb24uXG5cdCAqXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI2dldEZpbHRlcnNcblx0ICogQHJldHVybnMge3tmaWx0ZXJzOiBzYXAudWkubW9kZWwuRmlsdGVyW118dW5kZWZpbmVkLCBzZWFyY2g6IHN0cmluZ3x1bmRlZmluZWR9fSBBbiBhcnJheSBvZiBhY3RpdmUgZmlsdGVycyBhbmQgdGhlIHNlYXJjaCBleHByZXNzaW9uLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRnZXRGaWx0ZXJzKCkge1xuXHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0cmV0dXJuIEZpbHRlclV0aWxzLmdldEZpbHRlcnMob0ZpbHRlckJhcik7XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZSBhbiBvcHRpb24gZm9yIHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBzdHJpcCBhYm92ZSB0aGUgbGlzdCByZXBvcnQgdGFibGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbbWVzc2FnZV0gQ3VzdG9tIG1lc3NhZ2UgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSB0eXBlIHRvIGJlIHNldCBvbiB0aGUgdGFibGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlLm1lc3NhZ2UgTWVzc2FnZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLlxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLk1lc3NhZ2VUeXBlfSBtZXNzYWdlLnR5cGUgSW5kaWNhdGVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSB7c3RyaW5nW118c3RyaW5nfSBbdGFiS2V5XSBUaGUgdGFiS2V5IGlkZW50aWZ5aW5nIHRoZSB0YWJsZSB3aGVyZSB0aGUgY3VzdG9tIG1lc3NhZ2UgaXMgZGlzcGxheWVkLiBJZiB0YWJLZXkgaXMgZW1wdHksIHRoZSBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiBhbGwgdGFicyAuIElmIHRhYktleSA9IFsnMScsJzInXSwgdGhlIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRhYnMgMSBhbmQgMiBvbmx5XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkNsb3NlXSBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xvc2VzIHRoZSBtZXNzYWdlIGJhci5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0c2V0Q3VzdG9tTWVzc2FnZShtZXNzYWdlOiBMUkN1c3RvbU1lc3NhZ2UgfCB1bmRlZmluZWQsIHRhYktleT86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgb25DbG9zZT86IEZ1bmN0aW9uKSB7XG5cdFx0aWYgKCF0aGlzLkxpc3RSZXBvcnRNZXNzYWdlU3RyaXApIHtcblx0XHRcdHRoaXMuTGlzdFJlcG9ydE1lc3NhZ2VTdHJpcCA9IG5ldyBMUk1lc3NhZ2VTdHJpcCgpO1xuXHRcdH1cblx0XHR0aGlzLkxpc3RSZXBvcnRNZXNzYWdlU3RyaXAuc2hvd0N1c3RvbU1lc3NhZ2UobWVzc2FnZSwgdGhpcy5fY29udHJvbGxlciwgdGFiS2V5LCBvbkNsb3NlKTtcblx0XHRpZiAobWVzc2FnZT8ubWVzc2FnZSkge1xuXHRcdFx0SW52aXNpYmxlTWVzc2FnZS5nZXRJbnN0YW5jZSgpLmFubm91bmNlKG1lc3NhZ2UubWVzc2FnZSwgSW52aXNpYmxlTWVzc2FnZU1vZGUuQXNzZXJ0aXZlKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlzdFJlcG9ydEV4dGVuc2lvbkFQSTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7RUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFFTUEsc0IsV0FETEMsY0FBYyxDQUFDLDBDQUFELEM7Ozs7Ozs7OztJQUlkO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7V0FDQ0MsTyxHQUFBLG1CQUFVO01BQ1QsSUFBTUMsVUFBVSxHQUFHLEtBQUtDLFdBQUwsQ0FBaUJDLG9CQUFqQixFQUFuQjs7TUFDQSxJQUFJRixVQUFKLEVBQWdCO1FBQ2YsT0FBT0EsVUFBVSxDQUFDRyxxQkFBWCxHQUFtQ0MsSUFBbkMsQ0FBd0MsWUFBWTtVQUMxREosVUFBVSxDQUFDSyxhQUFYO1FBQ0EsQ0FGTSxDQUFQO01BR0EsQ0FKRCxNQUlPO1FBQ047UUFDQSxPQUFPQyxPQUFPLENBQUNDLE9BQVIsRUFBUDtNQUNBO0lBQ0Q7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NDLG1CLEdBQUEsK0JBQXNCO01BQUE7O01BQ3JCLElBQU1DLFFBQVEsR0FBSyxLQUFLUixXQUFMLENBQWlCUyxZQUFqQixnQ0FDbEIsS0FBS1QsV0FBTCxDQUFpQlUsb0JBQWpCLEVBRGtCLG9GQUNsQixzQkFBeUNDLHVCQUF6QyxFQURrQiwyREFDbEIsdUJBQW9FQyxPQURsRCxDQUFELElBRWpCLEtBQUta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
147
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJIiwiZGVmaW5lVUk1Q2xhc3MiLCJyZWZyZXNoIiwib0ZpbHRlckJhciIsIl9jb250cm9sbGVyIiwiX2dldEZpbHRlckJhckNvbnRyb2wiLCJ3YWl0Rm9ySW5pdGlhbGl6YXRpb24iLCJ0aGVuIiwidHJpZ2dlclNlYXJjaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIm9Db250cm9sIiwiX2lzTXVsdGlNb2RlIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJfZ2V0VGFibGUiLCJpc0EiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldF9jaGFydCIsImFTZWxlY3RlZERhdGFQb2ludHMiLCJDaGFydFV0aWxzIiwiZ2V0Q2hhcnRTZWxlY3RlZERhdGEiLCJpIiwibGVuZ3RoIiwicHVzaCIsImNvbnRleHQiLCJzZXRGaWx0ZXJWYWx1ZXMiLCJzQ29uZGl0aW9uUGF0aCIsInNPcGVyYXRvciIsInZWYWx1ZXMiLCJmaWx0ZXJCYXIiLCJfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2wiLCJhcmd1bWVudHMiLCJGaWx0ZXJVdGlscyIsImNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyIsIm1GaWx0ZXJDb25kaXRpb25zIiwiZ2V0RmlsdGVySW5mbyIsInVuZGVmaW5lZCIsImdldEZpbHRlcnMiLCJzZXRDdXN0b21NZXNzYWdlIiwibWVzc2FnZSIsInRhYktleSIsIm9uQ2xvc2UiLCJMaXN0UmVwb3J0TWVzc2FnZVN0cmlwIiwiTFJNZXNzYWdlU3RyaXAiLCJzaG93Q3VzdG9tTWVzc2FnZSIsIkludmlzaWJsZU1lc3NhZ2UiLCJnZXRJbnN0YW5jZSIsImFubm91bmNlIiwiSW52aXNpYmxlTWVzc2FnZU1vZGUiLCJBc3NlcnRpdmUiLCJFeHRlbnNpb25BUEkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkV4dGVuc2lvbkFQSS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvY29yZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQ2hhcnRVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSBMaXN0UmVwb3J0Q29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L0xpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IExSQ3VzdG9tTWVzc2FnZSwgTFJNZXNzYWdlU3RyaXAgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L0xSTWVzc2FnZVN0cmlwXCI7XG5pbXBvcnQgSW52aXNpYmxlTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvSW52aXNpYmxlTWVzc2FnZVwiO1xuaW1wb3J0IHsgSW52aXNpYmxlTWVzc2FnZU1vZGUgfSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuXG4vKipcbiAqIEV4dGVuc2lvbiBBUEkgZm9yIGxpc3QgcmVwb3J0cyBpbiBTQVAgRmlvcmkgZWxlbWVudHMgZm9yIE9EYXRhIFY0LlxuICpcbiAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJXG4gKiBAcHVibGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAZmluYWxcbiAqIEBzaW5jZSAxLjc5LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSVwiKVxuY2xhc3MgTGlzdFJlcG9ydEV4dGVuc2lvbkFQSSBleHRlbmRzIEV4dGVuc2lvbkFQSSB7XG5cdHByb3RlY3RlZCBfY29udHJvbGxlciE6IExpc3RSZXBvcnRDb250cm9sbGVyO1xuXHRMaXN0UmVwb3J0TWVzc2FnZVN0cmlwITogTFJNZXNzYWdlU3RyaXA7XG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgdGhlIExpc3QgUmVwb3J0LlxuXHQgKiBUaGlzIG1ldGhvZCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0cmlnZ2VyaW5nIHRoZSBzZWFyY2ggKGJ5IGNsaWNraW5nIG9uIHRoZSBHTyBidXR0b24pXG5cdCAqIGluIHRoZSBMaXN0IFJlcG9ydCBGaWx0ZXIgQmFyLiBJdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IHRoZSBpbml0aWFsIGxvYWQgb3IgdG8gcmVmcmVzaCB0aGVcblx0ICogY3VycmVudGx5IHNob3duIGRhdGEgYmFzZWQgb24gdGhlIGZpbHRlcnMgZW50ZXJlZCBieSB0aGUgdXNlci5cblx0ICogUGxlYXNlIG5vdGU6IFRoZSBQcm9taXNlIGlzIHJlc29sdmVkIG9uY2UgdGhlIHNlYXJjaCBpcyB0cmlnZ2VyZWQgYW5kIG5vdCBvbmNlIHRoZSBkYXRhIGlzIHJldHVybmVkLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNyZWZyZXNoXG5cdCAqIEByZXR1cm5zIFJlc29sdmVkIG9uY2UgdGhlIGRhdGEgaXMgcmVmcmVzaGVkIG9yIHJlamVjdGVkIGlmIHRoZSByZXF1ZXN0IGZhaWxlZFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZWZyZXNoKCkge1xuXHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkgYXMgYW55O1xuXHRcdGlmIChvRmlsdGVyQmFyKSB7XG5cdFx0XHRyZXR1cm4gb0ZpbHRlckJhci53YWl0Rm9ySW5pdGlhbGl6YXRpb24oKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0b0ZpbHRlckJhci50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVE9ETzogaWYgdGhlcmUgaXMgbm8gZmlsdGVyIGJhciwgbWFrZSByZWZyZXNoIHdvcmtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgbGlzdCBlbnRyaWVzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIGRpc3BsYXllZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0LkV4dGVuc2lvbkFQSSNnZXRTZWxlY3RlZENvbnRleHRzXG5cdCAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGNvbnRleHRzXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGdldFNlbGVjdGVkQ29udGV4dHMoKSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSAoKHRoaXMuX2NvbnRyb2xsZXIuX2lzTXVsdGlNb2RlKCkgJiZcblx0XHRcdHRoaXMuX2NvbnRyb2xsZXIuX2dldE11bHRpTW9kZUNvbnRyb2woKT8uZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKT8uY29udGVudCkgfHxcblx0XHRcdHRoaXMuX2NvbnRyb2xsZXIuX2dldFRhYmxlKCkpIGFzIGFueTtcblx0XHRpZiAob0NvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSkge1xuXHRcdFx0Y29uc3QgYVNlbGVjdGVkQ29udGV4dHMgPSBbXTtcblx0XHRcdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRfY2hhcnQoKSkge1xuXHRcdFx0XHRjb25zdCBhU2VsZWN0ZWREYXRhUG9pbnRzID0gQ2hhcnRVdGlscy5nZXRDaGFydFNlbGVjdGVkRGF0YShvQ29udHJvbC5nZXRfY2hhcnQoKSk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVNlbGVjdGVkRGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzLnB1c2goYVNlbGVjdGVkRGF0YVBvaW50c1tpXS5jb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFTZWxlY3RlZENvbnRleHRzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKG9Db250cm9sICYmIG9Db250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSkgfHwgW107XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgZmlsdGVyIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBmaWx0ZXIgYmFyLlxuXHQgKiBUaGUgZmlsdGVyIHZhbHVlcyBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHZhbHVlIG9yIGFuIGFycmF5IG9mIHZhbHVlcy5cblx0ICogRWFjaCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSByZXByZXNlbnRlZCBhcyBhIHByaW1pdGl2ZSB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIHNDb25kaXRpb25QYXRoIFRoZSBwYXRoIHRvIHRoZSBwcm9wZXJ0eSBhcyBhIGNvbmRpdGlvbiBwYXRoXG5cdCAqIEBwYXJhbSBbc09wZXJhdG9yXSBUaGUgb3BlcmF0b3IgdG8gYmUgdXNlZCAob3B0aW9uYWwpIC0gaWYgbm90IHNldCwgdGhlIGRlZmF1bHQgb3BlcmF0b3IgKEVRKSB3aWxsIGJlIHVzZWRcblx0ICogQHBhcmFtIHZWYWx1ZXMgVGhlIHZhbHVlcyB0byBiZSBhcHBsaWVkXG5cdCAqIEBhbGlhcyBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuRXh0ZW5zaW9uQVBJI3NldEZpbHRlclZhbHVlc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgZm9yIGFzeW5jaHJvbm91cyBoYW5kbGluZ1xuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzZXRGaWx0ZXJWYWx1ZXMoXG5cdFx0c0NvbmRpdGlvblBhdGg6IHN0cmluZyxcblx0XHRzT3BlcmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHR2VmFsdWVzPzogdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdIHwgbnVtYmVyW10gfCBib29sZWFuW11cblx0KSB7XG5cdFx0Ly8gVGhlIExpc3QgUmVwb3J0IGhhcyB0d28gZmlsdGVyIGJhcnM6IFRoZSBmaWx0ZXIgYmFyIGluIHRoZSBoZWFkZXIgYW5kIHRoZSBmaWx0ZXIgYmFyIGluIHRoZSBcIkFkYXB0IEZpbHRlclwiIGRpYWxvZztcblx0XHQvLyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLCB0aGUgdXNlciBpcyB3b3JraW5nIHdpdGggdGhhdCBhY3RpdmUgY29udHJvbDogUGFzcyBpdCB0byB0aGUgc2V0RmlsdGVyVmFsdWVzIG1ldGhvZCFcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSB0aGlzLl9jb250cm9sbGVyLl9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHx8IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0dlZhbHVlcyA9IHNPcGVyYXRvcjtcblx0XHRcdHJldHVybiBGaWx0ZXJVdGlscy5zZXRGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyLCBzQ29uZGl0aW9uUGF0aCwgdlZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEZpbHRlclV0aWxzLnNldEZpbHRlclZhbHVlcyhmaWx0ZXJCYXIsIHNDb25kaXRpb25QYXRoLCBzT3BlcmF0b3IsIHZWYWx1ZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIGZpbHRlciBjb25kaXRpb25zIHRvIGZpbHRlcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBtRmlsdGVyQ29uZGl0aW9ucyBNYXAgY29udGFpbmluZyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgb2YgdGhlIEZpbHRlckJhci5cblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjY3JlYXRlRmlsdGVyc0Zyb21GaWx0ZXJDb25kaXRpb25zXG5cdCAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgRmlsdGVyQmFyIGZpbHRlcnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGNyZWF0ZUZpbHRlcnNGcm9tRmlsdGVyQ29uZGl0aW9ucyhtRmlsdGVyQ29uZGl0aW9uczogYW55KSB7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuZ2V0RmlsdGVySW5mbyhvRmlsdGVyQmFyLCB1bmRlZmluZWQsIG1GaWx0ZXJDb25kaXRpb25zKTtcblx0fVxuXHQvKipcblx0ICogUHJvdmlkZXMgYWxsIHRoZSBtb2RlbCBmaWx0ZXJzIGZyb20gdGhlIGZpbHRlciBiYXIgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZVxuXHQgKiBhbG9uZyB3aXRoIHRoZSBzZWFyY2ggZXhwcmVzc2lvbi5cblx0ICpcblx0ICogQGFsaWFzIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5FeHRlbnNpb25BUEkjZ2V0RmlsdGVyc1xuXHQgKiBAcmV0dXJucyB7e2ZpbHRlcnM6IHNhcC51aS5tb2RlbC5GaWx0ZXJbXXx1bmRlZmluZWQsIHNlYXJjaDogc3RyaW5nfHVuZGVmaW5lZH19IEFuIGFycmF5IG9mIGFjdGl2ZSBmaWx0ZXJzIGFuZCB0aGUgc2VhcmNoIGV4cHJlc3Npb24uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGdldEZpbHRlcnMoKSB7XG5cdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2NvbnRyb2xsZXIuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRyZXR1cm4gRmlsdGVyVXRpbHMuZ2V0RmlsdGVycyhvRmlsdGVyQmFyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlIGFuIG9wdGlvbiBmb3Igc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIHN0cmlwIGFib3ZlIHRoZSBsaXN0IHJlcG9ydCB0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttZXNzYWdlXSBDdXN0b20gbWVzc2FnZSBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIHR5cGUgdG8gYmUgc2V0IG9uIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UubWVzc2FnZSBNZXNzYWdlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuXG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUuTWVzc2FnZVR5cGV9IG1lc3NhZ2UudHlwZSBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbWVzc2FnZS5cblx0ICogQHBhcmFtIHtzdHJpbmdbXXxzdHJpbmd9IFt0YWJLZXldIFRoZSB0YWJLZXkgaWRlbnRpZnlpbmcgdGhlIHRhYmxlIHdoZXJlIHRoZSBjdXN0b20gbWVzc2FnZSBpcyBkaXNwbGF5ZWQuIElmIHRhYktleSBpcyBlbXB0eSwgdGhlIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIGFsbCB0YWJzIC4gSWYgdGFiS2V5ID0gWycxJywnMiddLCB0aGUgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgaW4gdGFicyAxIGFuZCAyIG9ubHlcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ2xvc2VdIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgYmFyLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRzZXRDdXN0b21NZXNzYWdlKG1lc3NhZ2U6IExSQ3VzdG9tTWVzc2FnZSB8IHVuZGVmaW5lZCwgdGFiS2V5Pzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBvbkNsb3NlPzogRnVuY3Rpb24pIHtcblx0XHRpZiAoIXRoaXMuTGlzdFJlcG9ydE1lc3NhZ2VTdHJpcCkge1xuXHRcdFx0dGhpcy5MaXN0UmVwb3J0TWVzc2FnZVN0cmlwID0gbmV3IExSTWVzc2FnZVN0cmlwKCk7XG5cdFx0fVxuXHRcdHRoaXMuTGlzdFJlcG9ydE1lc3NhZ2VTdHJpcC5zaG93Q3VzdG9tTWVzc2FnZShtZXNzYWdlLCB0aGlzLl9jb250cm9sbGVyLCB0YWJLZXksIG9uQ2xvc2UpO1xuXHRcdGlmIChtZXNzYWdlPy5tZXNzYWdlKSB7XG5cdFx0XHRJbnZpc2libGVNZXNzYWdlLmdldEluc3RhbmNlKCkuYW5ub3VuY2UobWVzc2FnZS5tZXNzYWdlLCBJbnZpc2libGVNZXNzYWdlTW9kZS5Bc3NlcnRpdmUpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXN0UmVwb3J0RXh0ZW5zaW9uQVBJO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0VBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkEsSUFVTUEsc0JBQXNCLFdBRDNCQyxjQUFjLENBQUMsMENBQTBDLENBQUM7SUFBQTtJQUFBO01BQUE7SUFBQTtJQUFBO0lBSTFEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFWQyxPQVdBQyxPQUFPLEdBQVAsbUJBQVU7TUFDVCxJQUFNQyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxXQUFXLENBQUNDLG9CQUFvQixFQUFTO01BQ2pFLElBQUlGLFVBQVUsRUFBRTtRQUNmLE9BQU9BLFVBQVUsQ0FBQ0cscUJBQXFCLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDLFlBQVk7VUFDMURKLFVBQVUsQ0FBQ0ssYUFBYSxFQUFFO1FBQzNCLENBQUMsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNOO1FBQ0EsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLEVBQUU7TUFDekI7SUFDRDs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQU5DO0lBQUEsT0FPQUMsbUJBQW1CLEdBQW5CLCtCQUFzQjtNQUFBO01BQ3JCLElBQU1DLFFBQVEsR0FBSyxJQUFJLENBQUNSLFdBQVcsQ0FBQ1MsWUFBWSxFQUFFLDhCQUNqRCxJQUFJLENBQUNULFdBQVcsQ0FB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
@@ -1,9 +1,9 @@
1
1
  import ExtensionAPI from "sap/fe/core/ExtensionAPI";
2
2
  import { defineUI5Class } from "sap/fe/core/helpers/ClassSupport";
3
- import { LRCustomMessage, LRMessageStrip } from "sap/fe/core/helpers/LRMessageStrip";
4
3
  import ChartUtils from "sap/fe/macros/chart/ChartUtils";
5
4
  import FilterUtils from "sap/fe/macros/filter/FilterUtils";
6
5
  import type ListReportController from "sap/fe/templates/ListReport/ListReportController.controller";
6
+ import { LRCustomMessage, LRMessageStrip } from "sap/fe/templates/ListReport/LRMessageStrip";
7
7
  import InvisibleMessage from "sap/ui/core/InvisibleMessage";
8
8
  import { InvisibleMessageMode } from "sap/ui/core/library";
9
9
 
@@ -0,0 +1,196 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/ui/core/Core", "sap/ui/core/message/Message"], function (Core, Message) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var LRMessageStrip = /*#__PURE__*/function () {
10
+ function LRMessageStrip() {
11
+ var messageManager = Core.getMessageManager();
12
+ this.customMessageInfo = {
13
+ messageManagerDataBinding: messageManager.getMessageModel().bindList("/"),
14
+ multiModeControlMessagesMap: {}
15
+ };
16
+ }
17
+ _exports.LRMessageStrip = LRMessageStrip;
18
+ var _proto = LRMessageStrip.prototype;
19
+ _proto.getCustomMessageInfo = function getCustomMessageInfo() {
20
+ return this.customMessageInfo;
21
+ };
22
+ _proto.destroy = function destroy() {
23
+ this.customMessageInfo.messageManagerDataBinding.detachChange(this._eventHandlerCustomMessage, this);
24
+ };
25
+ _proto._getMessagesWithSameTargetThanCustomMessage = function _getMessagesWithSameTargetThanCustomMessage() {
26
+ var _this = this;
27
+ var messageManager = Core.getMessageManager();
28
+ return messageManager.getMessageModel().getData().filter(function (msg) {
29
+ var _this$customMessageIn;
30
+ return msg.getTargets()[0] === ((_this$customMessageIn = _this.customMessageInfo.currentMessage) === null || _this$customMessageIn === void 0 ? void 0 : _this$customMessageIn.getTargets()[0]) && msg !== _this.customMessageInfo.currentMessage;
31
+ });
32
+ }
33
+
34
+ /**
35
+ * MessageManager Event Handler responsible to add or remove the current customMessage.
36
+ *
37
+ * @alias sap.fe.core.helpers.LRMessageStrip#_eventHandlerCustomMessage
38
+ * @private
39
+ */;
40
+ _proto._eventHandlerCustomMessage = function _eventHandlerCustomMessage() {
41
+ var _this2 = this;
42
+ var messageManager = Core.getMessageManager();
43
+ if (this.customMessageInfo.currentMessage) {
44
+ var aMessageWithSameTargetThanCustomMessage = this._getMessagesWithSameTargetThanCustomMessage();
45
+ var isCustomMessageInMessageManager = !!messageManager.getMessageModel().getData().find(function (msg) {
46
+ return msg === _this2.customMessageInfo.currentMessage;
47
+ });
48
+ if (aMessageWithSameTargetThanCustomMessage.length > 0 && isCustomMessageInMessageManager) {
49
+ var _this$customMessageIn2;
50
+ //if there are other messages with the same message on the MessageManager and the customMessage
51
+ //then we need to remove the customeMessage from the MessageManager
52
+ messageManager.removeMessages([(_this$customMessageIn2 = this.customMessageInfo) === null || _this$customMessageIn2 === void 0 ? void 0 : _this$customMessageIn2.currentMessage]);
53
+ } else if (aMessageWithSameTargetThanCustomMessage.length === 0 && !isCustomMessageInMessageManager) {
54
+ messageManager.addMessages([this.customMessageInfo.currentMessage]);
55
+ }
56
+ }
57
+ }
58
+
59
+ /**
60
+ * This function manages the lifecycle of the custom message (populates the customMessageInfo object, attaches an event to the message manager and inserts a message).
61
+ *
62
+ * @param event Event object (optional).
63
+ * @param oData Parameters
64
+ * @param oData.message The LRCustomMessage to be used to generate the message object
65
+ * @param oData.table The table targeted by the message
66
+ * @param oData.skipMessageManagerUpdate Should skip to insert the message in the MessageManager
67
+ * @alias sap.fe.core.helpers.LRMessageStrip#createCustomMessage
68
+ * @private
69
+ */;
70
+ _proto.createCustomMessage = function createCustomMessage(event, oData) {
71
+ var _table$getRowBinding, _customMessageMap$tab;
72
+ var message = oData.message;
73
+ var table = oData.table;
74
+ var skipMessageManagerUpdate = oData.skipMessageManagerUpdate;
75
+ var rowBindingPath = (_table$getRowBinding = table.getRowBinding()) === null || _table$getRowBinding === void 0 ? void 0 : _table$getRowBinding.getPath();
76
+ var messageManager = Core.getMessageManager();
77
+ var customMessageMap = this.customMessageInfo.multiModeControlMessagesMap;
78
+ customMessageMap[table.getId()] = message;
79
+ if (!rowBindingPath) {
80
+ table.attachEventOnce("bindingUpdated", oData, this.createCustomMessage, this);
81
+ return;
82
+ }
83
+ if ((_customMessageMap$tab = customMessageMap[table.getId()]) !== null && _customMessageMap$tab !== void 0 && _customMessageMap$tab.onClose) {
84
+ var _customMessageMap$tab2;
85
+ table.getDataStateIndicator().detachEvent("close", (_customMessageMap$tab2 = customMessageMap[table.getId()]) === null || _customMessageMap$tab2 === void 0 ? void 0 : _customMessageMap$tab2.onClose, this);
86
+ }
87
+ var processor = table.getModel();
88
+ var oMessage = message ? new Message({
89
+ message: message.message,
90
+ type: message.type,
91
+ target: [rowBindingPath],
92
+ persistent: true,
93
+ processor: processor
94
+ }) : null;
95
+ this.customMessageInfo.messageManagerDataBinding.detachChange(this._eventHandlerCustomMessage, this);
96
+ if (!skipMessageManagerUpdate) {
97
+ if (this.customMessageInfo.currentMessage) {
98
+ messageManager.removeMessages([this.customMessageInfo.currentMessage]);
99
+ }
100
+ if (oMessage) {
101
+ this.customMessageInfo.currentMessage = oMessage;
102
+ } else {
103
+ delete this.customMessageInfo.currentMessage;
104
+ }
105
+ if (oMessage && this._getMessagesWithSameTargetThanCustomMessage().length === 0) {
106
+ messageManager.addMessages([oMessage]);
107
+ }
108
+ }
109
+ this.customMessageInfo.messageManagerDataBinding.attachChange(this._eventHandlerCustomMessage, this);
110
+ this.attachDataStateIndicatorCloseEvent(table, customMessageMap, message === null || message === void 0 ? void 0 : message.onClose);
111
+ }
112
+
113
+ /**
114
+ * This function attaches the onClose event function to the dataStateIndicator.
115
+ *
116
+ * @param table The table associated with the dataStateIndicator
117
+ * @param customMessageMap The CustomMessageMap object
118
+ * @param fnOnClose A function to be attached to the "close" event
119
+ * @alias sap.fe.core.helpers.LRMessageStrip#attachDataStateIndicatorCloseEvent
120
+ * @private
121
+ */;
122
+ _proto.attachDataStateIndicatorCloseEvent = function attachDataStateIndicatorCloseEvent(table, customMessageMap, fnOnClose) {
123
+ if (fnOnClose) {
124
+ table.getDataStateIndicator().attachEventOnce("close", fnOnClose, this);
125
+ }
126
+ //When closing the the messageStrip, the associated message is removed
127
+ table.getDataStateIndicator().attachEventOnce("close", function () {
128
+ delete customMessageMap[table.getId()];
129
+ });
130
+ }
131
+
132
+ /**
133
+ * MultipleModeControl Event handler responsible for displaying the correct custom message when a specific tab is selected.
134
+ *
135
+ * @alias sap.fe.core.helpers.LRMessageStrip#onSelectMultipleModeControl
136
+ * @private
137
+ */;
138
+ _proto.onSelectMultipleModeControl = function onSelectMultipleModeControl(event, controller) {
139
+ var table = controller._getTable();
140
+ var message = this.customMessageInfo.multiModeControlMessagesMap[table.getId()];
141
+ this.createCustomMessage(null, {
142
+ message: message,
143
+ table: table
144
+ });
145
+ }
146
+
147
+ /**
148
+ * Provide an option for showing a custom message in the message bar above the list report table.
149
+ *
150
+ * @param {object} [message] Custom message along with the message type to be set on the table.
151
+ * @param {string} [message.message] Message string to be displayed.
152
+ * @param {sap.ui.core.MessageType} [message.type] Indicates the type of message.
153
+ * @param {ListReportController} [controller] Controller of the current view.
154
+ * @param {string[]|string} [tabKey] The entitySet identifying the table in which to display the custom message.
155
+ * @param {Function} [onClose] A function that is called when the user closes the message bar.
156
+ * @private
157
+ */;
158
+ _proto.showCustomMessage = function showCustomMessage(message, controller, tabKey, onClose) {
159
+ var _this3 = this;
160
+ var _tabKey = Array.isArray(tabKey) ? tabKey : [tabKey];
161
+ var isMultiMode = controller._isMultiMode();
162
+ var table;
163
+ if (message) {
164
+ message.onClose = onClose;
165
+ }
166
+ if (isMultiMode) {
167
+ var multipleModeControl = controller._getMultiModeControl();
168
+ //we fisrt need to detach the select event to prevent multiple attachments.
169
+ multipleModeControl.detachEvent("select", this.onSelectMultipleModeControl, this);
170
+ multipleModeControl.attachEvent("select", controller, this.onSelectMultipleModeControl, this);
171
+ multipleModeControl.getAllInnerControls(true).forEach(function (innerControl, index) {
172
+ if (innerControl.isA("sap.fe.macros.table.TableAPI")) {
173
+ if (!tabKey || _tabKey.indexOf(index.toString()) !== -1) {
174
+ table = innerControl.getContent();
175
+ _this3.createCustomMessage(null, {
176
+ message: message,
177
+ table: table,
178
+ skipMessageManagerUpdate: multipleModeControl.getSelectedInnerControl() !== innerControl
179
+ });
180
+ }
181
+ }
182
+ });
183
+ return;
184
+ }
185
+ table = controller._getTable();
186
+ this.createCustomMessage(null, {
187
+ message: message,
188
+ table: table
189
+ });
190
+ };
191
+ return LRMessageStrip;
192
+ }();
193
+ _exports.LRMessageStrip = LRMessageStrip;
194
+ return _exports;
195
+ }, false);
196
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMUk1lc3NhZ2VTdHJpcCIsIm1lc3NhZ2VNYW5hZ2VyIiwiQ29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiY3VzdG9tTWVzc2FnZUluZm8iLCJtZXNzYWdlTWFuYWdlckRhdGFCaW5kaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiYmluZExpc3QiLCJtdWx0aU1vZGVDb250cm9sTWVzc2FnZXNNYXAiLCJnZXRDdXN0b21NZXNzYWdlSW5mbyIsImRlc3Ryb3kiLCJkZXRhY2hDaGFuZ2UiLCJfZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZSIsIl9nZXRNZXNzYWdlc1dpdGhTYW1lVGFyZ2V0VGhhbkN1c3RvbU1lc3NhZ2UiLCJnZXREYXRhIiwiZmlsdGVyIiwibXNnIiwiZ2V0VGFyZ2V0cyIsImN1cnJlbnRNZXNzYWdlIiwiYU1lc3NhZ2VXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlIiwiaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlciIsImZpbmQiLCJsZW5ndGgiLCJyZW1vdmVNZXNzYWdlcyIsImFkZE1lc3NhZ2VzIiwiY3JlYXRlQ3VzdG9tTWVzc2FnZSIsImV2ZW50Iiwib0RhdGEiLCJtZXNzYWdlIiwidGFibGUiLCJza2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUiLCJyb3dCaW5kaW5nUGF0aCIsImdldFJvd0JpbmRpbmciLCJnZXRQYXRoIiwiY3VzdG9tTWVzc2FnZU1hcCIsImdldElkIiwiYXR0YWNoRXZlbnRPbmNlIiwib25DbG9zZSIsImdldERhdGFTdGF0ZUluZGljYXRvciIsImRldGFjaEV2ZW50IiwicHJvY2Vzc29yIiwiZ2V0TW9kZWwiLCJvTWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwidGFyZ2V0IiwicGVyc2lzdGVudCIsImF0dGFjaENoYW5nZSIsImF0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnQiLCJmbk9uQ2xvc2UiLCJvblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2wiLCJjb250cm9sbGVyIiwiX2dldFRhYmxlIiwic2hvd0N1c3RvbU1lc3NhZ2UiLCJ0YWJLZXkiLCJfdGFiS2V5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNNdWx0aU1vZGUiLCJfaXNNdWx0aU1vZGUiLCJtdWx0aXBsZU1vZGVDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJhdHRhY2hFdmVudCIsImdldEFsbElubmVyQ29udHJvbHMiLCJmb3JFYWNoIiwiaW5uZXJDb250cm9sIiwiaW5kZXgiLCJpc0EiLCJpbmRleE9mIiwidG9TdHJpbmciLCJnZXRDb250ZW50IiwiZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2wiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkxSTWVzc2FnZVN0cmlwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSW5uZXJDb250cm9sVHlwZSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvY29udHJvbHMvTXVsdGlwbGVNb2RlQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgTGlzdFJlcG9ydENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNRENUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9MaXN0QmluZGluZ1wiO1xuXG5leHBvcnQgdHlwZSBMUkN1c3RvbU1lc3NhZ2UgPSB7XG5cdG1lc3NhZ2U6IHN0cmluZztcblx0dHlwZT86IE1lc3NhZ2VUeXBlO1xuXHRvbkNsb3NlPzogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgY2xhc3MgTFJNZXNzYWdlU3RyaXAge1xuXHRjdXN0b21NZXNzYWdlSW5mbyE6IHtcblx0XHRtZXNzYWdlTWFuYWdlckRhdGFCaW5kaW5nOiBMaXN0QmluZGluZztcblx0XHRjdXJyZW50TWVzc2FnZT86IE1lc3NhZ2U7XG5cdFx0bXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwOiB7IFtrZXk6IHN0cmluZ106IExSQ3VzdG9tTWVzc2FnZSB8IHVuZGVmaW5lZCB9O1xuXHR9O1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBtZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvID0ge1xuXHRcdFx0bWVzc2FnZU1hbmFnZXJEYXRhQmluZGluZzogbWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuYmluZExpc3QoXCIvXCIpLFxuXHRcdFx0bXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwOiB7fVxuXHRcdH07XG5cdH1cblx0Z2V0Q3VzdG9tTWVzc2FnZUluZm8oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY3VzdG9tTWVzc2FnZUluZm87XG5cdH1cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm1lc3NhZ2VNYW5hZ2VyRGF0YUJpbmRpbmcuZGV0YWNoQ2hhbmdlKHRoaXMuX2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UsIHRoaXMpO1xuXHR9XG5cdF9nZXRNZXNzYWdlc1dpdGhTYW1lVGFyZ2V0VGhhbkN1c3RvbU1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgbWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0cmV0dXJuIG1lc3NhZ2VNYW5hZ2VyXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdChtc2c6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdFx0bXNnLmdldFRhcmdldHMoKVswXSA9PT0gdGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZT8uZ2V0VGFyZ2V0cygpWzBdICYmXG5cdFx0XHRcdFx0bXNnICE9PSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1lc3NhZ2VNYW5hZ2VyIEV2ZW50IEhhbmRsZXIgcmVzcG9uc2libGUgdG8gYWRkIG9yIHJlbW92ZSB0aGUgY3VycmVudCBjdXN0b21NZXNzYWdlLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNfZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgbWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0aWYgKHRoaXMuY3VzdG9tTWVzc2FnZUluZm8uY3VycmVudE1lc3NhZ2UpIHtcblx0XHRcdGNvbnN0IGFNZXNzYWdlV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZSA9IHRoaXMuX2dldE1lc3NhZ2VzV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZSgpO1xuXHRcdFx0Y29uc3QgaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlciA9ICEhbWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbmQoKG1zZzogTWVzc2FnZSkgPT4gbXNnID09PSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlKTtcblxuXHRcdFx0aWYgKGFNZXNzYWdlV2l0aFNhbWVUYXJnZXRUaGFuQ3VzdG9tTWVzc2FnZS5sZW5ndGggPiAwICYmIGlzQ3VzdG9tTWVzc2FnZUluTWVzc2FnZU1hbmFnZXIpIHtcblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgb3RoZXIgbWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBtZXNzYWdlIG9uIHRoZSBNZXNzYWdlTWFuYWdlciBhbmQgdGhlIGN1c3RvbU1lc3NhZ2Vcblx0XHRcdFx0Ly90aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBjdXN0b21lTWVzc2FnZSBmcm9tIHRoZSBNZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRtZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhbdGhpcy5jdXN0b21NZXNzYWdlSW5mbz8uY3VycmVudE1lc3NhZ2VdKTtcblx0XHRcdH0gZWxzZSBpZiAoYU1lc3NhZ2VXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlLmxlbmd0aCA9PT0gMCAmJiAhaXNDdXN0b21NZXNzYWdlSW5NZXNzYWdlTWFuYWdlcikge1xuXHRcdFx0XHRtZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhbdGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIG1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgY3VzdG9tIG1lc3NhZ2UgKHBvcHVsYXRlcyB0aGUgY3VzdG9tTWVzc2FnZUluZm8gb2JqZWN0LCBhdHRhY2hlcyBhbiBldmVudCB0byB0aGUgbWVzc2FnZSBtYW5hZ2VyIGFuZCBpbnNlcnRzIGEgbWVzc2FnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBFdmVudCBvYmplY3QgKG9wdGlvbmFsKS5cblx0ICogQHBhcmFtIG9EYXRhIFBhcmFtZXRlcnNcblx0ICogQHBhcmFtIG9EYXRhLm1lc3NhZ2UgVGhlIExSQ3VzdG9tTWVzc2FnZSB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG9iamVjdFxuXHQgKiBAcGFyYW0gb0RhdGEudGFibGUgVGhlIHRhYmxlIHRhcmdldGVkIGJ5IHRoZSBtZXNzYWdlXG5cdCAqIEBwYXJhbSBvRGF0YS5za2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUgU2hvdWxkIHNraXAgdG8gaW5zZXJ0IHRoZSBtZXNzYWdlIGluIHRoZSBNZXNzYWdlTWFuYWdlclxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNjcmVhdGVDdXN0b21NZXNzYWdlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21NZXNzYWdlKFxuXHRcdGV2ZW50OiBFdmVudCB8IG51bGwsXG5cdFx0b0RhdGE6IHsgbWVzc2FnZTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkOyB0YWJsZTogTURDVGFibGU7IHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZT86IGJvb2xlYW4gfVxuXHQpIHtcblx0XHRjb25zdCBtZXNzYWdlID0gb0RhdGEubWVzc2FnZTtcblx0XHRjb25zdCB0YWJsZSA9IG9EYXRhLnRhYmxlO1xuXHRcdGNvbnN0IHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZSA9IG9EYXRhLnNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZTtcblx0XHRjb25zdCByb3dCaW5kaW5nUGF0aCA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKT8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdGNvbnN0IGN1c3RvbU1lc3NhZ2VNYXAgPSB0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm11bHRpTW9kZUNvbnRyb2xNZXNzYWdlc01hcDtcblx0XHRjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldID0gbWVzc2FnZTtcblx0XHRpZiAoIXJvd0JpbmRpbmdQYXRoKSB7XG5cdFx0XHR0YWJsZS5hdHRhY2hFdmVudE9uY2UoXCJiaW5kaW5nVXBkYXRlZFwiLCBvRGF0YSwgdGhpcy5jcmVhdGVDdXN0b21NZXNzYWdlLCB0aGlzKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY3VzdG9tTWVzc2FnZU1hcFt0YWJsZS5nZXRJZCgpXT8ub25DbG9zZSkge1xuXHRcdFx0dGFibGUuZ2V0RGF0YVN0YXRlSW5kaWNhdG9yKCkuZGV0YWNoRXZlbnQoXCJjbG9zZVwiLCBjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldPy5vbkNsb3NlIGFzIEZ1bmN0aW9uLCB0aGlzKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0YWJsZS5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG9NZXNzYWdlID0gbWVzc2FnZVxuXHRcdFx0PyBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlLFxuXHRcdFx0XHRcdHR5cGU6IG1lc3NhZ2UudHlwZSxcblx0XHRcdFx0XHR0YXJnZXQ6IFtyb3dCaW5kaW5nUGF0aF0sXG5cdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRwcm9jZXNzb3Jcblx0XHRcdCAgfSlcblx0XHRcdDogbnVsbDtcblxuXHRcdHRoaXMuY3VzdG9tTWVzc2FnZUluZm8ubWVzc2FnZU1hbmFnZXJEYXRhQmluZGluZy5kZXRhY2hDaGFuZ2UodGhpcy5fZXZlbnRIYW5kbGVyQ3VzdG9tTWVzc2FnZSwgdGhpcyk7XG5cdFx0aWYgKCFza2lwTWVzc2FnZU1hbmFnZXJVcGRhdGUpIHtcblx0XHRcdGlmICh0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlKSB7XG5cdFx0XHRcdG1lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLmN1cnJlbnRNZXNzYWdlXSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01lc3NhZ2UpIHtcblx0XHRcdFx0dGhpcy5jdXN0b21NZXNzYWdlSW5mby5jdXJyZW50TWVzc2FnZSA9IG9NZXNzYWdlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuY3VzdG9tTWVzc2FnZUluZm8uY3VycmVudE1lc3NhZ2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01lc3NhZ2UgJiYgdGhpcy5fZ2V0TWVzc2FnZXNXaXRoU2FtZVRhcmdldFRoYW5DdXN0b21NZXNzYWdlKCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdG1lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFtvTWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmN1c3RvbU1lc3NhZ2VJbmZvLm1lc3NhZ2VNYW5hZ2VyRGF0YUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX2V2ZW50SGFuZGxlckN1c3RvbU1lc3NhZ2UsIHRoaXMpO1xuXG5cdFx0dGhpcy5hdHRhY2hEYXRhU3RhdGVJbmRpY2F0b3JDbG9zZUV2ZW50KHRhYmxlLCBjdXN0b21NZXNzYWdlTWFwLCBtZXNzYWdlPy5vbkNsb3NlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIHRoZSBvbkNsb3NlIGV2ZW50IGZ1bmN0aW9uIHRvIHRoZSBkYXRhU3RhdGVJbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhU3RhdGVJbmRpY2F0b3Jcblx0ICogQHBhcmFtIGN1c3RvbU1lc3NhZ2VNYXAgVGhlIEN1c3RvbU1lc3NhZ2VNYXAgb2JqZWN0XG5cdCAqIEBwYXJhbSBmbk9uQ2xvc2UgQSBmdW5jdGlvbiB0byBiZSBhdHRhY2hlZCB0byB0aGUgXCJjbG9zZVwiIGV2ZW50XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5oZWxwZXJzLkxSTWVzc2FnZVN0cmlwI2F0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGF0dGFjaERhdGFTdGF0ZUluZGljYXRvckNsb3NlRXZlbnQoXG5cdFx0dGFibGU6IE1EQ1RhYmxlLFxuXHRcdGN1c3RvbU1lc3NhZ2VNYXA6IHsgW2tleTogc3RyaW5nXTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkIH0sXG5cdFx0Zm5PbkNsb3NlPzogRnVuY3Rpb25cblx0KSB7XG5cdFx0aWYgKGZuT25DbG9zZSkge1xuXHRcdFx0dGFibGUuZ2V0RGF0YVN0YXRlSW5kaWNhdG9yKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2xvc2VcIiwgZm5PbkNsb3NlLCB0aGlzKTtcblx0XHR9XG5cdFx0Ly9XaGVuIGNsb3NpbmcgdGhlIHRoZSBtZXNzYWdlU3RyaXAsIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UgaXMgcmVtb3ZlZFxuXHRcdHRhYmxlLmdldERhdGFTdGF0ZUluZGljYXRvcigpLmF0dGFjaEV2ZW50T25jZShcImNsb3NlXCIsICgpID0+IHtcblx0XHRcdGRlbGV0ZSBjdXN0b21NZXNzYWdlTWFwW3RhYmxlLmdldElkKCldO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE11bHRpcGxlTW9kZUNvbnRyb2wgRXZlbnQgaGFuZGxlciByZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyB0aGUgY29ycmVjdCBjdXN0b20gbWVzc2FnZSB3aGVuIGEgc3BlY2lmaWMgdGFiIGlzIHNlbGVjdGVkLlxuXHQgKlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuaGVscGVycy5MUk1lc3NhZ2VTdHJpcCNvblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2xcblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0b25TZWxlY3RNdWx0aXBsZU1vZGVDb250cm9sKGV2ZW50OiBFdmVudCwgY29udHJvbGxlcjogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRjb25zdCB0YWJsZSA9IGNvbnRyb2xsZXIuX2dldFRhYmxlKCkgYXMgTURDVGFibGU7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHRoaXMuY3VzdG9tTWVzc2FnZUluZm8ubXVsdGlNb2RlQ29udHJvbE1lc3NhZ2VzTWFwW3RhYmxlLmdldElkKCldO1xuXHRcdHRoaXMuY3JlYXRlQ3VzdG9tTWVzc2FnZShudWxsLCB7IG1lc3NhZ2UsIHRhYmxlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGUgYW4gb3B0aW9uIGZvciBzaG93aW5nIGEgY3VzdG9tIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgYmFyIGFib3ZlIHRoZSBsaXN0IHJlcG9ydCB0YWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttZXNzYWdlXSBDdXN0b20gbWVzc2FnZSBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIHR5cGUgdG8gYmUgc2V0IG9uIHRoZSB0YWJsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlLm1lc3NhZ2VdIE1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGRpc3BsYXllZC5cblx0ICogQHBhcmFtIHtzYXAudWkuY29yZS5NZXNzYWdlVHlwZX0gW21lc3NhZ2UudHlwZV0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSB7TGlzdFJlcG9ydENvbnRyb2xsZXJ9IFtjb250cm9sbGVyXSBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXcuXG5cdCAqIEBwYXJhbSB7c3RyaW5nW118c3RyaW5nfSBbdGFiS2V5XSBUaGUgZW50aXR5U2V0IGlkZW50aWZ5aW5nIHRoZSB0YWJsZSBpbiB3aGljaCB0byBkaXNwbGF5IHRoZSBjdXN0b20gbWVzc2FnZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uQ2xvc2VdIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgYmFyLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0c2hvd0N1c3RvbU1lc3NhZ2UoXG5cdFx0bWVzc2FnZTogTFJDdXN0b21NZXNzYWdlIHwgdW5kZWZpbmVkLFxuXHRcdGNvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdHRhYktleT86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCxcblx0XHRvbkNsb3NlPzogRnVuY3Rpb25cblx0KSB7XG5cdFx0Y29uc3QgX3RhYktleSA9IEFycmF5LmlzQXJyYXkodGFiS2V5KSA/IHRhYktleSA6IFt0YWJLZXldO1xuXHRcdGNvbnN0IGlzTXVsdGlNb2RlID0gY29udHJvbGxlci5faXNNdWx0aU1vZGUoKTtcblx0XHRsZXQgdGFibGU6IE1EQ1RhYmxlO1xuXHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHRtZXNzYWdlLm9uQ2xvc2UgPSBvbkNsb3NlO1xuXHRcdH1cblx0XHRpZiAoaXNNdWx0aU1vZGUpIHtcblx0XHRcdGNvbnN0IG11bHRpcGxlTW9kZUNvbnRyb2wgPSBjb250cm9sbGVyLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHQvL3dlIGZpc3J0IG5lZWQgdG8gZGV0YWNoIHRoZSBzZWxlY3QgZXZlbnQgdG8gcHJldmVudCBtdWx0aXBsZSBhdHRhY2htZW50cy5cblx0XHRcdG11bHRpcGxlTW9kZUNvbnRyb2wuZGV0YWNoRXZlbnQoXCJzZWxlY3RcIiwgdGhpcy5vblNlbGVjdE11bHRpcGxlTW9kZUNvbnRyb2wsIHRoaXMpO1xuXHRcdFx0bXVsdGlwbGVNb2RlQ29udHJvbC5hdHRhY2hFdmVudChcInNlbGVjdFwiLCBjb250cm9sbGVyLCB0aGlzLm9uU2VsZWN0TXVsdGlwbGVNb2RlQ29udHJvbCwgdGhpcyk7XG5cblx0XHRcdG11bHRpcGxlTW9kZUNvbnRyb2wuZ2V0QWxsSW5uZXJDb250cm9scyh0cnVlKS5mb3JFYWNoKChpbm5lckNvbnRyb2w6IElubmVyQ29udHJvbFR5cGUsIGluZGV4OiBudW1iZXIpID0+IHtcblx0XHRcdFx0aWYgKGlubmVyQ29udHJvbC5pc0EoXCJzYXAuZmUubWFjcm9zLnRhYmxlLlRhYmxlQVBJXCIpKSB7XG5cdFx0XHRcdFx0aWYgKCF0YWJLZXkgfHwgX3RhYktleS5pbmRleE9mKGluZGV4LnRvU3RyaW5nKCkpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0dGFibGUgPSAoaW5uZXJDb250cm9sIGFzIGFueSkuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRcdFx0dGhpcy5jcmVhdGVDdXN0b21NZXNzYWdlKG51bGwsIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0dGFibGUsXG5cdFx0XHRcdFx0XHRcdHNraXBNZXNzYWdlTWFuYWdlclVwZGF0ZTogbXVsdGlwbGVNb2RlQ29udHJvbC5nZXRTZWxlY3RlZElubmVyQ29udHJvbCgpICE9PSBpbm5lckNvbnRyb2xcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGFibGUgPSBjb250cm9sbGVyLl9nZXRUYWJsZSgpIGFzIE1EQ1RhYmxlO1xuXHRcdHRoaXMuY3JlYXRlQ3VzdG9tTWVzc2FnZShudWxsLCB7IG1lc3NhZ2UsIHRhYmxlIH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O01BZWFBLGNBQWM7SUFNMUIsMEJBQWM7TUFDYixJQUFNQyxjQUFjLEdBQUdDLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7TUFDL0MsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRztRQUN4QkMseUJBQXlCLEVBQUVKLGNBQWMsQ0FBQ0ssZUFBZSxFQUFFLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDekVDLDJCQUEyQixFQUFFLENBQUM7TUFDL0IsQ0FBQztJQUNGO0lBQUM7SUFBQTtJQUFBLE9BQ0RDLG9CQUFvQixHQUFwQixnQ0FBdUI7TUFDdEIsT0FBTyxJQUFJLENBQUNMLGlCQUFpQjtJQUM5QixDQUFDO0lBQUEsT0FDRE0sT0FBTyxHQUFQLG1CQUFVO01BQ1QsSUFBSSxDQUFDTixpQkFBaUIsQ0FBQ0MseUJBQXlCLENBQUNNLFlBQVksQ0FBQyxJQUFJLENBQUNDLDBCQUEwQixFQUFFLElBQUksQ0FBQztJQUNyRyxDQUFDO0lBQUEsT0FDREMsMkNBQTJDLEdBQTNDLHVEQUE4QztNQUFBO01BQzdDLElBQU1aLGNBQWMsR0FBR0MsSUFBSSxDQUFDQyxpQkFBaUIsRUFBRTtNQUMvQyxPQUFPRixjQUFjLENBQ25CSyxlQUFlLEVBQUUsQ0FDakJRLE9BQU8sRUFBRSxDQUNUQyxNQUFNLENB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