@sapui5/sap.fe.templates 1.98.0 → 1.101.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 (144) hide show
  1. package/package.json +9 -6
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +25 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +31 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +157 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +83 -39
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +124 -107
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +100 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +34 -27
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1112 -1001
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1009 -0
  18. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +55 -53
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +135 -136
  21. package/src/sap/fe/templates/ListReport/overrides/Share.ts +134 -0
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +444 -406
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +413 -0
  24. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +31 -23
  25. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  27. package/src/sap/fe/templates/ListReport/view/fragments/MultipleModeOld.fragment.xml +50 -0
  28. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +479 -473
  29. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +511 -0
  30. package/src/sap/fe/templates/ObjectPage/Component.js +170 -149
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +141 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +14 -53
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1531 -1464
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1442 -0
  37. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +137 -95
  38. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +25 -21
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +99 -53
  42. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  43. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +21 -16
  44. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +51 -47
  46. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +35 -34
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  49. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +16 -15
  50. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +12 -11
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  53. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +56 -52
  54. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +16 -17
  56. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +14 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +24 -21
  60. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +311 -317
  62. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +67 -57
  64. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  65. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +1 -1
  66. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +3 -3
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +18 -24
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +38 -0
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +1 -1
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +9 -5
  71. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +1 -0
  72. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +1 -0
  73. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +33 -0
  74. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +17 -0
  75. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +18 -0
  76. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +3 -3
  77. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +3 -3
  78. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  79. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +852 -815
  80. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +795 -0
  81. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +206 -187
  82. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  83. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +485 -459
  84. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  85. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +17 -14
  86. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  87. package/src/sap/fe/templates/TableScroller.js +46 -53
  88. package/src/sap/fe/templates/TableScroller.ts +48 -0
  89. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  90. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +22 -0
  91. package/src/sap/fe/templates/library.js +50 -63
  92. package/src/sap/fe/templates/library.ts +57 -0
  93. package/src/sap/fe/templates/messagebundle.properties +32 -36
  94. package/src/sap/fe/templates/messagebundle_ar.properties +15 -8
  95. package/src/sap/fe/templates/messagebundle_bg.properties +15 -8
  96. package/src/sap/fe/templates/messagebundle_ca.properties +15 -8
  97. package/src/sap/fe/templates/messagebundle_cs.properties +15 -8
  98. package/src/sap/fe/templates/messagebundle_cy.properties +15 -8
  99. package/src/sap/fe/templates/messagebundle_da.properties +15 -8
  100. package/src/sap/fe/templates/messagebundle_de.properties +15 -8
  101. package/src/sap/fe/templates/messagebundle_el.properties +16 -9
  102. package/src/sap/fe/templates/messagebundle_en.properties +15 -8
  103. package/src/sap/fe/templates/messagebundle_en_GB.properties +15 -8
  104. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +9 -6
  105. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +15 -8
  106. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +15 -8
  107. package/src/sap/fe/templates/messagebundle_es.properties +15 -8
  108. package/src/sap/fe/templates/messagebundle_es_MX.properties +15 -8
  109. package/src/sap/fe/templates/messagebundle_et.properties +15 -8
  110. package/src/sap/fe/templates/messagebundle_fi.properties +15 -8
  111. package/src/sap/fe/templates/messagebundle_fr.properties +15 -8
  112. package/src/sap/fe/templates/messagebundle_fr_CA.properties +15 -8
  113. package/src/sap/fe/templates/messagebundle_hi.properties +15 -8
  114. package/src/sap/fe/templates/messagebundle_hr.properties +16 -9
  115. package/src/sap/fe/templates/messagebundle_hu.properties +15 -8
  116. package/src/sap/fe/templates/messagebundle_id.properties +17 -10
  117. package/src/sap/fe/templates/messagebundle_it.properties +15 -8
  118. package/src/sap/fe/templates/messagebundle_iw.properties +15 -8
  119. package/src/sap/fe/templates/messagebundle_ja.properties +15 -8
  120. package/src/sap/fe/templates/messagebundle_kk.properties +15 -8
  121. package/src/sap/fe/templates/messagebundle_ko.properties +15 -8
  122. package/src/sap/fe/templates/messagebundle_lt.properties +15 -8
  123. package/src/sap/fe/templates/messagebundle_lv.properties +15 -8
  124. package/src/sap/fe/templates/messagebundle_ms.properties +15 -8
  125. package/src/sap/fe/templates/messagebundle_nl.properties +15 -8
  126. package/src/sap/fe/templates/messagebundle_no.properties +15 -8
  127. package/src/sap/fe/templates/messagebundle_pl.properties +15 -8
  128. package/src/sap/fe/templates/messagebundle_pt.properties +18 -11
  129. package/src/sap/fe/templates/messagebundle_pt_PT.properties +16 -9
  130. package/src/sap/fe/templates/messagebundle_ro.properties +15 -8
  131. package/src/sap/fe/templates/messagebundle_ru.properties +15 -8
  132. package/src/sap/fe/templates/messagebundle_sh.properties +15 -8
  133. package/src/sap/fe/templates/messagebundle_sk.properties +15 -8
  134. package/src/sap/fe/templates/messagebundle_sl.properties +15 -8
  135. package/src/sap/fe/templates/messagebundle_sv.properties +16 -9
  136. package/src/sap/fe/templates/messagebundle_th.properties +15 -8
  137. package/src/sap/fe/templates/messagebundle_tr.properties +15 -8
  138. package/src/sap/fe/templates/messagebundle_uk.properties +16 -9
  139. package/src/sap/fe/templates/messagebundle_vi.properties +15 -8
  140. package/src/sap/fe/templates/messagebundle_zh_CN.properties +15 -8
  141. package/src/sap/fe/templates/messagebundle_zh_TW.properties +15 -8
  142. package/ui5.yaml +0 -3
  143. package/src/sap/fe/templates/ListReport/overrides/MassEdit.js +0 -95
  144. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.xml +0 -49
@@ -1,476 +1,482 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
+ sap.ui.define(["sap/fe/macros/CommonHelper", "sap/ui/base/ManagedObject", "sap/ui/model/odata/v4/AnnotationHelper"], function (CommonHelper, ManagedObject, ODataModelAnnotationHelper) {
6
+ "use strict";
5
7
 
6
- sap.ui.define(
7
- ["sap/ui/model/odata/v4/AnnotationHelper", "sap/ui/base/ManagedObject", "sap/fe/macros/CommonHelper"],
8
- function(ODataModelAnnotationHelper, ManagedObject, CommonHelper) {
9
- "use strict";
10
-
11
- /*
12
- This class contains annotation helpers that might be used from several templates or controls
13
- */
14
-
15
- var AnnotationHelper = {
16
- getElementBinding: function(sPath) {
17
- var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
18
- if (sNavigationPath) {
19
- return "{path:'" + sNavigationPath + "'}";
20
- } else {
21
- //no navigation property needs empty object
22
- return "{path: ''}";
23
- }
24
- },
25
-
26
- /**
27
- * Function to check if draft pattern is supported.
28
- *
29
- * @param {object} oAnnotations Annotations of the current entity set.
30
- * @returns {string} Returns the Boolean value based on draft state
31
- */
32
- checkDraftState: function(oAnnotations) {
33
- if (
34
- oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] &&
35
- oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]
36
- ) {
37
- return true;
38
- } else {
39
- return false;
40
- }
41
- },
42
-
43
- /**
44
- * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
45
- *
46
- * @param {object} oAnnotations Annotations of the current entity set.
47
- * @returns {string} Returns expression binding or Boolean value based on the draft state
48
- */
49
- getSwitchToActiveVisibility: function(oAnnotations) {
50
- if (this.checkDraftState(oAnnotations)) {
51
- return "{= (${ui>/editMode} === 'Editable') && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} }";
52
- } else {
53
- return false;
54
- }
55
- },
56
-
57
- /**
58
- * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
59
- *
60
- * @param {object} oAnnotations Annotations of the current entity set.
61
- * @returns {string} Returns expression binding or Boolean value based on the draft state
62
- */
63
- getSwitchToDraftVisibility: function(oAnnotations) {
64
- if (this.checkDraftState(oAnnotations)) {
65
- return "{= !(${ui>/editMode} === 'Editable') && !${ui>createMode} && (${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe}) }";
66
- } else {
67
- return false;
68
- }
69
- },
70
-
71
- /**
72
- * Function to find an action from the array of header actions in the converter context.
73
- *
74
- * @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
75
- * @param {string} sActionType The action type
76
- * @returns {object | undefined} The action with the matching action type
77
- * @private
78
- */
79
- _findAction: function(aConverterContextHeaderActions, sActionType) {
80
- var oAction;
81
- if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
82
- oAction = aConverterContextHeaderActions.find(function(oHeaderAction) {
83
- return oHeaderAction.type === sActionType;
84
- });
85
- }
86
- return oAction;
87
- },
88
-
89
- /**
90
- * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
91
- *
92
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
93
- * @returns {string} Returns expression binding or Boolean value from the converter output
94
- */
95
- getDeleteCommandExecutionEnabled: function(aConverterContextHeaderActions) {
96
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
97
- return oDeleteAction ? oDeleteAction.enabled : "true";
98
- },
99
- /**
100
- * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
101
- *
102
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
103
- * @returns {string} Returns expression binding or Boolean value from the converter output
104
- */
105
- getDeleteCommandExecutionVisible: function(aConverterContextHeaderActions) {
106
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
107
- return oDeleteAction ? oDeleteAction.visible : "true";
108
- },
109
- /**
110
- * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
111
- *
112
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
113
- * @returns {string} Returns expression binding or Boolean value from the converter output
114
- */
115
- getEditCommandExecutionVisible: function(aConverterContextHeaderActions) {
116
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
117
- return oEditAction ? oEditAction.visible : "true";
118
- },
119
- /**
120
- * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
121
- *
122
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
123
- * @returns {string} Returns expression binding or Boolean value from the converter output
124
- */
125
- getEditCommandExecutionEnabled: function(aConverterContextHeaderActions) {
126
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
127
- return oEditAction ? oEditAction.enabled : "true";
128
- },
129
- /**
130
- * Function to get the EditAction from the Entityset based on Draft or sticky based application.
131
- *
132
- * @param {object} [oEntitySet] The value from the expression.
133
- * @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
134
- */
135
- getEditAction: function(oEntitySet) {
136
- var sPath = oEntitySet.getPath(),
137
- oAnnotations = oEntitySet.getObject(sPath + "@");
138
- var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
139
- var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
140
- var sActionName;
141
- if (bDraftRoot) {
142
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
143
- } else if (bStickySession) {
144
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
145
- }
146
- return !sActionName ? sActionName : sPath + "/" + sActionName;
147
- },
148
- isReadOnlyFromStaticAnnotations: function(oAnnotations, oFieldControl) {
149
- var bComputed, bImmutable, bReadOnly;
150
- if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
151
- bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool
152
- ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true"
153
- : true;
154
- }
155
- if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
156
- bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool
157
- ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true"
158
- : true;
159
- }
160
- bReadOnly = bComputed || bImmutable;
161
-
162
- if (oFieldControl) {
163
- bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
164
- }
165
- if (bReadOnly) {
166
- return false;
167
- } else {
168
- return true;
169
- }
170
- },
171
- isReadOnlyFromDynamicAnnotations: function(oFieldControl) {
172
- var sIsFieldControlPathReadOnly;
173
- if (oFieldControl) {
174
- if (ManagedObject.bindingParser(oFieldControl)) {
175
- sIsFieldControlPathReadOnly = "$" + oFieldControl + " === '1'";
176
- }
177
- }
178
- if (sIsFieldControlPathReadOnly) {
179
- return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
180
- } else {
181
- return true;
182
- }
183
- },
184
- /*
185
- * Function to get the expression for chart Title Press
186
- *
187
- * @function
188
- * @param {oConfiguration} [oConfigurations] control configuration from manifest
189
- * @param {oManifest} [oManifest] Outbounds from manifest
190
- * returns {String} [sCollectionName] Collection Name of the Micro Chart
191
- *
192
- * returns {String} [Expression] Handler Expression for the title press
193
- *
194
- */
195
- getExpressionForMicroChartTitlePress: function(oConfiguration, oManifestOutbound, sCollectionName) {
196
- if (oConfiguration) {
197
- if (
198
- (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) ||
199
- (oConfiguration["targetOutbound"] &&
200
- oConfiguration["targetOutbound"]["outbound"] &&
201
- oConfiguration["targetSections"])
202
- ) {
203
- return (
204
- ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" +
205
- JSON.stringify(oManifestOutbound) +
206
- "','" +
207
- oConfiguration["targetOutbound"]["outbound"] +
208
- "','" +
209
- sCollectionName +
210
- "' )"
211
- );
212
- } else if (oConfiguration["targetSections"]) {
213
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
214
- } else {
215
- return undefined;
216
- }
217
- }
218
- },
219
- /*
220
- * Function to render Chart Title as Link
221
- *
222
- * @function
223
- * @param {oControlConfiguration} [oConfigurations] control configuration from manifest
224
- * returns {String} [sKey] For the TargetOutbound and TargetSection
225
- *
226
- */
227
- getMicroChartTitleAsLink: function(oControlConfiguration) {
228
- if (
229
- oControlConfiguration &&
230
- (oControlConfiguration["targetOutbound"] ||
231
- (oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"]))
232
- ) {
233
- return "External";
234
- } else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
235
- return "InPage";
236
- } else {
237
- return "None";
238
- }
239
- },
240
-
241
- /* Get groupId from control configuration
242
- *
243
- * @function
244
- * @param {Object} [oConfigurations] control configuration from manifest
245
- * @param {String} [sAnnotationPath] Annotation Path for the configuration
246
- * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
247
- *
248
- */
249
- getGroupIdFromConfig: function(oConfigurations, sAnnotationPath, sDefaultGroupId) {
250
- var oConfiguration = oConfigurations[sAnnotationPath],
251
- aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"],
252
- sGroupId = sDefaultGroupId;
253
- if (
254
- oConfiguration &&
255
- oConfiguration.requestGroupId &&
256
- aAutoPatterns.some(function(autoPattern) {
257
- return autoPattern === oConfiguration.requestGroupId;
258
- })
259
- ) {
260
- sGroupId = "$auto." + oConfiguration.requestGroupId;
261
- }
262
- return sGroupId;
263
- },
264
-
265
- /*
266
- * Get Context Binding with groupId from control configuration
267
- *
268
- * @function
269
- * @param {Object} [oConfigurations] control configuration from manifest
270
- * @param {String} [sKey] Annotation Path for of the configuration
271
- * @description Used to get the binding for DataPoints in the Header.
272
- *
273
- */
274
- getBindingWithGroupIdFromConfig: function(oConfigurations, sKey) {
275
- var sGroupId = AnnotationHelper.getGroupIdFromConfig(oConfigurations, sKey),
276
- sBinding;
277
- if (sGroupId) {
278
- sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
279
- }
280
- return sBinding;
281
- },
282
- /**
283
- * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
284
- *
285
- * @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
286
- * @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
287
- */
288
- doesFieldGroupContainOnlyOneMultiLineDataField: function(aFormElements) {
289
- return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
290
- },
291
- /*
292
- * Get Visiblity of breadcrumbs.
293
- *
294
- * @function
295
- * @param {Object} [oViewData] ViewData model
296
- * returns {*} Expression or boolean
297
- */
298
- getVisibleExpressionForBreadcrumbs: function(oViewData) {
299
- return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined
300
- ? "{fclhelper>/breadCrumbIsVisible}"
301
- : oViewData.showBreadCrumbs;
302
- },
303
- getShareButtonVisibility: function(viewData) {
304
- var sShareButtonVisibilityExp = "!${ui>createMode}";
305
- if (viewData.fclEnabled) {
306
- sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
307
- }
308
- return "{= " + sShareButtonVisibilityExp + " }";
309
- },
310
-
311
- /*
312
- * Get visiblity for editable header facet.
313
- *
314
- * @function
315
- * @param {object} [oAnnotations] Annotations object for given entity set
316
- * @param {object} [oFieldControl] field control
317
- * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
318
- */
319
- getVisiblityOfHeaderFacet: function(oAnnotations, oFieldControl) {
320
- return (
321
- AnnotationHelper.isReadOnlyFromStaticAnnotations(oAnnotations, oFieldControl) &&
322
- AnnotationHelper.isReadOnlyFromDynamicAnnotations(oFieldControl)
323
- );
324
- },
325
- /*
326
- * Get Expression of press event of delete button.
327
- *
328
- * @function
329
- * @param {string} [sEntitySetName] Entity set name
330
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
331
- */
332
- getPressExpressionForDelete: function(sEntitySetName) {
333
- var sDeletableContexts = "${$view>/getBindingContext}",
334
- sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
335
- sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
336
- var oParams = {
337
- title: sTitle,
338
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
339
- description: sDescription
340
- };
341
- return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
342
- },
343
- /*
344
- * Get Expression of press event of Edit button.
345
- *
346
- * @function
347
- * @param {object} [oDataField] Data field object
348
- * @param {string} [sEntitySetName] Entity set name
349
- * @param {object} [oHeaderAction] Header action object
350
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
351
- */
352
- getPressExpressionForEdit: function(oDataField, sEntitySetName, oHeaderAction) {
353
- var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
354
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
355
- sInvocationGroup =
356
- sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
357
- var oParams = {
358
- contexts: "${$view>/getBindingContext}",
359
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
360
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
361
- model: "${$source>/}.getModel()",
362
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
363
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
364
- defaultValuesExtensionFunction:
365
- oHeaderAction && oHeaderAction.defaultValuesExtensionFunction
366
- ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'"
367
- : undefined
368
- };
369
- return CommonHelper.generateFunction(
370
- ".handlers.onCallAction",
371
- "${$view>/}",
372
- sEditableContexts,
373
- CommonHelper.objectToString(oParams)
374
- );
375
- },
376
- /*
377
- * Method to get the expression for the 'press' event for footer annotation actions
378
- *
379
- * @function
380
- * @param {object} [oDataField] Data field object
381
- * @param {string} [sEntitySetName] Entity set name
382
- * @param {object} [oHeaderAction] Header action object
383
- * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
384
- */
385
- getPressExpressionForFooterAnnotationAction: function(oDataField, sEntitySetName, oHeaderAction) {
386
- var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
387
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
388
- sInvocationGroup =
389
- sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
390
- var oParams = {
391
- contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
392
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
393
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
394
- model: "${$source>/}.getModel()",
395
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
396
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
397
- defaultValuesExtensionFunction:
398
- oHeaderAction && oHeaderAction.defaultValuesExtensionFunction
399
- ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'"
400
- : undefined
401
- };
402
- return CommonHelper.generateFunction(
403
- ".handlers.onCallAction",
404
- "${$view>/}",
405
- sActionContexts,
406
- CommonHelper.objectToString(oParams)
407
- );
408
- },
409
- /*
410
- * Gets the binding of the container HBox for the header facet.
411
- *
412
- * @function
413
- * @param {object} [oControlConfiguration] The control configuration form of the viewData model
414
- * @param {object} [oHeaderFacet] The object of the header facet
415
- * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
416
- */
417
- getStashableHBoxBinding: function(oControlConfiguration, oHeaderFacet) {
418
- if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
419
- return AnnotationHelper.getBindingWithGroupIdFromConfig(
420
- oControlConfiguration,
421
- oHeaderFacet.Facet.targetAnnotationValue
422
- );
423
- }
424
- },
425
-
426
- /*
427
- * Gets the 'Press' event expression for the external and internal data point link.
428
- *
429
- * @function
430
- * @param {object} [oConfiguration] Control configuration from manifest
431
- * @param {object} [oManifestOutbound] Outbounds from manifest
432
- * returns {string} The runtime binding of the 'Press' event
433
- */
434
- getPressExpressionForLink: function(oConfiguration, oManifestOutbound) {
435
- if (oConfiguration) {
436
- if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
437
- return (
438
- ".handlers.onDataPointTitlePressed($controller, ${$source>}, " +
439
- JSON.stringify(oManifestOutbound) +
440
- "," +
441
- JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) +
442
- ")"
443
- );
444
- } else if (oConfiguration["targetSections"]) {
445
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
446
- } else {
447
- return undefined;
448
- }
449
- }
450
- },
451
- isSubSectionTitleVisible: function(sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
452
- if (sSubSectionvisible.indexOf("{=") === 0) {
453
- // Dynamic expression
454
- var sExpressionResult = sSubSectionvisible.substring(
455
- sSubSectionvisible.indexOf("{=") + 2,
456
- sSubSectionvisible.lastIndexOf("}")
457
- );
458
- return (
459
- "{= (" +
460
- sExpressionResult +
461
- ") && ('" +
462
- sSubSectiontitle +
463
- "' !=='undefined') && (" +
464
- sSubSectionshowTitle +
465
- " ? true : false) }"
466
- );
467
- } else {
468
- return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? true : false);
469
- }
470
- }
471
- };
472
-
473
- return AnnotationHelper;
474
- },
475
- true
476
- );
8
+ /*
9
+ This class contains annotation helpers that might be used from several templates or controls
10
+ */
11
+ var AnnotationHelper = {
12
+ getElementBinding: function (sPath) {
13
+ var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
14
+
15
+ if (sNavigationPath) {
16
+ return "{path:'" + sNavigationPath + "'}";
17
+ } else {
18
+ //no navigation property needs empty object
19
+ return "{path: ''}";
20
+ }
21
+ },
22
+
23
+ /**
24
+ * Function to check if draft pattern is supported.
25
+ *
26
+ * @param {object} oAnnotations Annotations of the current entity set.
27
+ * @returns {string} Returns the Boolean value based on draft state
28
+ */
29
+ checkDraftState: function (oAnnotations) {
30
+ if (oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]) {
31
+ return true;
32
+ } else {
33
+ return false;
34
+ }
35
+ },
36
+
37
+ /**
38
+ * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
39
+ *
40
+ * @param {object} oAnnotations Annotations of the current entity set.
41
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
42
+ */
43
+ getSwitchToActiveVisibility: function (oAnnotations) {
44
+ if (this.checkDraftState(oAnnotations)) {
45
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( ${ui>/isEditable} && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
46
+ } else {
47
+ return false;
48
+ }
49
+ },
50
+
51
+ /**
52
+ * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
53
+ *
54
+ * @param {object} oAnnotations Annotations of the current entity set.
55
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
56
+ */
57
+ getSwitchToDraftVisibility: function (oAnnotations) {
58
+ if (this.checkDraftState(oAnnotations)) {
59
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/isEditable}) && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
60
+ } else {
61
+ return false;
62
+ }
63
+ },
64
+
65
+ /**
66
+ * Function to get the visibility for the SwitchDraftAndActive button in the object page or subobject page.
67
+ *
68
+ * @param {object} oAnnotations Annotations of the current entity set.
69
+ * @returns {string} Returns expression binding or Boolean value based on the draft state
70
+ */
71
+ getSwitchDraftAndActiveVisibility: function (oAnnotations) {
72
+ if (this.checkDraftState(oAnnotations)) {
73
+ return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
74
+ } else {
75
+ return false;
76
+ }
77
+ },
78
+
79
+ /**
80
+ * Function to find an action from the array of header actions in the converter context.
81
+ *
82
+ * @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
83
+ * @param {string} sActionType The action type
84
+ * @returns {object | undefined} The action with the matching action type
85
+ * @private
86
+ */
87
+ _findAction: function (aConverterContextHeaderActions, sActionType) {
88
+ var oAction;
89
+
90
+ if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
91
+ oAction = aConverterContextHeaderActions.find(function (oHeaderAction) {
92
+ return oHeaderAction.type === sActionType;
93
+ });
94
+ }
95
+
96
+ return oAction;
97
+ },
98
+
99
+ /**
100
+ * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
101
+ *
102
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
103
+ * @returns {string} Returns expression binding or Boolean value from the converter output
104
+ */
105
+ getDeleteCommandExecutionEnabled: function (aConverterContextHeaderActions) {
106
+ var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
107
+
108
+ return oDeleteAction ? oDeleteAction.enabled : "true";
109
+ },
110
+
111
+ /**
112
+ * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
113
+ *
114
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
115
+ * @returns {string} Returns expression binding or Boolean value from the converter output
116
+ */
117
+ getDeleteCommandExecutionVisible: function (aConverterContextHeaderActions) {
118
+ var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
119
+
120
+ return oDeleteAction ? oDeleteAction.visible : "true";
121
+ },
122
+
123
+ /**
124
+ * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
125
+ *
126
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
127
+ * @returns {string} Returns expression binding or Boolean value from the converter output
128
+ */
129
+ getEditCommandExecutionVisible: function (aConverterContextHeaderActions) {
130
+ var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
131
+
132
+ return oEditAction ? oEditAction.visible : "true";
133
+ },
134
+
135
+ /**
136
+ * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
137
+ *
138
+ * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
139
+ * @returns {string} Returns expression binding or Boolean value from the converter output
140
+ */
141
+ getEditCommandExecutionEnabled: function (aConverterContextHeaderActions) {
142
+ var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
143
+
144
+ return oEditAction ? oEditAction.enabled : "true";
145
+ },
146
+
147
+ /**
148
+ * Function to get the EditAction from the Entityset based on Draft or sticky based application.
149
+ *
150
+ * @param {object} [oEntitySet] The value from the expression.
151
+ * @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
152
+ */
153
+ getEditAction: function (oEntitySet) {
154
+ var sPath = oEntitySet.getPath(),
155
+ oAnnotations = oEntitySet.getObject(sPath + "@");
156
+ var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
157
+ var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
158
+ var sActionName;
159
+
160
+ if (bDraftRoot) {
161
+ sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
162
+ } else if (bStickySession) {
163
+ sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
164
+ }
165
+
166
+ return !sActionName ? sActionName : sPath + "/" + sActionName;
167
+ },
168
+ isReadOnlyFromStaticAnnotations: function (oAnnotations, oFieldControl) {
169
+ var bComputed, bImmutable, bReadOnly;
170
+
171
+ if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
172
+ bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true" : true;
173
+ }
174
+
175
+ if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
176
+ bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true" : true;
177
+ }
178
+
179
+ bReadOnly = bComputed || bImmutable;
180
+
181
+ if (oFieldControl) {
182
+ bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
183
+ }
184
+
185
+ if (bReadOnly) {
186
+ return true;
187
+ } else {
188
+ return false;
189
+ }
190
+ },
191
+ readOnlyExpressionFromDynamicAnnotations: function (oFieldControl) {
192
+ var sIsFieldControlPathReadOnly;
193
+
194
+ if (oFieldControl) {
195
+ if (ManagedObject.bindingParser(oFieldControl)) {
196
+ sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
197
+ }
198
+ }
199
+
200
+ if (sIsFieldControlPathReadOnly) {
201
+ return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
202
+ } else {
203
+ return;
204
+ }
205
+ },
206
+
207
+ /*
208
+ * Function to get the expression for chart Title Press
209
+ *
210
+ * @function
211
+ * @param {oConfiguration} [oConfigurations] control configuration from manifest
212
+ * @param {oManifest} [oManifest] Outbounds from manifest
213
+ * returns {String} [sCollectionName] Collection Name of the Micro Chart
214
+ *
215
+ * returns {String} [Expression] Handler Expression for the title press
216
+ *
217
+ */
218
+ getExpressionForMicroChartTitlePress: function (oConfiguration, oManifestOutbound, sCollectionName) {
219
+ if (oConfiguration) {
220
+ if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] || oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] && oConfiguration["targetSections"]) {
221
+ return ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" + JSON.stringify(oManifestOutbound) + "','" + oConfiguration["targetOutbound"]["outbound"] + "','" + sCollectionName + "' )";
222
+ } else if (oConfiguration["targetSections"]) {
223
+ return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
224
+ } else {
225
+ return undefined;
226
+ }
227
+ }
228
+ },
229
+
230
+ /*
231
+ * Function to render Chart Title as Link
232
+ *
233
+ * @function
234
+ * @param {oControlConfiguration} [oConfigurations] control configuration from manifest
235
+ * returns {String} [sKey] For the TargetOutbound and TargetSection
236
+ *
237
+ */
238
+ getMicroChartTitleAsLink: function (oControlConfiguration) {
239
+ if (oControlConfiguration && (oControlConfiguration["targetOutbound"] || oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"])) {
240
+ return "External";
241
+ } else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
242
+ return "InPage";
243
+ } else {
244
+ return "None";
245
+ }
246
+ },
247
+
248
+ /* Get groupId from control configuration
249
+ *
250
+ * @function
251
+ * @param {Object} [oConfigurations] control configuration from manifest
252
+ * @param {String} [sAnnotationPath] Annotation Path for the configuration
253
+ * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
254
+ *
255
+ */
256
+ getGroupIdFromConfig: function (oConfigurations, sAnnotationPath, sDefaultGroupId) {
257
+ var oConfiguration = oConfigurations[sAnnotationPath],
258
+ aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
259
+ var sGroupId = sDefaultGroupId;
260
+
261
+ if (oConfiguration && oConfiguration.requestGroupId && aAutoPatterns.some(function (autoPattern) {
262
+ return autoPattern === oConfiguration.requestGroupId;
263
+ })) {
264
+ sGroupId = "$auto." + oConfiguration.requestGroupId;
265
+ }
266
+
267
+ return sGroupId;
268
+ },
269
+
270
+ /*
271
+ * Get Context Binding with groupId from control configuration
272
+ *
273
+ * @function
274
+ * @param {Object} [oConfigurations] control configuration from manifest
275
+ * @param {String} [sKey] Annotation Path for of the configuration
276
+ * @description Used to get the binding for DataPoints in the Header.
277
+ *
278
+ */
279
+ getBindingWithGroupIdFromConfig: function (oConfigurations, sKey) {
280
+ var sGroupId = AnnotationHelper.getGroupIdFromConfig(oConfigurations, sKey);
281
+ var sBinding;
282
+
283
+ if (sGroupId) {
284
+ sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
285
+ }
286
+
287
+ return sBinding;
288
+ },
289
+
290
+ /**
291
+ * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
292
+ *
293
+ * @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
294
+ * @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
295
+ */
296
+ doesFieldGroupContainOnlyOneMultiLineDataField: function (aFormElements) {
297
+ return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
298
+ },
299
+
300
+ /*
301
+ * Get Visiblity of breadcrumbs.
302
+ *
303
+ * @function
304
+ * @param {Object} [oViewData] ViewData model
305
+ * returns {*} Expression or boolean
306
+ */
307
+ getVisibleExpressionForBreadcrumbs: function (oViewData) {
308
+ return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined ? "{fclhelper>/breadCrumbIsVisible}" : oViewData.showBreadCrumbs;
309
+ },
310
+ getShareButtonVisibility: function (viewData) {
311
+ var sShareButtonVisibilityExp = "!${ui>createMode}";
312
+
313
+ if (viewData.fclEnabled) {
314
+ sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
315
+ }
316
+
317
+ return "{= " + sShareButtonVisibilityExp + " }";
318
+ },
319
+
320
+ /*
321
+ * Get visiblity for editable header facet.
322
+ *
323
+ * If either the title or description field from the header annotations are editable, then the
324
+ * editable header facet is visible.
325
+ *
326
+ * @function
327
+ * @param {object} [oAnnotations] Annotations object for given entity set
328
+ * @param {object} [oFieldControl] field control
329
+ * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
330
+ */
331
+ getVisiblityOfHeaderFacet: function (oTitleAnnotations, oDescriptionAnnotations, oFieldTitleFieldControl, oFieldDescriptionFieldControl) {
332
+ // Check Annotations for Title Field
333
+ var bIsTitleReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl);
334
+ var titleExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl); // There is no expression and the title is not ready only, this is sufficient for an editable header
335
+
336
+ if (!bIsTitleReadOnly && !titleExpression) {
337
+ return true;
338
+ } // Check Annotations for Description Field
339
+
340
+
341
+ var bIsDescriptionReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oDescriptionAnnotations, oFieldDescriptionFieldControl);
342
+ var descriptionExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl); // There is no expression and the description is not ready only, this is sufficient for an editable header
343
+
344
+ if (!bIsDescriptionReadOnly && !descriptionExpression) {
345
+ return true;
346
+ } // Both title and description are not editable and there are no dynamic annotations
347
+
348
+
349
+ if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
350
+ return false;
351
+ } // Now combine expressions
352
+
353
+
354
+ if (titleExpression && !descriptionExpression) {
355
+ return titleExpression;
356
+ } else if (!titleExpression && descriptionExpression) {
357
+ return descriptionExpression;
358
+ } else {
359
+ return AnnotationHelper.combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
360
+ }
361
+ },
362
+ combineTitleAndDescriptionExpression: function (oTitleFieldControl, oDescriptionFieldControl) {
363
+ // If both header and title field are based on dynmaic field control, the editable header
364
+ // is visible if at least one of these is not ready only
365
+ return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
366
+ },
367
+
368
+ /*
369
+ * Get Expression of press event of delete button.
370
+ *
371
+ * @function
372
+ * @param {string} [sEntitySetName] Entity set name
373
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
374
+ */
375
+ getPressExpressionForDelete: function (sEntitySetName) {
376
+ var sDeletableContexts = "${$view>/getBindingContext}",
377
+ sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
378
+ sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
379
+ var oParams = {
380
+ title: sTitle,
381
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
382
+ description: sDescription
383
+ };
384
+ return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
385
+ },
386
+
387
+ /*
388
+ * Get Expression of press event of Edit button.
389
+ *
390
+ * @function
391
+ * @param {object} [oDataField] Data field object
392
+ * @param {string} [sEntitySetName] Entity set name
393
+ * @param {object} [oHeaderAction] Header action object
394
+ * returns {string} binding expression / function string generated from commanhelper's function generateFunction
395
+ */
396
+ getPressExpressionForEdit: function (oDataField, sEntitySetName, oHeaderAction) {
397
+ var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
398
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
399
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
400
+ var oParams = {
401
+ contexts: "${$view>/getBindingContext}",
402
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
403
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
404
+ model: "${$source>/}.getModel()",
405
+ label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
406
+ isNavigable: oHeaderAction && oHeaderAction.isNavigable,
407
+ defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
408
+ };
409
+ return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sEditableContexts, CommonHelper.objectToString(oParams));
410
+ },
411
+
412
+ /*
413
+ * Method to get the expression for the 'press' event for footer annotation actions
414
+ *
415
+ * @function
416
+ * @param {object} [oDataField] Data field object
417
+ * @param {string} [sEntitySetName] Entity set name
418
+ * @param {object} [oHeaderAction] Header action object
419
+ * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
420
+ */
421
+ getPressExpressionForFooterAnnotationAction: function (oDataField, sEntitySetName, oHeaderAction) {
422
+ var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
423
+ sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
424
+ sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
425
+ var oParams = {
426
+ contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
427
+ entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
428
+ invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
429
+ model: "${$source>/}.getModel()",
430
+ label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
431
+ isNavigable: oHeaderAction && oHeaderAction.isNavigable,
432
+ defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
433
+ };
434
+ return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
435
+ },
436
+
437
+ /*
438
+ * Gets the binding of the container HBox for the header facet.
439
+ *
440
+ * @function
441
+ * @param {object} [oControlConfiguration] The control configuration form of the viewData model
442
+ * @param {object} [oHeaderFacet] The object of the header facet
443
+ * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
444
+ */
445
+ getStashableHBoxBinding: function (oControlConfiguration, oHeaderFacet) {
446
+ if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
447
+ return AnnotationHelper.getBindingWithGroupIdFromConfig(oControlConfiguration, oHeaderFacet.Facet.targetAnnotationValue);
448
+ }
449
+ },
450
+
451
+ /*
452
+ * Gets the 'Press' event expression for the external and internal data point link.
453
+ *
454
+ * @function
455
+ * @param {object} [oConfiguration] Control configuration from manifest
456
+ * @param {object} [oManifestOutbound] Outbounds from manifest
457
+ * returns {string} The runtime binding of the 'Press' event
458
+ */
459
+ getPressExpressionForLink: function (oConfiguration, oManifestOutbound) {
460
+ if (oConfiguration) {
461
+ if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
462
+ return ".handlers.onDataPointTitlePressed($controller, ${$source>}, " + JSON.stringify(oManifestOutbound) + "," + JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) + ")";
463
+ } else if (oConfiguration["targetSections"]) {
464
+ return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
465
+ } else {
466
+ return undefined;
467
+ }
468
+ }
469
+ },
470
+ isSubSectionTitleVisible: function (sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
471
+ if (sSubSectionvisible.indexOf("{=") === 0) {
472
+ // Dynamic expression
473
+ var sExpressionResult = sSubSectionvisible.substring(sSubSectionvisible.indexOf("{=") + 2, sSubSectionvisible.lastIndexOf("}"));
474
+ return "{= (" + sExpressionResult + ") && ('" + sSubSectiontitle + "' !=='undefined') && (" + sSubSectionshowTitle + " ? true : false) }";
475
+ } else {
476
+ return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? "true" : "false");
477
+ }
478
+ }
479
+ };
480
+ return AnnotationHelper;
481
+ }, false);
482
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFubm90YXRpb25IZWxwZXIudHMiXSwibmFtZXMiOlsiQW5ub3RhdGlvbkhlbHBlciIsImdldEVsZW1lbnRCaW5kaW5nIiwic1BhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiY2hlY2tEcmFmdFN0YXRlIiwib0Fubm90YXRpb25zIiwiZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkiLCJnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkiLCJfZmluZEFjdGlvbiIsImFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyIsInNBY3Rpb25UeXBlIiwib0FjdGlvbiIsImxlbmd0aCIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwidHlwZSIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsInZpc2libGUiLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJvRWRpdEFjdGlvbiIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsImdldEVkaXRBY3Rpb24iLCJvRW50aXR5U2V0IiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJTdGlja3lTZXNzaW9uIiwic0FjdGlvbk5hbWUiLCJpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsImJDb21wdXRlZCIsImJJbW11dGFibGUiLCJiUmVhZE9ubHkiLCJCb29sIiwicmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyIsInNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwiZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzIiwib0NvbmZpZ3VyYXRpb24iLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb2xsZWN0aW9uTmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsiLCJvQ29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRHcm91cElkRnJvbUNvbmZpZyIsIm9Db25maWd1cmF0aW9ucyIsInNBbm5vdGF0aW9uUGF0aCIsInNEZWZhdWx0R3JvdXBJZCIsImFBdXRvUGF0dGVybnMiLCJzR3JvdXBJZCIsInJlcXVlc3RHcm91cElkIiwic29tZSIsImF1dG9QYXR0ZXJuIiwiZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyIsInNLZXkiLCJzQmluZGluZyIsImRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQiLCJhRm9ybUVsZW1lbnRzIiwiaXNWYWx1ZU11bHRpbGluZVRleHQiLCJnZXRWaXNpYmxlRXhwcmVzc2lvbkZvckJyZWFkY3J1bWJzIiwib1ZpZXdEYXRhIiwic2hvd0JyZWFkQ3J1bWJzIiwiZmNsRW5hYmxlZCIsImdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdEYXRhIiwic1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCIsImdldFZpc2libGl0eU9mSGVhZGVyRmFjZXQiLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwib0RhdGFGaWVsZCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiaXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlIiwic1N1YlNlY3Rpb252aXNpYmxlIiwic1N1YlNlY3Rpb250aXRsZSIsInNTdWJTZWN0aW9uc2hvd1RpdGxlIiwiaW5kZXhPZiIsInNFeHByZXNzaW9uUmVzdWx0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QkMsSUFBQUEsaUJBQWlCLEVBQUUsVUFBVUMsS0FBVixF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bW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbi8qXG5cdCBUaGlzIGNsYXNzIGNvbnRhaW5zIGFubm90YXRpb24gaGVscGVycyB0aGF0IG1pZ2h0IGJlIHVzZWQgZnJvbSBzZXZlcmFsIHRlbXBsYXRlcyBvciBjb250cm9sc1xuXHQgKi9cbmNvbnN0IEFubm90YXRpb25IZWxwZXIgPSB7XG5cdGdldEVsZW1lbnRCaW5kaW5nOiBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyLmdldE5hdmlnYXRpb25QYXRoKHNQYXRoKTtcblx0XHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRyYWZ0IHBhdHRlcm4gaXMgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gZHJhZnQgc3RhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRTdGF0ZTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gJiZcblx0XHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5OiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0aGlzLmNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaW5kIGFuIGFjdGlvbiBmcm9tIHRoZSBhcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBpbiB0aGUgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZmluZEFjdGlvbjogZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0FjdGlvbjtcblx0XHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcblx0ICovXG5cdGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdFx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGU6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IEFubm90YXRpb25IZWxwZXIuX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0XHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xuXHR9LFxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9FZGl0QWN0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5fZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0XHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJ0cnVlXCI7XG5cdH0sXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG5cdCAqL1xuXHRnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQ6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRcdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBFbnRpdHlzZXQgYmFzZWQgb24gRHJhZnQgb3Igc3RpY2t5IGJhc2VkIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29FbnRpdHlTZXRdIFRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHZSYXdWYWx1ZSAmIG9EcmFmdE5vZGVcblx0ICovXG5cdGdldEVkaXRBY3Rpb246IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpO1xuXHRcdGNvbnN0IGJEcmFmdFJvb3QgPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBiU3RpY2t5U2Vzc2lvbiA9IG9Bbm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdFx0bGV0IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChiRHJhZnRSb290KSB7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uXCIpO1xuXHRcdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuICFzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogc1BhdGggKyBcIi9cIiArIHNBY3Rpb25OYW1lO1xuXHR9LFxuXHRpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblx0XHRpZiAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbFxuXHRcdFx0XHQ/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0pIHtcblx0XHRcdGJJbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2xcblx0XHRcdFx0PyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPT0gXCJ0cnVlXCJcblx0XHRcdFx0OiB0cnVlO1xuXHRcdH1cblx0XHRiUmVhZE9ubHkgPSBiQ29tcHV0ZWQgfHwgYkltbXV0YWJsZTtcblxuXHRcdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdFx0fVxuXHRcdGlmIChiUmVhZE9ubHkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdFx0bGV0IHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seTtcblx0XHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0XHRzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgPSBcIiVcIiArIG9GaWVsZENvbnRyb2wgKyBcIiA9PT0gMSBcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIFwiez0gXCIgKyBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgKyBcIj8gZmFsc2UgOiB0cnVlIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBleHByZXNzaW9uIGZvciBjaGFydCBUaXRsZSBQcmVzc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3Rcblx0ICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzQ29sbGVjdGlvbk5hbWVdIENvbGxlY3Rpb24gTmFtZSBvZiB0aGUgTWljcm8gQ2hhcnRcblx0ICpcblx0ICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3Ncblx0ICpcblx0ICovXG5cdGdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzczogZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFx0XCInIClcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG5cdCAqXG5cdCAqL1xuXHRnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbms6IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRcdGlmIChcblx0XHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCJJblBhZ2VcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblx0fSxcblxuXHQvKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0Fubm90YXRpb25QYXRoXSBBbm5vdGF0aW9uIFBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEdyb3VwSWRGcm9tQ29uZmlnOiBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNBbm5vdGF0aW9uUGF0aDogYW55LCBzRGVmYXVsdEdyb3VwSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdFx0bGV0IHNHcm91cElkID0gc0RlZmF1bHRHcm91cElkO1xuXHRcdGlmIChcblx0XHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0XHRvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCAmJlxuXHRcdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzR3JvdXBJZDtcblx0fSxcblxuXHQvKlxuXHQgKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWc6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBBbm5vdGF0aW9uSGVscGVyLmdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdFx0bGV0IHNCaW5kaW5nO1xuXHRcdGlmIChzR3JvdXBJZCkge1xuXHRcdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0XHR9XG5cdFx0cmV0dXJuIHNCaW5kaW5nO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXNbXX0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cblx0ICovXG5cdGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQ6IGZ1bmN0aW9uIChhRm9ybUVsZW1lbnRzOiBhbnlbXSkge1xuXHRcdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcblx0fSxcblx0Lypcblx0ICogR2V0IFZpc2libGl0eSBvZiBicmVhZGNydW1icy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3RGF0YSBtb2RlbFxuXHQgKiByZXR1cm5zIHsqfSBFeHByZXNzaW9uIG9yIGJvb2xlYW5cblx0ICovXG5cdGdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnM6IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRcdHJldHVybiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzICYmIG9WaWV3RGF0YS5mY2xFbmFibGVkICE9PSB1bmRlZmluZWRcblx0XHRcdD8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiXG5cdFx0XHQ6IG9WaWV3RGF0YS5zaG93QnJlYWRDcnVtYnM7XG5cdH0sXG5cdGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eTogZnVuY3Rpb24gKHZpZXdEYXRhOiBhbnkpIHtcblx0XHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0XHRpZiAodmlld0RhdGEuZmNsRW5hYmxlZCkge1xuXHRcdFx0c1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiJHtmY2xoZWxwZXI+L3Nob3dTaGFyZUljb259ICYmIFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cDtcblx0XHR9XG5cdFx0cmV0dXJuIFwiez0gXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwICsgXCIgfVwiO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEdldCB2aXNpYmxpdHkgZm9yIGVkaXRhYmxlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuXHQgKiBlZGl0YWJsZSBoZWFkZXIgZmFjZXQgaXMgdmlzaWJsZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG5cdCAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuXHQgKi9cblx0Z2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldDogZnVuY3Rpb24gKFxuXHRcdG9UaXRsZUFubm90YXRpb25zOiBhbnksXG5cdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0XHRvRmllbGRUaXRsZUZpZWxkQ29udHJvbDogYW55LFxuXHRcdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnlcblx0KSB7XG5cdFx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdFx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IEFubm90YXRpb25IZWxwZXIuaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpO1xuXHRcdGNvbnN0IHRpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIucmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdFx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRcdGlmICghYklzVGl0bGVSZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBBbm5vdGF0aW9ucyBmb3IgRGVzY3JpcHRpb24gRmllbGRcblx0XHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gQW5ub3RhdGlvbkhlbHBlci5pc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKFxuXHRcdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsXG5cdFx0XHRvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbFxuXHRcdCk7XG5cdFx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5yZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdFx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdFx0aWYgKGJJc1RpdGxlUmVhZE9ubHkgJiYgYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBOb3cgY29tYmluZSBleHByZXNzaW9uc1xuXHRcdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0XHR9IGVsc2UgaWYgKCF0aXRsZUV4cHJlc3Npb24gJiYgZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5jb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHR9XG5cdH0sXG5cdGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbDogYW55LCBvRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdC8vIElmIGJvdGggaGVhZGVyIGFuZCB0aXRsZSBmaWVsZCBhcmUgYmFzZWQgb24gZHlubWFpYyBmaWVsZCBjb250cm9sLCB0aGUgZWRpdGFibGUgaGVhZGVyXG5cdFx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0XHRyZXR1cm4gXCJ7PSAlXCIgKyBvVGl0bGVGaWVsZENvbnRyb2wgKyBcIiA9PT0gMSA/ICggJVwiICsgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sICsgXCIgPT09IDEgPyBmYWxzZSA6IHRydWUgKSA6IHRydWUgfVwiO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG5cdCAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG5cdCAqL1xuXHRnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGU6IGZ1bmN0aW9uIChzRW50aXR5U2V0TmFtZTogYW55KSB7XG5cdFx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRcdHNUaXRsZSA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkSGVhZGluZy9nZXRJdGVtcy8xL2dldFRleHR9XCIsXG5cdFx0XHRzRGVzY3JpcHRpb24gPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZENvbnRlbnQvMC9nZXRJdGVtcy8wL2dldFRleHR9XCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFwiLCBzRGVsZXRhYmxlQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG5cdH0sXG5cdC8qXG5cdCAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIEVkaXQgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdDogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0XHRzSW52b2NhdGlvbkdyb3VwID1cblx0XHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdFx0Y29udGV4dHM6IFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCIsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRcdG1vZGVsOiBcIiR7JHNvdXJjZT4vfS5nZXRNb2RlbCgpXCIsXG5cdFx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjpcblx0XHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdD8gXCInXCIgKyBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiArIFwiJ1wiXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLFxuXHRcdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XHRzRWRpdGFibGVDb250ZXh0cyxcblx0XHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKVxuXHRcdCk7XG5cdH0sXG5cdC8qXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG5cdCAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbjogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdFx0c0ludm9jYXRpb25Hcm91cCA9XG5cdFx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNJbnZvY2F0aW9uR3JvdXApLFxuXHRcdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0PyBcIidcIiArIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uICsgXCInXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgc0FjdGlvbkNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcblx0ICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cblx0ICovXG5cdGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nOiBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdFx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5nZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIEdldHMgdGhlICdQcmVzcycgZXZlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBkYXRhIHBvaW50IGxpbmsuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29Db25maWd1cmF0aW9uXSBDb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcblx0ICovXG5cdGdldFByZXNzRXhwcmVzc2lvbkZvckxpbms6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbjogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcdFwiLFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XHRcIilcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlOiBmdW5jdGlvbiAoc1N1YlNlY3Rpb252aXNpYmxlOiBhbnksIHNTdWJTZWN0aW9udGl0bGU6IGFueSwgc1N1YlNlY3Rpb25zaG93VGl0bGU6IGFueSkge1xuXHRcdGlmIChzU3ViU2VjdGlvbnZpc2libGUuaW5kZXhPZihcIns9XCIpID09PSAwKSB7XG5cdFx0XHQvLyBEeW5hbWljIGV4cHJlc3Npb25cblx0XHRcdGNvbnN0IHNFeHByZXNzaW9uUmVzdWx0ID0gc1N1YlNlY3Rpb252aXNpYmxlLnN1YnN0cmluZyhcblx0XHRcdFx0c1N1YlNlY3Rpb252aXNpYmxlLmluZGV4T2YoXCJ7PVwiKSArIDIsXG5cdFx0XHRcdHNTdWJTZWN0aW9udmlzaWJsZS5sYXN0SW5kZXhPZihcIn1cIilcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIns9IChcIiArXG5cdFx0XHRcdHNFeHByZXNzaW9uUmVzdWx0ICtcblx0XHRcdFx0XCIpICYmICgnXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnRpdGxlICtcblx0XHRcdFx0XCInICE9PSd1bmRlZmluZWQnKSAmJiAoXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnNob3dUaXRsZSArXG5cdFx0XHRcdFwiID8gdHJ1ZSA6IGZhbHNlKSB9XCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzU3ViU2VjdGlvbnZpc2libGUgJiYgc1N1YlNlY3Rpb250aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoc1N1YlNlY3Rpb25zaG93VGl0bGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbm5vdGF0aW9uSGVscGVyO1xuIl19