@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,899 +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/f/FlexibleColumnLayoutSemanticHelper", "sap/f/library", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/KeepAliveHelper", "sap/m/Link", "sap/m/MessageBox", "sap/m/MessagePage", "./RootContainerBaseController"], function (Log, FlexibleColumnLayoutSemanticHelper, fLibrary, ViewState, ClassSupport, KeepAliveHelper, Link, MessageBox, MessagePage, BaseController) {
|
|
6
|
-
"use strict";
|
|
7
|
-
|
|
8
|
-
var _dec, _dec2, _class, _class2, _descriptor;
|
|
9
|
-
|
|
10
|
-
var Icon = MessageBox.Icon;
|
|
11
|
-
var Action = MessageBox.Action;
|
|
12
|
-
var usingExtension = ClassSupport.usingExtension;
|
|
13
|
-
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
14
|
-
|
|
15
|
-
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 }); }
|
|
16
|
-
|
|
17
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
18
|
-
|
|
19
|
-
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
20
|
-
|
|
21
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
22
|
-
|
|
23
|
-
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; }
|
|
24
|
-
|
|
25
|
-
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.'); }
|
|
26
|
-
|
|
27
|
-
var LayoutType = fLibrary.LayoutType;
|
|
28
|
-
var CONSTANTS = {
|
|
29
|
-
page: {
|
|
30
|
-
names: ["BeginColumn", "MidColumn", "EndColumn"],
|
|
31
|
-
currentGetter: {
|
|
32
|
-
prefix: "getCurrent",
|
|
33
|
-
suffix: "Page"
|
|
34
|
-
},
|
|
35
|
-
getter: {
|
|
36
|
-
prefix: "get",
|
|
37
|
-
suffix: "Pages"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
var _getViewFromContainer = function (oContainer) {
|
|
43
|
-
if (oContainer.isA("sap.ui.core.ComponentContainer")) {
|
|
44
|
-
return oContainer.getComponentInstance().getRootControl();
|
|
45
|
-
} else {
|
|
46
|
-
return oContainer;
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
var FclController = (_dec = defineUI5Class("sap.fe.templates.RootContainer.controller.Fcl"), _dec2 = usingExtension(ViewState.override({
|
|
51
|
-
applyInitialStateOnly: function () {
|
|
52
|
-
return false;
|
|
53
|
-
},
|
|
54
|
-
adaptBindingRefreshControls: function (aControls) {
|
|
55
|
-
this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
|
|
56
|
-
var pChildView = new Promise(function (resolve) {
|
|
57
|
-
resolve(oChildView);
|
|
58
|
-
});
|
|
59
|
-
aControls.push(pChildView);
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
adaptStateControls: function (aStateControls) {
|
|
63
|
-
this.getView().getController()._getAllVisibleViews().forEach(function (oChildView) {
|
|
64
|
-
var pChildView = new Promise(function (resolve) {
|
|
65
|
-
resolve(oChildView);
|
|
66
|
-
});
|
|
67
|
-
aStateControls.push(pChildView);
|
|
68
|
-
});
|
|
69
|
-
},
|
|
70
|
-
onRestore: function () {
|
|
71
|
-
var oView = this.getView(),
|
|
72
|
-
oNavContainer = oView.byId("appContent");
|
|
73
|
-
var oFCLController = this.getView().getController();
|
|
74
|
-
var oInternalModel = oNavContainer.getModel("internal");
|
|
75
|
-
var oPages = oInternalModel.getProperty("/pages");
|
|
76
|
-
|
|
77
|
-
for (var sComponentId in oPages) {
|
|
78
|
-
oInternalModel.setProperty("/pages/".concat(sComponentId, "/restoreStatus"), "pending");
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
oFCLController.onContainerReady();
|
|
82
|
-
},
|
|
83
|
-
onSuspend: function () {
|
|
84
|
-
var oFCLController = this.getView().getController();
|
|
85
|
-
var oFCLControl = oFCLController.getFclControl();
|
|
86
|
-
var aBeginColumnPages = oFCLControl.getBeginColumnPages() || [];
|
|
87
|
-
var aMidColumnPages = oFCLControl.getMidColumnPages() || [];
|
|
88
|
-
var aEndColumnPages = oFCLControl.getEndColumnPages() || [];
|
|
89
|
-
var aPages = [].concat(aBeginColumnPages, aMidColumnPages, aEndColumnPages);
|
|
90
|
-
aPages.forEach(function (oPage) {
|
|
91
|
-
var oTargetView = _getViewFromContainer(oPage);
|
|
92
|
-
|
|
93
|
-
var oController = oTargetView && oTargetView.getController();
|
|
94
|
-
|
|
95
|
-
if (oController && oController.viewState && oController.viewState.onSuspend) {
|
|
96
|
-
return oController.viewState.onSuspend();
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
})), _dec(_class = (_class2 = /*#__PURE__*/function (_BaseController) {
|
|
101
|
-
_inheritsLoose(FclController, _BaseController);
|
|
102
|
-
|
|
103
|
-
function FclController() {
|
|
104
|
-
var _this;
|
|
105
|
-
|
|
106
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
107
|
-
args[_key] = arguments[_key];
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
_this = _BaseController.call.apply(_BaseController, [this].concat(args)) || this;
|
|
111
|
-
|
|
112
|
-
_initializerDefineProperty(_this, "viewState", _descriptor, _assertThisInitialized(_this));
|
|
113
|
-
|
|
114
|
-
return _this;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
var _proto = FclController.prototype;
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* @private
|
|
121
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.getMetadata
|
|
122
|
-
* @function
|
|
123
|
-
*/
|
|
124
|
-
_proto.onInit = function onInit() {
|
|
125
|
-
_BaseController.prototype.onInit.call(this);
|
|
126
|
-
|
|
127
|
-
this._internalInit();
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
_proto.attachRouteMatchers = function attachRouteMatchers() {
|
|
131
|
-
this.getRouter().attachBeforeRouteMatched(this._getViewForNavigatedRowsComputation, this);
|
|
132
|
-
|
|
133
|
-
_BaseController.prototype.attachRouteMatchers.call(this);
|
|
134
|
-
|
|
135
|
-
this._internalInit();
|
|
136
|
-
|
|
137
|
-
this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
|
|
138
|
-
this.getRouter().attachRouteMatched(this.onRouteMatched, this);
|
|
139
|
-
this.getFclControl().attachStateChange(this._saveLayout, this);
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
_proto._internalInit = function _internalInit() {
|
|
143
|
-
if (this._oRouterProxy) {
|
|
144
|
-
return; // Already initialized
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
this.sCurrentRouteName = "";
|
|
148
|
-
this.sCurrentArguments = {};
|
|
149
|
-
this.SQUERYKEYNAME = "?query";
|
|
150
|
-
var oAppComponent = this.getAppComponent();
|
|
151
|
-
this._oRouterProxy = oAppComponent.getRouterProxy(); // Get FCL configuration in the manifest
|
|
152
|
-
|
|
153
|
-
this._oFCLConfig = {
|
|
154
|
-
maxColumnsCount: 3
|
|
155
|
-
};
|
|
156
|
-
var oRoutingConfig = oAppComponent.getManifest()["sap.ui5"].routing;
|
|
157
|
-
|
|
158
|
-
if (oRoutingConfig && oRoutingConfig.config) {
|
|
159
|
-
if (oRoutingConfig.config.flexibleColumnLayout) {
|
|
160
|
-
var oFCLManifestConfig = oRoutingConfig.config.flexibleColumnLayout; // Default layout for 2 columns
|
|
161
|
-
|
|
162
|
-
if (oFCLManifestConfig.defaultTwoColumnLayoutType) {
|
|
163
|
-
this._oFCLConfig.defaultTwoColumnLayoutType = oFCLManifestConfig.defaultTwoColumnLayoutType;
|
|
164
|
-
} // Default layout for 3 columns
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (oFCLManifestConfig.defaultThreeColumnLayoutType) {
|
|
168
|
-
this._oFCLConfig.defaultThreeColumnLayoutType = oFCLManifestConfig.defaultThreeColumnLayoutType;
|
|
169
|
-
} // Limit FCL to 2 columns ?
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (oFCLManifestConfig.limitFCLToTwoColumns === true) {
|
|
173
|
-
this._oFCLConfig.maxColumnsCount = 2;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (oRoutingConfig.config.controlAggregation) {
|
|
178
|
-
this._oFCLConfig.defaultControlAggregation = oRoutingConfig.config.controlAggregation;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
this._initializeTargetAggregation(oAppComponent);
|
|
183
|
-
|
|
184
|
-
this._initializeRoutesInformation(oAppComponent);
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
_proto.getFclControl = function getFclControl() {
|
|
188
|
-
return this.getView().getContent()[0];
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
_proto._saveLayout = function _saveLayout(oEvent) {
|
|
192
|
-
this.sPreviousLayout = oEvent.getParameters().layout;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Get the additionnal view (on top of the visible views), to be able to compute the latest table navigated rows of the most right visible view after a nav back or column fullscreen.
|
|
196
|
-
*
|
|
197
|
-
* @function
|
|
198
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_getRightMostViewBeforeRouteMatched
|
|
199
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
200
|
-
*/
|
|
201
|
-
;
|
|
202
|
-
|
|
203
|
-
_proto._getViewForNavigatedRowsComputation = function _getViewForNavigatedRowsComputation() {
|
|
204
|
-
var _this2 = this;
|
|
205
|
-
|
|
206
|
-
var aAllVisibleViewsBeforeRouteMatched = this._getAllVisibleViews(this.sPreviousLayout);
|
|
207
|
-
|
|
208
|
-
var oRightMostViewBeforeRouteMatched = aAllVisibleViewsBeforeRouteMatched[aAllVisibleViewsBeforeRouteMatched.length - 1];
|
|
209
|
-
var oRightMostView;
|
|
210
|
-
this.getRouter().attachEventOnce("routeMatched", function (oEvent) {
|
|
211
|
-
oRightMostView = _getViewFromContainer(oEvent.getParameter("views")[oEvent.getParameter("views").length - 1]);
|
|
212
|
-
|
|
213
|
-
if (oRightMostViewBeforeRouteMatched) {
|
|
214
|
-
// Navigation forward from L2 to view level L3 (FullScreenLayout):
|
|
215
|
-
if (oRightMostView.getViewData() && oRightMostView.getViewData().viewLevel === _this2._oFCLConfig.maxColumnsCount) {
|
|
216
|
-
_this2.oAdditionalViewForNavRowsComputation = oRightMostView;
|
|
217
|
-
} // Navigations backward from L3 down to L2, L1, L0 (ThreeColumn layout):
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (oRightMostView.getViewData() && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel < _this2._oFCLConfig.maxColumnsCount && oRightMostViewBeforeRouteMatched.getViewData() && oRightMostViewBeforeRouteMatched.getViewData().viewLevel > oRightMostView.getViewData().viewLevel && oRightMostView !== oRightMostViewBeforeRouteMatched) {
|
|
221
|
-
_this2.oAdditionalViewForNavRowsComputation = oRightMostViewBeforeRouteMatched;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
_proto.getViewForNavigatedRowsComputation = function getViewForNavigatedRowsComputation() {
|
|
228
|
-
return this.oAdditionalViewForNavRowsComputation;
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
_proto.onExit = function onExit() {
|
|
232
|
-
this.getRouter().detachRouteMatched(this.onRouteMatched, this);
|
|
233
|
-
this.getRouter().detachBeforeRouteMatched(this.onBeforeRouteMatched, this);
|
|
234
|
-
this.getFclControl().detachStateChange(this.onStateChanged, this);
|
|
235
|
-
this.getFclControl().detachAfterEndColumnNavigate(this.onStateChanged, this);
|
|
236
|
-
this._oTargetsAggregation = null;
|
|
237
|
-
this._oTargetsFromRoutePattern = null;
|
|
238
|
-
BaseController.prototype.onExit.bind(this)();
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Check if the FCL component is enabled.
|
|
242
|
-
*
|
|
243
|
-
* @function
|
|
244
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#isFclEnabled
|
|
245
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
246
|
-
* @returns `true` since we are in FCL scenario
|
|
247
|
-
* @ui5-restricted
|
|
248
|
-
* @final
|
|
249
|
-
*/
|
|
250
|
-
;
|
|
251
|
-
|
|
252
|
-
_proto.isFclEnabled = function isFclEnabled() {
|
|
253
|
-
return true;
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
_proto.displayMessagePage = function displayMessagePage(sErrorMessage, mParameters) {
|
|
257
|
-
var oFCLControl = this.getFclControl();
|
|
258
|
-
|
|
259
|
-
if (this._oFCLConfig && mParameters.FCLLevel >= this._oFCLConfig.maxColumnsCount) {
|
|
260
|
-
mParameters.FCLLevel = this._oFCLConfig.maxColumnsCount - 1;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (!this.aMessagePages) {
|
|
264
|
-
this.aMessagePages = [null, null, null];
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
var oMessagePage = this.aMessagePages[mParameters.FCLLevel];
|
|
268
|
-
|
|
269
|
-
if (!oMessagePage) {
|
|
270
|
-
oMessagePage = new MessagePage({
|
|
271
|
-
showHeader: false,
|
|
272
|
-
icon: "sap-icon://message-error"
|
|
273
|
-
});
|
|
274
|
-
this.aMessagePages[mParameters.FCLLevel] = oMessagePage;
|
|
275
|
-
|
|
276
|
-
switch (mParameters.FCLLevel) {
|
|
277
|
-
case 0:
|
|
278
|
-
oFCLControl.addBeginColumnPage(oMessagePage);
|
|
279
|
-
break;
|
|
280
|
-
|
|
281
|
-
case 1:
|
|
282
|
-
oFCLControl.addMidColumnPage(oMessagePage);
|
|
283
|
-
break;
|
|
284
|
-
|
|
285
|
-
default:
|
|
286
|
-
oFCLControl.addEndColumnPage(oMessagePage);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
oMessagePage.setText(sErrorMessage);
|
|
291
|
-
|
|
292
|
-
if (mParameters.technicalMessage) {
|
|
293
|
-
oMessagePage.setCustomDescription(new Link({
|
|
294
|
-
text: mParameters.description || mParameters.technicalMessage,
|
|
295
|
-
press: function () {
|
|
296
|
-
MessageBox.show(mParameters.technicalMessage, {
|
|
297
|
-
icon: Icon.ERROR,
|
|
298
|
-
title: mParameters.title,
|
|
299
|
-
actions: [Action.OK],
|
|
300
|
-
defaultAction: Action.OK,
|
|
301
|
-
details: mParameters.technicalDetails || "",
|
|
302
|
-
contentWidth: "60%"
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
}));
|
|
306
|
-
} else {
|
|
307
|
-
oMessagePage.setDescription(mParameters.description || "");
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
oFCLControl.to(oMessagePage.getId());
|
|
311
|
-
return Promise.resolve(true);
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Initialize the object _oTargetsAggregation that defines for each route the relevant aggregation and pattern.
|
|
315
|
-
*
|
|
316
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeTargetAggregation
|
|
317
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
318
|
-
* @function
|
|
319
|
-
* @param [oAppComponent] Reference to the AppComponent
|
|
320
|
-
*/
|
|
321
|
-
;
|
|
322
|
-
|
|
323
|
-
_proto._initializeTargetAggregation = function _initializeTargetAggregation(oAppComponent) {
|
|
324
|
-
var _this3 = this;
|
|
325
|
-
|
|
326
|
-
var oManifest = oAppComponent.getManifest(),
|
|
327
|
-
oTargets = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.targets : null;
|
|
328
|
-
this._oTargetsAggregation = {};
|
|
329
|
-
|
|
330
|
-
if (oTargets) {
|
|
331
|
-
Object.keys(oTargets).forEach(function (sTargetName) {
|
|
332
|
-
var oTarget = oTargets[sTargetName];
|
|
333
|
-
|
|
334
|
-
if (oTarget.controlAggregation) {
|
|
335
|
-
_this3._oTargetsAggregation[sTargetName] = {
|
|
336
|
-
aggregation: oTarget.controlAggregation,
|
|
337
|
-
pattern: oTarget.contextPattern
|
|
338
|
-
};
|
|
339
|
-
} else {
|
|
340
|
-
_this3._oTargetsAggregation[sTargetName] = {
|
|
341
|
-
aggregation: "page",
|
|
342
|
-
pattern: null
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Initializes the mapping between a route (identifed as its pattern) and the corresponding targets
|
|
350
|
-
*
|
|
351
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_initializeRoutesInformation
|
|
352
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
353
|
-
* @function
|
|
354
|
-
* @param oAppComponent ref to the AppComponent
|
|
355
|
-
*/
|
|
356
|
-
;
|
|
357
|
-
|
|
358
|
-
_proto._initializeRoutesInformation = function _initializeRoutesInformation(oAppComponent) {
|
|
359
|
-
var _this4 = this;
|
|
360
|
-
|
|
361
|
-
var oManifest = oAppComponent.getManifest(),
|
|
362
|
-
aRoutes = oManifest["sap.ui5"].routing ? oManifest["sap.ui5"].routing.routes : null;
|
|
363
|
-
this._oTargetsFromRoutePattern = {};
|
|
364
|
-
|
|
365
|
-
if (aRoutes) {
|
|
366
|
-
aRoutes.forEach(function (route) {
|
|
367
|
-
_this4._oTargetsFromRoutePattern[route.pattern] = route.target;
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
};
|
|
371
|
-
|
|
372
|
-
_proto.getCurrentArgument = function getCurrentArgument() {
|
|
373
|
-
return this.sCurrentArguments;
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
_proto.getCurrentRouteName = function getCurrentRouteName() {
|
|
377
|
-
return this.sCurrentRouteName;
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Get FE FCL constant.
|
|
381
|
-
*
|
|
382
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
383
|
-
* @returns The constants
|
|
384
|
-
*/
|
|
385
|
-
;
|
|
386
|
-
|
|
387
|
-
_proto.getConstants = function getConstants() {
|
|
388
|
-
return CONSTANTS;
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Getter for oTargetsAggregation array.
|
|
392
|
-
*
|
|
393
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#getTargetAggregation
|
|
394
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
395
|
-
* @function
|
|
396
|
-
* @returns The _oTargetsAggregation array
|
|
397
|
-
* @ui5-restricted
|
|
398
|
-
*/
|
|
399
|
-
;
|
|
400
|
-
|
|
401
|
-
_proto.getTargetAggregation = function getTargetAggregation() {
|
|
402
|
-
return this._oTargetsAggregation;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Function triggered by the router RouteMatched event.
|
|
406
|
-
*
|
|
407
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onRouteMatched
|
|
408
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
409
|
-
* @param oEvent
|
|
410
|
-
*/
|
|
411
|
-
;
|
|
412
|
-
|
|
413
|
-
_proto.onRouteMatched = function onRouteMatched(oEvent) {
|
|
414
|
-
var sRouteName = oEvent.getParameter("name"); // Save the current/previous routes and arguments
|
|
415
|
-
|
|
416
|
-
this.sCurrentRouteName = sRouteName;
|
|
417
|
-
this.sCurrentArguments = oEvent.getParameter("arguments");
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* This function is triggering the table scroll to the navigated row after each layout change.
|
|
421
|
-
*
|
|
422
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#scrollToLastSelectedItem
|
|
423
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
424
|
-
*/
|
|
425
|
-
;
|
|
426
|
-
|
|
427
|
-
_proto._scrollTablesToLastNavigatedItems = function _scrollTablesToLastNavigatedItems() {
|
|
428
|
-
var aViews = this._getAllVisibleViews(); //The scrolls are triggered only if the layout is with several columns or when switching the mostRight column in full screen
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
if (aViews.length > 1 || aViews[0].getViewData().viewLevel < this._oFCLConfig.maxColumnsCount) {
|
|
432
|
-
var sCurrentViewPath;
|
|
433
|
-
var oAdditionalView = this.getViewForNavigatedRowsComputation();
|
|
434
|
-
|
|
435
|
-
if (oAdditionalView && aViews.indexOf(oAdditionalView) === -1) {
|
|
436
|
-
aViews.push(oAdditionalView);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
for (var index = aViews.length - 1; index > 0; index--) {
|
|
440
|
-
var oView = aViews[index],
|
|
441
|
-
oPreviousView = aViews[index - 1];
|
|
442
|
-
|
|
443
|
-
if (oView.getBindingContext()) {
|
|
444
|
-
sCurrentViewPath = oView.getBindingContext().getPath();
|
|
445
|
-
|
|
446
|
-
oPreviousView.getController()._scrollTablesToRow(sCurrentViewPath);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* Function triggered by the FCL StateChanged event.
|
|
453
|
-
*
|
|
454
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onStateChanged
|
|
455
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
456
|
-
* @param oEvent
|
|
457
|
-
*/
|
|
458
|
-
;
|
|
459
|
-
|
|
460
|
-
_proto.onStateChanged = function onStateChanged(oEvent) {
|
|
461
|
-
var bIsNavigationArrow = oEvent.getParameter("isNavigationArrow");
|
|
462
|
-
|
|
463
|
-
if (this.sCurrentArguments !== undefined) {
|
|
464
|
-
if (!this.sCurrentArguments[this.SQUERYKEYNAME]) {
|
|
465
|
-
this.sCurrentArguments[this.SQUERYKEYNAME] = {};
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
this.sCurrentArguments[this.SQUERYKEYNAME].layout = oEvent.getParameter("layout");
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
this._forceModelContextChangeOnBreadCrumbs(oEvent); // Replace the URL with the new layout if a navigation arrow was used
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
if (bIsNavigationArrow) {
|
|
475
|
-
this._oRouterProxy.navTo(this.sCurrentRouteName, this.sCurrentArguments);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Function to fire ModelContextChange event on all breadcrumbs ( on each ObjectPages).
|
|
480
|
-
*
|
|
481
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#_forceModelContextChangeOnBreadCrumbs
|
|
482
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
483
|
-
* @param oEvent
|
|
484
|
-
*/
|
|
485
|
-
;
|
|
486
|
-
|
|
487
|
-
_proto._forceModelContextChangeOnBreadCrumbs = function _forceModelContextChangeOnBreadCrumbs(oEvent) {
|
|
488
|
-
//force modelcontextchange on ObjectPages to refresh the breadcrumbs link hrefs
|
|
489
|
-
var oFcl = oEvent.getSource();
|
|
490
|
-
var oPages = [];
|
|
491
|
-
oPages = oPages.concat(oFcl.getBeginColumnPages()).concat(oFcl.getMidColumnPages()).concat(oFcl.getEndColumnPages());
|
|
492
|
-
oPages.forEach(function (oPage) {
|
|
493
|
-
var oView = _getViewFromContainer(oPage);
|
|
494
|
-
|
|
495
|
-
var oBreadCrumbs = oView.byId && oView.byId("breadcrumbs");
|
|
496
|
-
|
|
497
|
-
if (oBreadCrumbs) {
|
|
498
|
-
oBreadCrumbs.fireModelContextChange();
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* Function triggered to update the Share button Visibility.
|
|
504
|
-
*
|
|
505
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
506
|
-
* @param viewColumn Name of the current column ("beginColumn", "midColumn", "endColumn")
|
|
507
|
-
* @param sLayout The current layout used by the FCL
|
|
508
|
-
* @returns The share button visibility
|
|
509
|
-
*/
|
|
510
|
-
;
|
|
511
|
-
|
|
512
|
-
_proto._updateShareButtonVisibility = function _updateShareButtonVisibility(viewColumn, sLayout) {
|
|
513
|
-
var bShowShareIcon;
|
|
514
|
-
|
|
515
|
-
switch (sLayout) {
|
|
516
|
-
case "OneColumn":
|
|
517
|
-
bShowShareIcon = viewColumn === "beginColumn";
|
|
518
|
-
break;
|
|
519
|
-
|
|
520
|
-
case "MidColumnFullScreen":
|
|
521
|
-
case "ThreeColumnsBeginExpandedEndHidden":
|
|
522
|
-
case "ThreeColumnsMidExpandedEndHidden":
|
|
523
|
-
case "TwoColumnsBeginExpanded":
|
|
524
|
-
case "TwoColumnsMidExpanded":
|
|
525
|
-
bShowShareIcon = viewColumn === "midColumn";
|
|
526
|
-
break;
|
|
527
|
-
|
|
528
|
-
case "EndColumnFullScreen":
|
|
529
|
-
case "ThreeColumnsEndExpanded":
|
|
530
|
-
case "ThreeColumnsMidExpanded":
|
|
531
|
-
bShowShareIcon = viewColumn === "endColumn";
|
|
532
|
-
break;
|
|
533
|
-
|
|
534
|
-
default:
|
|
535
|
-
bShowShareIcon = false;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
return bShowShareIcon;
|
|
539
|
-
};
|
|
540
|
-
|
|
541
|
-
_proto.updateUIStateForView = function updateUIStateForView(oView, FCLLevel) {
|
|
542
|
-
var oUIState = this.getHelper().getCurrentUIState(),
|
|
543
|
-
oFclColName = ["beginColumn", "midColumn", "endColumn"],
|
|
544
|
-
sLayout = this.getFclControl().getLayout();
|
|
545
|
-
var viewColumn;
|
|
546
|
-
|
|
547
|
-
if (!oView.getModel("fclhelper")) {
|
|
548
|
-
oView.setModel(this._createHelperModel(), "fclhelper");
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
if (FCLLevel >= this._oFCLConfig.maxColumnsCount) {
|
|
552
|
-
// The view is on a level > max number of columns. It's always fullscreen without close/exit buttons
|
|
553
|
-
viewColumn = oFclColName[this._oFCLConfig.maxColumnsCount - 1];
|
|
554
|
-
oUIState.actionButtonsInfo.midColumn.fullScreen = null;
|
|
555
|
-
oUIState.actionButtonsInfo.midColumn.exitFullScreen = null;
|
|
556
|
-
oUIState.actionButtonsInfo.midColumn.closeColumn = null;
|
|
557
|
-
oUIState.actionButtonsInfo.endColumn.exitFullScreen = null;
|
|
558
|
-
oUIState.actionButtonsInfo.endColumn.fullScreen = null;
|
|
559
|
-
oUIState.actionButtonsInfo.endColumn.closeColumn = null;
|
|
560
|
-
} else {
|
|
561
|
-
viewColumn = oFclColName[FCLLevel];
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
if (FCLLevel >= this._oFCLConfig.maxColumnsCount || sLayout === "EndColumnFullScreen" || sLayout === "MidColumnFullScreen" || sLayout === "OneColumn") {
|
|
565
|
-
oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", true);
|
|
566
|
-
} else {
|
|
567
|
-
oView.getModel("fclhelper").setProperty("/breadCrumbIsVisible", false);
|
|
568
|
-
} // Unfortunately, the FCLHelper doesn't provide actionButton values for the first column
|
|
569
|
-
// so we have to add this info manually
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
oUIState.actionButtonsInfo.beginColumn = {
|
|
573
|
-
fullScreen: null,
|
|
574
|
-
exitFullScreen: null,
|
|
575
|
-
closeColumn: null
|
|
576
|
-
};
|
|
577
|
-
var oActionButtonInfos = Object.assign({}, oUIState.actionButtonsInfo[viewColumn]);
|
|
578
|
-
oActionButtonInfos.switchVisible = oActionButtonInfos.fullScreen !== null || oActionButtonInfos.exitFullScreen !== null;
|
|
579
|
-
oActionButtonInfos.switchIcon = oActionButtonInfos.fullScreen !== null ? "sap-icon://full-screen" : "sap-icon://exit-full-screen";
|
|
580
|
-
oActionButtonInfos.isFullScreen = oActionButtonInfos.fullScreen === null;
|
|
581
|
-
oView.getModel("fclhelper").setProperty("/actionButtonsInfo", oActionButtonInfos);
|
|
582
|
-
oView.getModel("fclhelper").setProperty("/showShareIcon", this._updateShareButtonVisibility(viewColumn, sLayout));
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* Function triggered by the router BeforeRouteMatched event.
|
|
586
|
-
*
|
|
587
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#onBeforeRouteMatched
|
|
588
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
589
|
-
* @param oEvent
|
|
590
|
-
*/
|
|
591
|
-
;
|
|
592
|
-
|
|
593
|
-
_proto.onBeforeRouteMatched = function onBeforeRouteMatched(oEvent) {
|
|
594
|
-
if (oEvent) {
|
|
595
|
-
var oQueryParams = oEvent.getParameters().arguments[this.SQUERYKEYNAME];
|
|
596
|
-
var sLayout = oQueryParams ? oQueryParams.layout : null; // If there is no layout parameter, query for the default level 0 layout (normally OneColumn)
|
|
597
|
-
|
|
598
|
-
if (!sLayout) {
|
|
599
|
-
var oNextUIState = this.getHelper().getNextUIState(0);
|
|
600
|
-
sLayout = oNextUIState.layout;
|
|
601
|
-
} // Check if the layout if compatible with the number of targets
|
|
602
|
-
// This should always be the case for normal navigation, just needed in case
|
|
603
|
-
// the URL has been manually modified
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
var aTargets = oEvent.getParameter("config").target;
|
|
607
|
-
sLayout = this._correctLayoutForTargets(sLayout, aTargets); // Update the layout of the FlexibleColumnLayout
|
|
608
|
-
|
|
609
|
-
if (sLayout) {
|
|
610
|
-
this.getFclControl().setLayout(sLayout);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* Helper for the FCL Component.
|
|
616
|
-
*
|
|
617
|
-
* @name sap.fe.templates.RootContainer.controller.Fcl.controller#getHelper
|
|
618
|
-
* @memberof sap.fe.templates.RootContainer.controller.Fcl.controller
|
|
619
|
-
* @returns Instance of a semantic helper
|
|
620
|
-
*/
|
|
621
|
-
;
|
|
622
|
-
|
|
623
|
-
_proto.getHelper = function getHelper() {
|
|
624
|
-
return FlexibleColumnLayoutSemanticHelper.getInstanceFor(this.getFclControl(), this._oFCLConfig);
|
|
625
|
-
}
|
|
626
|
-
/**
|
|
627
|
-
* Calculates the FCL layout for a given FCL level and a target hash.
|
|
628
|
-
*
|
|
629
|
-
* @param iNextFCLLevel FCL level to be navigated to
|
|
630
|
-
* @param sHash The hash to be navigated to
|
|
631
|
-
* @param sProposedLayout The proposed layout
|
|
632
|
-
* @param keepCurrentLayout True if we want to keep the current layout if possible
|
|
633
|
-
* @returns The calculated layout
|
|
634
|
-
*/
|
|
635
|
-
;
|
|
636
|
-
|
|
637
|
-
_proto.calculateLayout = function calculateLayout(iNextFCLLevel, sHash, sProposedLayout, keepCurrentLayout) {
|
|
638
|
-
// First, ask the FCL helper to calculate the layout if nothing is proposed
|
|
639
|
-
if (!sProposedLayout) {
|
|
640
|
-
sProposedLayout = keepCurrentLayout ? this.getFclControl().getLayout() : this.getHelper().getNextUIState(iNextFCLLevel).layout;
|
|
641
|
-
} // Then change this value if necessary, based on the number of targets
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
var oRoute = this.getRouter().getRouteByHash("".concat(sHash, "?layout=").concat(sProposedLayout));
|
|
645
|
-
|
|
646
|
-
var aTargets = this._oTargetsFromRoutePattern[oRoute.getPattern()];
|
|
647
|
-
|
|
648
|
-
return this._correctLayoutForTargets(sProposedLayout, aTargets);
|
|
649
|
-
}
|
|
650
|
-
/**
|
|
651
|
-
* Checks whether a given FCL layout is compatible with an array of targets.
|
|
652
|
-
*
|
|
653
|
-
* @param sProposedLayout Proposed value for the FCL layout
|
|
654
|
-
* @param aTargets Array of target names used for checking
|
|
655
|
-
* @returns The corrected layout
|
|
656
|
-
*/
|
|
657
|
-
;
|
|
658
|
-
|
|
659
|
-
_proto._correctLayoutForTargets = function _correctLayoutForTargets(sProposedLayout, aTargets) {
|
|
660
|
-
var allAllowedLayouts = {
|
|
661
|
-
"2": ["TwoColumnsMidExpanded", "TwoColumnsBeginExpanded", "MidColumnFullScreen"],
|
|
662
|
-
"3": ["ThreeColumnsMidExpanded", "ThreeColumnsEndExpanded", "ThreeColumnsMidExpandedEndHidden", "ThreeColumnsBeginExpandedEndHidden", "MidColumnFullScreen", "EndColumnFullScreen"]
|
|
663
|
-
};
|
|
664
|
-
|
|
665
|
-
if (aTargets && !Array.isArray(aTargets)) {
|
|
666
|
-
// To support single target as a string in the manifest
|
|
667
|
-
aTargets = [aTargets];
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
if (!aTargets) {
|
|
671
|
-
// Defensive, just in case...
|
|
672
|
-
return sProposedLayout;
|
|
673
|
-
} else if (aTargets.length > 1) {
|
|
674
|
-
// More than 1 target: just simply check from the allowed values
|
|
675
|
-
var aLayouts = allAllowedLayouts[aTargets.length];
|
|
676
|
-
|
|
677
|
-
if (aLayouts.indexOf(sProposedLayout) < 0) {
|
|
678
|
-
// The proposed layout isn't compatible with the number of columns
|
|
679
|
-
// --> Ask the helper for the default layout for the number of columns
|
|
680
|
-
sProposedLayout = aLayouts[0]; //this.getHelper().getNextUIState(aTargets.length - 1).layout;
|
|
681
|
-
}
|
|
682
|
-
} else {
|
|
683
|
-
// Only one target
|
|
684
|
-
var sTargetAggregation = this.getTargetAggregation()[aTargets[0]].aggregation || this._oFCLConfig.defaultControlAggregation;
|
|
685
|
-
|
|
686
|
-
switch (sTargetAggregation) {
|
|
687
|
-
case "beginColumnPages":
|
|
688
|
-
sProposedLayout = "OneColumn";
|
|
689
|
-
break;
|
|
690
|
-
|
|
691
|
-
case "midColumnPages":
|
|
692
|
-
sProposedLayout = "MidColumnFullScreen";
|
|
693
|
-
break;
|
|
694
|
-
|
|
695
|
-
case "endColumnPages":
|
|
696
|
-
sProposedLayout = "EndColumnFullScreen";
|
|
697
|
-
break;
|
|
698
|
-
// no default
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
return sProposedLayout;
|
|
703
|
-
}
|
|
704
|
-
/**
|
|
705
|
-
* get all visible views in the FCL component.
|
|
706
|
-
* sLayout optional parameter is very specific as part of the calculation of the latest navigated row
|
|
707
|
-
*
|
|
708
|
-
* @param {*} sLayout Layout that was applied just before the current navigation
|
|
709
|
-
* @returns {Array} return views
|
|
710
|
-
*/
|
|
711
|
-
;
|
|
712
|
-
|
|
713
|
-
_proto._getAllVisibleViews = function _getAllVisibleViews(sLayout) {
|
|
714
|
-
var aViews = [];
|
|
715
|
-
sLayout = sLayout ? sLayout : this.getFclControl().getLayout();
|
|
716
|
-
|
|
717
|
-
switch (sLayout) {
|
|
718
|
-
case LayoutType.EndColumnFullScreen:
|
|
719
|
-
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
720
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
break;
|
|
724
|
-
|
|
725
|
-
case LayoutType.MidColumnFullScreen:
|
|
726
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
727
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
break;
|
|
731
|
-
|
|
732
|
-
case LayoutType.OneColumn:
|
|
733
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
734
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
break;
|
|
738
|
-
|
|
739
|
-
case LayoutType.ThreeColumnsEndExpanded:
|
|
740
|
-
case LayoutType.ThreeColumnsMidExpanded:
|
|
741
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
742
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
746
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
750
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
break;
|
|
754
|
-
|
|
755
|
-
case LayoutType.TwoColumnsBeginExpanded:
|
|
756
|
-
case LayoutType.TwoColumnsMidExpanded:
|
|
757
|
-
case LayoutType.ThreeColumnsMidExpandedEndHidden:
|
|
758
|
-
case LayoutType.ThreeColumnsBeginExpandedEndHidden:
|
|
759
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
760
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
764
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
break;
|
|
768
|
-
|
|
769
|
-
default:
|
|
770
|
-
Log.error("Unhandled switch case for ".concat(this.getFclControl().getLayout()));
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
return aViews;
|
|
774
|
-
};
|
|
775
|
-
|
|
776
|
-
_proto._getAllViews = function _getAllViews(sLayout) {
|
|
777
|
-
var aViews = [];
|
|
778
|
-
sLayout = sLayout ? sLayout : this.getFclControl().getLayout();
|
|
779
|
-
|
|
780
|
-
switch (sLayout) {
|
|
781
|
-
case LayoutType.OneColumn:
|
|
782
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
783
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
break;
|
|
787
|
-
|
|
788
|
-
case LayoutType.ThreeColumnsEndExpanded:
|
|
789
|
-
case LayoutType.ThreeColumnsMidExpanded:
|
|
790
|
-
case LayoutType.ThreeColumnsMidExpandedEndHidden:
|
|
791
|
-
case LayoutType.ThreeColumnsBeginExpandedEndHidden:
|
|
792
|
-
case LayoutType.EndColumnFullScreen:
|
|
793
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
794
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
798
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
802
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
break;
|
|
806
|
-
|
|
807
|
-
case LayoutType.TwoColumnsBeginExpanded:
|
|
808
|
-
case LayoutType.TwoColumnsMidExpanded:
|
|
809
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
810
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
814
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
break;
|
|
818
|
-
|
|
819
|
-
case LayoutType.MidColumnFullScreen:
|
|
820
|
-
// In this case we need to determine if this mid column fullscreen comes from a 2 or a 3 column layout
|
|
821
|
-
var sLayoutWhenExitFullScreen = this.getHelper().getCurrentUIState().actionButtonsInfo.midColumn.exitFullScreen;
|
|
822
|
-
|
|
823
|
-
if (this.getFclControl().getCurrentBeginColumnPage()) {
|
|
824
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentBeginColumnPage()));
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
if (this.getFclControl().getCurrentMidColumnPage()) {
|
|
828
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentMidColumnPage()));
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
if (sLayoutWhenExitFullScreen.indexOf("ThreeColumn") >= 0) {
|
|
832
|
-
// We come from a 3 column layout
|
|
833
|
-
if (this.getFclControl().getCurrentEndColumnPage()) {
|
|
834
|
-
aViews.push(_getViewFromContainer(this.getFclControl().getCurrentEndColumnPage()));
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
break;
|
|
839
|
-
|
|
840
|
-
default:
|
|
841
|
-
Log.error("Unhandled switch case for ".concat(this.getFclControl().getLayout()));
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
return aViews;
|
|
845
|
-
};
|
|
846
|
-
|
|
847
|
-
_proto.onContainerReady = function onContainerReady() {
|
|
848
|
-
// Restore views if neccessary.
|
|
849
|
-
var aViews = this._getAllVisibleViews();
|
|
850
|
-
|
|
851
|
-
var aRestorePromises = aViews.reduce(function (aPromises, oTargetView) {
|
|
852
|
-
aPromises.push(KeepAliveHelper.restoreView(oTargetView));
|
|
853
|
-
return aPromises;
|
|
854
|
-
}, []);
|
|
855
|
-
return Promise.all(aRestorePromises);
|
|
856
|
-
};
|
|
857
|
-
|
|
858
|
-
_proto.getRightmostContext = function getRightmostContext() {
|
|
859
|
-
var oView = this.getRightmostView();
|
|
860
|
-
return oView && oView.getBindingContext();
|
|
861
|
-
};
|
|
862
|
-
|
|
863
|
-
_proto.getRightmostView = function getRightmostView() {
|
|
864
|
-
return this._getAllViews().pop();
|
|
865
|
-
};
|
|
866
|
-
|
|
867
|
-
_proto.isContextUsedInPages = function isContextUsedInPages(oContext) {
|
|
868
|
-
if (!this.getFclControl()) {
|
|
869
|
-
return false;
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
var aAllVisibleViews = this._getAllViews();
|
|
873
|
-
|
|
874
|
-
for (var i = 0; i < aAllVisibleViews.length; i++) {
|
|
875
|
-
var oView = aAllVisibleViews[i];
|
|
876
|
-
|
|
877
|
-
if (!oView) {
|
|
878
|
-
// A view has been destroyed --> app is currently being destroyed
|
|
879
|
-
return false;
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
if (oView.getBindingContext() === oContext) {
|
|
883
|
-
return true;
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
return false;
|
|
888
|
-
};
|
|
889
|
-
|
|
890
|
-
return FclController;
|
|
891
|
-
}(BaseController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec2], {
|
|
892
|
-
configurable: true,
|
|
893
|
-
enumerable: true,
|
|
894
|
-
writable: true,
|
|
895
|
-
initializer: null
|
|
896
|
-
})), _class2)) || _class);
|
|
897
|
-
return FclController;
|
|
898
|
-
}, false);
|
|
899
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMYXlvdXRUeXBlIiwiZkxpYnJhcnkiLCJDT05TVEFOVFMiLCJwYWdlIiwibmFtZXMiLCJjdXJyZW50R2V0dGVyIiwicHJlZml4Iiwic3VmZml4IiwiZ2V0dGVyIiwiX2dldFZpZXdGcm9tQ29udGFpbmVyIiwib0NvbnRhaW5lciIsImlzQSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiZ2V0Um9vdENvbnRyb2wiLCJGY2xDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlZpZXdTdGF0ZSIsIm92ZXJyaWRlIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5IiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfZ2V0QWxsVmlzaWJsZVZpZXdzIiwiZm9yRWFjaCIsIm9DaGlsZFZpZXciLCJwQ2hpbGRWaWV3IiwiUHJvbWlzZSIsInJlc29sdmUiLCJwdXNoIiwiYWRhcHRTdGF0ZUNvbnRyb2xzIiwiYVN0YXRlQ29udHJvbHMiLCJvblJlc3RvcmUiLCJvVmlldyIsIm9OYXZDb250YWluZXIiLCJieUlkIiwib0ZDTENvbnRyb2xsZXIiLCJvSW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwib1BhZ2VzIiwiZ2V0UHJvcGVydHkiLCJzQ29tcG9uZW50SWQiLCJzZXRQcm9wZXJ0eSIsIm9uQ29udGFpbmVyUmVhZHkiLCJvblN1c3BlbmQiLCJvRkNMQ29udHJvbCIsImdldEZjbENvbnRyb2wiLCJhQmVnaW5Db2x1bW5QYWdlcyIsImdldEJlZ2luQ29sdW1uUGFnZXMiLCJhTWlkQ29sdW1uUGFnZXMiLCJnZXRNaWRDb2x1bW5QYWdlcyIsImFFbmRDb2x1bW5QYWdlcyIsImdldEVuZENvbHVtblBhZ2VzIiwiYVBhZ2VzIiwiY29uY2F0Iiwib1BhZ2UiLCJvVGFyZ2V0VmlldyIsIm9Db250cm9sbGVyIiwidmlld1N0YXRlIiwib25Jbml0IiwiX2ludGVybmFsSW5pdCIsImF0dGFjaFJvdXRlTWF0Y2hlcnMiLCJnZXRSb3V0ZXIiLCJhdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQiLCJfZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiIsIm9uQmVmb3JlUm91dGVNYXRjaGVkIiwiYXR0YWNoUm91dGVNYXRjaGVkIiwib25Sb3V0ZU1hdGNoZWQiLCJhdHRhY2hTdGF0ZUNoYW5nZSIsIl9zYXZlTGF5b3V0IiwiX29Sb3V0ZXJQcm94eSIsInNDdXJyZW50Um91dGVOYW1lIiwic0N1cnJlbnRBcmd1bWVudHMiLCJTUVVFUllLRVlOQU1FIiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiX29GQ0xDb25maWciLCJtYXhDb2x1bW5zQ291bnQiLCJvUm91dGluZ0NvbmZpZyIsImdldE1hbmlmZXN0Iiwicm91dGluZyIsImNvbmZpZyIsImZsZXhpYmxlQ29sdW1uTGF5b3V0Iiwib0ZDTE1hbmlmZXN0Q29uZmlnIiwiZGVmYXVsdFR3b0NvbHVtbkxheW91dFR5cGUiLCJkZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlIiwibGltaXRGQ0xUb1R3b0NvbHVtbnMiLCJjb250cm9sQWdncmVnYXRpb24iLCJkZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uIiwiX2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvbiIsIl9pbml0aWFsaXplUm91dGVzSW5mb3JtYXRpb24iLCJnZXRDb250ZW50Iiwib0V2ZW50Iiwic1ByZXZpb3VzTGF5b3V0IiwiZ2V0UGFyYW1ldGVycyIsImxheW91dCIsImFBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQiLCJvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZCIsImxlbmd0aCIsIm9SaWdodE1vc3RWaWV3IiwiYXR0YWNoRXZlbnRPbmNlIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJvQWRkaXRpb25hbFZpZXdGb3JOYXZSb3dzQ29tcHV0YXRpb24iLCJnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uIiwib25FeGl0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiZGV0YWNoQmVmb3JlUm91dGVNYXRjaGVkIiwiZGV0YWNoU3RhdGVDaGFuZ2UiLCJvblN0YXRlQ2hhbmdlZCIsImRldGFjaEFmdGVyRW5kQ29sdW1uTmF2aWdhdGUiLCJfb1RhcmdldHNBZ2dyZWdhdGlvbiIsIl9vVGFyZ2V0c0Zyb21Sb3V0ZVBhdHRlcm4iLCJCYXNlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImJpbmQiLCJpc0ZjbEVuYWJsZWQiLCJkaXNwbGF5TWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJGQ0xMZXZlbCIsImFNZXNzYWdlUGFnZXMiLCJvTWVzc2FnZVBhZ2UiLCJNZXNzYWdlUGFnZSIsInNob3dIZWFkZXIiLCJpY29uIiwiYWRkQmVnaW5Db2x1bW5QYWdlIiwiYWRkTWlkQ29sdW1uUGFnZSIsImFkZEVuZENvbHVtblBhZ2UiLCJzZXRUZXh0IiwidGVjaG5pY2FsTWVzc2FnZSIsInNldEN1c3RvbURlc2NyaXB0aW9uIiwiTGluayIsInRleHQiLCJkZXNjcmlwdGlvbiIsInByZXNzIiwiTWVzc2FnZUJveCIsInNob3ciLCJJY29uIiwiRVJST1IiLCJ0aXRsZSIsImFjdGlvbnMiLCJBY3Rpb24iLCJPSyIsImRlZmF1bHRBY3Rpb24iLCJkZXRhaWxzIiwidGVjaG5pY2FsRGV0YWlscyIsImNvbnRlbnRXaWR0aCIsInNldERlc2NyaXB0aW9uIiwidG8iLCJnZXRJZCIsIm9NYW5pZmVzdCIsIm9UYXJnZXRzIiwidGFyZ2V0cyIsIk9iamVjdCIsImtleXMiLCJzVGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJhZ2dyZWdhdGlvbiIsInBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsImFSb3V0ZXMiLCJyb3V0ZXMiLCJyb3V0ZSIsInRhcmdldCIsImdldEN1cnJlbnRBcmd1bWVudCIsImdldEN1cnJlbnRSb3V0ZU5hbWUiLCJnZXRDb25zdGFudHMiLCJnZXRUYXJnZXRBZ2dyZWdhdGlvbiIsInNSb3V0ZU5hbWUiLCJfc2Nyb2xsVGFibGVzVG9MYXN0TmF2aWdhdGVkSXRlbXMiLCJhVmlld3MiLCJzQ3VycmVudFZpZXdQYXRoIiwib0FkZGl0aW9uYWxWaWV3IiwiaW5kZXhPZiIsImluZGV4Iiwib1ByZXZpb3VzVmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0UGF0aCIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsImJJc05hdmlnYXRpb25BcnJvdyIsInVuZGVmaW5lZCIsIl9mb3JjZU1vZGVsQ29udGV4dENoYW5nZU9uQnJlYWRDcnVtYnMiLCJuYXZUbyIsIm9GY2wiLCJnZXRTb3VyY2UiLCJvQnJlYWRDcnVtYnMiLCJmaXJlTW9kZWxDb250ZXh0Q2hhbmdlIiwiX3VwZGF0ZVNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdDb2x1bW4iLCJzTGF5b3V0IiwiYlNob3dTaGFyZUljb24iLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsIm9VSVN0YXRlIiwiZ2V0SGVscGVyIiwiZ2V0Q3VycmVudFVJU3RhdGUiLCJvRmNsQ29sTmFtZSIsImdldExheW91dCIsInNldE1vZGVsIiwiX2NyZWF0ZUhlbHBlck1vZGVsIiwiYWN0aW9uQnV0dG9uc0luZm8iLCJtaWRDb2x1bW4iLCJmdWxsU2NyZWVuIiwiZXhpdEZ1bGxTY3JlZW4iLCJjbG9zZUNvbHVtbiIsImVuZENvbHVtbiIsImJlZ2luQ29sdW1uIiwib0FjdGlvbkJ1dHRvbkluZm9zIiwiYXNzaWduIiwic3dpdGNoVmlzaWJsZSIsInN3aXRjaEljb24iLCJpc0Z1bGxTY3JlZW4iLCJvUXVlcnlQYXJhbXMiLCJhcmd1bWVudHMiLCJvTmV4dFVJU3RhdGUiLCJnZXROZXh0VUlTdGF0ZSIsImFUYXJnZXRzIiwiX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzIiwic2V0TGF5b3V0IiwiRmxleGlibGVDb2x1bW5MYXlvdXRTZW1hbnRpY0hlbHBlciIsImdldEluc3RhbmNlRm9yIiwiY2FsY3VsYXRlTGF5b3V0IiwiaU5leHRGQ0xMZXZlbCIsInNIYXNoIiwic1Byb3Bvc2VkTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJvUm91dGUiLCJnZXRSb3V0ZUJ5SGFzaCIsImdldFBhdHRlcm4iLCJhbGxBbGxvd2VkTGF5b3V0cyIsIkFycmF5IiwiaXNBcnJheSIsImFMYXlvdXRzIiwic1RhcmdldEFnZ3JlZ2F0aW9uIiwiRW5kQ29sdW1uRnVsbFNjcmVlbiIsImdldEN1cnJlbnRFbmRDb2x1bW5QYWdlIiwiTWlkQ29sdW1uRnVsbFNjcmVlbiIsImdldEN1cnJlbnRNaWRDb2x1bW5QYWdlIiwiT25lQ29sdW1uIiwiZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSIsIlRocmVlQ29sdW1uc0VuZEV4cGFuZGVkIiwiVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQiLCJUd29Db2x1bW5zQmVnaW5FeHBhbmRlZCIsIlR3b0NvbHVtbnNNaWRFeHBhbmRlZCIsIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuIiwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlbiIsIkxvZyIsImVycm9yIiwiX2dldEFsbFZpZXdzIiwic0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiIsImFSZXN0b3JlUHJvbWlzZXMiLCJyZWR1Y2UiLCJhUHJvbWlzZXMiLCJLZWVwQWxpdmVIZWxwZXIiLCJyZXN0b3JlVmlldyIsImFsbCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJnZXRSaWdodG1vc3RWaWV3IiwicG9wIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJvQ29udGV4dCIsImFBbGxWaXNpYmxlVmlld3MiLCJpIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJGY2wuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEZsZXhpYmxlQ29sdW1uTGF5b3V0IGZyb20gXCJzYXAvZi9GbGV4aWJsZUNvbHVtbkxheW91dFwiO1xuaW1wb3J0IEZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXIgZnJvbSBcInNhcC9mL0ZsZXhpYmxlQ29sdW1uTGF5b3V0U2VtYW50aWNIZWxwZXJcIjtcbmltcG9ydCBmTGlicmFyeSBmcm9tIFwic2FwL2YvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCwgeyBBY3Rpb24sIEljb24gfSBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VQYWdlIGZyb20gXCJzYXAvbS9NZXNzYWdlUGFnZVwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXIgZnJvbSBcIi4vUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCI7XG5cbmNvbnN0IExheW91dFR5cGUgPSBmTGlicmFyeS5MYXlvdXRUeXBlO1xuXG5jb25zdCBDT05TVEFOVFMgPSB7XG5cdHBhZ2U6IHtcblx0XHRuYW1lczogW1wiQmVnaW5Db2x1bW5cIiwgXCJNaWRDb2x1bW5cIiwgXCJFbmRDb2x1bW5cIl0sXG5cdFx0Y3VycmVudEdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldEN1cnJlbnRcIixcblx0XHRcdHN1ZmZpeDogXCJQYWdlXCJcblx0XHR9LFxuXHRcdGdldHRlcjoge1xuXHRcdFx0cHJlZml4OiBcImdldFwiLFxuXHRcdFx0c3VmZml4OiBcIlBhZ2VzXCJcblx0XHR9XG5cdH1cbn07XG5jb25zdCBfZ2V0Vmlld0Zyb21Db250YWluZXIgPSBmdW5jdGlvbiAob0NvbnRhaW5lcjogYW55KSB7XG5cdGlmIChvQ29udGFpbmVyLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdHJldHVybiBvQ29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlKCkuZ2V0Um9vdENvbnRyb2woKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gb0NvbnRhaW5lcjtcblx0fVxufTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsXCIpXG5jbGFzcyBGY2xDb250cm9sbGVyIGV4dGVuZHMgQmFzZUNvbnRyb2xsZXIge1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0Vmlld1N0YXRlLm92ZXJyaWRlKHtcblx0XHRcdGFwcGx5SW5pdGlhbFN0YXRlT25seTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IGFueSkge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIEZjbENvbnRyb2xsZXIpLl9nZXRBbGxWaXNpYmxlVmlld3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQ2hpbGRWaWV3OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBwQ2hpbGRWaWV3ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKG9DaGlsZFZpZXcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRhZGFwdFN0YXRlQ29udHJvbHM6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIGFTdGF0ZUNvbnRyb2xzOiBhbnkpIHtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBGY2xDb250cm9sbGVyKS5fZ2V0QWxsVmlzaWJsZVZpZXdzKCkuZm9yRWFjaChmdW5jdGlvbiAob0NoaWxkVmlldzogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgcENoaWxkVmlldyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvQ2hpbGRWaWV3KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhU3RhdGVDb250cm9scy5wdXNoKHBDaGlsZFZpZXcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRvblJlc3RvcmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRvTmF2Q29udGFpbmVyID0gb1ZpZXcuYnlJZChcImFwcENvbnRlbnRcIik7XG5cdFx0XHRcdGNvbnN0IG9GQ0xDb250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IG9OYXZDb250YWluZXIuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdGNvbnN0IG9QYWdlcyA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2VzXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3Qgc0NvbXBvbmVudElkIGluIG9QYWdlcykge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KGAvcGFnZXMvJHtzQ29tcG9uZW50SWR9L3Jlc3RvcmVTdGF0dXNgLCBcInBlbmRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0KG9GQ0xDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLm9uQ29udGFpbmVyUmVhZHkoKTtcblx0XHRcdH0sXG5cdFx0XHRvblN1c3BlbmQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpIHtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSBvRkNMQ29udHJvbGxlci5nZXRGY2xDb250cm9sKCk7XG5cdFx0XHRcdGNvbnN0IGFCZWdpbkNvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRCZWdpbkNvbHVtblBhZ2VzKCkgfHwgW107XG5cdFx0XHRcdGNvbnN0IGFNaWRDb2x1bW5QYWdlczogQ29udHJvbFtdID0gb0ZDTENvbnRyb2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgYUVuZENvbHVtblBhZ2VzOiBDb250cm9sW10gPSBvRkNMQ29udHJvbC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBhUGFnZXMgPSAoW10gYXMgQ29udHJvbFtdKS5jb25jYXQoYUJlZ2luQ29sdW1uUGFnZXMsIGFNaWRDb2x1bW5QYWdlcywgYUVuZENvbHVtblBhZ2VzKTtcblxuXHRcdFx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRWaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblxuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1RhcmdldFZpZXcgJiYgb1RhcmdldFZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbGxlciAmJiBvQ29udHJvbGxlci52aWV3U3RhdGUgJiYgb0NvbnRyb2xsZXIudmlld1N0YXRlLm9uU3VzcGVuZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnZpZXdTdGF0ZS5vblN1c3BlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXHRwcml2YXRlIHNDdXJyZW50Um91dGVOYW1lITogc3RyaW5nO1xuXHRwcml2YXRlIHNDdXJyZW50QXJndW1lbnRzPzogYW55O1xuXHRwcml2YXRlIHNQcmV2aW91c0xheW91dCE6IHN0cmluZztcblx0cHJpdmF0ZSBTUVVFUllLRVlOQU1FITogc3RyaW5nO1xuXHRwcml2YXRlIF9vRkNMQ29uZmlnOiBhbnk7XG5cdHByaXZhdGUgb0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uOiBhbnk7XG5cdHByaXZhdGUgX29UYXJnZXRzQWdncmVnYXRpb246IGFueTtcblx0cHJpdmF0ZSBfb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuOiBhbnk7XG5cdHByaXZhdGUgYU1lc3NhZ2VQYWdlcz86IGFueVtdO1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmdldE1ldGFkYXRhXG5cdCAqIEBmdW5jdGlvblxuXHQgKi9cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cblx0XHR0aGlzLl9pbnRlcm5hbEluaXQoKTtcblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlcnMoKSB7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fZ2V0Vmlld0Zvck5hdmlnYXRlZFJvd3NDb21wdXRhdGlvbiwgdGhpcyk7XG5cdFx0c3VwZXIuYXR0YWNoUm91dGVNYXRjaGVycygpO1xuXHRcdHRoaXMuX2ludGVybmFsSW5pdCgpO1xuXG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5vbkJlZm9yZVJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRSb3V0ZXIoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5vblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0dGhpcy5nZXRGY2xDb250cm9sKCkuYXR0YWNoU3RhdGVDaGFuZ2UodGhpcy5fc2F2ZUxheW91dCwgdGhpcyk7XG5cdH1cblxuXHRfaW50ZXJuYWxJbml0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkpIHtcblx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBpbml0aWFsaXplZFxuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHMgPSB7fTtcblx0XHR0aGlzLlNRVUVSWUtFWU5BTUUgPSBcIj9xdWVyeVwiO1xuXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSBvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHQvLyBHZXQgRkNMIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1hbmlmZXN0XG5cdFx0dGhpcy5fb0ZDTENvbmZpZyA9IHsgbWF4Q29sdW1uc0NvdW50OiAzIH07XG5cdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSAob0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nQ29uZmlnICYmIG9Sb3V0aW5nQ29uZmlnLmNvbmZpZykge1xuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5mbGV4aWJsZUNvbHVtbkxheW91dCkge1xuXHRcdFx0XHRjb25zdCBvRkNMTWFuaWZlc3RDb25maWcgPSBvUm91dGluZ0NvbmZpZy5jb25maWcuZmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cblx0XHRcdFx0Ly8gRGVmYXVsdCBsYXlvdXQgZm9yIDIgY29sdW1uc1xuXHRcdFx0XHRpZiAob0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUd29Db2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZSA9IG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VHdvQ29sdW1uTGF5b3V0VHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERlZmF1bHQgbGF5b3V0IGZvciAzIGNvbHVtbnNcblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlKSB7XG5cdFx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0VGhyZWVDb2x1bW5MYXlvdXRUeXBlID0gb0ZDTE1hbmlmZXN0Q29uZmlnLmRlZmF1bHRUaHJlZUNvbHVtbkxheW91dFR5cGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMaW1pdCBGQ0wgdG8gMiBjb2x1bW5zID9cblx0XHRcdFx0aWYgKG9GQ0xNYW5pZmVzdENvbmZpZy5saW1pdEZDTFRvVHdvQ29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50ID0gMjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9Sb3V0aW5nQ29uZmlnLmNvbmZpZy5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0dGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uID0gb1JvdXRpbmdDb25maWcuY29uZmlnLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9pbml0aWFsaXplVGFyZ2V0QWdncmVnYXRpb24ob0FwcENvbXBvbmVudCk7XG5cdFx0dGhpcy5faW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uKG9BcHBDb21wb25lbnQpO1xuXHR9XG5cblx0Z2V0RmNsQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udGVudCgpWzBdIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0O1xuXHR9XG5cblx0X3NhdmVMYXlvdXQob0V2ZW50OiBhbnkpIHtcblx0XHR0aGlzLnNQcmV2aW91c0xheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYWRkaXRpb25uYWwgdmlldyAob24gdG9wIG9mIHRoZSB2aXNpYmxlIHZpZXdzKSwgdG8gYmUgYWJsZSB0byBjb21wdXRlIHRoZSBsYXRlc3QgdGFibGUgbmF2aWdhdGVkIHJvd3Mgb2YgdGhlIG1vc3QgcmlnaHQgdmlzaWJsZSB2aWV3IGFmdGVyIGEgbmF2IGJhY2sgb3IgY29sdW1uIGZ1bGxzY3JlZW4uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfZ2V0UmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICovXG5cblx0X2dldFZpZXdGb3JOYXZpZ2F0ZWRSb3dzQ29tcHV0YXRpb24oKSB7XG5cdFx0Y29uc3QgYUFsbFZpc2libGVWaWV3c0JlZm9yZVJvdXRlTWF0Y2hlZCA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cyh0aGlzLnNQcmV2aW91c0xheW91dCk7XG5cdFx0Y29uc3Qgb1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQgPSBhQWxsVmlzaWJsZVZpZXdzQmVmb3JlUm91dGVNYXRjaGVkW2FBbGxWaXNpYmxlVmlld3NCZWZvcmVSb3V0ZU1hdGNoZWQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG9SaWdodE1vc3RWaWV3O1xuXHRcdHRoaXMuZ2V0Um91dGVyKCkuYXR0YWNoRXZlbnRPbmNlKFwicm91dGVNYXRjaGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0b1JpZ2h0TW9zdFZpZXcgPSBfZ2V0Vmlld0Zyb21Db250YWluZXIob0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpW29FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2aWV3c1wiKS5sZW5ndGggLSAxXSk7XG5cdFx0XHRpZiAob1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGlvbiBmb3J3YXJkIGZyb20gTDIgdG8gdmlldyBsZXZlbCBMMyAoRnVsbFNjcmVlbkxheW91dCk6XG5cdFx0XHRcdGlmIChvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmIG9SaWdodE1vc3RWaWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsID09PSB0aGlzLl9vRkNMQ29uZmlnLm1heENvbHVtbnNDb3VudCkge1xuXHRcdFx0XHRcdHRoaXMub0FkZGl0aW9uYWxWaWV3Rm9yTmF2Um93c0NvbXB1dGF0aW9uID0gb1JpZ2h0TW9zdFZpZXc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gTmF2aWdhdGlvbnMgYmFja3dhcmQgZnJvbSBMMyBkb3duIHRvIEwyLCBMMSwgTDAgKFRocmVlQ29sdW1uIGxheW91dCk6XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKSAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgJiZcblx0XHRcdFx0XHRvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZC5nZXRWaWV3RGF0YSgpICYmXG5cdFx0XHRcdFx0b1JpZ2h0TW9zdFZpZXdCZWZvcmVSb3V0ZU1hdGNoZWQuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWwgPiBvUmlnaHRNb3N0Vmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbCAmJlxuXHRcdFx0XHRcdG9SaWdodE1vc3RWaWV3ICE9PSBvUmlnaHRNb3N0Vmlld0JlZm9yZVJvdXRlTWF0Y2hlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbiA9IG9SaWdodE1vc3RWaWV3QmVmb3JlUm91dGVNYXRjaGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRnZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9BZGRpdGlvbmFsVmlld0Zvck5hdlJvd3NDb21wdXRhdGlvbjtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLm9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldFJvdXRlcigpLmRldGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCh0aGlzLm9uQmVmb3JlUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hTdGF0ZUNoYW5nZSh0aGlzLm9uU3RhdGVDaGFuZ2VkLCB0aGlzKTtcblx0XHR0aGlzLmdldEZjbENvbnRyb2woKS5kZXRhY2hBZnRlckVuZENvbHVtbk5hdmlnYXRlKHRoaXMub25TdGF0ZUNoYW5nZWQsIHRoaXMpO1xuXHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb24gPSBudWxsO1xuXHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybiA9IG51bGw7XG5cblx0XHRCYXNlQ29udHJvbGxlci5wcm90b3R5cGUub25FeGl0LmJpbmQodGhpcykoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiB0aGUgRkNMIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjaXNGY2xFbmFibGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgc2luY2Ugd2UgYXJlIGluIEZDTCBzY2VuYXJpb1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRpc0ZjbEVuYWJsZWQoKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRkaXNwbGF5TWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0ZDTENvbnRyb2wgPSB0aGlzLmdldEZjbENvbnRyb2woKTtcblxuXHRcdGlmICh0aGlzLl9vRkNMQ29uZmlnICYmIG1QYXJhbWV0ZXJzLkZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50IC0gMTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuYU1lc3NhZ2VQYWdlcykge1xuXHRcdFx0dGhpcy5hTWVzc2FnZVBhZ2VzID0gW251bGwsIG51bGwsIG51bGxdO1xuXHRcdH1cblx0XHRsZXQgb01lc3NhZ2VQYWdlID0gdGhpcy5hTWVzc2FnZVBhZ2VzW21QYXJhbWV0ZXJzLkZDTExldmVsXTtcblx0XHRpZiAoIW9NZXNzYWdlUGFnZSkge1xuXHRcdFx0b01lc3NhZ2VQYWdlID0gbmV3IE1lc3NhZ2VQYWdlKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdGljb246IFwic2FwLWljb246Ly9tZXNzYWdlLWVycm9yXCJcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5hTWVzc2FnZVBhZ2VzW21QYXJhbWV0ZXJzLkZDTExldmVsXSA9IG9NZXNzYWdlUGFnZTtcblxuXHRcdFx0c3dpdGNoIChtUGFyYW1ldGVycy5GQ0xMZXZlbCkge1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0b0ZDTENvbnRyb2wuYWRkQmVnaW5Db2x1bW5QYWdlKG9NZXNzYWdlUGFnZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZE1pZENvbHVtblBhZ2Uob01lc3NhZ2VQYWdlKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9GQ0xDb250cm9sLmFkZEVuZENvbHVtblBhZ2Uob01lc3NhZ2VQYWdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvTWVzc2FnZVBhZ2Uuc2V0VGV4dChzRXJyb3JNZXNzYWdlKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy50ZWNobmljYWxNZXNzYWdlKSB7XG5cdFx0XHRvTWVzc2FnZVBhZ2Uuc2V0Q3VzdG9tRGVzY3JpcHRpb24oXG5cdFx0XHRcdG5ldyBMaW5rKHtcblx0XHRcdFx0XHR0ZXh0OiBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiB8fCBtUGFyYW1ldGVycy50ZWNobmljYWxNZXNzYWdlLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3cobVBhcmFtZXRlcnMudGVjaG5pY2FsTWVzc2FnZSwge1xuXHRcdFx0XHRcdFx0XHRpY29uOiBJY29uLkVSUk9SLFxuXHRcdFx0XHRcdFx0XHR0aXRsZTogbVBhcmFtZXRlcnMudGl0bGUsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbnM6IFtBY3Rpb24uT0tdLFxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0QWN0aW9uOiBBY3Rpb24uT0ssXG5cdFx0XHRcdFx0XHRcdGRldGFpbHM6IG1QYXJhbWV0ZXJzLnRlY2huaWNhbERldGFpbHMgfHwgXCJcIixcblx0XHRcdFx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjYwJVwiXG5cdFx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b01lc3NhZ2VQYWdlLnNldERlc2NyaXB0aW9uKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIHx8IFwiXCIpO1xuXHRcdH1cblxuXHRcdChvRkNMQ29udHJvbCBhcyBhbnkpLnRvKG9NZXNzYWdlUGFnZS5nZXRJZCgpKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgdGhlIG9iamVjdCBfb1RhcmdldHNBZ2dyZWdhdGlvbiB0aGF0IGRlZmluZXMgZm9yIGVhY2ggcm91dGUgdGhlIHJlbGV2YW50IGFnZ3JlZ2F0aW9uIGFuZCBwYXR0ZXJuLlxuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfaW5pdGlhbGl6ZVRhcmdldEFnZ3JlZ2F0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIFtvQXBwQ29tcG9uZW50XSBSZWZlcmVuY2UgdG8gdGhlIEFwcENvbXBvbmVudFxuXHQgKi9cblx0X2luaXRpYWxpemVUYXJnZXRBZ2dyZWdhdGlvbihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRjb25zdCBvTWFuaWZlc3QgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCkgYXMgYW55LFxuXHRcdFx0b1RhcmdldHMgPSBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcgPyBvTWFuaWZlc3RbXCJzYXAudWk1XCJdLnJvdXRpbmcudGFyZ2V0cyA6IG51bGw7XG5cblx0XHR0aGlzLl9vVGFyZ2V0c0FnZ3JlZ2F0aW9uID0ge307XG5cblx0XHRpZiAob1RhcmdldHMpIHtcblx0XHRcdE9iamVjdC5rZXlzKG9UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBvVGFyZ2V0c1tzVGFyZ2V0TmFtZV07XG5cdFx0XHRcdGlmIChvVGFyZ2V0LmNvbnRyb2xBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRcdHRoaXMuX29UYXJnZXRzQWdncmVnYXRpb25bc1RhcmdldE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb246IG9UYXJnZXQuY29udHJvbEFnZ3JlZ2F0aW9uLFxuXHRcdFx0XHRcdFx0cGF0dGVybjogb1RhcmdldC5jb250ZXh0UGF0dGVyblxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbltzVGFyZ2V0TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbjogXCJwYWdlXCIsXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBudWxsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYSByb3V0ZSAoaWRlbnRpZmVkIGFzIGl0cyBwYXR0ZXJuKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0c1xuXHQgKlxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlciNfaW5pdGlhbGl6ZVJvdXRlc0luZm9ybWF0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIG9BcHBDb21wb25lbnQgcmVmIHRvIHRoZSBBcHBDb21wb25lbnRcblx0ICovXG5cblx0X2luaXRpYWxpemVSb3V0ZXNJbmZvcm1hdGlvbihvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRjb25zdCBvTWFuaWZlc3QgPSBvQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0KCkgYXMgYW55LFxuXHRcdFx0YVJvdXRlcyA9IG9NYW5pZmVzdFtcInNhcC51aTVcIl0ucm91dGluZyA/IG9NYW5pZmVzdFtcInNhcC51aTVcIl0ucm91dGluZy5yb3V0ZXMgOiBudWxsO1xuXG5cdFx0dGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuID0ge307XG5cblx0XHRpZiAoYVJvdXRlcykge1xuXHRcdFx0YVJvdXRlcy5mb3JFYWNoKChyb3V0ZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRzRnJvbVJvdXRlUGF0dGVybltyb3V0ZS5wYXR0ZXJuXSA9IHJvdXRlLnRhcmdldDtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGdldEN1cnJlbnRBcmd1bWVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5zQ3VycmVudEFyZ3VtZW50cztcblx0fVxuXG5cdGdldEN1cnJlbnRSb3V0ZU5hbWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IEZFIEZDTCBjb25zdGFudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEByZXR1cm5zIFRoZSBjb25zdGFudHNcblx0ICovXG5cdGdldENvbnN0YW50cygpIHtcblx0XHRyZXR1cm4gQ09OU1RBTlRTO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHRlciBmb3Igb1RhcmdldHNBZ2dyZWdhdGlvbiBhcnJheS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjZ2V0VGFyZ2V0QWdncmVnYXRpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyBUaGUgX29UYXJnZXRzQWdncmVnYXRpb24gYXJyYXlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRnZXRUYXJnZXRBZ2dyZWdhdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldHNBZ2dyZWdhdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0cmlnZ2VyZWQgYnkgdGhlIHJvdXRlciBSb3V0ZU1hdGNoZWQgZXZlbnQuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI29uUm91dGVNYXRjaGVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRvblJvdXRlTWF0Y2hlZChvRXZlbnQ6IGFueSkge1xuXHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmFtZVwiKTtcblxuXHRcdC8vIFNhdmUgdGhlIGN1cnJlbnQvcHJldmlvdXMgcm91dGVzIGFuZCBhcmd1bWVudHNcblx0XHR0aGlzLnNDdXJyZW50Um91dGVOYW1lID0gc1JvdXRlTmFtZTtcblx0XHR0aGlzLnNDdXJyZW50QXJndW1lbnRzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImFyZ3VtZW50c1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHRyaWdnZXJpbmcgdGhlIHRhYmxlIHNjcm9sbCB0byB0aGUgbmF2aWdhdGVkIHJvdyBhZnRlciBlYWNoIGxheW91dCBjaGFuZ2UuXG5cdCAqXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyI3Njcm9sbFRvTGFzdFNlbGVjdGVkSXRlbVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvTGFzdE5hdmlnYXRlZEl0ZW1zKCkge1xuXHRcdGNvbnN0IGFWaWV3cyA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cygpO1xuXHRcdC8vVGhlIHNjcm9sbHMgYXJlIHRyaWdnZXJlZCBvbmx5IGlmIHRoZSBsYXlvdXQgaXMgd2l0aCBzZXZlcmFsIGNvbHVtbnMgb3Igd2hlbiBzd2l0Y2hpbmcgdGhlIG1vc3RSaWdodCBjb2x1bW4gaW4gZnVsbCBzY3JlZW5cblx0XHRpZiAoYVZpZXdzLmxlbmd0aCA+IDEgfHwgYVZpZXdzWzBdLmdldFZpZXdEYXRhKCkudmlld0xldmVsIDwgdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQpIHtcblx0XHRcdGxldCBzQ3VycmVudFZpZXdQYXRoO1xuXHRcdFx0Y29uc3Qgb0FkZGl0aW9uYWxWaWV3ID0gdGhpcy5nZXRWaWV3Rm9yTmF2aWdhdGVkUm93c0NvbXB1dGF0aW9uKCk7XG5cdFx0XHRpZiAob0FkZGl0aW9uYWxWaWV3ICYmIGFWaWV3cy5pbmRleE9mKG9BZGRpdGlvbmFsVmlldykgPT09IC0xKSB7XG5cdFx0XHRcdGFWaWV3cy5wdXNoKG9BZGRpdGlvbmFsVmlldyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpbmRleCA9IGFWaWV3cy5sZW5ndGggLSAxOyBpbmRleCA+IDA7IGluZGV4LS0pIHtcblx0XHRcdFx0Y29uc3Qgb1ZpZXcgPSBhVmlld3NbaW5kZXhdLFxuXHRcdFx0XHRcdG9QcmV2aW91c1ZpZXcgPSBhVmlld3NbaW5kZXggLSAxXTtcblx0XHRcdFx0aWYgKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0XHRzQ3VycmVudFZpZXdQYXRoID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0b1ByZXZpb3VzVmlldy5nZXRDb250cm9sbGVyKCkuX3Njcm9sbFRhYmxlc1RvUm93KHNDdXJyZW50Vmlld1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCBieSB0aGUgRkNMIFN0YXRlQ2hhbmdlZCBldmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjb25TdGF0ZUNoYW5nZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdG9uU3RhdGVDaGFuZ2VkKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3QgYklzTmF2aWdhdGlvbkFycm93ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlzTmF2aWdhdGlvbkFycm93XCIpO1xuXHRcdGlmICh0aGlzLnNDdXJyZW50QXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdKSB7XG5cdFx0XHRcdHRoaXMuc0N1cnJlbnRBcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zQ3VycmVudEFyZ3VtZW50c1t0aGlzLlNRVUVSWUtFWU5BTUVdLmxheW91dCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJsYXlvdXRcIik7XG5cdFx0fVxuXHRcdHRoaXMuX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQpO1xuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgVVJMIHdpdGggdGhlIG5ldyBsYXlvdXQgaWYgYSBuYXZpZ2F0aW9uIGFycm93IHdhcyB1c2VkXG5cdFx0aWYgKGJJc05hdmlnYXRpb25BcnJvdykge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvKHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUsIHRoaXMuc0N1cnJlbnRBcmd1bWVudHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBldmVudCBvbiBhbGwgYnJlYWRjcnVtYnMgKCBvbiBlYWNoIE9iamVjdFBhZ2VzKS5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjX2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1ic1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X2ZvcmNlTW9kZWxDb250ZXh0Q2hhbmdlT25CcmVhZENydW1icyhvRXZlbnQ6IGFueSkge1xuXHRcdC8vZm9yY2UgbW9kZWxjb250ZXh0Y2hhbmdlIG9uIE9iamVjdFBhZ2VzIHRvIHJlZnJlc2ggdGhlIGJyZWFkY3J1bWJzIGxpbmsgaHJlZnNcblx0XHRjb25zdCBvRmNsID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGxldCBvUGFnZXM6IGFueVtdID0gW107XG5cdFx0b1BhZ2VzID0gb1BhZ2VzLmNvbmNhdChvRmNsLmdldEJlZ2luQ29sdW1uUGFnZXMoKSkuY29uY2F0KG9GY2wuZ2V0TWlkQ29sdW1uUGFnZXMoKSkuY29uY2F0KG9GY2wuZ2V0RW5kQ29sdW1uUGFnZXMoKSk7XG5cdFx0b1BhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9QYWdlOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gX2dldFZpZXdGcm9tQ29udGFpbmVyKG9QYWdlKTtcblx0XHRcdGNvbnN0IG9CcmVhZENydW1icyA9IG9WaWV3LmJ5SWQgJiYgb1ZpZXcuYnlJZChcImJyZWFkY3J1bWJzXCIpO1xuXHRcdFx0aWYgKG9CcmVhZENydW1icykge1xuXHRcdFx0XHRvQnJlYWRDcnVtYnMuZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCB0byB1cGRhdGUgdGhlIFNoYXJlIGJ1dHRvbiBWaXNpYmlsaXR5LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXJcblx0ICogQHBhcmFtIHZpZXdDb2x1bW4gTmFtZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gKFwiYmVnaW5Db2x1bW5cIiwgXCJtaWRDb2x1bW5cIiwgXCJlbmRDb2x1bW5cIilcblx0ICogQHBhcmFtIHNMYXlvdXQgVGhlIGN1cnJlbnQgbGF5b3V0IHVzZWQgYnkgdGhlIEZDTFxuXHQgKiBAcmV0dXJucyBUaGUgc2hhcmUgYnV0dG9uIHZpc2liaWxpdHlcblx0ICovXG5cdF91cGRhdGVTaGFyZUJ1dHRvblZpc2liaWxpdHkodmlld0NvbHVtbjogc3RyaW5nLCBzTGF5b3V0OiBzdHJpbmcpIHtcblx0XHRsZXQgYlNob3dTaGFyZUljb247XG5cdFx0c3dpdGNoIChzTGF5b3V0KSB7XG5cdFx0XHRjYXNlIFwiT25lQ29sdW1uXCI6XG5cdFx0XHRcdGJTaG93U2hhcmVJY29uID0gdmlld0NvbHVtbiA9PT0gXCJiZWdpbkNvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJNaWRDb2x1bW5GdWxsU2NyZWVuXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zQmVnaW5FeHBhbmRlZEVuZEhpZGRlblwiOlxuXHRcdFx0Y2FzZSBcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkRW5kSGlkZGVuXCI6XG5cdFx0XHRjYXNlIFwiVHdvQ29sdW1uc0JlZ2luRXhwYW5kZWRcIjpcblx0XHRcdGNhc2UgXCJUd29Db2x1bW5zTWlkRXhwYW5kZWRcIjpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSB2aWV3Q29sdW1uID09PSBcIm1pZENvbHVtblwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCI6XG5cdFx0XHRjYXNlIFwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWRcIjpcblx0XHRcdGNhc2UgXCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZFwiOlxuXHRcdFx0XHRiU2hvd1NoYXJlSWNvbiA9IHZpZXdDb2x1bW4gPT09IFwiZW5kQ29sdW1uXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YlNob3dTaGFyZUljb24gPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGJTaG93U2hhcmVJY29uO1xuXHR9XG5cblx0dXBkYXRlVUlTdGF0ZUZvclZpZXcob1ZpZXc6IGFueSwgRkNMTGV2ZWw6IGFueSkge1xuXHRcdGNvbnN0IG9VSVN0YXRlID0gdGhpcy5nZXRIZWxwZXIoKS5nZXRDdXJyZW50VUlTdGF0ZSgpIGFzIGFueSxcblx0XHRcdG9GY2xDb2xOYW1lID0gW1wiYmVnaW5Db2x1bW5cIiwgXCJtaWRDb2x1bW5cIiwgXCJlbmRDb2x1bW5cIl0sXG5cdFx0XHRzTGF5b3V0ID0gdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCk7XG5cdFx0bGV0IHZpZXdDb2x1bW47XG5cblx0XHRpZiAoIW9WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpKSB7XG5cdFx0XHRvVmlldy5zZXRNb2RlbCh0aGlzLl9jcmVhdGVIZWxwZXJNb2RlbCgpLCBcImZjbGhlbHBlclwiKTtcblx0XHR9XG5cdFx0aWYgKEZDTExldmVsID49IHRoaXMuX29GQ0xDb25maWcubWF4Q29sdW1uc0NvdW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpcyBvbiBhIGxldmVsID4gbWF4IG51bWJlciBvZiBjb2x1bW5zLiBJdCdzIGFsd2F5cyBmdWxsc2NyZWVuIHdpdGhvdXQgY2xvc2UvZXhpdCBidXR0b25zXG5cdFx0XHR2aWV3Q29sdW1uID0gb0ZjbENvbE5hbWVbdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgLSAxXTtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLm1pZENvbHVtbi5mdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLm1pZENvbHVtbi5leGl0RnVsbFNjcmVlbiA9IG51bGw7XG5cdFx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uY2xvc2VDb2x1bW4gPSBudWxsO1xuXHRcdFx0b1VJU3RhdGUuYWN0aW9uQnV0dG9uc0luZm8uZW5kQ29sdW1uLmV4aXRGdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5mdWxsU2NyZWVuID0gbnVsbDtcblx0XHRcdG9VSVN0YXRlLmFjdGlvbkJ1dHRvbnNJbmZvLmVuZENvbHVtbi5jbG9zZUNvbHVtbiA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZpZXdDb2x1bW4gPSBvRmNsQ29sTmFtZVtGQ0xMZXZlbF07XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0RkNMTGV2ZWwgPj0gdGhpcy5fb0ZDTENvbmZpZy5tYXhDb2x1bW5zQ291bnQgfHxcblx0XHRcdHNMYXlvdXQgPT09IFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiIHx8XG5cdFx0XHRzTGF5b3V0ID09PSBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIiB8fFxuXHRcdFx0c0xheW91dCA9PT0gXCJPbmVDb2x1bW5cIlxuXHRcdCkge1xuXHRcdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYnJlYWRDcnVtYklzVmlzaWJsZVwiLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvYnJlYWRDcnVtYklzVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0fVxuXHRcdC8vIFVuZm9ydHVuYXRlbHksIHRoZSBGQ0xIZWxwZXIgZG9lc24ndCBwcm92aWRlIGFjdGlvbkJ1dHRvbiB2YWx1ZXMgZm9yIHRoZSBmaXJzdCBjb2x1bW5cblx0XHQvLyBzbyB3ZSBoYXZlIHRvIGFkZCB0aGlzIGluZm8gbWFudWFsbHlcblx0XHRvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mby5iZWdpbkNvbHVtbiA9IHsgZnVsbFNjcmVlbjogbnVsbCwgZXhpdEZ1bGxTY3JlZW46IG51bGwsIGNsb3NlQ29sdW1uOiBudWxsIH07XG5cblx0XHRjb25zdCBvQWN0aW9uQnV0dG9uSW5mb3MgPSBPYmplY3QuYXNzaWduKHt9LCBvVUlTdGF0ZS5hY3Rpb25CdXR0b25zSW5mb1t2aWV3Q29sdW1uXSk7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLnN3aXRjaFZpc2libGUgPSBvQWN0aW9uQnV0dG9uSW5mb3MuZnVsbFNjcmVlbiAhPT0gbnVsbCB8fCBvQWN0aW9uQnV0dG9uSW5mb3MuZXhpdEZ1bGxTY3JlZW4gIT09IG51bGw7XG5cdFx0b0FjdGlvbkJ1dHRvbkluZm9zLnN3aXRjaEljb24gPSBvQWN0aW9uQnV0dG9uSW5mb3MuZnVsbFNjcmVlbiAhPT0gbnVsbCA/IFwic2FwLWljb246Ly9mdWxsLXNjcmVlblwiIDogXCJzYXAtaWNvbjovL2V4aXQtZnVsbC1zY3JlZW5cIjtcblx0XHRvQWN0aW9uQnV0dG9uSW5mb3MuaXNGdWxsU2NyZWVuID0gb0FjdGlvbkJ1dHRvbkluZm9zLmZ1bGxTY3JlZW4gPT09IG51bGw7XG5cblx0XHRvVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5zZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mb1wiLCBvQWN0aW9uQnV0dG9uSW5mb3MpO1xuXG5cdFx0b1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuc2V0UHJvcGVydHkoXCIvc2hvd1NoYXJlSWNvblwiLCB0aGlzLl91cGRhdGVTaGFyZUJ1dHRvblZpc2liaWxpdHkodmlld0NvbHVtbiwgc0xheW91dCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRyaWdnZXJlZCBieSB0aGUgcm91dGVyIEJlZm9yZVJvdXRlTWF0Y2hlZCBldmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjb25CZWZvcmVSb3V0ZU1hdGNoZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuUm9vdENvbnRhaW5lci5jb250cm9sbGVyLkZjbC5jb250cm9sbGVyXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdG9uQmVmb3JlUm91dGVNYXRjaGVkKG9FdmVudDogYW55KSB7XG5cdFx0aWYgKG9FdmVudCkge1xuXHRcdFx0Y29uc3Qgb1F1ZXJ5UGFyYW1zID0gb0V2ZW50LmdldFBhcmFtZXRlcnMoKS5hcmd1bWVudHNbdGhpcy5TUVVFUllLRVlOQU1FXTtcblx0XHRcdGxldCBzTGF5b3V0ID0gb1F1ZXJ5UGFyYW1zID8gb1F1ZXJ5UGFyYW1zLmxheW91dCA6IG51bGw7XG5cblx0XHRcdC8vIElmIHRoZXJlIGlzIG5vIGxheW91dCBwYXJhbWV0ZXIsIHF1ZXJ5IGZvciB0aGUgZGVmYXVsdCBsZXZlbCAwIGxheW91dCAobm9ybWFsbHkgT25lQ29sdW1uKVxuXHRcdFx0aWYgKCFzTGF5b3V0KSB7XG5cdFx0XHRcdGNvbnN0IG9OZXh0VUlTdGF0ZSA9IHRoaXMuZ2V0SGVscGVyKCkuZ2V0TmV4dFVJU3RhdGUoMCk7XG5cdFx0XHRcdHNMYXlvdXQgPSBvTmV4dFVJU3RhdGUubGF5b3V0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgbGF5b3V0IGlmIGNvbXBhdGlibGUgd2l0aCB0aGUgbnVtYmVyIG9mIHRhcmdldHNcblx0XHRcdC8vIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBmb3Igbm9ybWFsIG5hdmlnYXRpb24sIGp1c3QgbmVlZGVkIGluIGNhc2Vcblx0XHRcdC8vIHRoZSBVUkwgaGFzIGJlZW4gbWFudWFsbHkgbW9kaWZpZWRcblx0XHRcdGNvbnN0IGFUYXJnZXRzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbmZpZ1wiKS50YXJnZXQ7XG5cdFx0XHRzTGF5b3V0ID0gdGhpcy5fY29ycmVjdExheW91dEZvclRhcmdldHMoc0xheW91dCwgYVRhcmdldHMpO1xuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgRmxleGlibGVDb2x1bW5MYXlvdXRcblx0XHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0RmNsQ29udHJvbCgpLnNldExheW91dChzTGF5b3V0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZvciB0aGUgRkNMIENvbXBvbmVudC5cblx0ICpcblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5Sb290Q29udGFpbmVyLmNvbnRyb2xsZXIuRmNsLmNvbnRyb2xsZXIjZ2V0SGVscGVyXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIuY29udHJvbGxlci5GY2wuY29udHJvbGxlclxuXHQgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBhIHNlbWFudGljIGhlbHBlclxuXHQgKi9cblx0Z2V0SGVscGVyKCkge1xuXHRcdHJldHVybiBGbGV4aWJsZUNvbHVtbkxheW91dFNlbWFudGljSGVscGVyLmdldEluc3RhbmNlRm9yKHRoaXMuZ2V0RmNsQ29udHJvbCgpLCB0aGlzLl9vRkNMQ29uZmlnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBGQ0wgbGF5b3V0IGZvciBhIGdpdmVuIEZDTCBsZXZlbCBhbmQgYSB0YXJnZXQgaGFzaC5cblx0ICpcblx0ICogQHBhcmFtIGlOZXh0RkNMTGV2ZWwgRkNMIGxldmVsIHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gc0hhc2ggVGhlIGhhc2ggdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBzUHJvcG9zZWRMYXlvdXQgVGhlIHByb3Bvc2VkIGxheW91dFxuXHQgKiBAcGFyYW0ga2VlcEN1cnJlbnRMYXlvdXQgVHJ1ZSBpZiB3ZSB3YW50IHRvIGtlZXAgdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHBvc3NpYmxlXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxjdWxhdGVkIGxheW91dFxuXHQgKi9cblx0Y2FsY3VsYXRlTGF5b3V0KGlOZXh0RkNMTGV2ZWw6IG51bWJlciwgc0hhc2g6IHN0cmluZywgc1Byb3Bvc2VkTGF5b3V0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtlZXBDdXJyZW50TGF5b3V0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG5cdFx0Ly8gRmlyc3QsIGFzayB0aGUgRkNMIGhlbHBlciB0byBjYWxjdWxhdGUgdGhlIGxheW91dCBpZiBub3RoaW5nIGlzIHByb3Bvc2VkXG5cdFx0aWYgKCFzUHJvcG9zZWRMYXlvdXQpIHtcblx0XHRcdHNQcm9wb3NlZExheW91dCA9IGtlZXBDdXJyZW50TGF5b3V0ID8gdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCkgOiB0aGlzLmdldEhlbHBlcigpLmdldE5leHRVSVN0YXRlKGlOZXh0RkNMTGV2ZWwpLmxheW91dDtcblx0XHR9XG5cblx0XHQvLyBUaGVuIGNoYW5nZSB0aGlzIHZhbHVlIGlmIG5lY2Vzc2FyeSwgYmFzZWQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzXG5cdFx0Y29uc3Qgb1JvdXRlID0gKHRoaXMuZ2V0Um91dGVyKCkgYXMgYW55KS5nZXRSb3V0ZUJ5SGFzaChgJHtzSGFzaH0/bGF5b3V0PSR7c1Byb3Bvc2VkTGF5b3V0fWApO1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gdGhpcy5fb1RhcmdldHNGcm9tUm91dGVQYXR0ZXJuW29Sb3V0ZS5nZXRQYXR0ZXJuKCldO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dCwgYVRhcmdldHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gRkNMIGxheW91dCBpcyBjb21wYXRpYmxlIHdpdGggYW4gYXJyYXkgb2YgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHNQcm9wb3NlZExheW91dCBQcm9wb3NlZCB2YWx1ZSBmb3IgdGhlIEZDTCBsYXlvdXRcblx0ICogQHBhcmFtIGFUYXJnZXRzIEFycmF5IG9mIHRhcmdldCBuYW1lcyB1c2VkIGZvciBjaGVja2luZ1xuXHQgKiBAcmV0dXJucyBUaGUgY29ycmVjdGVkIGxheW91dFxuXHQgKi9cblx0X2NvcnJlY3RMYXlvdXRGb3JUYXJnZXRzKHNQcm9wb3NlZExheW91dDogYW55LCBhVGFyZ2V0czogYW55KSB7XG5cdFx0Y29uc3QgYWxsQWxsb3dlZExheW91dHM6IGFueSA9IHtcblx0XHRcdFwiMlwiOiBbXCJUd29Db2x1bW5zTWlkRXhwYW5kZWRcIiwgXCJUd29Db2x1bW5zQmVnaW5FeHBhbmRlZFwiLCBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIl0sXG5cdFx0XHRcIjNcIjogW1xuXHRcdFx0XHRcIlRocmVlQ29sdW1uc01pZEV4cGFuZGVkXCIsXG5cdFx0XHRcdFwiVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWRcIixcblx0XHRcdFx0XCJUaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlblwiLFxuXHRcdFx0XHRcIlRocmVlQ29sdW1uc0JlZ2luRXhwYW5kZWRFbmRIaWRkZW5cIixcblx0XHRcdFx0XCJNaWRDb2x1bW5GdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwiRW5kQ29sdW1uRnVsbFNjcmVlblwiXG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdGlmIChhVGFyZ2V0cyAmJiAhQXJyYXkuaXNBcnJheShhVGFyZ2V0cykpIHtcblx0XHRcdC8vIFRvIHN1cHBvcnQgc2luZ2xlIHRhcmdldCBhcyBhIHN0cmluZyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdGFUYXJnZXRzID0gW2FUYXJnZXRzXTtcblx0XHR9XG5cblx0XHRpZiAoIWFUYXJnZXRzKSB7XG5cdFx0XHQvLyBEZWZlbnNpdmUsIGp1c3QgaW4gY2FzZS4uLlxuXHRcdFx0cmV0dXJuIHNQcm9wb3NlZExheW91dDtcblx0XHR9IGVsc2UgaWYgKGFUYXJnZXRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE1vcmUgdGhhbiAxIHRhcmdldDoganVzdCBzaW1wbHkgY2hlY2sgZnJvbSB0aGUgYWxsb3dlZCB2YWx1ZXNcblx0XHRcdGNvbnN0IGFMYXlvdXRzID0gYWxsQWxsb3dlZExheW91dHNbYVRhcmdldHMubGVuZ3RoXTtcblx0XHRcdGlmIChhTGF5b3V0cy5pbmRleE9mKHNQcm9wb3NlZExheW91dCkgPCAwKSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wb3NlZCBsYXlvdXQgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZSBudW1iZXIgb2YgY29sdW1uc1xuXHRcdFx0XHQvLyAtLT4gQXNrIHRoZSBoZWxwZXIgZm9yIHRoZSBkZWZhdWx0IGxheW91dCBmb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zXG5cdFx0XHRcdHNQcm9wb3NlZExheW91dCA9IGFMYXlvdXRzWzBdOyAvL3RoaXMuZ2V0SGVscGVyKCkuZ2V0TmV4dFVJU3RhdGUoYVRhcmdldHMubGVuZ3RoIC0gMSkubGF5b3V0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPbmx5IG9uZSB0YXJnZXRcblx0XHRcdGNvbnN0IHNUYXJnZXRBZ2dyZWdhdGlvbiA9IHRoaXMuZ2V0VGFyZ2V0QWdncmVnYXRpb24oKVthVGFyZ2V0c1swXV0uYWdncmVnYXRpb24gfHwgdGhpcy5fb0ZDTENvbmZpZy5kZWZhdWx0Q29udHJvbEFnZ3JlZ2F0aW9uO1xuXHRcdFx0c3dpdGNoIChzVGFyZ2V0QWdncmVnYXRpb24pIHtcblx0XHRcdFx0Y2FzZSBcImJlZ2luQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIk9uZUNvbHVtblwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibWlkQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRzUHJvcG9zZWRMYXlvdXQgPSBcIk1pZENvbHVtbkZ1bGxTY3JlZW5cIjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImVuZENvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0c1Byb3Bvc2VkTGF5b3V0ID0gXCJFbmRDb2x1bW5GdWxsU2NyZWVuXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIG5vIGRlZmF1bHRcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc1Byb3Bvc2VkTGF5b3V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmlzaWJsZSB2aWV3cyBpbiB0aGUgRkNMIGNvbXBvbmVudC5cblx0ICogc0xheW91dCBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdmVyeSBzcGVjaWZpYyBhcyBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgbGF0ZXN0IG5hdmlnYXRlZCByb3dcblx0ICpcblx0ICogQHBhcmFtIHsqfSBzTGF5b3V0IExheW91dCB0aGF0IHdhcyBhcHBsaWVkIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IG5hdmlnYXRpb25cblx0ICogQHJldHVybnMge0FycmF5fSByZXR1cm4gdmlld3Ncblx0ICovXG5cblx0X2dldEFsbFZpc2libGVWaWV3cyhzTGF5b3V0PzogYW55KSB7XG5cdFx0Y29uc3QgYVZpZXdzID0gW107XG5cdFx0c0xheW91dCA9IHNMYXlvdXQgPyBzTGF5b3V0IDogdGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCk7XG5cdFx0c3dpdGNoIChzTGF5b3V0KSB7XG5cdFx0XHRjYXNlIExheW91dFR5cGUuRW5kQ29sdW1uRnVsbFNjcmVlbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEVuZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuTWlkQ29sdW1uRnVsbFNjcmVlbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuT25lQ29sdW1uOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zRW5kRXhwYW5kZWQ6XG5cdFx0XHRjYXNlIExheW91dFR5cGUuVGhyZWVDb2x1bW5zTWlkRXhwYW5kZWQ6XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0TG9nLmVycm9yKGBVbmhhbmRsZWQgc3dpdGNoIGNhc2UgZm9yICR7dGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0TGF5b3V0KCl9YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFWaWV3cztcblx0fVxuXHRfZ2V0QWxsVmlld3Moc0xheW91dD86IGFueSkge1xuXHRcdGNvbnN0IGFWaWV3cyA9IFtdO1xuXHRcdHNMYXlvdXQgPSBzTGF5b3V0ID8gc0xheW91dCA6IHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldExheW91dCgpO1xuXHRcdHN3aXRjaCAoc0xheW91dCkge1xuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLk9uZUNvbHVtbjpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNFbmRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNNaWRFeHBhbmRlZEVuZEhpZGRlbjpcblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5UaHJlZUNvbHVtbnNCZWdpbkV4cGFuZGVkRW5kSGlkZGVuOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLkVuZENvbHVtbkZ1bGxTY3JlZW46XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSB7XG5cdFx0XHRcdFx0YVZpZXdzLnB1c2goX2dldFZpZXdGcm9tQ29udGFpbmVyKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNCZWdpbkV4cGFuZGVkOlxuXHRcdFx0Y2FzZSBMYXlvdXRUeXBlLlR3b0NvbHVtbnNNaWRFeHBhbmRlZDpcblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRCZWdpbkNvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkge1xuXHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50TWlkQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTGF5b3V0VHlwZS5NaWRDb2x1bW5GdWxsU2NyZWVuOlxuXHRcdFx0XHQvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtaWQgY29sdW1uIGZ1bGxzY3JlZW4gY29tZXMgZnJvbSBhIDIgb3IgYSAzIGNvbHVtbiBsYXlvdXRcblx0XHRcdFx0Y29uc3Qgc0xheW91dFdoZW5FeGl0RnVsbFNjcmVlbiA9ICh0aGlzLmdldEhlbHBlcigpLmdldEN1cnJlbnRVSVN0YXRlKCkgYXMgYW55KS5hY3Rpb25CdXR0b25zSW5mby5taWRDb2x1bW4uZXhpdEZ1bGxTY3JlZW47XG5cdFx0XHRcdGlmICh0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50QmVnaW5Db2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudEJlZ2luQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRNaWRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRhVmlld3MucHVzaChfZ2V0Vmlld0Zyb21Db250YWluZXIodGhpcy5nZXRGY2xDb250cm9sKCkuZ2V0Q3VycmVudE1pZENvbHVtblBhZ2UoKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzTGF5b3V0V2hlbkV4aXRGdWxsU2NyZWVuLmluZGV4T2YoXCJUaHJlZUNvbHVtblwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0Ly8gV2UgY29tZSBmcm9tIGEgMyBjb2x1bW4gbGF5b3V0XG5cdFx0XHRcdFx0aWYgKHRoaXMuZ2V0RmNsQ29udHJvbCgpLmdldEN1cnJlbnRFbmRDb2x1bW5QYWdlKCkpIHtcblx0XHRcdFx0XHRcdGFWaWV3cy5wdXNoKF9nZXRWaWV3RnJvbUNvbnRhaW5lcih0aGlzLmdldEZjbENvbnRyb2woKS5nZXRDdXJyZW50RW5kQ29sdW1uUGFnZSgpKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRMb2cuZXJyb3IoYFVuaGFuZGxlZCBzd2l0Y2ggY2FzZSBmb3IgJHt0aGlzLmdldEZjbENvbnRyb2woKS5nZXRMYXlvdXQoKX1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFWaWV3cztcblx0fVxuXG5cdG9uQ29udGFpbmVyUmVhZHkoKSB7XG5cdFx0Ly8gUmVzdG9yZSB2aWV3cyBpZiBuZWNjZXNzYXJ5LlxuXHRcdGNvbnN0IGFWaWV3cyA9IHRoaXMuX2dldEFsbFZpc2libGVWaWV3cygpO1xuXHRcdGNvbnN0IGFSZXN0b3JlUHJvbWlzZXM6IGFueVtdID0gYVZpZXdzLnJlZHVjZShmdW5jdGlvbiAoYVByb21pc2VzOiBhbnksIG9UYXJnZXRWaWV3OiBhbnkpIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKEtlZXBBbGl2ZUhlbHBlci5yZXN0b3JlVmlldyhvVGFyZ2V0VmlldykpO1xuXHRcdFx0cmV0dXJuIGFQcm9taXNlcztcblx0XHR9LCBbXSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXN0b3JlUHJvbWlzZXMpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0Q29udGV4dCgpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0UmlnaHRtb3N0VmlldygpO1xuXHRcdHJldHVybiBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHR9XG5cblx0Z2V0UmlnaHRtb3N0VmlldygpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QWxsVmlld3MoKS5wb3AoKTtcblx0fVxuXG5cdGlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0aWYgKCF0aGlzLmdldEZjbENvbnRyb2woKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBhQWxsVmlzaWJsZVZpZXdzID0gdGhpcy5fZ2V0QWxsVmlld3MoKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYUFsbFZpc2libGVWaWV3cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSBhQWxsVmlzaWJsZVZpZXdzW2ldO1xuXHRcdFx0aWYgKCFvVmlldykge1xuXHRcdFx0XHQvLyBBIHZpZXcgaGFzIGJlZW4gZGVzdHJveWVkIC0tPiBhcHAgaXMgY3VycmVudGx5IGJlaW5nIGRlc3Ryb3llZFxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSA9PT0gb0NvbnRleHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZjbENvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUJBLElBQU1BLFVBQVUsR0FBR0MsUUFBUSxDQUFDRCxVQUE1QjtFQUVBLElBQU1FLFNBQVMsR0FBRztJQUNqQkMsSUFBSSxFQUFFO01BQ0xDLEtBQUssRUFBRSxDQUFDLGFBQUQsRUFBZ0IsV0FBaEIsRUFBNkIsV0FBN0IsQ0FERjtNQUVMQyxhQUFhLEVBQUU7UUFDZEMsTUFBTSxFQUFFLFlBRE07UUFFZEMsTUFBTSxFQUFFO01BRk0sQ0FGVjtNQU1MQyxNQUFNLEVBQUU7UUFDUEYsTUFBTSxFQUFFLEtBREQ7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
|