@sapui5/sap.fe.core 1.121.4 → 1.121.6
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 +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -2
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +54 -40
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +62 -38
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/library.js +1 -1
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog.block", "../../controls/Recommendations/ConfirmRecommendationDialog.block"], function (Log, EditState, DraftDataLossDialogBlock, ConfirmRecommendationDialog_block) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "../../controls/DataLossOrDraftDiscard/DraftDataLossDialog.block", "../../controls/Recommendations/ConfirmRecommendationDialog.block"], function (Log, EditState, ModelHelper, DraftDataLossDialogBlock, ConfirmRecommendationDialog_block) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var RecommendationDialogDecision = ConfirmRecommendationDialog_block.RecommendationDialogDecision;
|
|
9
9
|
/* Enum for navigation types */
|
|
10
10
|
var NavigationType;
|
|
11
|
-
/* Enum types for the
|
|
11
|
+
/* Enum types for the data loss dialog options */
|
|
12
12
|
(function (NavigationType) {
|
|
13
13
|
NavigationType["BackNavigation"] = "BackNavigation";
|
|
14
14
|
NavigationType["ForwardNavigation"] = "ForwardNavigation";
|
|
@@ -19,7 +19,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
19
19
|
DraftDataLossOptions["Keep"] = "draftDataLossOptionKeep";
|
|
20
20
|
DraftDataLossOptions["Discard"] = "draftDataLossOptionDiscard";
|
|
21
21
|
})(DraftDataLossOptions || (DraftDataLossOptions = {}));
|
|
22
|
-
/*Create the
|
|
22
|
+
/*Create the data loss dialog*/
|
|
23
23
|
const dataLossDialog = new DraftDataLossDialogBlock({});
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -30,28 +30,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
30
30
|
*/
|
|
31
31
|
function silentlyKeepDraftOnForwardNavigation(pageController) {
|
|
32
32
|
var _oManifest$app;
|
|
33
|
-
let rbSilentlyKeep
|
|
33
|
+
let rbSilentlyKeep;
|
|
34
34
|
const oManifest = pageController.getAppComponent().getManifestEntry("sap.fe");
|
|
35
35
|
rbSilentlyKeep = (oManifest === null || oManifest === void 0 ? void 0 : (_oManifest$app = oManifest.app) === null || _oManifest$app === void 0 ? void 0 : _oManifest$app.silentlyKeepDraftOnForwardNavigation) || false;
|
|
36
36
|
return rbSilentlyKeep;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
|
-
* Logic to process the
|
|
40
|
+
* Logic to process the FCL mode.
|
|
41
41
|
*
|
|
42
42
|
* @param draftAdminData Admin data
|
|
43
43
|
* @param fnCancelFunction The cancel function
|
|
44
44
|
* @param oController The current controller referenced
|
|
45
|
-
* @param processFunctionForDrafts The
|
|
45
|
+
* @param processFunctionForDrafts The function to process the handler
|
|
46
46
|
* @param bSkipBindingToView The optional parameter to skip the binding to the view
|
|
47
|
+
* @param context The context to be used for the draft operation
|
|
47
48
|
* @returns Nothing
|
|
48
49
|
*/
|
|
49
|
-
async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView) {
|
|
50
|
+
async function processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, context) {
|
|
50
51
|
// The application is running in FCL mode so in this case we fall back to
|
|
51
52
|
// the old logic since the dirty state handling is not properly working
|
|
52
53
|
// for FCL.
|
|
53
54
|
if (draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime) {
|
|
54
|
-
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
|
|
55
|
+
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
|
|
55
56
|
} else {
|
|
56
57
|
processFunctionForDrafts();
|
|
57
58
|
}
|
|
@@ -63,14 +64,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
63
64
|
* @param draftAdminData Admin data
|
|
64
65
|
* @param fnCancelFunction The cancel function
|
|
65
66
|
* @param oController The current controller referenced
|
|
66
|
-
* @param processFunctionForDrafts The
|
|
67
|
+
* @param processFunctionForDrafts The function to process the handler
|
|
67
68
|
* @param navigationType The navigation type for which the function should be called
|
|
68
69
|
* @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
|
|
69
70
|
* @param bSkipBindingToView The optional parameter to skip the binding to the view
|
|
71
|
+
* @param context The context to be used for the draft operations
|
|
70
72
|
* @returns Nothing
|
|
71
73
|
*/
|
|
72
|
-
async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
|
|
73
|
-
// There is no active entity so we are editing either newly created data or
|
|
74
|
+
async function processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
|
|
75
|
+
// There is no active entity so, we are editing either newly created data or
|
|
74
76
|
// a draft which has never been saved to active version
|
|
75
77
|
// Since we want to react differently in the two situations, we have to check the
|
|
76
78
|
// dirty state
|
|
@@ -80,7 +82,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
80
82
|
// navigation we can silently discard the draft again
|
|
81
83
|
// eslint-disable-next-line promise/no-nesting
|
|
82
84
|
try {
|
|
83
|
-
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView);
|
|
85
|
+
await draftDataLossPopup.discardDraft(oController, bSkipBindingToView, context);
|
|
84
86
|
processFunctionForDrafts();
|
|
85
87
|
} catch (error) {
|
|
86
88
|
Log.error("Error while canceling the document", error);
|
|
@@ -91,8 +93,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
91
93
|
processFunctionForDrafts();
|
|
92
94
|
} else {
|
|
93
95
|
// In this case data is being changed or a forward navigation is triggered
|
|
94
|
-
// and we always want to show the
|
|
95
|
-
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
|
|
96
|
+
// and, we always want to show the data loss dialog on navigation
|
|
97
|
+
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
|
|
96
98
|
}
|
|
97
99
|
} else {
|
|
98
100
|
// We are editing a draft which has been created earlier but never saved to active
|
|
@@ -107,7 +109,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
107
109
|
*
|
|
108
110
|
* @param oController The current controller referenced.
|
|
109
111
|
* @param oContext The context of the current call
|
|
110
|
-
* @param processFunctionForDrafts The
|
|
112
|
+
* @param processFunctionForDrafts The function to process the handler
|
|
111
113
|
* @param navigationType The navigation type for which the function should be called
|
|
112
114
|
*/
|
|
113
115
|
async function processEditingDraftForExistingEntity(oController, oContext, processFunctionForDrafts, navigationType) {
|
|
@@ -115,8 +117,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
115
117
|
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
116
118
|
// never saved before, hence we're currently editing a newly created draft for
|
|
117
119
|
// an existing active entity for the first time.
|
|
118
|
-
// Also there have so far been no changes made to the draft and in this
|
|
119
|
-
// case we want to silently navigate and delete the
|
|
120
|
+
// Also, there have so far been no changes made to the draft and in this
|
|
121
|
+
// case we want to silently navigate and delete the draft in case of a back
|
|
120
122
|
// navigation but in case of a forward navigation we want to silently keep it!
|
|
121
123
|
if (navigationType === NavigationType.BackNavigation) {
|
|
122
124
|
const mParameters = {
|
|
@@ -136,17 +138,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
/**
|
|
139
|
-
* Logic to process the edit state dirty.
|
|
141
|
+
* Logic to process the context when the edit state is in dirty mode.
|
|
140
142
|
*
|
|
141
143
|
* @param oController The current controller referenced.
|
|
142
144
|
* @param fnCancelFunction The cancel function
|
|
143
|
-
* @param processFunctionForDrafts The
|
|
145
|
+
* @param processFunctionForDrafts The function to process the handler
|
|
144
146
|
* @param navigationType The navigation type for which the function should be called
|
|
145
147
|
* @param bSilentlyKeepDraftOnForwardNavigation The parameter to determine whether to skip the popup appearance in forward case
|
|
146
148
|
* @param bSkipBindingToView The optional parameter to skip the binding to the view.
|
|
149
|
+
* @param context The context to be used for the draft operations
|
|
147
150
|
* @returns Nothing
|
|
148
151
|
*/
|
|
149
|
-
async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView) {
|
|
152
|
+
async function processEditStateDirty(oController, fnCancelFunction, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView, context) {
|
|
150
153
|
if (navigationType === NavigationType.ForwardNavigation && bSilentlyKeepDraftOnForwardNavigation) {
|
|
151
154
|
// In case we have a "forward navigation" and an additional parameter set in the manifest
|
|
152
155
|
// we "silently" keep the draft
|
|
@@ -155,9 +158,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
155
158
|
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
156
159
|
// an existing draft and need to distinguish depending on if any changes
|
|
157
160
|
// have been made in the current editing session or not
|
|
158
|
-
// Changes have been made in the current editing session so we want
|
|
159
|
-
// to show the
|
|
160
|
-
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView));
|
|
161
|
+
// Changes have been made in the current editing session, so we want
|
|
162
|
+
// to show the data loss dialog and let the user decide
|
|
163
|
+
return dataLossDialog.open(oController).then(selectedKey => draftDataLossPopup.handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView, context));
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
|
|
@@ -165,7 +168,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
165
168
|
* Logic to process the admin data.
|
|
166
169
|
*
|
|
167
170
|
* @param draftAdminData Admin data
|
|
168
|
-
* @param fnProcessFunction The
|
|
171
|
+
* @param fnProcessFunction The function to process the handler
|
|
169
172
|
* @param fnCancelFunction The cancel function
|
|
170
173
|
* @param oContext The context of the current call
|
|
171
174
|
* @param oController The current controller referenced
|
|
@@ -186,7 +189,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
186
189
|
const bSilentlyKeepDraftOnForwardNavigation = silentlyKeepDraftOnForwardNavigation(oController);
|
|
187
190
|
if (draftAdminData) {
|
|
188
191
|
if (oController.getAppComponent().getRootViewController().isFclEnabled()) {
|
|
189
|
-
await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView);
|
|
192
|
+
await processFclMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, bSkipBindingToView, oContext);
|
|
190
193
|
} else if (!oContext.getObject().HasActiveEntity) {
|
|
191
194
|
processNoActiveEntityMode(draftAdminData, fnCancelFunction, oController, processFunctionForDrafts, navigationType, bSilentlyKeepDraftOnForwardNavigation, bSkipBindingToView);
|
|
192
195
|
} else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
@@ -196,7 +199,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
196
199
|
} else {
|
|
197
200
|
// The user started editing the existing draft but did not make any changes
|
|
198
201
|
// in the current editing session, so in this case we do not want
|
|
199
|
-
// to show the
|
|
202
|
+
// to show the data loss dialog but just keep the draft
|
|
200
203
|
processFunctionForDrafts();
|
|
201
204
|
}
|
|
202
205
|
} else {
|
|
@@ -223,15 +226,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
223
226
|
const isDraftRoot = entitySetName ? !!oMetaModel.getObject("/" + entitySetName + "@com.sap.vocabularies.Common.v1.DraftRoot") : false;
|
|
224
227
|
const oUIModel = oView.getModel("ui");
|
|
225
228
|
const bIsEditable = oUIModel.getProperty("/isEditable");
|
|
226
|
-
const
|
|
229
|
+
const originalContext = oContext;
|
|
230
|
+
let draftRootPath = oContext.getPath();
|
|
231
|
+
if (!isDraftRoot) {
|
|
232
|
+
draftRootPath = ModelHelper.getDraftRootPath(oContext) ?? draftRootPath;
|
|
233
|
+
}
|
|
234
|
+
oContext = oModel.bindContext(draftRootPath, undefined, {
|
|
235
|
+
$expand: "DraftAdministrativeData"
|
|
236
|
+
}).getBoundContext();
|
|
227
237
|
|
|
228
238
|
// Shouldn't display data loss popover on shell back navigation from sub-object pages
|
|
229
239
|
// or when object page is in display mode, or when the object is deleted
|
|
230
|
-
if (
|
|
240
|
+
if (originalContext.isDeleted() || !isDraftRoot && navigationType === NavigationType.BackNavigation || !bIsEditable) {
|
|
231
241
|
fnProcessFunction();
|
|
232
242
|
} else {
|
|
233
243
|
try {
|
|
234
|
-
const draftAdminData = await
|
|
244
|
+
const draftAdminData = await oContext.requestObject("DraftAdministrativeData");
|
|
235
245
|
await processDraftAdminData(draftAdminData, fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView, navigationType);
|
|
236
246
|
} catch (oError) {
|
|
237
247
|
Log.error("Cannot retrieve draftDataContext information", oError);
|
|
@@ -245,11 +255,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
245
255
|
* from EditFlow is called.
|
|
246
256
|
*
|
|
247
257
|
* @param controller Controller of the current view
|
|
258
|
+
* @param context The context to be used for the draft operations
|
|
248
259
|
* @returns A promise resolved if the save was successful
|
|
249
260
|
*/
|
|
250
|
-
async function saveDocument(controller) {
|
|
251
|
-
const
|
|
252
|
-
|
|
261
|
+
async function saveDocument(controller, context) {
|
|
262
|
+
const hasInitialContext = context !== undefined;
|
|
263
|
+
context = context ?? controller.getView().getBindingContext();
|
|
264
|
+
if (!hasInitialContext && controller.isA("sap.fe.templates.ObjectPage.ObjectPageController")) {
|
|
253
265
|
return controller._saveDocument();
|
|
254
266
|
} else {
|
|
255
267
|
return controller.editFlow.saveDocument(context, {});
|
|
@@ -261,10 +273,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
261
273
|
*
|
|
262
274
|
* @param controller Controller of the current view
|
|
263
275
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
276
|
+
* @param context The context to be used for the draft operations
|
|
264
277
|
* @returns A promise resolved if cancelDocument was successful
|
|
265
278
|
*/
|
|
266
|
-
async function discardDraft(controller, skipBindingToView) {
|
|
267
|
-
|
|
279
|
+
async function discardDraft(controller, skipBindingToView, context) {
|
|
280
|
+
context = context ?? controller.getView().getBindingContext();
|
|
268
281
|
const params = {
|
|
269
282
|
skipBackNavigation: true,
|
|
270
283
|
skipDiscardPopover: true,
|
|
@@ -274,18 +287,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
274
287
|
}
|
|
275
288
|
|
|
276
289
|
/**
|
|
277
|
-
* Executes the follow-up functions after an option was selected in the
|
|
290
|
+
* Executes the follow-up functions after an option was selected in the data loss dialog.
|
|
278
291
|
*
|
|
279
|
-
* @param selectedKey The key of the selected option from the
|
|
292
|
+
* @param selectedKey The key of the selected option from the data loss dialog
|
|
280
293
|
* @param processFunctionForDrafts The function to process the handler
|
|
281
294
|
* @param fnCancelFunction The function to process the handler
|
|
282
295
|
* @param controller Controller of the current view
|
|
283
296
|
* @param skipBindingToView The parameter to skip the binding to the view
|
|
297
|
+
* @param context The context to be used for the binding
|
|
284
298
|
*/
|
|
285
|
-
function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView) {
|
|
299
|
+
function handleDialogSelection(selectedKey, processFunctionForDrafts, fnCancelFunction, controller, skipBindingToView, context) {
|
|
286
300
|
switch (selectedKey) {
|
|
287
301
|
case DraftDataLossOptions.Save:
|
|
288
|
-
draftDataLossPopup.saveDocument(controller).then(context => processFunctionForDrafts(context)).catch(function (error) {
|
|
302
|
+
draftDataLossPopup.saveDocument(controller, context).then(context => processFunctionForDrafts(context)).catch(function (error) {
|
|
289
303
|
if (error === RecommendationDialogDecision.Continue) {
|
|
290
304
|
return fnCancelFunction();
|
|
291
305
|
}
|
|
@@ -298,7 +312,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
298
312
|
dataLossDialog.close();
|
|
299
313
|
break;
|
|
300
314
|
case DraftDataLossOptions.Discard:
|
|
301
|
-
draftDataLossPopup.discardDraft(controller, skipBindingToView).then(context => processFunctionForDrafts(context)).catch(function (error) {
|
|
315
|
+
draftDataLossPopup.discardDraft(controller, skipBindingToView, context).then(context => processFunctionForDrafts(context)).catch(function (error) {
|
|
302
316
|
Log.error("Error while discarding draft", error);
|
|
303
317
|
});
|
|
304
318
|
dataLossDialog.close();
|
|
@@ -322,4 +336,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/EditState", "../../controls/
|
|
|
322
336
|
};
|
|
323
337
|
return draftDataLossPopup;
|
|
324
338
|
}, false);
|
|
325
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2siLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsInJiU2lsZW50bHlLZWVwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsInByb2Nlc3NGY2xNb2RlIiwiZHJhZnRBZG1pbkRhdGEiLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwib3BlbiIsInRoZW4iLCJzZWxlY3RlZEtleSIsImRyYWZ0RGF0YUxvc3NQb3B1cCIsImhhbmRsZURpYWxvZ1NlbGVjdGlvbiIsInByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUiLCJuYXZpZ2F0aW9uVHlwZSIsImJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJFZGl0U3RhdGUiLCJpc0VkaXRTdGF0ZURpcnR5IiwiQmFja05hdmlnYXRpb24iLCJkaXNjYXJkRHJhZnQiLCJlcnJvciIsIkxvZyIsIkZvcndhcmROYXZpZ2F0aW9uIiwicHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5Iiwib0NvbnRleHQiLCJtUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVkaXRGbG93IiwiY2FuY2VsRG9jdW1lbnQiLCJwcm9jZXNzRWRpdFN0YXRlRGlydHkiLCJwcm9jZXNzRHJhZnRBZG1pbkRhdGEiLCJmblByb2Nlc3NGdW5jdGlvbiIsImNvbGxhYm9yYXRpb25Db25uZWN0ZWQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJpc0ZjbEVuYWJsZWQiLCJnZXRPYmplY3QiLCJIYXNBY3RpdmVFbnRpdHkiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIm9WaWV3IiwiZ2V0VmlldyIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsImlzRHJhZnRSb290Iiwib1VJTW9kZWwiLCJiSXNFZGl0YWJsZSIsImdldFByb3BlcnR5IiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0UGF0aCIsImdldEJvdW5kQ29udGV4dCIsImlzRGVsZXRlZCIsInJlcXVlc3RPYmplY3QiLCJvRXJyb3IiLCJzYXZlRG9jdW1lbnQiLCJjb250cm9sbGVyIiwiY29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNBIiwiX3NhdmVEb2N1bWVudCIsInNraXBCaW5kaW5nVG9WaWV3IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwidW5kZWZpbmVkIiwiU2F2ZSIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnREYXRhTG9zc1BvcHVwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgRHJhZnREYXRhTG9zc0RpYWxvZ0Jsb2NrIGZyb20gXCIuLi8uLi9jb250cm9scy9EYXRhTG9zc09yRHJhZnREaXNjYXJkL0RyYWZ0RGF0YUxvc3NEaWFsb2cuYmxvY2tcIjtcbmltcG9ydCB7IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfSBmcm9tIFwiLi4vLi4vY29udHJvbHMvUmVjb21tZW5kYXRpb25zL0NvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZy5ibG9ja1wiO1xuXG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG5cbi8qIEVudW0gdHlwZXMgZm9yIHRoZSBkYXRhbG9zcyBkaWFsb2cgb3B0aW9ucyAqL1xuZW51bSBEcmFmdERhdGFMb3NzT3B0aW9ucyB7XG5cdFNhdmUgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25TYXZlXCIsXG5cdEtlZXAgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25LZWVwXCIsXG5cdERpc2NhcmQgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25EaXNjYXJkXCJcbn1cblxudHlwZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSA9IHtcblx0Q3JlYXRpb25EYXRlVGltZTogRGF0ZTtcblx0TGFzdENoYW5nZURhdGVUaW1lOiBEYXRlO1xufTtcblxuLypDcmVhdGUgdGhlIGRhdGFsb3NzIGRpYWxvZyovXG5jb25zdCBkYXRhTG9zc0RpYWxvZyA9IG5ldyBEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2soe30pO1xuXG4vKipcbiAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgaW4gY2FzZSBhIGZvcndhcmQgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250cm9sbGVyIFRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgd2l0aCB0cnVlIG9yIGZhbHNlIHRvIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0XG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihwYWdlQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiBib29sZWFuIHtcblx0bGV0IHJiU2lsZW50bHlLZWVwID0gZmFsc2U7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHBhZ2VDb250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuZmVcIik7XG5cdHJiU2lsZW50bHlLZWVwID0gb01hbmlmZXN0Py5hcHA/LnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiB8fCBmYWxzZTtcblx0cmV0dXJuIHJiU2lsZW50bHlLZWVwO1xufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGZjbCBtb2RlLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBUaGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBGQ0wgbW9kZSBzbyBpbiB0aGlzIGNhc2Ugd2UgZmFsbCBiYWNrIHRvXG5cdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdC8vIGZvciBGQ0wuXG5cdGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdC5vcGVuKG9Db250cm9sbGVyKVxuXHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdHNlbGVjdGVkS2V5IGFzIHN0cmluZyxcblx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIG1vZGUgd2l0aCBubyBhY3RpdmUgZW50aXR5LlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvbiBUaGUgY2FuY2VsIGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzIFRoZSBmdW5jdG9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBUaGVyZSBpcyBubyBhY3RpdmUgZW50aXR5IHNvIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0Ly8gaW4gY2FzZSB3ZSBoYXZlIHVudG91Y2hlZCBjaGFuZ2VzIGZvciB0aGUgZHJhZnQgYW5kIGEgXCJiYWNrXCJcblx0XHRcdC8vIG5hdmlnYXRpb24gd2UgY2FuIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRyYWZ0IGFnYWluXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9uby1uZXN0aW5nXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBkcmFmdERhdGFMb3NzUG9wdXAuZGlzY2FyZERyYWZ0KG9Db250cm9sbGVyLCBiU2tpcEJpbmRpbmdUb1ZpZXcpO1xuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0Ly8gYW5kIHdlIGFsd2F5cyB3YW50IHRvIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRyZXR1cm4gZGF0YUxvc3NEaWFsb2dcblx0XHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0XHRkcmFmdERhdGFMb3NzUG9wdXAuaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGRyYWZ0IGVkaXRpbmcgZm9yIGV4aXN0aW5nIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0b24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eShcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFdlIGFyZSBlZGl0aW5nIGEgZHJhZnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHlcblx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdC8vIG5ldmVyIHNhdmVkIGJlZm9yZSwgaGVuY2Ugd2UncmUgY3VycmVudGx5IGVkaXRpbmcgYSBuZXdseSBjcmVhdGVkIGRyYWZ0IGZvclxuXHQvLyBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5IGZvciB0aGUgZmlyc3QgdGltZS5cblx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0Ly8gY2FzZSB3ZSB3YW50IHRvIHNpbGVudGx5IG5hdmlnYXRlIGFuZCBkZWxldGUgdGhlIGRyYWZ0aW4gY2FzZSBvZiBhIGJhY2tcblx0Ly8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb0NvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIEVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBhbmQgb25seVxuXHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgZWRpdCBzdGF0ZSBkaXJ0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3RvbiB0byBwcm9jZXNzIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEBwYXJhbSBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIFRoZSBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2tpcCB0aGUgcG9wdXAgYXBwZWFyYW5jZSBpbiBmb3J3YXJkIGNhc2VcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3LlxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb24gJiYgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbikge1xuXHRcdC8vIEluIGNhc2Ugd2UgaGF2ZSBhIFwiZm9yd2FyZCBuYXZpZ2F0aW9uXCIgYW5kIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBpbiB0aGUgbWFuaWZlc3Rcblx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBUaGUgQ3JlYXRpb25EYXRlVGltZSBhbmQgTGFzdENoYW5nZURhdGVUaW1lIGFyZSBOT1QgZXF1YWwsIHNvIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZ1xuXHRcdC8vIGFuIGV4aXN0aW5nIGRyYWZ0IGFuZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIGRlcGVuZGluZyBvbiBpZiBhbnkgY2hhbmdlc1xuXHRcdC8vIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBvciBub3Rcblx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YWxvc3MgZGlhbG9nIGFuZCBsZXQgdGhlIHVzZXIgZGVjaWRlXG5cdFx0cmV0dXJuIGRhdGFMb3NzRGlhbG9nXG5cdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdC50aGVuKChzZWxlY3RlZEtleSkgPT5cblx0XHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwLmhhbmRsZURpYWxvZ1NlbGVjdGlvbihcblx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb24gVGhlIGZ1bmN0b24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RyYWZ0QWRtaW5EYXRhKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLmFwcGx5KG51bGwsIC4uLmFyZ3MpO1xuXHRcdCAgfTtcblxuXHRjb25zdCBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uID0gc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKG9Db250cm9sbGVyKTtcblxuXHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGF3YWl0IHByb2Nlc3NGY2xNb2RlKGRyYWZ0QWRtaW5EYXRhLCBmbkNhbmNlbEZ1bmN0aW9uLCBvQ29udHJvbGxlciwgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLCBiU2tpcEJpbmRpbmdUb1ZpZXcpO1xuXHRcdH0gZWxzZSBpZiAoIW9Db250ZXh0LmdldE9iamVjdCgpLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0cHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lID09PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWUpIHtcblx0XHRcdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eShvQ29udHJvbGxlciwgb0NvbnRleHQsIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cywgbmF2aWdhdGlvblR5cGUpO1xuXHRcdH0gZWxzZSBpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0cHJvY2Vzc0VkaXRTdGF0ZURpcnR5KFxuXHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRuYXZpZ2F0aW9uVHlwZSxcblx0XHRcdFx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlTZXROYW1lID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgeyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSkuZW50aXR5U2V0O1xuXHRjb25zdCBpc0RyYWZ0Um9vdCA9IGVudGl0eVNldE5hbWUgPyAhIW9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZW50aXR5U2V0TmFtZSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIikgOiBmYWxzZTtcblx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdC8vIFNob3VsZG4ndCBkaXNwbGF5IGRhdGEgbG9zcyBwb3BvdmVyIG9uIHNoZWxsIGJhY2sgbmF2aWdhdGlvbiBmcm9tIHN1Yi1vYmplY3QgcGFnZXNcblx0Ly8gb3Igd2hlbiBvYmplY3QgcGFnZSBpcyBpbiBkaXNwbGF5IG1vZGUsIG9yIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkXG5cdGlmIChvQ29udGV4dC5pc0RlbGV0ZWQoKSB8fCAoIWlzRHJhZnRSb290ICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdGF3YWl0IHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0XHRcdFx0ZHJhZnRBZG1pbkRhdGEsXG5cdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGVcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uKCk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogU2F2ZXMgdGhlIGRvY3VtZW50LiBJZiB0aGUgY29udHJvbGxlciBpcyBvZiB0eXBlIE9iamVjdFBhZ2UsIHRoZW4gaW50ZXJuYWwgX3NhdmVEb2N1bWVudCBpcyBjYWxsZWQsIG90aGVyd2lzZSBzYXZlRG9jdW1lbnRcbiAqIGZyb20gRWRpdEZsb3cgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmVkIGlmIHRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVEb2N1bWVudChjb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0aWYgKGNvbnRyb2xsZXIuaXNBPE9iamVjdFBhZ2VDb250cm9sbGVyQ29udHJvbGxlcj4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIikpIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5fc2F2ZURvY3VtZW50KCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHt9KTtcblx0fVxufVxuXG4vKipcbiAqIERpc2NhcmRzIHRoZSBkcmFmdC5cbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBUaGUgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiBjYW5jZWxEb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoY29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdGNvbnN0IGNvbnRleHQgPSBjb250cm9sbGVyLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0c2tpcEJhY2tOYXZpZ2F0aW9uOiB0cnVlLFxuXHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZSxcblx0XHRza2lwQmluZGluZ1RvVmlldzogc2tpcEJpbmRpbmdUb1ZpZXcgIT09IHVuZGVmaW5lZCA/IHNraXBCaW5kaW5nVG9WaWV3IDogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5jYW5jZWxEb2N1bWVudChjb250ZXh0LCBwYXJhbXMpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBmb2xsb3ctdXAgZnVuY3Rpb25zIGFmdGVyIGFuIG9wdGlvbiB3YXMgc2VsZWN0ZWQgaW4gdGhlIGRhdGFsb3NzIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gc2VsZWN0ZWRLZXkgVGhlIGtleSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gdGhlIGRhdGFsb3NzIGRpYWxvZ1xuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICovXG5mdW5jdGlvbiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdHNlbGVjdGVkS2V5OiBzdHJpbmcsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRjb250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0c2tpcEJpbmRpbmdUb1ZpZXc6IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlcilcblx0XHRcdFx0LnRoZW4oKGNvbnRleHQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoY29udGV4dCkpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChlcnJvciA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5LZWVwOlxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3KVxuXHRcdFx0XHQudGhlbigoY29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhjb250ZXh0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRhTG9zc1Bv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
|
|
339
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZpZ2F0aW9uVHlwZSIsIkRyYWZ0RGF0YUxvc3NPcHRpb25zIiwiZGF0YUxvc3NEaWFsb2ciLCJEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2siLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJwYWdlQ29udHJvbGxlciIsInJiU2lsZW50bHlLZWVwIiwib01hbmlmZXN0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsInByb2Nlc3NGY2xNb2RlIiwiZHJhZnRBZG1pbkRhdGEiLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJjb250ZXh0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsIm9wZW4iLCJ0aGVuIiwic2VsZWN0ZWRLZXkiLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJoYW5kbGVEaWFsb2dTZWxlY3Rpb24iLCJwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlIiwibmF2aWdhdGlvblR5cGUiLCJiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIkJhY2tOYXZpZ2F0aW9uIiwiZGlzY2FyZERyYWZ0IiwiZXJyb3IiLCJMb2ciLCJGb3J3YXJkTmF2aWdhdGlvbiIsInByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eSIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50IiwicHJvY2Vzc0VkaXRTdGF0ZURpcnR5IiwicHJvY2Vzc0RyYWZ0QWRtaW5EYXRhIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJjb2xsYWJvcmF0aW9uQ29ubmVjdGVkIiwiY29sbGFib3JhdGl2ZURyYWZ0IiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwiYXJncyIsImFwcGx5IiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiaXNGY2xFbmFibGVkIiwiZ2V0T2JqZWN0IiwiSGFzQWN0aXZlRW50aXR5IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJvVmlldyIsImdldFZpZXciLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJlbnRpdHlTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJpc0RyYWZ0Um9vdCIsIm9VSU1vZGVsIiwiYklzRWRpdGFibGUiLCJnZXRQcm9wZXJ0eSIsIm9yaWdpbmFsQ29udGV4dCIsImRyYWZ0Um9vdFBhdGgiLCJnZXRQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXREcmFmdFJvb3RQYXRoIiwiYmluZENvbnRleHQiLCJ1bmRlZmluZWQiLCIkZXhwYW5kIiwiZ2V0Qm91bmRDb250ZXh0IiwiaXNEZWxldGVkIiwicmVxdWVzdE9iamVjdCIsIm9FcnJvciIsInNhdmVEb2N1bWVudCIsImNvbnRyb2xsZXIiLCJoYXNJbml0aWFsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNBIiwiX3NhdmVEb2N1bWVudCIsInNraXBCaW5kaW5nVG9WaWV3IiwicGFyYW1zIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwiU2F2ZSIsImNhdGNoIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2xvc2UiLCJLZWVwIiwiRGlzY2FyZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnREYXRhTG9zc1BvcHVwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlQ29udHJvbGxlckNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBEcmFmdERhdGFMb3NzRGlhbG9nQmxvY2sgZnJvbSBcIi4uLy4uL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRHJhZnREYXRhTG9zc0RpYWxvZy5ibG9ja1wiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi8uLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nLmJsb2NrXCI7XG5cbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cblxuLyogRW51bSB0eXBlcyBmb3IgdGhlIGRhdGEgbG9zcyBkaWFsb2cgb3B0aW9ucyAqL1xuZW51bSBEcmFmdERhdGFMb3NzT3B0aW9ucyB7XG5cdFNhdmUgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25TYXZlXCIsXG5cdEtlZXAgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25LZWVwXCIsXG5cdERpc2NhcmQgPSBcImRyYWZ0RGF0YUxvc3NPcHRpb25EaXNjYXJkXCJcbn1cblxudHlwZSBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSA9IHtcblx0Q3JlYXRpb25EYXRlVGltZTogRGF0ZTtcblx0TGFzdENoYW5nZURhdGVUaW1lOiBEYXRlO1xufTtcblxuLypDcmVhdGUgdGhlIGRhdGEgbG9zcyBkaWFsb2cqL1xuY29uc3QgZGF0YUxvc3NEaWFsb2cgPSBuZXcgRHJhZnREYXRhTG9zc0RpYWxvZ0Jsb2NrKHt9KTtcblxuLyoqXG4gKiBUaGUgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpbiB0aGUgbWFuaWZlc3QgaXMgc2V0IHRvIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGluIGNhc2UgYSBmb3J3YXJkIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBwYXJhbSBwYWdlQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFBhZ2VDb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdpdGggdHJ1ZSBvciBmYWxzZSB0byBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdFxuICovXG5mdW5jdGlvbiBzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24ocGFnZUNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyKTogYm9vbGVhbiB7XG5cdGxldCByYlNpbGVudGx5S2VlcDtcblx0Y29uc3Qgb01hbmlmZXN0ID0gcGFnZUNvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKTtcblx0cmJTaWxlbnRseUtlZXAgPSBvTWFuaWZlc3Q/LmFwcD8uc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIHx8IGZhbHNlO1xuXHRyZXR1cm4gcmJTaWxlbnRseUtlZXA7XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgRkNMIG1vZGUuXG4gKlxuICogQHBhcmFtIGRyYWZ0QWRtaW5EYXRhIEFkbWluIGRhdGFcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY3VycmVudCBjb250cm9sbGVyIHJlZmVyZW5jZWRcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXcgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciB0byBza2lwIHRoZSBiaW5kaW5nIHRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGY2xNb2RlKFxuXHRkcmFmdEFkbWluRGF0YTogRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEsXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0Ly8gdGhlIG9sZCBsb2dpYyBzaW5jZSB0aGUgZGlydHkgc3RhdGUgaGFuZGxpbmcgaXMgbm90IHByb3Blcmx5IHdvcmtpbmdcblx0Ly8gZm9yIEZDTC5cblx0aWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBtb2RlIHdpdGggbm8gYWN0aXZlIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gZHJhZnRBZG1pbkRhdGEgQWRtaW4gZGF0YVxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGNhbmNlbCBmdW5jdGlvblxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZFxuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcGFyYW0gYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiBUaGUgcGFyYW1ldGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNraXAgdGhlIHBvcHVwIGFwcGVhcmFuY2UgaW4gZm9yd2FyZCBjYXNlXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIE5vdGhpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05vQWN0aXZlRW50aXR5TW9kZShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUsXG5cdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdGJTa2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28sIHdlIGFyZSBlZGl0aW5nIGVpdGhlciBuZXdseSBjcmVhdGVkIGRhdGEgb3Jcblx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHQvLyBTaW5jZSB3ZSB3YW50IHRvIHJlYWN0IGRpZmZlcmVudGx5IGluIHRoZSB0d28gc2l0dWF0aW9ucywgd2UgaGF2ZSB0byBjaGVjayB0aGVcblx0Ly8gZGlydHkgc3RhdGVcblx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0Ly8gaW4gY2FzZSB3ZSBoYXZlIHVudG91Y2hlZCBjaGFuZ2VzIGZvciB0aGUgZHJhZnQgYW5kIGEgXCJiYWNrXCJcblx0XHRcdC8vIG5hdmlnYXRpb24gd2UgY2FuIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRyYWZ0IGFnYWluXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9uby1uZXN0aW5nXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBkcmFmdERhdGFMb3NzUG9wdXAuZGlzY2FyZERyYWZ0KG9Db250cm9sbGVyLCBiU2tpcEJpbmRpbmdUb1ZpZXcsIGNvbnRleHQpO1xuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0XHQvLyBJbiBjYXNlIHdlIGhhdmUgYSBcImZvcndhcmQgbmF2aWdhdGlvblwiIGFuZCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHQvLyB3ZSBcInNpbGVudGx5XCIga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgZGF0YSBpcyBiZWluZyBjaGFuZ2VkIG9yIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHRcdFx0Ly8gYW5kLCB3ZSBhbHdheXMgd2FudCB0byBzaG93IHRoZSBkYXRhIGxvc3MgZGlhbG9nIG9uIG5hdmlnYXRpb25cblx0XHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0XHQub3BlbihvQ29udHJvbGxlcilcblx0XHRcdFx0LnRoZW4oKHNlbGVjdGVkS2V5KSA9PlxuXHRcdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0XHRzZWxlY3RlZEtleSBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljIHRvIHByb2Nlc3MgdGhlIGRyYWZ0IGVkaXRpbmcgZm9yIGV4aXN0aW5nIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGNhbGxcbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdGluZ0RyYWZ0Rm9yRXhpc3RpbmdFbnRpdHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGVcbik6IFByb21pc2U8dm9pZD4ge1xuXHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZW50aXR5XG5cdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIGVxdWFsLCBzbyB0aGlzIGRyYWZ0IHdhc1xuXHQvLyBuZXZlciBzYXZlZCBiZWZvcmUsIGhlbmNlIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nIGEgbmV3bHkgY3JlYXRlZCBkcmFmdCBmb3Jcblx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdC8vIEFsc28sIHRoZXJlIGhhdmUgc28gZmFyIGJlZW4gbm8gY2hhbmdlcyBtYWRlIHRvIHRoZSBkcmFmdCBhbmQgaW4gdGhpc1xuXHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0Ly8gbmF2aWdhdGlvbiBidXQgaW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIHNpbGVudGx5IGtlZXAgaXQhXG5cdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogdHJ1ZVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb0NvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIEVycm9yKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIGZvcndhcmQgbmF2aWdhdGlvbiB3ZSBzaWxlbnRseSBrZWVwIHRoZSBkcmFmdCBhbmQgb25seVxuXHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9XG59XG5cbi8qKlxuICogTG9naWMgdG8gcHJvY2VzcyB0aGUgY29udGV4dCB3aGVuIHRoZSBlZGl0IHN0YXRlIGlzIGluIGRpcnR5IG1vZGUuXG4gKlxuICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjdXJyZW50IGNvbnRyb2xsZXIgcmVmZXJlbmNlZC5cbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogQHBhcmFtIGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24gVGhlIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBza2lwIHRoZSBwb3B1cCBhcHBlYXJhbmNlIGluIGZvcndhcmQgY2FzZVxuICogQHBhcmFtIGJTa2lwQmluZGluZ1RvVmlldyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNraXAgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcuXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgZHJhZnQgb3BlcmF0aW9uc1xuICogQHJldHVybnMgTm90aGluZ1xuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0czogRnVuY3Rpb24sXG5cdG5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZSxcblx0YlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogYm9vbGVhbixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5Gb3J3YXJkTmF2aWdhdGlvbiAmJiBiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uKSB7XG5cdFx0Ly8gSW4gY2FzZSB3ZSBoYXZlIGEgXCJmb3J3YXJkIG5hdmlnYXRpb25cIiBhbmQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGluIHRoZSBtYW5pZmVzdFxuXHRcdC8vIHdlIFwic2lsZW50bHlcIiBrZWVwIHRoZSBkcmFmdFxuXHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdC8vIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyB3ZSB3YW50XG5cdFx0Ly8gdG8gc2hvdyB0aGUgZGF0YSBsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxuXHRcdHJldHVybiBkYXRhTG9zc0RpYWxvZ1xuXHRcdFx0Lm9wZW4ob0NvbnRyb2xsZXIpXG5cdFx0XHQudGhlbigoc2VsZWN0ZWRLZXkpID0+XG5cdFx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cC5oYW5kbGVEaWFsb2dTZWxlY3Rpb24oXG5cdFx0XHRcdFx0c2VsZWN0ZWRLZXkgYXMgc3RyaW5nLFxuXHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpYyB0byBwcm9jZXNzIHRoZSBhZG1pbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBkcmFmdEFkbWluRGF0YSBBZG1pbiBkYXRhXG4gKiBAcGFyYW0gZm5Qcm9jZXNzRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBmbkNhbmNlbEZ1bmN0aW9uIFRoZSBjYW5jZWwgZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBjYWxsXG4gKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGN1cnJlbnQgY29udHJvbGxlciByZWZlcmVuY2VkXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3IFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIG5hdmlnYXRpb25UeXBlIFRoZSBuYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4gKiBAcmV0dXJucyBOb3RoaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEcmFmdEFkbWluRGF0YShcblx0ZHJhZnRBZG1pbkRhdGE6IERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLFxuXHRmblByb2Nlc3NGdW5jdGlvbjogRnVuY3Rpb24sXG5cdGZuQ2FuY2VsRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBjb2xsYWJvcmF0aW9uQ29ubmVjdGVkID0gb0NvbnRyb2xsZXIuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCk7XG5cdGNvbnN0IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyA9ICFjb2xsYWJvcmF0aW9uQ29ubmVjdGVkXG5cdFx0PyBmblByb2Nlc3NGdW5jdGlvblxuXHRcdDogZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0XHRvQ29udHJvbGxlci5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbi5hcHBseShudWxsLCAuLi5hcmdzKTtcblx0XHQgIH07XG5cblx0Y29uc3QgYlNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbiA9IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbihvQ29udHJvbGxlcik7XG5cblx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0aWYgKG9Db250cm9sbGVyLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRmNsTW9kZShkcmFmdEFkbWluRGF0YSwgZm5DYW5jZWxGdW5jdGlvbiwgb0NvbnRyb2xsZXIsIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cywgYlNraXBCaW5kaW5nVG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fSBlbHNlIGlmICghb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRwcm9jZXNzTm9BY3RpdmVFbnRpdHlNb2RlKFxuXHRcdFx0XHRkcmFmdEFkbWluRGF0YSxcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyxcblx0XHRcdFx0bmF2aWdhdGlvblR5cGUsXG5cdFx0XHRcdGJTaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdFx0XHRcdGJTa2lwQmluZGluZ1RvVmlld1xuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdFx0cHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5KG9Db250cm9sbGVyLCBvQ29udGV4dCwgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLCBuYXZpZ2F0aW9uVHlwZSk7XG5cdFx0fSBlbHNlIGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRwcm9jZXNzRWRpdFN0YXRlRGlydHkoXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlLFxuXHRcdFx0XHRiU2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGEgbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGdlbmVyYWwgaGFuZGxlciBpbiB3aGljaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyBhcmUgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0Zm5DYW5jZWxGdW5jdGlvbjogRnVuY3Rpb24sXG5cdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9WaWV3ID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpO1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBlbnRpdHlTZXROYW1lID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgeyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSkuZW50aXR5U2V0O1xuXHRjb25zdCBpc0RyYWZ0Um9vdCA9IGVudGl0eVNldE5hbWUgPyAhIW9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZW50aXR5U2V0TmFtZSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIikgOiBmYWxzZTtcblx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldy5nZXRNb2RlbChcInVpXCIpO1xuXHRjb25zdCBiSXNFZGl0YWJsZSA9IG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdGNvbnN0IG9yaWdpbmFsQ29udGV4dCA9IG9Db250ZXh0O1xuXHRsZXQgZHJhZnRSb290UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0aWYgKCFpc0RyYWZ0Um9vdCkge1xuXHRcdGRyYWZ0Um9vdFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KSA/PyBkcmFmdFJvb3RQYXRoO1xuXHR9XG5cdG9Db250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGRyYWZ0Um9vdFBhdGgsIHVuZGVmaW5lZCwgeyAkZXhwYW5kOiBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIgfSkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cblx0Ly8gU2hvdWxkbid0IGRpc3BsYXkgZGF0YSBsb3NzIHBvcG92ZXIgb24gc2hlbGwgYmFjayBuYXZpZ2F0aW9uIGZyb20gc3ViLW9iamVjdCBwYWdlc1xuXHQvLyBvciB3aGVuIG9iamVjdCBwYWdlIGlzIGluIGRpc3BsYXkgbW9kZSwgb3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWRcblx0aWYgKG9yaWdpbmFsQ29udGV4dC5pc0RlbGV0ZWQoKSB8fCAoIWlzRHJhZnRSb290ICYmIG5hdmlnYXRpb25UeXBlID09PSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvbikgfHwgIWJJc0VkaXRhYmxlKSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRhd2FpdCBwcm9jZXNzRHJhZnRBZG1pbkRhdGEoXG5cdFx0XHRcdGRyYWZ0QWRtaW5EYXRhLFxuXHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbixcblx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXcsXG5cdFx0XHRcdG5hdmlnYXRpb25UeXBlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIGRyYWZ0RGF0YUNvbnRleHQgaW5mb3JtYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBkb2N1bWVudC4gSWYgdGhlIGNvbnRyb2xsZXIgaXMgb2YgdHlwZSBPYmplY3RQYWdlLCB0aGVuIGludGVybmFsIF9zYXZlRG9jdW1lbnQgaXMgY2FsbGVkLCBvdGhlcndpc2Ugc2F2ZURvY3VtZW50XG4gKiBmcm9tIEVkaXRGbG93IGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciBDb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBkcmFmdCBvcGVyYXRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2ZWQgaWYgdGhlIHNhdmUgd2FzIHN1Y2Nlc3NmdWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZURvY3VtZW50KGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBjb250ZXh0PzogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0Y29uc3QgaGFzSW5pdGlhbENvbnRleHQgPSBjb250ZXh0ICE9PSB1bmRlZmluZWQ7XG5cdGNvbnRleHQgPSBjb250ZXh0ID8/IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGlmICghaGFzSW5pdGlhbENvbnRleHQgJiYgY29udHJvbGxlci5pc0E8T2JqZWN0UGFnZUNvbnRyb2xsZXJDb250cm9sbGVyPihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKSkge1xuXHRcdHJldHVybiBjb250cm9sbGVyLl9zYXZlRG9jdW1lbnQoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29udHJvbGxlci5lZGl0Rmxvdy5zYXZlRG9jdW1lbnQoY29udGV4dCwge30pO1xuXHR9XG59XG5cbi8qKlxuICogRGlzY2FyZHMgdGhlIGRyYWZ0LlxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWZ0IG9wZXJhdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCBpZiBjYW5jZWxEb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bFxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNjYXJkRHJhZnQoXG5cdGNvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLFxuXHRza2lwQmluZGluZ1RvVmlldzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0Y29udGV4dD86IE9EYXRhVjRDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcblx0Y29udGV4dCA9IGNvbnRleHQgPz8gY29udHJvbGxlci5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdHNraXBCYWNrTmF2aWdhdGlvbjogdHJ1ZSxcblx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IHRydWUsXG5cdFx0c2tpcEJpbmRpbmdUb1ZpZXc6IHNraXBCaW5kaW5nVG9WaWV3ICE9PSB1bmRlZmluZWQgPyBza2lwQmluZGluZ1RvVmlldyA6IHRydWVcblx0fTtcblx0cmV0dXJuIGNvbnRyb2xsZXIuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQoY29udGV4dCwgcGFyYW1zKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZm9sbG93LXVwIGZ1bmN0aW9ucyBhZnRlciBhbiBvcHRpb24gd2FzIHNlbGVjdGVkIGluIHRoZSBkYXRhIGxvc3MgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBzZWxlY3RlZEtleSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSB0aGUgZGF0YSBsb3NzIGRpYWxvZ1xuICogQHBhcmFtIHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgaGFuZGxlclxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSBjb250cm9sbGVyIENvbnRyb2xsZXIgb2YgdGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHNraXBCaW5kaW5nVG9WaWV3IFRoZSBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgYmluZGluZyB0byB0aGUgdmlld1xuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gaGFuZGxlRGlhbG9nU2VsZWN0aW9uKFxuXHRzZWxlY3RlZEtleTogc3RyaW5nLFxuXHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHM6IEZ1bmN0aW9uLFxuXHRmbkNhbmNlbEZ1bmN0aW9uOiBGdW5jdGlvbixcblx0Y29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsXG5cdHNraXBCaW5kaW5nVG9WaWV3OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuXHRjb250ZXh0PzogT0RhdGFWNENvbnRleHRcbik6IHZvaWQge1xuXHRzd2l0Y2ggKHNlbGVjdGVkS2V5KSB7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5TYXZlOlxuXHRcdFx0ZHJhZnREYXRhTG9zc1BvcHVwXG5cdFx0XHRcdC5zYXZlRG9jdW1lbnQoY29udHJvbGxlciwgY29udGV4dClcblx0XHRcdFx0LnRoZW4oKGNvbnRleHQ/KSA9PiBwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoY29udGV4dCkpXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChlcnJvciA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuQ2FuY2VsRnVuY3Rpb24oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBEcmFmdERhdGFMb3NzT3B0aW9ucy5LZWVwOlxuXHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRHJhZnREYXRhTG9zc09wdGlvbnMuRGlzY2FyZDpcblx0XHRcdGRyYWZ0RGF0YUxvc3NQb3B1cFxuXHRcdFx0XHQuZGlzY2FyZERyYWZ0KGNvbnRyb2xsZXIsIHNraXBCaW5kaW5nVG9WaWV3LCBjb250ZXh0KVxuXHRcdFx0XHQudGhlbigoY29udGV4dD8pID0+IHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyhjb250ZXh0KSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0ZGF0YUxvc3NEaWFsb2cuY2xvc2UoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRmbkNhbmNlbEZ1bmN0aW9uKCk7XG5cdFx0XHRkYXRhTG9zc0RpYWxvZy5jbG9zZSgpO1xuXHR9XG59XG5cbmNvbnN0IGRyYWZ0RGF0YUxvc3NQb3B1cCA9IHtcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlLFxuXHRwcm9jZXNzRmNsTW9kZTogcHJvY2Vzc0ZjbE1vZGUsXG5cdHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGU6IHByb2Nlc3NOb0FjdGl2ZUVudGl0eU1vZGUsXG5cdHByb2Nlc3NFZGl0aW5nRHJhZnRGb3JFeGlzdGluZ0VudGl0eTogcHJvY2Vzc0VkaXRpbmdEcmFmdEZvckV4aXN0aW5nRW50aXR5LFxuXHRwcm9jZXNzRWRpdFN0YXRlRGlydHk6IHByb2Nlc3NFZGl0U3RhdGVEaXJ0eSxcblx0aGFuZGxlRGlhbG9nU2VsZWN0aW9uOiBoYW5kbGVEaWFsb2dTZWxlY3Rpb24sXG5cdHNhdmVEb2N1bWVudDogc2F2ZURvY3VtZW50LFxuXHRkaXNjYXJkRHJhZnQ6IGRpc2NhcmREcmFmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnREYXRhTG9zc1BvcHVwO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztFQVNBO0VBQUEsSUFDS0EsY0FBYztFQUtuQjtFQUFBLFdBTEtBLGNBQWM7SUFBZEEsY0FBYztJQUFkQSxjQUFjO0VBQUEsR0FBZEEsY0FBYyxLQUFkQSxjQUFjO0VBQUEsSUFNZEMsb0JBQW9CO0VBQUEsV0FBcEJBLG9CQUFvQjtJQUFwQkEsb0JBQW9CO0lBQXBCQSxvQkFBb0I7SUFBcEJBLG9CQUFvQjtFQUFBLEdBQXBCQSxvQkFBb0IsS0FBcEJBLG9CQUFvQjtFQVd6QjtFQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0Msb0NBQW9DLENBQUNDLGNBQThCLEVBQVc7SUFBQTtJQUN0RixJQUFJQyxjQUFjO0lBQ2xCLE1BQU1DLFNBQVMsR0FBR0YsY0FBYyxDQUFDRyxlQUFlLEVBQUUsQ0FBQ0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQzdFSCxjQUFjLEdBQUcsQ0FBQUMsU0FBUyxhQUFUQSxTQUFTLHlDQUFUQSxTQUFTLENBQUVHLEdBQUcsbURBQWQsZUFBZ0JOLG9DQUFvQyxLQUFJLEtBQUs7SUFDOUUsT0FBT0UsY0FBYztFQUN0Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUssY0FBYyxDQUM1QkMsY0FBdUMsRUFDdkNDLGdCQUEwQixFQUMxQkMsV0FBMkIsRUFDM0JDLHdCQUFrQyxFQUNsQ0Msa0JBQTRCLEVBQzVCQyxPQUF3QixFQUNSO0lBQ2hCO0lBQ0E7SUFDQTtJQUNBLElBQUlMLGNBQWMsQ0FBQ00sZ0JBQWdCLEtBQUtOLGNBQWMsQ0FBQ08sa0JBQWtCLEVBQUU7TUFDMUUsT0FBT2pCLGNBQWMsQ0FDbkJrQixJQUFJLENBQUNOLFdBQVcsQ0FBQyxDQUNqQk8sSUFBSSxDQUFFQyxXQUFXLElBQ2pCQyxrQkFBa0IsQ0FBQ0MscUJBQXFCLENBQ3ZDRixXQUFXLEVBQ1hQLHdCQUF3QixFQUN4QkYsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkMsT0FBTyxDQUNQLENBQ0Q7SUFDSCxDQUFDLE1BQU07TUFDTkYsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVVLHlCQUF5QixDQUN2Q2IsY0FBdUMsRUFDdkNDLGdCQUEwQixFQUMxQkMsV0FBMkIsRUFDM0JDLHdCQUFrQyxFQUNsQ1csY0FBOEIsRUFDOUJDLHFDQUE4QyxFQUM5Q1gsa0JBQTRCLEVBQzVCQyxPQUF3QixFQUNSO0lBQ2hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFBSVcsU0FBUyxDQUFDQyxnQkFBZ0IsRUFBRSxFQUFFO01BQ2pDLElBQUlqQixjQUFjLENBQUNNLGdCQUFnQixLQUFLTixjQUFjLENBQUNPLGtCQUFrQixJQUFJTyxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFjLEVBQUU7UUFDOUg7UUFDQTtRQUNBO1FBQ0EsSUFBSTtVQUNILE1BQU1QLGtCQUFrQixDQUFDUSxZQUFZLENBQUNqQixXQUFXLEVBQUVFLGtCQUFrQixFQUFFQyxPQUFPLENBQUM7VUFDL0VGLHdCQUF3QixFQUFFO1FBQzNCLENBQUMsQ0FBQyxPQUFPaUIsS0FBYyxFQUFFO1VBQ3hCQyxHQUFHLENBQUNELEtBQUssQ0FBQyxvQ0FBb0MsRUFBRUEsS0FBSyxDQUFXO1FBQ2pFO01BQ0QsQ0FBQyxNQUFNLElBQUlOLGNBQWMsS0FBSzFCLGNBQWMsQ0FBQ2tDLGlCQUFpQixJQUFJUCxxQ0FBcUMsRUFBRTtRQUN4RztRQUNBO1FBQ0FaLHdCQUF3QixFQUFFO01BQzNCLENBQUMsTUFBTTtRQUNOO1FBQ0E7UUFDQSxPQUFPYixjQUFjLENBQ25Ca0IsSUFBSSxDQUFDTixXQUFXLENBQUMsQ0FDakJPLElBQUksQ0FBRUMsV0FBVyxJQUNqQkMsa0JBQWtCLENBQUNDLHFCQUFxQixDQUN2Q0YsV0FBVyxFQUNYUCx3QkFBd0IsRUFDeEJGLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYRSxrQkFBa0IsRUFDbEJDLE9BQU8sQ0FDUCxDQUNEO01BQ0g7SUFDRCxDQUFDLE1BQU07TUFDTjtNQUNBO01BQ0E7TUFDQUYsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZW9CLG9DQUFvQyxDQUNsRHJCLFdBQTJCLEVBQzNCc0IsUUFBd0IsRUFDeEJyQix3QkFBa0MsRUFDbENXLGNBQThCLEVBQ2Q7SUFDaEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJQSxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFjLEVBQUU7TUFDckQsTUFBTU8sV0FBVyxHQUFHO1FBQ25CQyxrQkFBa0IsRUFBRTtNQUNyQixDQUFDO01BRUQsSUFBSTtRQUNILE1BQU14QixXQUFXLENBQUN5QixRQUFRLENBQUNDLGNBQWMsQ0FBQ0osUUFBUSxFQUFFQyxXQUFXLENBQUM7UUFDaEV0Qix3QkFBd0IsRUFBRTtNQUMzQixDQUFDLENBQUMsT0FBT2lCLEtBQUssRUFBRTtRQUNmQyxHQUFHLENBQUNELEtBQUssQ0FBQyxvQ0FBb0MsRUFBRUEsS0FBSyxDQUFVO01BQ2hFO0lBQ0QsQ0FBQyxNQUFNO01BQ047TUFDQTtNQUNBakIsd0JBQXdCLEVBQUU7SUFDM0I7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlMEIscUJBQXFCLENBQ25DM0IsV0FBMkIsRUFDM0JELGdCQUEwQixFQUMxQkUsd0JBQWtDLEVBQ2xDVyxjQUE4QixFQUM5QkMscUNBQThDLEVBQzlDWCxrQkFBNEIsRUFDNUJDLE9BQXdCLEVBQ1I7SUFDaEIsSUFBSVMsY0FBYyxLQUFLMUIsY0FBYyxDQUFDa0MsaUJBQWlCLElBQUlQLHFDQUFxQyxFQUFFO01BQ2pHO01BQ0E7TUFDQVosd0JBQXdCLEVBQUU7SUFDM0IsQ0FBQyxNQUFNO01BQ047TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLE9BQU9iLGNBQWMsQ0FDbkJrQixJQUFJLENBQUNOLFdBQVcsQ0FBQyxDQUNqQk8sSUFBSSxDQUFFQyxXQUFXLElBQ2pCQyxrQkFBa0IsQ0FBQ0MscUJBQXFCLENBQ3ZDRixXQUFXLEVBQ1hQLHdCQUF3QixFQUN4QkYsZ0JBQWdCLEVBQ2hCQyxXQUFXLEVBQ1hFLGtCQUFrQixFQUNsQkMsT0FBTyxDQUNQLENBQ0Q7SUFDSDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWV5QixxQkFBcUIsQ0FDbkM5QixjQUF1QyxFQUN2QytCLGlCQUEyQixFQUMzQjlCLGdCQUEwQixFQUMxQnVCLFFBQXdCLEVBQ3hCdEIsV0FBMkIsRUFDM0JFLGtCQUE0QixFQUVaO0lBQUEsSUFEaEJVLGNBQThCLHVFQUFHMUIsY0FBYyxDQUFDOEIsY0FBYztJQUU5RCxNQUFNYyxzQkFBc0IsR0FBRzlCLFdBQVcsQ0FBQytCLGtCQUFrQixDQUFDQyxXQUFXLEVBQUU7SUFDM0UsTUFBTS9CLHdCQUF3QixHQUFHLENBQUM2QixzQkFBc0IsR0FDckRELGlCQUFpQixHQUNqQixZQUFvQztNQUNwQzdCLFdBQVcsQ0FBQytCLGtCQUFrQixDQUFDRSxVQUFVLEVBQUU7TUFBQyxrQ0FEL0JDLElBQUk7UUFBSkEsSUFBSTtNQUFBO01BRWpCTCxpQkFBaUIsQ0FBQ00sS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHRCxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVKLE1BQU1yQixxQ0FBcUMsR0FBR3ZCLG9DQUFvQyxDQUFDVSxXQUFXLENBQUM7SUFFL0YsSUFBSUYsY0FBYyxFQUFFO01BQ25CLElBQUlFLFdBQVcsQ0FBQ04sZUFBZSxFQUFFLENBQUMwQyxxQkFBcUIsRUFBRSxDQUFDQyxZQUFZLEVBQUUsRUFBRTtRQUN6RSxNQUFNeEMsY0FBYyxDQUFDQyxjQUFjLEVBQUVDLGdCQUFnQixFQUFFQyxXQUFXLEVBQUVDLHdCQUF3QixFQUFFQyxrQkFBa0IsRUFBRW9CLFFBQVEsQ0FBQztNQUM1SCxDQUFDLE1BQU0sSUFBSSxDQUFDQSxRQUFRLENBQUNnQixTQUFTLEVBQUUsQ0FBQ0MsZUFBZSxFQUFFO1FBQ2pENUIseUJBQXlCLENBQ3hCYixjQUFjLEVBQ2RDLGdCQUFnQixFQUNoQkMsV0FBVyxFQUNYQyx3QkFBd0IsRUFDeEJXLGNBQWMsRUFDZEMscUNBQXFDLEVBQ3JDWCxrQkFBa0IsQ0FDbEI7TUFDRixDQUFDLE1BQU0sSUFBSUosY0FBYyxDQUFDTSxnQkFBZ0IsS0FBS04sY0FBYyxDQUFDTyxrQkFBa0IsRUFBRTtRQUNqRmdCLG9DQUFvQyxDQUFDckIsV0FBVyxFQUFFc0IsUUFBUSxFQUFFckIsd0JBQXdCLEVBQUVXLGNBQWMsQ0FBQztNQUN0RyxDQUFDLE1BQU0sSUFBSUUsU0FBUyxDQUFDQyxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3hDWSxxQkFBcUIsQ0FDcEIzQixXQUFXLEVBQ1hELGdCQUFnQixFQUNoQkUsd0JBQXdCLEVBQ3hCVyxjQUFjLEVBQ2RDLHFDQUFxQyxFQUNyQ1gsa0JBQWtCLENBQ2xCO01BQ0YsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0FELHdCQUF3QixFQUFFO01BQzNCO0lBQ0QsQ0FBQyxNQUFNO01BQ040QixpQkFBaUIsRUFBRTtJQUNwQjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZVcseUNBQXlDLENBQ3ZEWCxpQkFBMkIsRUFDM0I5QixnQkFBMEIsRUFDMUJ1QixRQUF3QixFQUN4QnRCLFdBQTJCLEVBQzNCRSxrQkFBNEIsRUFFWjtJQUFBLElBRGhCVSxjQUE4Qix1RUFBRzFCLGNBQWMsQ0FBQzhCLGNBQWM7SUFFOUQsTUFBTXlCLEtBQUssR0FBR3pDLFdBQVcsQ0FBQzBDLE9BQU8sRUFBRTtJQUNuQyxNQUFNQyxNQUFNLEdBQUdyQixRQUFRLENBQUNzQixRQUFRLEVBQUU7SUFDbEMsTUFBTUMsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksRUFBRTtJQUN4QyxNQUFNQyxhQUFhLEdBQUlOLEtBQUssQ0FBQ08sV0FBVyxFQUFFLENBQTRCQyxTQUFTO0lBQy9FLE1BQU1DLFdBQVcsR0FBR0gsYUFBYSxHQUFHLENBQUMsQ0FBQ0YsVUFBVSxDQUFDUCxTQUFTLENBQUMsR0FBRyxHQUFHUyxhQUFhLEdBQUcsMkNBQTJDLENBQUMsR0FBRyxLQUFLO0lBQ3JJLE1BQU1JLFFBQVEsR0FBR1YsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3JDLE1BQU1RLFdBQVcsR0FBR0QsUUFBUSxDQUFDRSxXQUFXLENBQUMsYUFBYSxDQUFDO0lBQ3ZELE1BQU1DLGVBQWUsR0FBR2hDLFFBQVE7SUFDaEMsSUFBSWlDLGFBQWEsR0FBR2pDLFFBQVEsQ0FBQ2tDLE9BQU8sRUFBRTtJQUN0QyxJQUFJLENBQUNOLFdBQVcsRUFBRTtNQUNqQkssYUFBYSxHQUFHRSxXQUFXLENBQUNDLGdCQUFnQixDQUFDcEMsUUFBUSxDQUFDLElBQUlpQyxhQUFhO0lBQ3hFO0lBQ0FqQyxRQUFRLEdBQUdxQixNQUFNLENBQUNnQixXQUFXLENBQUNKLGFBQWEsRUFBRUssU0FBUyxFQUFFO01BQUVDLE9BQU8sRUFBRTtJQUEwQixDQUFDLENBQUMsQ0FBQ0MsZUFBZSxFQUFFOztJQUVqSDtJQUNBO0lBQ0EsSUFBSVIsZUFBZSxDQUFDUyxTQUFTLEVBQUUsSUFBSyxDQUFDYixXQUFXLElBQUl0QyxjQUFjLEtBQUsxQixjQUFjLENBQUM4QixjQUFlLElBQUksQ0FBQ29DLFdBQVcsRUFBRTtNQUN0SHZCLGlCQUFpQixFQUFFO0lBQ3BCLENBQUMsTUFBTTtNQUNOLElBQUk7UUFDSCxNQUFNL0IsY0FBYyxHQUFHLE1BQU13QixRQUFRLENBQUMwQyxhQUFhLENBQUMseUJBQXlCLENBQUM7UUFDOUUsTUFBTXBDLHFCQUFxQixDQUMxQjlCLGNBQWMsRUFDZCtCLGlCQUFpQixFQUNqQjlCLGdCQUFnQixFQUNoQnVCLFFBQVEsRUFDUnRCLFdBQVcsRUFDWEUsa0JBQWtCLEVBQ2xCVSxjQUFjLENBQ2Q7TUFDRixDQUFDLENBQUMsT0FBT3FELE1BQWUsRUFBRTtRQUN6QjlDLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLDhDQUE4QyxFQUFFK0MsTUFBTSxDQUFXO1FBQzNFcEMsaUJBQWlCLEVBQUU7TUFDcEI7SUFDRDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlcUMsWUFBWSxDQUFDQyxVQUEwQixFQUFFaEUsT0FBd0IsRUFBb0I7SUFDbkcsTUFBTWlFLGlCQUFpQixHQUFHakUsT0FBTyxLQUFLeUQsU0FBUztJQUMvQ3pELE9BQU8sR0FBR0EsT0FBTyxJQUFJZ0UsVUFBVSxDQUFDekIsT0FBTyxFQUFFLENBQUMyQixpQkFBaUIsRUFBRTtJQUM3RCxJQUFJLENBQUNELGlCQUFpQixJQUFJRCxVQUFVLENBQUNHLEdBQUcsQ0FBaUMsa0RBQWtELENBQUMsRUFBRTtNQUM3SCxPQUFPSCxVQUFVLENBQUNJLGFBQWEsRUFBRTtJQUNsQyxDQUFDLE1BQU07TUFDTixPQUFPSixVQUFVLENBQUMxQyxRQUFRLENBQUN5QyxZQUFZLENBQUMvRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQ7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZWMsWUFBWSxDQUMxQmtELFVBQTBCLEVBQzFCSyxpQkFBc0MsRUFDdENyRSxPQUF3QixFQUNMO0lBQ25CQSxPQUFPLEdBQUdBLE9BQU8sSUFBSWdFLFVBQVUsQ0FBQ3pCLE9BQU8sRUFBRSxDQUFDMkIsaUJBQWlCLEVBQUU7SUFDN0QsTUFBTUksTUFBTSxHQUFHO01BQ2RDLGtCQUFrQixFQUFFLElBQUk7TUFDeEJsRCxrQkFBa0IsRUFBRSxJQUFJO01BQ3hCZ0QsaUJBQWlCLEVBQUVBLGlCQUFpQixLQUFLWixTQUFTLEdBQUdZLGlCQUFpQixHQUFHO0lBQzFFLENBQUM7SUFDRCxPQUFPTCxVQUFVLENBQUMxQyxRQUFRLENBQUNDLGNBQWMsQ0FBQ3ZCLE9BQU8sRUFBRXNFLE1BQU0sQ0FBQztFQUMzRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVMvRCxxQkFBcUIsQ0FDN0JGLFdBQW1CLEVBQ25CUCx3QkFBa0MsRUFDbENGLGdCQUEwQixFQUMxQm9FLFVBQTBCLEVBQzFCSyxpQkFBc0MsRUFDdENyRSxPQUF3QixFQUNqQjtJQUNQLFFBQVFLLFdBQVc7TUFDbEIsS0FBS3JCLG9CQUFvQixDQUFDd0YsSUFBSTtRQUM3QmxFLGtCQUFrQixDQUNoQnlELFlBQVksQ0FBQ0MsVUFBVSxFQUFFaEUsT0FBTyxDQUFDLENBQ2pDSSxJQUFJLENBQUVKLE9BQVEsSUFBS0Ysd0JBQXdCLENBQUNFLE9BQU8sQ0FBQyxDQUFDLENBQ3JEeUUsS0FBSyxDQUFDLFVBQVUxRCxLQUF5QixFQUFFO1VBQzNDLElBQUlBLEtBQUssS0FBSzJELDRCQUE0QixDQUFDQyxRQUFRLEVBQUU7WUFDcEQsT0FBTy9FLGdCQUFnQixFQUFFO1VBQzFCO1VBQ0FvQixHQUFHLENBQUNELEtBQUssQ0FBQyw2QkFBNkIsRUFBRUEsS0FBSyxDQUFDO1FBQ2hELENBQUMsQ0FBQztRQUNIOUIsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO1FBQ3RCO01BQ0QsS0FBSzVGLG9CQUFvQixDQUFDNkYsSUFBSTtRQUM3Qi9FLHdCQUF3QixDQUFDa0UsVUFBVSxDQUFDekIsT0FBTyxFQUFFLENBQUMyQixpQkFBaUIsRUFBRSxDQUFDO1FBQ2xFakYsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO1FBQ3RCO01BQ0QsS0FBSzVGLG9CQUFvQixDQUFDOEYsT0FBTztRQUNoQ3hFLGtCQUFrQixDQUNoQlEsWUFBWSxDQUFDa0QsVUFBVSxFQUFFSyxpQkFBaUIsRUFBRXJFLE9BQU8sQ0FBQyxDQUNwREksSUFBSSxDQUFFSixPQUFRLElBQUtGLHdCQUF3QixDQUFDRSxPQUFPLENBQUMsQ0FBQyxDQUNyRHlFLEtBQUssQ0FBQyxVQUFVMUQsS0FBeUIsRUFBRTtVQUMzQ0MsR0FBRyxDQUFDRCxLQUFLLENBQUMsOEJBQThCLEVBQUVBLEtBQUssQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFDSDlCLGNBQWMsQ0FBQzJGLEtBQUssRUFBRTtRQUN0QjtNQUNEO1FBQ0NoRixnQkFBZ0IsRUFBRTtRQUNsQlgsY0FBYyxDQUFDMkYsS0FBSyxFQUFFO0lBQUM7RUFFMUI7RUFFQSxNQUFNdEUsa0JBQWtCLEdBQUc7SUFDMUIrQix5Q0FBeUMsRUFBRUEseUNBQXlDO0lBQ3BGbEQsb0NBQW9DLEVBQUVBLG9DQUFvQztJQUMxRUosY0FBYyxFQUFFQSxjQUFjO0lBQzlCVyxjQUFjLEVBQUVBLGNBQWM7SUFDOUJjLHlCQUF5QixFQUFFQSx5QkFBeUI7SUFDcERVLG9DQUFvQyxFQUFFQSxvQ0FBb0M7SUFDMUVNLHFCQUFxQixFQUFFQSxxQkFBcUI7SUFDNUNqQixxQkFBcUIsRUFBRUEscUJBQXFCO0lBQzVDd0QsWUFBWSxFQUFFQSxZQUFZO0lBQzFCakQsWUFBWSxFQUFFQTtFQUNmLENBQUM7RUFBQyxPQUVhUixrQkFBa0I7QUFBQSJ9
|