@sapui5/sap.fe.templates 1.106.0 → 1.108.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.
- package/package.json +3 -2
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/ListComponent.js +5 -1
- package/src/sap/fe/templates/ListComponent.ts +4 -0
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +43 -3
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +38 -2
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +12 -1
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +80 -22
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +63 -14
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +30 -21
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +21 -10
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +4 -7
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -6
- package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -14
- package/src/sap/fe/templates/ListReport/overrides/Share.ts +8 -15
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +15 -11
- package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +27 -9
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +3 -3
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +2 -2
- package/src/sap/fe/templates/ListReport/view/fragments/Table.fragment.xml +0 -1
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +132 -3
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +88 -1
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +35 -47
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +286 -45
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +209 -32
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +49 -7
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +60 -5
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -2
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -2
- package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +33 -0
- package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.ts +23 -0
- package/src/sap/fe/templates/ObjectPage/manifest.json +8 -0
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +2 -2
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -1
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +10 -3
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +8 -1
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +7 -1
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +5 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +8 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +38 -23
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingContent.fragment.xml +30 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/MacroChart.fragment.xml +1 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/Table.fragment.xml +1 -0
- package/src/sap/fe/templates/library.js +1 -1
- package/src/sap/fe/templates/messagebundle_lt.properties +1 -1
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +0 -899
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +0 -830
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +0 -207
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +0 -177
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +0 -575
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +0 -492
- package/src/sap/fe/templates/RootContainer/view/Fcl.view.xml +0 -16
- package/src/sap/fe/templates/RootContainer/view/NavContainer.view.xml +0 -9
|
@@ -1,575 +0,0 @@
|
|
|
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/base/Log", "sap/fe/core/BaseController", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/helpers/ClassSupport", "sap/fe/macros/table/TableSizeHelper", "sap/ui/base/BindingParser", "sap/ui/core/routing/HashChanger", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/AnnotationHelper"], function (Log, BaseController, CommonUtils, Placeholder, ClassSupport, TableSizeHelper, BindingParser, HashChanger, JSONModel, AnnotationHelper) {
|
|
6
|
-
"use strict";
|
|
7
|
-
|
|
8
|
-
var _dec, _dec2, _class, _class2, _descriptor;
|
|
9
|
-
|
|
10
|
-
var usingExtension = ClassSupport.usingExtension;
|
|
11
|
-
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
12
|
-
|
|
13
|
-
function _catch(body, recover) {
|
|
14
|
-
try {
|
|
15
|
-
var result = body();
|
|
16
|
-
} catch (e) {
|
|
17
|
-
return recover(e);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (result && result.then) {
|
|
21
|
-
return result.then(void 0, recover);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
28
|
-
|
|
29
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
30
|
-
|
|
31
|
-
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
32
|
-
|
|
33
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
34
|
-
|
|
35
|
-
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
36
|
-
|
|
37
|
-
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
38
|
-
|
|
39
|
-
var RootContainerBaseController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.RootContainerBaseController"), _dec2 = usingExtension(Placeholder), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
|
|
40
|
-
_inheritsLoose(RootContainerBaseController, _BaseController);
|
|
41
|
-
|
|
42
|
-
function RootContainerBaseController() {
|
|
43
|
-
var _this;
|
|
44
|
-
|
|
45
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
46
|
-
args[_key] = arguments[_key];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
_this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
|
|
50
|
-
|
|
51
|
-
_initializerDefineProperty(_this, "oPlaceholder", _descriptor, _assertThisInitialized(_this));
|
|
52
|
-
|
|
53
|
-
_this.bIsComputingTitleHierachy = false;
|
|
54
|
-
return _this;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
var _proto = RootContainerBaseController.prototype;
|
|
58
|
-
|
|
59
|
-
_proto.onInit = function onInit() {
|
|
60
|
-
TableSizeHelper.init();
|
|
61
|
-
this._aHelperModels = [];
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
_proto.getPlaceholder = function getPlaceholder() {
|
|
65
|
-
return this.oPlaceholder;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
_proto.attachRouteMatchers = function attachRouteMatchers() {
|
|
69
|
-
this.oPlaceholder.attachRouteMatchers();
|
|
70
|
-
this.getAppComponent().getRoutingService().attachAfterRouteMatched(this._onAfterRouteMatched, this);
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
_proto.onExit = function onExit() {
|
|
74
|
-
this.getAppComponent().getRoutingService().detachAfterRouteMatched(this._onAfterRouteMatched, this);
|
|
75
|
-
this.oRouter = undefined;
|
|
76
|
-
TableSizeHelper.exit(); // Destroy all JSON models created dynamically for the views
|
|
77
|
-
|
|
78
|
-
this._aHelperModels.forEach(function (oModel) {
|
|
79
|
-
oModel.destroy();
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Convenience method for getting the resource bundle.
|
|
84
|
-
*
|
|
85
|
-
* @public
|
|
86
|
-
* @returns The resourceModel of the component
|
|
87
|
-
*/
|
|
88
|
-
;
|
|
89
|
-
|
|
90
|
-
_proto.getResourceBundle = function getResourceBundle() {
|
|
91
|
-
return this.getOwnerComponent().getModel("i18n").getResourceBundle();
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
_proto.getRouter = function getRouter() {
|
|
95
|
-
if (!this.oRouter) {
|
|
96
|
-
this.oRouter = this.getAppComponent().getRouter();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return this.oRouter;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
_proto._createHelperModel = function _createHelperModel() {
|
|
103
|
-
// We keep a reference on the models created dynamically, as they don't get destroyed
|
|
104
|
-
// automatically when the view is destroyed.
|
|
105
|
-
// This is done during onExit
|
|
106
|
-
var oModel = new JSONModel();
|
|
107
|
-
|
|
108
|
-
this._aHelperModels.push(oModel);
|
|
109
|
-
|
|
110
|
-
return oModel;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Function waiting for the Right most view to be ready.
|
|
114
|
-
*
|
|
115
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
116
|
-
* @param oEvent Reference an Event parameter coming from routeMatched event
|
|
117
|
-
* @returns A promise indicating when the right most view is ready
|
|
118
|
-
*/
|
|
119
|
-
;
|
|
120
|
-
|
|
121
|
-
_proto.waitForRightMostViewReady = function waitForRightMostViewReady(oEvent) {
|
|
122
|
-
return new Promise(function (resolve) {
|
|
123
|
-
var aContainers = oEvent.getParameter("views"),
|
|
124
|
-
// There can also be reuse components in the view, remove them before processing.
|
|
125
|
-
aFEContainers = [];
|
|
126
|
-
aContainers.forEach(function (oContainer) {
|
|
127
|
-
var oView = oContainer;
|
|
128
|
-
|
|
129
|
-
if (oContainer && oContainer.getComponentInstance) {
|
|
130
|
-
var oComponentInstance = oContainer.getComponentInstance();
|
|
131
|
-
oView = oComponentInstance.getRootControl();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (oView && oView.getController() && oView.getController().pageReady) {
|
|
135
|
-
aFEContainers.push(oView);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
var oRightMostFEView = aFEContainers[aFEContainers.length - 1];
|
|
139
|
-
|
|
140
|
-
if (oRightMostFEView && oRightMostFEView.getController().pageReady.isPageReady()) {
|
|
141
|
-
resolve(oRightMostFEView);
|
|
142
|
-
} else if (oRightMostFEView) {
|
|
143
|
-
oRightMostFEView.getController().pageReady.attachEventOnce("pageReady", function () {
|
|
144
|
-
resolve(oRightMostFEView);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Callback when the navigation is done.
|
|
151
|
-
* - update the shell title.
|
|
152
|
-
* - update table scroll.
|
|
153
|
-
* - call onPageReady on the rightMostView.
|
|
154
|
-
*
|
|
155
|
-
* @param oEvent
|
|
156
|
-
* @name sap.fe.templates.RootContainer.controller.BaseController#_onAfterRouteMatched
|
|
157
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
158
|
-
*/
|
|
159
|
-
;
|
|
160
|
-
|
|
161
|
-
_proto._onAfterRouteMatched = function _onAfterRouteMatched(oEvent) {
|
|
162
|
-
var _this2 = this;
|
|
163
|
-
|
|
164
|
-
if (!this._oRouteMatchedPromise) {
|
|
165
|
-
this._oRouteMatchedPromise = this.waitForRightMostViewReady(oEvent).then(function (oView) {
|
|
166
|
-
// The autoFocus is initially disabled on the navContainer or the FCL, so that the focus stays on the Shell menu
|
|
167
|
-
// even if the app takes a long time to launch
|
|
168
|
-
// The first time the view is displayed, we need to enable the autofocus so that it's managed properly during navigation
|
|
169
|
-
var oRootControl = _this2.getView().getContent()[0];
|
|
170
|
-
|
|
171
|
-
if (oRootControl && oRootControl.getAutoFocus && !oRootControl.getAutoFocus()) {
|
|
172
|
-
oRootControl.setProperty("autoFocus", true, true); // Do not mark the container as invalid, otherwise it's re-rendered
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
var oAppComponent = _this2.getAppComponent();
|
|
176
|
-
|
|
177
|
-
_this2._scrollTablesToLastNavigatedItems();
|
|
178
|
-
|
|
179
|
-
if (oAppComponent.getEnvironmentCapabilities().getCapabilities().UShell) {
|
|
180
|
-
_this2._computeTitleHierarchy(oView);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
var bForceFocus = oAppComponent.getRouterProxy().isFocusForced();
|
|
184
|
-
oAppComponent.getRouterProxy().setFocusForced(false); // reset
|
|
185
|
-
|
|
186
|
-
if (oView.getController() && oView.getController().onPageReady && oView.getParent().onPageReady) {
|
|
187
|
-
oView.getParent().onPageReady({
|
|
188
|
-
forceFocus: bForceFocus
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (_this2.onContainerReady) {
|
|
193
|
-
_this2.onContainerReady();
|
|
194
|
-
}
|
|
195
|
-
}).catch(function (oError) {
|
|
196
|
-
Log.error("An error occurs while computing the title hierarchy and calling focus method", oError);
|
|
197
|
-
}).finally(function () {
|
|
198
|
-
_this2._oRouteMatchedPromise = null;
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* This function returns the TitleHierarchy cache ( or initializes it if undefined).
|
|
204
|
-
*
|
|
205
|
-
* @name sap.fe.templates.RootContainer.controller.BaseController#_getTitleHierarchyCache
|
|
206
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
207
|
-
* @returns The TitleHierarchy cache
|
|
208
|
-
*/
|
|
209
|
-
;
|
|
210
|
-
|
|
211
|
-
_proto._getTitleHierarchyCache = function _getTitleHierarchyCache() {
|
|
212
|
-
if (!this.oTitleHierarchyCache) {
|
|
213
|
-
this.oTitleHierarchyCache = {};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return this.oTitleHierarchyCache;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* This function returns a titleInfo object.
|
|
220
|
-
*
|
|
221
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
222
|
-
* @param title
|
|
223
|
-
* @param subtitle
|
|
224
|
-
* @param sIntent The intent path to be redirected to
|
|
225
|
-
* @returns The title information
|
|
226
|
-
*/
|
|
227
|
-
;
|
|
228
|
-
|
|
229
|
-
_proto._computeTitleInfo = function _computeTitleInfo(title, subtitle, sIntent) {
|
|
230
|
-
var aParts = sIntent.split("/");
|
|
231
|
-
|
|
232
|
-
if (aParts[aParts.length - 1].indexOf("?") === -1) {
|
|
233
|
-
sIntent += "?restoreHistory=true";
|
|
234
|
-
} else {
|
|
235
|
-
sIntent += "&restoreHistory=true";
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return {
|
|
239
|
-
title: title,
|
|
240
|
-
subtitle: subtitle,
|
|
241
|
-
intent: sIntent,
|
|
242
|
-
icon: ""
|
|
243
|
-
};
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
_proto._formatTitle = function _formatTitle(displayMode, titleValue, titleDescription) {
|
|
247
|
-
var formattedTitle = "";
|
|
248
|
-
|
|
249
|
-
switch (displayMode) {
|
|
250
|
-
case "Value":
|
|
251
|
-
formattedTitle = "".concat(titleValue);
|
|
252
|
-
break;
|
|
253
|
-
|
|
254
|
-
case "ValueDescription":
|
|
255
|
-
formattedTitle = "".concat(titleValue, " (").concat(titleDescription, ")");
|
|
256
|
-
break;
|
|
257
|
-
|
|
258
|
-
case "DescriptionValue":
|
|
259
|
-
formattedTitle = "".concat(titleDescription, " (").concat(titleValue, ")");
|
|
260
|
-
break;
|
|
261
|
-
|
|
262
|
-
case "Description":
|
|
263
|
-
formattedTitle = "".concat(titleDescription);
|
|
264
|
-
break;
|
|
265
|
-
|
|
266
|
-
default:
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
return formattedTitle;
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Fetches the value of the HeaderInfo title for a given path.
|
|
273
|
-
*
|
|
274
|
-
* @param sPath The path to the entity
|
|
275
|
-
* @returns A promise containing the formatted title, or an empty string if no HeaderInfo title annotation is available
|
|
276
|
-
*/
|
|
277
|
-
;
|
|
278
|
-
|
|
279
|
-
_proto._fetchTitleValue = function _fetchTitleValue(sPath) {
|
|
280
|
-
try {
|
|
281
|
-
var _this4 = this;
|
|
282
|
-
|
|
283
|
-
var oAppComponent = _this4.getAppComponent(),
|
|
284
|
-
oModel = _this4.getView().getModel(),
|
|
285
|
-
oMetaModel = oAppComponent.getMetaModel(),
|
|
286
|
-
sMetaPath = oMetaModel.getMetaPath(sPath),
|
|
287
|
-
oBindingViewContext = oModel.createBindingContext(sPath),
|
|
288
|
-
sValueExpression = AnnotationHelper.format(oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value")), {
|
|
289
|
-
context: oMetaModel.createBindingContext("/")
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
if (!sValueExpression) {
|
|
293
|
-
return Promise.resolve("");
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
var sTextExpression = AnnotationHelper.format(oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@com.sap.vocabularies.Common.v1.Text")), {
|
|
297
|
-
context: oMetaModel.createBindingContext("/")
|
|
298
|
-
}),
|
|
299
|
-
oPropertyContext = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/Title/Value/$Path@")),
|
|
300
|
-
aPromises = [],
|
|
301
|
-
oValueExpression = BindingParser.complexParser(sValueExpression),
|
|
302
|
-
oPromiseForDisplayMode = new Promise(function (resolve) {
|
|
303
|
-
var displayMode = CommonUtils.computeDisplayMode(oPropertyContext);
|
|
304
|
-
resolve(displayMode);
|
|
305
|
-
});
|
|
306
|
-
aPromises.push(oPromiseForDisplayMode);
|
|
307
|
-
var sValuePath = oValueExpression.parts ? oValueExpression.parts[0].path : oValueExpression.path,
|
|
308
|
-
fnValueFormatter = oValueExpression.formatter,
|
|
309
|
-
oValueBinding = oModel.bindProperty(sValuePath, oBindingViewContext);
|
|
310
|
-
oValueBinding.initialize();
|
|
311
|
-
var oPromiseForTitleValue = new Promise(function (resolve) {
|
|
312
|
-
var fnChange = function (oEvent) {
|
|
313
|
-
var sTargetValue = fnValueFormatter ? fnValueFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
|
|
314
|
-
oValueBinding.detachChange(fnChange);
|
|
315
|
-
resolve(sTargetValue);
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
oValueBinding.attachChange(fnChange);
|
|
319
|
-
});
|
|
320
|
-
aPromises.push(oPromiseForTitleValue);
|
|
321
|
-
|
|
322
|
-
if (sTextExpression) {
|
|
323
|
-
var oTextExpression = BindingParser.complexParser(sTextExpression);
|
|
324
|
-
var sTextPath = oTextExpression.parts ? oTextExpression.parts[0].path : oTextExpression.path;
|
|
325
|
-
sTextPath = sValuePath.lastIndexOf("/") > -1 ? sValuePath.slice(0, sValuePath.lastIndexOf("/")) + "/" + sTextPath : sTextPath;
|
|
326
|
-
var fnTextFormatter = oTextExpression.formatter,
|
|
327
|
-
oTextBinding = oModel.bindProperty(sTextPath, oBindingViewContext);
|
|
328
|
-
oTextBinding.initialize();
|
|
329
|
-
var oPromiseForTitleText = new Promise(function (resolve) {
|
|
330
|
-
var fnChange = function (oEvent) {
|
|
331
|
-
var sTargetText = fnTextFormatter ? fnTextFormatter(oEvent.getSource().getValue()) : oEvent.getSource().getValue();
|
|
332
|
-
oTextBinding.detachChange(fnChange);
|
|
333
|
-
resolve(sTargetText);
|
|
334
|
-
};
|
|
335
|
-
|
|
336
|
-
oTextBinding.attachChange(fnChange);
|
|
337
|
-
});
|
|
338
|
-
aPromises.push(oPromiseForTitleText);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return Promise.resolve(_catch(function () {
|
|
342
|
-
return Promise.resolve(Promise.all(aPromises)).then(function (titleInfo) {
|
|
343
|
-
var formattedTitle = "";
|
|
344
|
-
|
|
345
|
-
if (typeof titleInfo !== "string") {
|
|
346
|
-
formattedTitle = _this4._formatTitle(titleInfo[0], titleInfo[1], titleInfo[2]);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return formattedTitle;
|
|
350
|
-
});
|
|
351
|
-
}, function (error) {
|
|
352
|
-
Log.error("Error while fetching the title from the header info :" + error);
|
|
353
|
-
}));
|
|
354
|
-
} catch (e) {
|
|
355
|
-
return Promise.reject(e);
|
|
356
|
-
}
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
_proto._getAppSpecificHash = function _getAppSpecificHash() {
|
|
360
|
-
// HashChanged isShellNavigationHashChanger
|
|
361
|
-
return HashChanger.getInstance().hrefForAppSpecificHash ? HashChanger.getInstance().hrefForAppSpecificHash("") : "";
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
_proto._getHash = function _getHash() {
|
|
365
|
-
return HashChanger.getInstance().getHash();
|
|
366
|
-
}
|
|
367
|
-
/**
|
|
368
|
-
* This function returns titleInformation from a path.
|
|
369
|
-
* It updates the cache to store Title Information if necessary
|
|
370
|
-
*
|
|
371
|
-
* @name sap.fe.templates.RootContainer.controller.BaseController#getTitleInfoFromPath
|
|
372
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
373
|
-
* @param {*} sPath path of the context to retrieve title information from MetaModel
|
|
374
|
-
* @returns {Promise} oTitleinformation returned as promise
|
|
375
|
-
*/
|
|
376
|
-
;
|
|
377
|
-
|
|
378
|
-
_proto.getTitleInfoFromPath = function getTitleInfoFromPath(sPath) {
|
|
379
|
-
var _this5 = this;
|
|
380
|
-
|
|
381
|
-
var oTitleHierarchyCache = this._getTitleHierarchyCache();
|
|
382
|
-
|
|
383
|
-
if (oTitleHierarchyCache[sPath]) {
|
|
384
|
-
// The title info is already stored in the cache
|
|
385
|
-
return Promise.resolve(oTitleHierarchyCache[sPath]);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
var oMetaModel = this.getAppComponent().getMetaModel();
|
|
389
|
-
var sEntityPath = oMetaModel.getMetaPath(sPath);
|
|
390
|
-
var sTypeName = oMetaModel.getObject("".concat(sEntityPath, "/@com.sap.vocabularies.UI.v1.HeaderInfo/TypeName"));
|
|
391
|
-
|
|
392
|
-
var sAppSpecificHash = this._getAppSpecificHash();
|
|
393
|
-
|
|
394
|
-
var sIntent = sAppSpecificHash + sPath.slice(1);
|
|
395
|
-
return this._fetchTitleValue(sPath).then(function (sTitle) {
|
|
396
|
-
var oTitleInfo = _this5._computeTitleInfo(sTypeName, sTitle, sIntent);
|
|
397
|
-
|
|
398
|
-
oTitleHierarchyCache[sPath] = oTitleInfo;
|
|
399
|
-
return oTitleInfo;
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Ensure that the ushell service receives all elements
|
|
404
|
-
* (title, subtitle, intent, icon) as strings.
|
|
405
|
-
*
|
|
406
|
-
* Annotation HeaderInfo allows for binding of title and description
|
|
407
|
-
* (which are used here as title and subtitle) to any element in the entity
|
|
408
|
-
* (being possibly types like boolean, timestamp, double, etc.)
|
|
409
|
-
*
|
|
410
|
-
* Creates a new hierarchy and converts non-string types to string.
|
|
411
|
-
*
|
|
412
|
-
* @param aHierarchy Shell title hierarchy
|
|
413
|
-
* @returns Copy of shell title hierarchy containing all elements as strings
|
|
414
|
-
*/
|
|
415
|
-
;
|
|
416
|
-
|
|
417
|
-
_proto._ensureHierarchyElementsAreStrings = function _ensureHierarchyElementsAreStrings(aHierarchy) {
|
|
418
|
-
var aHierarchyShell = [];
|
|
419
|
-
|
|
420
|
-
for (var level in aHierarchy) {
|
|
421
|
-
var oHierarchy = aHierarchy[level];
|
|
422
|
-
var oShellHierarchy = {};
|
|
423
|
-
|
|
424
|
-
for (var key in oHierarchy) {
|
|
425
|
-
oShellHierarchy[key] = typeof oHierarchy[key] !== "string" ? String(oHierarchy[key]) : oHierarchy[key];
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
aHierarchyShell.push(oShellHierarchy);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
return aHierarchyShell;
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
_proto._getTargetTypeFromHash = function _getTargetTypeFromHash(sHash) {
|
|
435
|
-
var oAppComponent = this.getAppComponent();
|
|
436
|
-
var sTargetType = "";
|
|
437
|
-
var aRoutes = oAppComponent.getManifestEntry("/sap.ui5/routing/routes");
|
|
438
|
-
|
|
439
|
-
for (var j = 0; j < aRoutes.length; j++) {
|
|
440
|
-
var oRoute = oAppComponent.getRouter().getRoute(aRoutes[j].name);
|
|
441
|
-
|
|
442
|
-
if (oRoute.match(sHash)) {
|
|
443
|
-
var sTarget = Array.isArray(aRoutes[j].target) ? aRoutes[j].target[0] : aRoutes[j].target;
|
|
444
|
-
sTargetType = oAppComponent.getRouter().getTarget(sTarget)._oOptions.name;
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
return sTargetType;
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* This function is updating the shell title after each navigation.
|
|
453
|
-
*
|
|
454
|
-
* @memberof sap.fe.templates.RootContainer.controller.BaseController
|
|
455
|
-
* @param oView The current view
|
|
456
|
-
* @returns A Promise that is resolved when the menu is filled properly
|
|
457
|
-
*/
|
|
458
|
-
;
|
|
459
|
-
|
|
460
|
-
_proto._computeTitleHierarchy = function _computeTitleHierarchy(oView) {
|
|
461
|
-
var _this6 = this;
|
|
462
|
-
|
|
463
|
-
var oAppComponent = this.getAppComponent(),
|
|
464
|
-
oContext = oView.getBindingContext(),
|
|
465
|
-
oCurrentPage = oView.getParent(),
|
|
466
|
-
aTitleInformationPromises = [],
|
|
467
|
-
sAppSpecificHash = this._getAppSpecificHash(),
|
|
468
|
-
sAppTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").title || "",
|
|
469
|
-
sAppSubTitle = oAppComponent.getMetadata().getManifestEntry("sap.app").appSubTitle || "";
|
|
470
|
-
|
|
471
|
-
var oPageTitleInformation, sNewPath;
|
|
472
|
-
|
|
473
|
-
if (oCurrentPage && oCurrentPage._getPageTitleInformation) {
|
|
474
|
-
if (oContext) {
|
|
475
|
-
// If the first page of the application is a LR, use the title and subtitle from the manifest
|
|
476
|
-
if (this._getTargetTypeFromHash("") === "sap.fe.templates.ListReport") {
|
|
477
|
-
aTitleInformationPromises.push(Promise.resolve(this._computeTitleInfo(sAppTitle, sAppSubTitle, sAppSpecificHash)));
|
|
478
|
-
} // Then manage other pages
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
sNewPath = oContext.getPath();
|
|
482
|
-
var aPathParts = sNewPath.split("/");
|
|
483
|
-
var sPath = "";
|
|
484
|
-
aPathParts.shift(); // Remove the first segment (empty string) as it has been managed above
|
|
485
|
-
|
|
486
|
-
aPathParts.pop(); // Remove the last segment as it corresponds to the current page and shouldn't appear in the menu
|
|
487
|
-
|
|
488
|
-
aPathParts.forEach(function (sPathPart) {
|
|
489
|
-
sPath += "/".concat(sPathPart);
|
|
490
|
-
var oMetaModel = oAppComponent.getMetaModel(),
|
|
491
|
-
sParameterPath = oMetaModel.getMetaPath(sPath),
|
|
492
|
-
bIsParameterized = oMetaModel.getObject("".concat(sParameterPath, "/@com.sap.vocabularies.Common.v1.ResultContext"));
|
|
493
|
-
|
|
494
|
-
if (!bIsParameterized) {
|
|
495
|
-
aTitleInformationPromises.push(_this6.getTitleInfoFromPath(sPath));
|
|
496
|
-
}
|
|
497
|
-
});
|
|
498
|
-
} // Current page
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
oPageTitleInformation = oCurrentPage._getPageTitleInformation();
|
|
502
|
-
oPageTitleInformation = this._computeTitleInfo(oPageTitleInformation.title, oPageTitleInformation.subtitle, sAppSpecificHash + this._getHash());
|
|
503
|
-
|
|
504
|
-
if (oContext) {
|
|
505
|
-
this._getTitleHierarchyCache()[sNewPath] = oPageTitleInformation;
|
|
506
|
-
} else {
|
|
507
|
-
this._getTitleHierarchyCache()[sAppSpecificHash] = oPageTitleInformation;
|
|
508
|
-
}
|
|
509
|
-
} else {
|
|
510
|
-
aTitleInformationPromises.push(Promise.reject("Title information missing in HeaderInfo"));
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
return Promise.all(aTitleInformationPromises).then(function (aTitleInfoHierarchy) {
|
|
514
|
-
// workaround for shell which is expecting all elements being of type string
|
|
515
|
-
var aTitleInfoHierarchyShell = _this6._ensureHierarchyElementsAreStrings(aTitleInfoHierarchy),
|
|
516
|
-
sTitle = oPageTitleInformation.title;
|
|
517
|
-
|
|
518
|
-
oAppComponent.getShellServices().setHierarchy(aTitleInfoHierarchyShell.reverse());
|
|
519
|
-
oAppComponent.getShellServices().setTitle(sTitle);
|
|
520
|
-
}).catch(function (sErrorMessage) {
|
|
521
|
-
Log.error(sErrorMessage);
|
|
522
|
-
}).finally(function () {
|
|
523
|
-
_this6.bIsComputingTitleHierachy = false;
|
|
524
|
-
}).catch(function (sErrorMessage) {
|
|
525
|
-
Log.error(sErrorMessage);
|
|
526
|
-
});
|
|
527
|
-
} // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
528
|
-
;
|
|
529
|
-
|
|
530
|
-
_proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
|
|
531
|
-
return null;
|
|
532
|
-
}
|
|
533
|
-
/**
|
|
534
|
-
* Callback after a view has been bound to a context.
|
|
535
|
-
*
|
|
536
|
-
* @param oContext The context that has been bound to a view
|
|
537
|
-
*/
|
|
538
|
-
;
|
|
539
|
-
|
|
540
|
-
_proto.onContextBoundToView = function onContextBoundToView(oContext) {
|
|
541
|
-
if (oContext) {
|
|
542
|
-
var sDeepestPath = this.getView().getModel("internal").getProperty("/deepestPath"),
|
|
543
|
-
sViewContextPath = oContext.getPath();
|
|
544
|
-
|
|
545
|
-
if (!sDeepestPath || sDeepestPath.indexOf(sViewContextPath) !== 0) {
|
|
546
|
-
// There was no previous value for the deepest reached path, or the path
|
|
547
|
-
// for the view isn't a subpath of the previous deepest path --> update
|
|
548
|
-
this.getView().getModel("internal").setProperty("/deepestPath", sViewContextPath, undefined, true);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
} // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
552
|
-
;
|
|
553
|
-
|
|
554
|
-
_proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
|
|
555
|
-
// To be overridden
|
|
556
|
-
return Promise.resolve(true);
|
|
557
|
-
} // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
558
|
-
;
|
|
559
|
-
|
|
560
|
-
_proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {// To be overriden
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
_proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {// To be overriden
|
|
564
|
-
};
|
|
565
|
-
|
|
566
|
-
return RootContainerBaseController;
|
|
567
|
-
}(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "oPlaceholder", [_dec2], {
|
|
568
|
-
configurable: true,
|
|
569
|
-
enumerable: true,
|
|
570
|
-
writable: true,
|
|
571
|
-
initializer: null
|
|
572
|
-
})), _class2)) || _class);
|
|
573
|
-
return RootContainerBaseController;
|
|
574
|
-
}, false);
|
|
575
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeSIsIm9uSW5pdCIsIlRhYmxlU2l6ZUhlbHBlciIsImluaXQiLCJfYUhlbHBlck1vZGVscyIsImdldFBsYWNlaG9sZGVyIiwib1BsYWNlaG9sZGVyIiwiYXR0YWNoUm91dGVNYXRjaGVycyIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJfb25BZnRlclJvdXRlTWF0Y2hlZCIsIm9uRXhpdCIsImRldGFjaEFmdGVyUm91dGVNYXRjaGVkIiwib1JvdXRlciIsInVuZGVmaW5lZCIsImV4aXQiLCJmb3JFYWNoIiwib01vZGVsIiwiZGVzdHJveSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0T3duZXJDb21wb25lbnQiLCJnZXRNb2RlbCIsImdldFJvdXRlciIsIl9jcmVhdGVIZWxwZXJNb2RlbCIsIkpTT05Nb2RlbCIsInB1c2giLCJ3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5Iiwib0V2ZW50IiwiUHJvbWlzZSIsInJlc29sdmUiLCJhQ29udGFpbmVycyIsImdldFBhcmFtZXRlciIsImFGRUNvbnRhaW5lcnMiLCJvQ29udGFpbmVyIiwib1ZpZXciLCJnZXRDb21wb25lbnRJbnN0YW5jZSIsIm9Db21wb25lbnRJbnN0YW5jZSIsImdldFJvb3RDb250cm9sIiwiZ2V0Q29udHJvbGxlciIsInBhZ2VSZWFkeSIsIm9SaWdodE1vc3RGRVZpZXciLCJsZW5ndGgiLCJpc1BhZ2VSZWFkeSIsImF0dGFjaEV2ZW50T25jZSIsIl9vUm91dGVNYXRjaGVkUHJvbWlzZSIsIm9Sb290Q29udHJvbCIsImdldFZpZXciLCJnZXRDb250ZW50IiwiZ2V0QXV0b0ZvY3VzIiwic2V0UHJvcGVydHkiLCJvQXBwQ29tcG9uZW50IiwiX3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJVU2hlbGwiLCJfY29tcHV0ZVRpdGxlSGllcmFyY2h5IiwiYkZvcmNlRm9jdXMiLCJnZXRSb3V0ZXJQcm94eSIsImlzRm9jdXNGb3JjZWQiLCJzZXRGb2N1c0ZvcmNlZCIsIm9uUGFnZVJlYWR5IiwiZ2V0UGFyZW50IiwiZm9yY2VGb2N1cyIsIm9uQ29udGFpbmVyUmVhZHkiLCJjYXRjaCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZmluYWxseSIsIl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlIiwib1RpdGxlSGllcmFyY2h5Q2FjaGUiLCJfY29tcHV0ZVRpdGxlSW5mbyIsInRpdGxlIiwic3VidGl0bGUiLCJzSW50ZW50IiwiYVBhcnRzIiwic3BsaXQiLCJpbmRleE9mIiwiaW50ZW50IiwiaWNvbiIsIl9mb3JtYXRUaXRsZSIsImRpc3BsYXlNb2RlIiwidGl0bGVWYWx1ZSIsInRpdGxlRGVzY3JpcHRpb24iLCJmb3JtYXR0ZWRUaXRsZSIsIl9mZXRjaFRpdGxlVmFsdWUiLCJzUGF0aCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsIm9CaW5kaW5nVmlld0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInNWYWx1ZUV4cHJlc3Npb24iLCJBbm5vdGF0aW9uSGVscGVyIiwiZm9ybWF0IiwiZ2V0T2JqZWN0IiwiY29udGV4dCIsInNUZXh0RXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eUNvbnRleHQiLCJhUHJvbWlzZXMiLCJvVmFsdWVFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJvUHJvbWlzZUZvckRpc3BsYXlNb2RlIiwiQ29tbW9uVXRpbHMiLCJjb21wdXRlRGlzcGxheU1vZGUiLCJzVmFsdWVQYXRoIiwicGFydHMiLCJwYXRoIiwiZm5WYWx1ZUZvcm1hdHRlciIsImZvcm1hdHRlciIsIm9WYWx1ZUJpbmRpbmciLCJiaW5kUHJvcGVydHkiLCJpbml0aWFsaXplIiwib1Byb21pc2VGb3JUaXRsZVZhbHVlIiwiZm5DaGFuZ2UiLCJzVGFyZ2V0VmFsdWUiLCJnZXRTb3VyY2UiLCJnZXRWYWx1ZSIsImRldGFjaENoYW5nZSIsImF0dGFjaENoYW5nZSIsIm9UZXh0RXhwcmVzc2lvbiIsInNUZXh0UGF0aCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJmblRleHRGb3JtYXR0ZXIiLCJvVGV4dEJpbmRpbmciLCJvUHJvbWlzZUZvclRpdGxlVGV4dCIsInNUYXJnZXRUZXh0IiwiYWxsIiwidGl0bGVJbmZvIiwiX2dldEFwcFNwZWNpZmljSGFzaCIsIkhhc2hDaGFuZ2VyIiwiZ2V0SW5zdGFuY2UiLCJocmVmRm9yQXBwU3BlY2lmaWNIYXNoIiwiX2dldEhhc2giLCJnZXRIYXNoIiwiZ2V0VGl0bGVJbmZvRnJvbVBhdGgiLCJzRW50aXR5UGF0aCIsInNUeXBlTmFtZSIsInNBcHBTcGVjaWZpY0hhc2giLCJzVGl0bGUiLCJvVGl0bGVJbmZvIiwiX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyIsImFIaWVyYXJjaHkiLCJhSGllcmFyY2h5U2hlbGwiLCJsZXZlbCIsIm9IaWVyYXJjaHkiLCJvU2hlbGxIaWVyYXJjaHkiLCJrZXkiLCJTdHJpbmciLCJfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoIiwic0hhc2giLCJzVGFyZ2V0VHlwZSIsImFSb3V0ZXMiLCJnZXRNYW5pZmVzdEVudHJ5IiwiaiIsIm9Sb3V0ZSIsImdldFJvdXRlIiwibmFtZSIsIm1hdGNoIiwic1RhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsImdldFRhcmdldCIsIl9vT3B0aW9ucyIsIm9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ3VycmVudFBhZ2UiLCJhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzIiwic0FwcFRpdGxlIiwiZ2V0TWV0YWRhdGEiLCJzQXBwU3ViVGl0bGUiLCJhcHBTdWJUaXRsZSIsIm9QYWdlVGl0bGVJbmZvcm1hdGlvbiIsInNOZXdQYXRoIiwiX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uIiwiZ2V0UGF0aCIsImFQYXRoUGFydHMiLCJzaGlmdCIsInBvcCIsInNQYXRoUGFydCIsInNQYXJhbWV0ZXJQYXRoIiwiYklzUGFyYW1ldGVyaXplZCIsInJlamVjdCIsImFUaXRsZUluZm9IaWVyYXJjaHkiLCJhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0SGllcmFyY2h5IiwicmV2ZXJzZSIsInNldFRpdGxlIiwic0Vycm9yTWVzc2FnZSIsImNhbGN1bGF0ZUxheW91dCIsImlOZXh0RkNMTGV2ZWwiLCJzUHJvcG9zZWRMYXlvdXQiLCJrZWVwQ3VycmVudExheW91dCIsIm9uQ29udGV4dEJvdW5kVG9WaWV3Iiwic0RlZXBlc3RQYXRoIiwiZ2V0UHJvcGVydHkiLCJzVmlld0NvbnRleHRQYXRoIiwiZGlzcGxheU1lc3NhZ2VQYWdlIiwibVBhcmFtZXRlcnMiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIkZDTExldmVsIiwiQmFzZUNvbnRyb2xsZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IFRhYmxlU2l6ZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZVNpemVIZWxwZXJcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCIpXG5jbGFzcyBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlQ29udHJvbGxlciB7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0b1BsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cdHByaXZhdGUgX2FIZWxwZXJNb2RlbHMhOiBhbnlbXTtcblx0cHJpdmF0ZSBvUm91dGVyPzogUm91dGVyO1xuXHRwcml2YXRlIF9vUm91dGVNYXRjaGVkUHJvbWlzZTogYW55O1xuXHRwcml2YXRlIG9UaXRsZUhpZXJhcmNoeUNhY2hlOiBhbnk7XG5cdHByaXZhdGUgYklzQ29tcHV0aW5nVGl0bGVIaWVyYWNoeTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdG9uSW5pdCgpIHtcblx0XHRUYWJsZVNpemVIZWxwZXIuaW5pdCgpO1xuXG5cdFx0dGhpcy5fYUhlbHBlck1vZGVscyA9IFtdO1xuXHR9XG5cblx0Z2V0UGxhY2Vob2xkZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMub1BsYWNlaG9sZGVyO1xuXHR9XG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKSB7XG5cdFx0dGhpcy5vUGxhY2Vob2xkZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLl9vbkFmdGVyUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0fVxuXHRvbkV4aXQoKSB7XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuX29uQWZ0ZXJSb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHRcdHRoaXMub1JvdXRlciA9IHVuZGVmaW5lZDtcblxuXHRcdFRhYmxlU2l6ZUhlbHBlci5leGl0KCk7XG5cblx0XHQvLyBEZXN0cm95IGFsbCBKU09OIG1vZGVscyBjcmVhdGVkIGR5bmFtaWNhbGx5IGZvciB0aGUgdmlld3Ncblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKG9Nb2RlbDogYW55KSB7XG5cdFx0XHRvTW9kZWwuZGVzdHJveSgpO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2VNb2RlbCBvZiB0aGUgY29tcG9uZW50XG5cdCAqL1xuXHRnZXRSZXNvdXJjZUJ1bmRsZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRNb2RlbChcImkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0fVxuXHRnZXRSb3V0ZXIoKSB7XG5cdFx0aWYgKCF0aGlzLm9Sb3V0ZXIpIHtcblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlcjtcblx0fVxuXG5cdF9jcmVhdGVIZWxwZXJNb2RlbCgpIHtcblx0XHQvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBtb2RlbHMgY3JlYXRlZCBkeW5hbWljYWxseSwgYXMgdGhleSBkb24ndCBnZXQgZGVzdHJveWVkXG5cdFx0Ly8gYXV0b21hdGljYWxseSB3aGVuIHRoZSB2aWV3IGlzIGRlc3Ryb3llZC5cblx0XHQvLyBUaGlzIGlzIGRvbmUgZHVyaW5nIG9uRXhpdFxuXHRcdGNvbnN0IG9Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHR0aGlzLl9hSGVscGVyTW9kZWxzLnB1c2gob01vZGVsKTtcblxuXHRcdHJldHVybiBvTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gd2FpdGluZyBmb3IgdGhlIFJpZ2h0IG1vc3QgdmlldyB0byBiZSByZWFkeS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvRXZlbnQgUmVmZXJlbmNlIGFuIEV2ZW50IHBhcmFtZXRlciBjb21pbmcgZnJvbSByb3V0ZU1hdGNoZWQgZXZlbnRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGluZGljYXRpbmcgd2hlbiB0aGUgcmlnaHQgbW9zdCB2aWV3IGlzIHJlYWR5XG5cdCAqL1xuXHR3YWl0Rm9yUmlnaHRNb3N0Vmlld1JlYWR5KG9FdmVudDogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgYUNvbnRhaW5lcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIiksXG5cdFx0XHRcdC8vIFRoZXJlIGNhbiBhbHNvIGJlIHJldXNlIGNvbXBvbmVudHMgaW4gdGhlIHZpZXcsIHJlbW92ZSB0aGVtIGJlZm9yZSBwcm9jZXNzaW5nLlxuXHRcdFx0XHRhRkVDb250YWluZXJzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUNvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdFx0XHRcdGxldCBvVmlldyA9IG9Db250YWluZXI7XG5cdFx0XHRcdGlmIChvQ29udGFpbmVyICYmIG9Db250YWluZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRjb25zdCBvQ29tcG9uZW50SW5zdGFuY2UgPSBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCk7XG5cdFx0XHRcdFx0b1ZpZXcgPSBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0Um9vdENvbnRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob1ZpZXcgJiYgb1ZpZXcuZ2V0Q29udHJvbGxlcigpICYmIG9WaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkpIHtcblx0XHRcdFx0XHRhRkVDb250YWluZXJzLnB1c2gob1ZpZXcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9SaWdodE1vc3RGRVZpZXcgPSBhRkVDb250YWluZXJzW2FGRUNvbnRhaW5lcnMubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAob1JpZ2h0TW9zdEZFVmlldyAmJiBvUmlnaHRNb3N0RkVWaWV3LmdldENvbnRyb2xsZXIoKS5wYWdlUmVhZHkuaXNQYWdlUmVhZHkoKSkge1xuXHRcdFx0XHRyZXNvbHZlKG9SaWdodE1vc3RGRVZpZXcpO1xuXHRcdFx0fSBlbHNlIGlmIChvUmlnaHRNb3N0RkVWaWV3KSB7XG5cdFx0XHRcdG9SaWdodE1vc3RGRVZpZXcuZ2V0Q29udHJvbGxlcigpLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlc29sdmUob1JpZ2h0TW9zdEZFVmlldyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZG9uZS5cblx0ICogIC0gdXBkYXRlIHRoZSBzaGVsbCB0aXRsZS5cblx0ICogIC0gdXBkYXRlIHRhYmxlIHNjcm9sbC5cblx0ICogIC0gY2FsbCBvblBhZ2VSZWFkeSBvbiB0aGUgcmlnaHRNb3N0Vmlldy5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNfb25BZnRlclJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICovXG5cdF9vbkFmdGVyUm91dGVNYXRjaGVkKG9FdmVudDogYW55KSB7XG5cdFx0aWYgKCF0aGlzLl9vUm91dGVNYXRjaGVkUHJvbWlzZSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlTWF0Y2hlZFByb21pc2UgPSB0aGlzLndhaXRGb3JSaWdodE1vc3RWaWV3UmVhZHkob0V2ZW50KVxuXHRcdFx0XHQudGhlbigob1ZpZXc6IGFueSkgPT4ge1xuXHRcdFx0XHRcdC8vIFRoZSBhdXRvRm9jdXMgaXMgaW5pdGlhbGx5IGRpc2FibGVkIG9uIHRoZSBuYXZDb250YWluZXIgb3IgdGhlIEZDTCwgc28gdGhhdCB0aGUgZm9jdXMgc3RheXMgb24gdGhlIFNoZWxsIG1lbnVcblx0XHRcdFx0XHQvLyBldmVuIGlmIHRoZSBhcHAgdGFrZXMgYSBsb25nIHRpbWUgdG8gbGF1bmNoXG5cdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IHRpbWUgdGhlIHZpZXcgaXMgZGlzcGxheWVkLCB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgYXV0b2ZvY3VzIHNvIHRoYXQgaXQncyBtYW5hZ2VkIHByb3Blcmx5IGR1cmluZyBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0Y29uc3Qgb1Jvb3RDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdIGFzIGFueTtcblx0XHRcdFx0XHRpZiAob1Jvb3RDb250cm9sICYmIG9Sb290Q29udHJvbC5nZXRBdXRvRm9jdXMgJiYgIW9Sb290Q29udHJvbC5nZXRBdXRvRm9jdXMoKSkge1xuXHRcdFx0XHRcdFx0b1Jvb3RDb250cm9sLnNldFByb3BlcnR5KFwiYXV0b0ZvY3VzXCIsIHRydWUsIHRydWUpOyAvLyBEbyBub3QgbWFyayB0aGUgY29udGFpbmVyIGFzIGludmFsaWQsIG90aGVyd2lzZSBpdCdzIHJlLXJlbmRlcmVkXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0dGhpcy5fc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMoKTtcblx0XHRcdFx0XHRpZiAob0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLlVTaGVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY29tcHV0ZVRpdGxlSGllcmFyY2h5KG9WaWV3KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYkZvcmNlRm9jdXMgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaXNGb2N1c0ZvcmNlZCgpO1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRGb2N1c0ZvcmNlZChmYWxzZSk7IC8vIHJlc2V0XG5cdFx0XHRcdFx0aWYgKG9WaWV3LmdldENvbnRyb2xsZXIoKSAmJiBvVmlldy5nZXRDb250cm9sbGVyKCkub25QYWdlUmVhZHkgJiYgb1ZpZXcuZ2V0UGFyZW50KCkub25QYWdlUmVhZHkpIHtcblx0XHRcdFx0XHRcdG9WaWV3LmdldFBhcmVudCgpLm9uUGFnZVJlYWR5KHsgZm9yY2VGb2N1czogYkZvcmNlRm9jdXMgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLm9uQ29udGFpbmVyUmVhZHkpIHtcblx0XHRcdFx0XHRcdHRoaXMub25Db250YWluZXJSZWFkeSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkFuIGVycm9yIG9jY3VycyB3aGlsZSBjb21wdXRpbmcgdGhlIHRpdGxlIGhpZXJhcmNoeSBhbmQgY2FsbGluZyBmb2N1cyBtZXRob2RcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX29Sb3V0ZU1hdGNoZWRQcm9taXNlID0gbnVsbDtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVGl0bGVIaWVyYXJjaHkgY2FjaGUgKCBvciBpbml0aWFsaXplcyBpdCBpZiB1bmRlZmluZWQpLlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNfZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHJldHVybnMgIFRoZSBUaXRsZUhpZXJhcmNoeSBjYWNoZVxuXHQgKi9cblx0X2dldFRpdGxlSGllcmFyY2h5Q2FjaGUoKSB7XG5cdFx0aWYgKCF0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlKSB7XG5cdFx0XHR0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlID0ge307XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm9UaXRsZUhpZXJhcmNoeUNhY2hlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHRpdGxlSW5mbyBvYmplY3QuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlclxuXHQgKiBAcGFyYW0gdGl0bGVcblx0ICogQHBhcmFtIHN1YnRpdGxlXG5cdCAqIEBwYXJhbSBzSW50ZW50IFRoZSBpbnRlbnQgcGF0aCB0byBiZSByZWRpcmVjdGVkIHRvXG5cdCAqIEByZXR1cm5zIFRoZSB0aXRsZSBpbmZvcm1hdGlvblxuXHQgKi9cblx0X2NvbXB1dGVUaXRsZUluZm8odGl0bGU6IGFueSwgc3VidGl0bGU6IGFueSwgc0ludGVudDogYW55KSB7XG5cdFx0Y29uc3QgYVBhcnRzID0gc0ludGVudC5zcGxpdChcIi9cIik7XG5cdFx0aWYgKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0uaW5kZXhPZihcIj9cIikgPT09IC0xKSB7XG5cdFx0XHRzSW50ZW50ICs9IFwiP3Jlc3RvcmVIaXN0b3J5PXRydWVcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c0ludGVudCArPSBcIiZyZXN0b3JlSGlzdG9yeT10cnVlXCI7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogdGl0bGUsXG5cdFx0XHRzdWJ0aXRsZTogc3VidGl0bGUsXG5cdFx0XHRpbnRlbnQ6IHNJbnRlbnQsXG5cdFx0XHRpY29uOiBcIlwiXG5cdFx0fTtcblx0fVxuXHRfZm9ybWF0VGl0bGUoZGlzcGxheU1vZGU6IHN0cmluZywgdGl0bGVWYWx1ZTogc3RyaW5nLCB0aXRsZURlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBmb3JtYXR0ZWRUaXRsZSA9IFwiXCI7XG5cdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdGZvcm1hdHRlZFRpdGxlID0gYCR7dGl0bGVWYWx1ZX1gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdGZvcm1hdHRlZFRpdGxlID0gYCR7dGl0bGVWYWx1ZX0gKCR7dGl0bGVEZXNjcmlwdGlvbn0pYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRmb3JtYXR0ZWRUaXRsZSA9IGAke3RpdGxlRGVzY3JpcHRpb259ICgke3RpdGxlVmFsdWV9KWA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdGZvcm1hdHRlZFRpdGxlID0gYCR7dGl0bGVEZXNjcmlwdGlvbn1gO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0fVxuXHRcdHJldHVybiBmb3JtYXR0ZWRUaXRsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGZXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgSGVhZGVySW5mbyB0aXRsZSBmb3IgYSBnaXZlbiBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGggdG8gdGhlIGVudGl0eVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgY29udGFpbmluZyB0aGUgZm9ybWF0dGVkIHRpdGxlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gSGVhZGVySW5mbyB0aXRsZSBhbm5vdGF0aW9uIGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0YXN5bmMgX2ZldGNoVGl0bGVWYWx1ZShzUGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRvTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKSxcblx0XHRcdG9CaW5kaW5nVmlld0NvbnRleHQgPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdFx0c1ZhbHVlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIuZm9ybWF0KFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvL1RpdGxlL1ZhbHVlYCksXG5cdFx0XHRcdHsgY29udGV4dDogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dCB9XG5cdFx0XHQpO1xuXHRcdGlmICghc1ZhbHVlRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIlwiKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1RleHRFeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5mb3JtYXQoXG5cdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWUvJFBhdGhAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRgXG5cdFx0XHRcdCksXG5cdFx0XHRcdHsgY29udGV4dDogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dCB9XG5cdFx0XHQpLFxuXHRcdFx0b1Byb3BlcnR5Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm8vVGl0bGUvVmFsdWUvJFBhdGhAYCksXG5cdFx0XHRhUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuXHRcdFx0b1ZhbHVlRXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzVmFsdWVFeHByZXNzaW9uKSxcblx0XHRcdG9Qcm9taXNlRm9yRGlzcGxheU1vZGUgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBDb21tb25VdGlscy5jb21wdXRlRGlzcGxheU1vZGUob1Byb3BlcnR5Q29udGV4dCk7XG5cdFx0XHRcdHJlc29sdmUoZGlzcGxheU1vZGUpO1xuXHRcdFx0fSk7XG5cdFx0YVByb21pc2VzLnB1c2gob1Byb21pc2VGb3JEaXNwbGF5TW9kZSk7XG5cdFx0Y29uc3Qgc1ZhbHVlUGF0aCA9IG9WYWx1ZUV4cHJlc3Npb24ucGFydHMgPyBvVmFsdWVFeHByZXNzaW9uLnBhcnRzWzBdLnBhdGggOiBvVmFsdWVFeHByZXNzaW9uLnBhdGgsXG5cdFx0XHRmblZhbHVlRm9ybWF0dGVyID0gb1ZhbHVlRXhwcmVzc2lvbi5mb3JtYXR0ZXIsXG5cdFx0XHRvVmFsdWVCaW5kaW5nID0gb01vZGVsLmJpbmRQcm9wZXJ0eShzVmFsdWVQYXRoLCBvQmluZGluZ1ZpZXdDb250ZXh0KTtcblx0XHRvVmFsdWVCaW5kaW5nLmluaXRpYWxpemUoKTtcblx0XHRjb25zdCBvUHJvbWlzZUZvclRpdGxlVmFsdWUgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRWYWx1ZSA9IGZuVmFsdWVGb3JtYXR0ZXIgPyBmblZhbHVlRm9ybWF0dGVyKG9FdmVudC5nZXRTb3VyY2UoKS5nZXRWYWx1ZSgpKSA6IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRWYWx1ZSgpO1xuXG5cdFx0XHRcdG9WYWx1ZUJpbmRpbmcuZGV0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdFx0cmVzb2x2ZShzVGFyZ2V0VmFsdWUpO1xuXHRcdFx0fTtcblx0XHRcdG9WYWx1ZUJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHR9KTtcblx0XHRhUHJvbWlzZXMucHVzaChvUHJvbWlzZUZvclRpdGxlVmFsdWUpO1xuXG5cdFx0aWYgKHNUZXh0RXhwcmVzc2lvbikge1xuXHRcdFx0Y29uc3Qgb1RleHRFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNUZXh0RXhwcmVzc2lvbik7XG5cdFx0XHRsZXQgc1RleHRQYXRoID0gb1RleHRFeHByZXNzaW9uLnBhcnRzID8gb1RleHRFeHByZXNzaW9uLnBhcnRzWzBdLnBhdGggOiBvVGV4dEV4cHJlc3Npb24ucGF0aDtcblx0XHRcdHNUZXh0UGF0aCA9IHNWYWx1ZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgPyBzVmFsdWVQYXRoLnNsaWNlKDAsIHNWYWx1ZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSArIFwiL1wiICsgc1RleHRQYXRoIDogc1RleHRQYXRoO1xuXHRcdFx0Y29uc3QgZm5UZXh0Rm9ybWF0dGVyID0gb1RleHRFeHByZXNzaW9uLmZvcm1hdHRlcixcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gb01vZGVsLmJpbmRQcm9wZXJ0eShzVGV4dFBhdGgsIG9CaW5kaW5nVmlld0NvbnRleHQpO1xuXHRcdFx0b1RleHRCaW5kaW5nLmluaXRpYWxpemUoKTtcblx0XHRcdGNvbnN0IG9Qcm9taXNlRm9yVGl0bGVUZXh0ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6IChkZXNjcmlwdGlvbjogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdGNvbnN0IGZuQ2hhbmdlID0gZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RhcmdldFRleHQgPSBmblRleHRGb3JtYXR0ZXIgPyBmblRleHRGb3JtYXR0ZXIob0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCkpIDogb0V2ZW50LmdldFNvdXJjZSgpLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0XHRvVGV4dEJpbmRpbmcuZGV0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdFx0XHRyZXNvbHZlKHNUYXJnZXRUZXh0KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRvVGV4dEJpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuQ2hhbmdlKTtcblx0XHRcdH0pO1xuXHRcdFx0YVByb21pc2VzLnB1c2gob1Byb21pc2VGb3JUaXRsZVRleHQpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGl0bGVJbmZvOiBhbnlbXSA9IGF3YWl0IFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdFx0XHRsZXQgZm9ybWF0dGVkVGl0bGUgPSBcIlwiO1xuXHRcdFx0aWYgKHR5cGVvZiB0aXRsZUluZm8gIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Zm9ybWF0dGVkVGl0bGUgPSB0aGlzLl9mb3JtYXRUaXRsZSh0aXRsZUluZm9bMF0sIHRpdGxlSW5mb1sxXSwgdGl0bGVJbmZvWzJdKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmb3JtYXR0ZWRUaXRsZTtcblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBmZXRjaGluZyB0aGUgdGl0bGUgZnJvbSB0aGUgaGVhZGVyIGluZm8gOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRBcHBTcGVjaWZpY0hhc2goKSB7XG5cdFx0Ly8gSGFzaENoYW5nZWQgaXNTaGVsbE5hdmlnYXRpb25IYXNoQ2hhbmdlclxuXHRcdHJldHVybiAoSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKSBhcyBhbnkpLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hcblx0XHRcdD8gKEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkgYXMgYW55KS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoKFwiXCIpXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblxuXHRfZ2V0SGFzaCgpIHtcblx0XHRyZXR1cm4gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRpdGxlSW5mb3JtYXRpb24gZnJvbSBhIHBhdGguXG5cdCAqIEl0IHVwZGF0ZXMgdGhlIGNhY2hlIHRvIHN0b3JlIFRpdGxlIEluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeVxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5CYXNlQ29udHJvbGxlciNnZXRUaXRsZUluZm9Gcm9tUGF0aFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuQmFzZUNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHsqfSBzUGF0aCBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIHJldHJpZXZlIHRpdGxlIGluZm9ybWF0aW9uIGZyb20gTWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSAgb1RpdGxlaW5mb3JtYXRpb24gcmV0dXJuZWQgYXMgcHJvbWlzZVxuXHQgKi9cblxuXHRnZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aDogYW55KSB7XG5cdFx0Y29uc3Qgb1RpdGxlSGllcmFyY2h5Q2FjaGUgPSB0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKCk7XG5cblx0XHRpZiAob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKSB7XG5cdFx0XHQvLyBUaGUgdGl0bGUgaW5mbyBpcyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUgY2FjaGVcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob1RpdGxlSGllcmFyY2h5Q2FjaGVbc1BhdGhdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IHNUeXBlTmFtZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGVhZGVySW5mby9UeXBlTmFtZWApO1xuXHRcdGNvbnN0IHNBcHBTcGVjaWZpY0hhc2ggPSB0aGlzLl9nZXRBcHBTcGVjaWZpY0hhc2goKTtcblx0XHRjb25zdCBzSW50ZW50ID0gc0FwcFNwZWNpZmljSGFzaCArIHNQYXRoLnNsaWNlKDEpO1xuXHRcdHJldHVybiB0aGlzLl9mZXRjaFRpdGxlVmFsdWUoc1BhdGgpLnRoZW4oKHNUaXRsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvVGl0bGVJbmZvID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhzVHlwZU5hbWUsIHNUaXRsZSwgc0ludGVudCk7XG5cdFx0XHRvVGl0bGVIaWVyYXJjaHlDYWNoZVtzUGF0aF0gPSBvVGl0bGVJbmZvO1xuXHRcdFx0cmV0dXJuIG9UaXRsZUluZm87XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEVuc3VyZSB0aGF0IHRoZSB1c2hlbGwgc2VydmljZSByZWNlaXZlcyBhbGwgZWxlbWVudHNcblx0ICogKHRpdGxlLCBzdWJ0aXRsZSwgaW50ZW50LCBpY29uKSBhcyBzdHJpbmdzLlxuXHQgKlxuXHQgKiBBbm5vdGF0aW9uIEhlYWRlckluZm8gYWxsb3dzIGZvciBiaW5kaW5nIG9mIHRpdGxlIGFuZCBkZXNjcmlwdGlvblxuXHQgKiAod2hpY2ggYXJlIHVzZWQgaGVyZSBhcyB0aXRsZSBhbmQgc3VidGl0bGUpIHRvIGFueSBlbGVtZW50IGluIHRoZSBlbnRpdHlcblx0ICogKGJlaW5nIHBvc3NpYmx5IHR5cGVzIGxpa2UgYm9vbGVhbiwgdGltZXN0YW1wLCBkb3VibGUsIGV0Yy4pXG5cdCAqXG5cdCAqIENyZWF0ZXMgYSBuZXcgaGllcmFyY2h5IGFuZCBjb252ZXJ0cyBub24tc3RyaW5nIHR5cGVzIHRvIHN0cmluZy5cblx0ICpcblx0ICogQHBhcmFtIGFIaWVyYXJjaHkgU2hlbGwgdGl0bGUgaGllcmFyY2h5XG5cdCAqIEByZXR1cm5zIENvcHkgb2Ygc2hlbGwgdGl0bGUgaGllcmFyY2h5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGFzIHN0cmluZ3Ncblx0ICovXG5cdF9lbnN1cmVIaWVyYXJjaHlFbGVtZW50c0FyZVN0cmluZ3MoYUhpZXJhcmNoeTogYW55KSB7XG5cdFx0Y29uc3QgYUhpZXJhcmNoeVNoZWxsID0gW107XG5cdFx0Zm9yIChjb25zdCBsZXZlbCBpbiBhSGllcmFyY2h5KSB7XG5cdFx0XHRjb25zdCBvSGllcmFyY2h5ID0gYUhpZXJhcmNoeVtsZXZlbF07XG5cdFx0XHRjb25zdCBvU2hlbGxIaWVyYXJjaHk6IGFueSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gb0hpZXJhcmNoeSkge1xuXHRcdFx0XHRvU2hlbGxIaWVyYXJjaHlba2V5XSA9IHR5cGVvZiBvSGllcmFyY2h5W2tleV0gIT09IFwic3RyaW5nXCIgPyBTdHJpbmcob0hpZXJhcmNoeVtrZXldKSA6IG9IaWVyYXJjaHlba2V5XTtcblx0XHRcdH1cblx0XHRcdGFIaWVyYXJjaHlTaGVsbC5wdXNoKG9TaGVsbEhpZXJhcmNoeSk7XG5cdFx0fVxuXHRcdHJldHVybiBhSGllcmFyY2h5U2hlbGw7XG5cdH1cblxuXHRfZ2V0VGFyZ2V0VHlwZUZyb21IYXNoKHNIYXNoOiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRsZXQgc1RhcmdldFR5cGUgPSBcIlwiO1xuXG5cdFx0Y29uc3QgYVJvdXRlcyA9IG9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVJvdXRlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0Y29uc3Qgb1JvdXRlID0gb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRSb3V0ZShhUm91dGVzW2pdLm5hbWUpO1xuXHRcdFx0aWYgKG9Sb3V0ZS5tYXRjaChzSGFzaCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9IEFycmF5LmlzQXJyYXkoYVJvdXRlc1tqXS50YXJnZXQpID8gYVJvdXRlc1tqXS50YXJnZXRbMF0gOiBhUm91dGVzW2pdLnRhcmdldDtcblx0XHRcdFx0c1RhcmdldFR5cGUgPSAob0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKS5nZXRUYXJnZXQoc1RhcmdldCkgYXMgYW55KS5fb09wdGlvbnMubmFtZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNUYXJnZXRUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXBkYXRpbmcgdGhlIHNoZWxsIHRpdGxlIGFmdGVyIGVhY2ggbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkJhc2VDb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvVmlldyBUaGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG1lbnUgaXMgZmlsbGVkIHByb3Blcmx5XG5cdCAqL1xuXHRfY29tcHV0ZVRpdGxlSGllcmFyY2h5KG9WaWV3OiBhbnkpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdG9Db250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdG9DdXJyZW50UGFnZSA9IG9WaWV3LmdldFBhcmVudCgpLFxuXHRcdFx0YVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcyA9IFtdLFxuXHRcdFx0c0FwcFNwZWNpZmljSGFzaCA9IHRoaXMuX2dldEFwcFNwZWNpZmljSGFzaCgpLFxuXHRcdFx0c0FwcFRpdGxlID0gb0FwcENvbXBvbmVudC5nZXRNZXRhZGF0YSgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpLnRpdGxlIHx8IFwiXCIsXG5cdFx0XHRzQXBwU3ViVGl0bGUgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFkYXRhKCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIikuYXBwU3ViVGl0bGUgfHwgXCJcIjtcblx0XHRsZXQgb1BhZ2VUaXRsZUluZm9ybWF0aW9uOiBhbnksIHNOZXdQYXRoO1xuXG5cdFx0aWYgKG9DdXJyZW50UGFnZSAmJiBvQ3VycmVudFBhZ2UuX2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGEgTFIsIHVzZSB0aGUgdGl0bGUgYW5kIHN1YnRpdGxlIGZyb20gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdGlmICh0aGlzLl9nZXRUYXJnZXRUeXBlRnJvbUhhc2goXCJcIikgPT09IFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NvbXB1dGVUaXRsZUluZm8oc0FwcFRpdGxlLCBzQXBwU3ViVGl0bGUsIHNBcHBTcGVjaWZpY0hhc2gpKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGVuIG1hbmFnZSBvdGhlciBwYWdlc1xuXHRcdFx0XHRzTmV3UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgYVBhdGhQYXJ0cyA9IHNOZXdQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0bGV0IHNQYXRoID0gXCJcIjtcblxuXHRcdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7IC8vIFJlbW92ZSB0aGUgZmlyc3Qgc2VnbWVudCAoZW1wdHkgc3RyaW5nKSBhcyBpdCBoYXMgYmVlbiBtYW5hZ2VkIGFib3ZlXG5cdFx0XHRcdGFQYXRoUGFydHMucG9wKCk7IC8vIFJlbW92ZSB0aGUgbGFzdCBzZWdtZW50IGFzIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNob3VsZG4ndCBhcHBlYXIgaW4gdGhlIG1lbnVcblxuXHRcdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goKHNQYXRoUGFydDogYW55KSA9PiB7XG5cdFx0XHRcdFx0c1BhdGggKz0gYC8ke3NQYXRoUGFydH1gO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdFx0c1BhcmFtZXRlclBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKSxcblx0XHRcdFx0XHRcdGJJc1BhcmFtZXRlcml6ZWQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGFyYW1ldGVyUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdFx0XHRcdFx0aWYgKCFiSXNQYXJhbWV0ZXJpemVkKSB7XG5cdFx0XHRcdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2godGhpcy5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1cnJlbnQgcGFnZVxuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gb0N1cnJlbnRQYWdlLl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpO1xuXHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uID0gdGhpcy5fY29tcHV0ZVRpdGxlSW5mbyhcblx0XHRcdFx0b1BhZ2VUaXRsZUluZm9ybWF0aW9uLnRpdGxlLFxuXHRcdFx0XHRvUGFnZVRpdGxlSW5mb3JtYXRpb24uc3VidGl0bGUsXG5cdFx0XHRcdHNBcHBTcGVjaWZpY0hhc2ggKyB0aGlzLl9nZXRIYXNoKClcblx0XHRcdCk7XG5cblx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9nZXRUaXRsZUhpZXJhcmNoeUNhY2hlKClbc05ld1BhdGhdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGl0bGVIaWVyYXJjaHlDYWNoZSgpW3NBcHBTcGVjaWZpY0hhc2hdID0gb1BhZ2VUaXRsZUluZm9ybWF0aW9uO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGl0bGVJbmZvcm1hdGlvblByb21pc2VzLnB1c2goUHJvbWlzZS5yZWplY3QoXCJUaXRsZSBpbmZvcm1hdGlvbiBtaXNzaW5nIGluIEhlYWRlckluZm9cIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVRpdGxlSW5mb3JtYXRpb25Qcm9taXNlcylcblx0XHRcdC50aGVuKChhVGl0bGVJbmZvSGllcmFyY2h5OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIGZvciBzaGVsbCB3aGljaCBpcyBleHBlY3RpbmcgYWxsIGVsZW1lbnRzIGJlaW5nIG9mIHR5cGUgc3RyaW5nXG5cdFx0XHRcdGNvbnN0IGFUaXRsZUluZm9IaWVyYXJjaHlTaGVsbCA9IHRoaXMuX2Vuc3VyZUhpZXJhcmNoeUVsZW1lbnRzQXJlU3RyaW5ncyhhVGl0bGVJbmZvSGllcmFyY2h5KSxcblx0XHRcdFx0XHRzVGl0bGUgPSBvUGFnZVRpdGxlSW5mb3JtYXRpb24udGl0bGU7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEhpZXJhcmNoeShhVGl0bGVJbmZvSGllcmFyY2h5U2hlbGwucmV2ZXJzZSgpKTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0VGl0bGUoc1RpdGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmJJc0NvbXB1dGluZ1RpdGxlSGllcmFjaHkgPSBmYWxzZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHNFcnJvck1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yTWVzc2FnZSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGJhY2sgYWZ0ZXIgYSB2aWV3IGhhcyBiZWVuIGJvdW5kIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgaGFzIGJlZW4gYm91bmQgdG8gYSB2aWV3XG5cdCAqL1xuXHRvbkNvbnRleHRCb3VuZFRvVmlldyhvQ29udGV4dDogYW55KSB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRGVlcGVzdFBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpLmdldFByb3BlcnR5KFwiL2RlZXBlc3RQYXRoXCIpLFxuXHRcdFx0XHRzVmlld0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAoIXNEZWVwZXN0UGF0aCB8fCBzRGVlcGVzdFBhdGguaW5kZXhPZihzVmlld0NvbnRleHRQYXRoKSAhPT0gMCkge1xuXHRcdFx0XHQvLyBUaGVyZSB3YXMgbm8gcHJldmlvdXMgdmFsdWUgZm9yIHRoZSBkZWVwZXN0IHJlYWNoZWQgcGF0aCwgb3IgdGhlIHBhdGhcblx0XHRcdFx0Ly8gZm9yIHRoZSB2aWV3IGlzbid0IGEgc3VicGF0aCBvZiB0aGUgcHJldmlvdXMgZGVlcGVzdCBwYXRoIC0tPiB1cGRhdGVcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kZWVwZXN0UGF0aFwiLCBzVmlld0NvbnRleHRQYXRoLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0ZGlzcGxheU1lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHR1cGRhdGVVSVN0YXRlRm9yVmlldyhvVmlldzogYW55LCBGQ0xMZXZlbDogYW55KSB7XG5cdFx0Ly8gVG8gYmUgb3ZlcnJpZGVuXG5cdH1cblx0X3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCk6IHZvaWQge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG59XG5pbnRlcmZhY2UgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyIHtcblx0b25Db250YWluZXJSZWFkeT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7RUFrakJPLGdCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStC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
|