@sapui5/sap.fe.core 1.121.2 → 1.123.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 +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +1 -2
- package/src/sap/fe/core/CommonUtils.js +14 -171
- package/src/sap/fe/core/CommonUtils.ts +15 -221
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +16 -0
- package/src/sap/fe/core/TemplateComponent.js +6 -1
- package/src/sap/fe/core/TemplateComponent.ts +8 -0
- package/src/sap/fe/core/UIProvider.js +23 -0
- package/src/sap/fe/core/UIProvider.ts +38 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
- package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
- package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
- package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
- package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
- package/src/sap/fe/core/controllerextensions/Share.js +7 -7
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
- package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
- package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
- package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
- package/src/sap/fe/core/converters/ConverterContext.js +17 -9
- package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
- package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
- package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
- package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
- package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
- package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
- package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
- package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
- package/src/sap/fe/core/converters/helpers/Key.js +2 -2
- package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
- package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
- package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
- package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
- package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
- package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
- package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
- package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
- package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
- package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
- package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
- package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
- package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
- package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
- package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
- package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
- package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
- package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
- package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +5 -2
- package/src/sap/fe/core/messagebundle_da.properties +1 -1
- package/src/sap/fe/core/messagebundle_en.properties +267 -2
- package/src/sap/fe/core/messagebundle_sl.properties +1 -1
- package/src/sap/fe/core/operationsHelper.js +2 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
- package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
- package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
- package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
- package/src/sap/fe/core/templating/FilterHelper.js +13 -10
- package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
- package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
- package/src/sap/fe/core/templating/UIFormatters.js +23 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/EDM.ts +2 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +2 -2
|
@@ -2,16 +2,14 @@
|
|
|
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/base/util/deepClone", "sap/fe/core/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvider", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/converters/annotations/DataField", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/PromiseKeeper", "sap/fe/core/helpers/ToES6Promise", "sap/fe/core/helpers/TypeGuards", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/library"], function (Log, deepClone, CommonUtils, UIProvider, BusyLocker, draft, UiModelConstants, operations, sticky, messageHandling, MetaModelConverter, DataField, deleteHelper, FPMHelper, MetaModelFunction, ModelHelper, PromiseKeeper, toES6Promise, TypeGuards, FELibrary, Button, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Library, Messaging, coreLibrary) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var getRequiredPropertiesFromInsertRestrictions = MetaModelFunction.getRequiredPropertiesFromInsertRestrictions;
|
|
9
|
-
var getNonComputedVisibleFields = MetaModelFunction.getNonComputedVisibleFields;
|
|
10
|
-
var isDataFieldForAction = DataField.isDataFieldForAction;
|
|
11
8
|
var isNavigationProperty = TypeGuards.isNavigationProperty;
|
|
12
|
-
var
|
|
13
|
-
var
|
|
9
|
+
var getCreatePopupFields = MetaModelFunction.getCreatePopupFields;
|
|
10
|
+
var isDataFieldForAction = DataField.isDataFieldForAction;
|
|
14
11
|
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
12
|
+
var getCoreUIFactory = UIProvider.getCoreUIFactory;
|
|
15
13
|
const CreationMode = FELibrary.CreationMode;
|
|
16
14
|
const ProgrammingModel = FELibrary.ProgrammingModel;
|
|
17
15
|
|
|
@@ -132,14 +130,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
132
130
|
const dataForCreation = initialData ?? {};
|
|
133
131
|
if (this.isListBindingHierarchical(listBinding)) {
|
|
134
132
|
var _options$parentContex;
|
|
133
|
+
let listBindingForCreation;
|
|
135
134
|
if (((_options$parentContex = options.parentContext) === null || _options$parentContex === void 0 ? void 0 : _options$parentContex.isExpanded()) === false) {
|
|
136
135
|
// If the parent context already has children and is collapsed, we expand it first
|
|
137
136
|
await listBinding.expand(options.parentContext);
|
|
138
137
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
if (listBinding.isRelative()) {
|
|
139
|
+
Object.assign(dataForCreation, {
|
|
140
|
+
"@$ui5.node.parent": options.parentContext
|
|
141
|
+
});
|
|
142
|
+
listBindingForCreation = listBinding;
|
|
143
|
+
} else {
|
|
144
|
+
// Absolute binding: creation from the ListReport
|
|
145
|
+
// We use a temporary flat listBinding for the creation, to avoid adding the new context in the table (we don't want to display it until it's saved)
|
|
146
|
+
const model = listBinding.getModel();
|
|
147
|
+
const metaModel = model.getMetaModel();
|
|
148
|
+
listBindingForCreation = model.bindList(listBinding.getPath(), undefined, undefined, undefined, {
|
|
149
|
+
$$groupId: listBinding.getGroupId(),
|
|
150
|
+
$$updateGroupId: listBinding.getUpdateGroupId()
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Add the parent path in the initial data if a parent is provided
|
|
154
|
+
if (options.parentContext) {
|
|
155
|
+
var _objectPath$targetEnt, _objectPath$targetEnt2;
|
|
156
|
+
const objectPath = getInvolvedDataModelObjects(metaModel.getMetaContext(listBinding.getPath()));
|
|
157
|
+
const hierarchyQualifier = listBinding.getAggregation().hierarchyQualifier;
|
|
158
|
+
const parentNavigation = (_objectPath$targetEnt = objectPath.targetEntityType.annotations.Aggregation) === null || _objectPath$targetEnt === void 0 ? void 0 : (_objectPath$targetEnt2 = _objectPath$targetEnt[`RecursiveHierarchy#${hierarchyQualifier}`]) === null || _objectPath$targetEnt2 === void 0 ? void 0 : _objectPath$targetEnt2.ParentNavigationProperty.value;
|
|
159
|
+
if (!parentNavigation) {
|
|
160
|
+
throw new Error(`Cannot find parent navigation property for ${listBinding.getPath()}`);
|
|
161
|
+
}
|
|
162
|
+
const parentBindingData = {};
|
|
163
|
+
parentBindingData[`${parentNavigation}@odata.bind`] = options.parentContext.getPath().replace(/^\//, ""); // Remove leading "/" from the path
|
|
164
|
+
Object.assign(dataForCreation, parentBindingData);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return listBindingForCreation.create(dataForCreation, true);
|
|
143
168
|
} else {
|
|
144
169
|
return listBinding.create(dataForCreation, true, options.createAtEnd, options.createInactive);
|
|
145
170
|
}
|
|
@@ -147,7 +172,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
147
172
|
_proto.getCreationParameters = function getCreationParameters(listBinding, createData, appComponent) {
|
|
148
173
|
const metaModel = listBinding.getModel().getMetaModel();
|
|
149
174
|
const metaPath = metaModel.getMetaPath(listBinding.getHeaderContext().getPath());
|
|
150
|
-
const nonComputedVisibleFields =
|
|
175
|
+
const nonComputedVisibleFields = getCreatePopupFields(metaModel, metaPath, appComponent);
|
|
151
176
|
// Do not consider fields for which we provide some initial data
|
|
152
177
|
return nonComputedVisibleFields.filter(fieldName => {
|
|
153
178
|
return !(fieldName in (createData ?? {}));
|
|
@@ -330,18 +355,18 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
330
355
|
const isNewPageCreation = parameters.creationMode !== CreationMode.CreationRow && parameters.creationMode !== CreationMode.Inline;
|
|
331
356
|
const nonComputedVisibleKeyFields = isNewPageCreation ? this.getCreationParameters(mainListBinding, initialData, appComponent) : [];
|
|
332
357
|
if (nonComputedVisibleKeyFields.length > 0) {
|
|
333
|
-
|
|
334
|
-
newDocumentContext = onKeyFieldResult.newContext;
|
|
358
|
+
newDocumentContext = await this.createWithDialog(mainListBinding, nonComputedVisibleKeyFields, parameters, appComponent, messageHandler);
|
|
335
359
|
} else {
|
|
336
360
|
newDocumentContext = await this.createDocumentContext(mainListBinding, parameters);
|
|
337
361
|
if (!parameters.inactive) {
|
|
338
|
-
await this.
|
|
362
|
+
await this.waitForCreateCompletion(newDocumentContext, parameters.keepTransientContextOnFailed === true);
|
|
339
363
|
}
|
|
340
364
|
}
|
|
341
365
|
return newDocumentContext;
|
|
342
366
|
} catch (error) {
|
|
343
|
-
|
|
344
|
-
|
|
367
|
+
const msg = typeof error === "string" ? error : error.message ?? error;
|
|
368
|
+
Log.error("Error while creating the new document", msg);
|
|
369
|
+
throw msg;
|
|
345
370
|
}
|
|
346
371
|
}
|
|
347
372
|
};
|
|
@@ -728,6 +753,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
728
753
|
* @param mParameters.internalModelContext
|
|
729
754
|
* @param mParameters.groupId
|
|
730
755
|
* @param mParameters.defaultValuesExtensionFunction
|
|
756
|
+
* @param [mParameters.ignoreETag] If specified, the action is called without ETag handling
|
|
731
757
|
* @param oView Contains the object of the current view
|
|
732
758
|
* @param appComponent The appComponent
|
|
733
759
|
* @param messageHandler The message handler extension
|
|
@@ -793,7 +819,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
793
819
|
defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction,
|
|
794
820
|
selectedItems: mParameters.contexts,
|
|
795
821
|
disableStrictHandling,
|
|
796
|
-
groupId: mParameters.groupId
|
|
822
|
+
groupId: mParameters.groupId,
|
|
823
|
+
ignoreETag: mParameters.ignoreETag
|
|
797
824
|
});
|
|
798
825
|
} else {
|
|
799
826
|
oResult = await operations.callActionImport(sActionName, oModel, appComponent, {
|
|
@@ -802,6 +829,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
802
829
|
skipParameterDialog: mParameters.skipParameterDialog,
|
|
803
830
|
bindingParameters: mBindingParameters,
|
|
804
831
|
entitySetName: mParameters.entitySetName,
|
|
832
|
+
additionalSideEffect: mSideEffectsParameters,
|
|
805
833
|
onSubmitted: () => {
|
|
806
834
|
this.busyLock(appComponent);
|
|
807
835
|
},
|
|
@@ -812,7 +840,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
812
840
|
internalModelContext: mParameters.internalModelContext,
|
|
813
841
|
operationAvailableMap: mParameters.operationAvailableMap,
|
|
814
842
|
messageHandler: messageHandler,
|
|
815
|
-
bObjectPage: mParameters.bObjectPage
|
|
843
|
+
bObjectPage: mParameters.bObjectPage,
|
|
844
|
+
ignoreETag: mParameters.ignoreETag
|
|
816
845
|
});
|
|
817
846
|
}
|
|
818
847
|
if (messageHandler) {
|
|
@@ -933,279 +962,142 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
933
962
|
confirmationPopover.openBy(cancelButton, false);
|
|
934
963
|
});
|
|
935
964
|
};
|
|
936
|
-
_proto.
|
|
937
|
-
|
|
938
|
-
const
|
|
965
|
+
_proto.createWithDialog = async function createWithDialog(listBinding, fieldNames, parameters, appComponent, messageHandler) {
|
|
966
|
+
const model = listBinding.getModel();
|
|
967
|
+
const metaModel = model.getMetaModel();
|
|
968
|
+
const listMetaPath = metaModel.getMetaPath(listBinding.getResolvedPath());
|
|
939
969
|
|
|
940
|
-
//
|
|
941
|
-
const
|
|
970
|
+
// Create a fake (transient) listBinding and context, just for the binding context of the dialog
|
|
971
|
+
const transientListBinding = model.bindList(listBinding.getPath(), listBinding.getContext(), undefined, undefined, {
|
|
942
972
|
$$updateGroupId: "submitLater"
|
|
943
973
|
});
|
|
944
|
-
|
|
974
|
+
transientListBinding.refreshInternal = function () {
|
|
945
975
|
/* */
|
|
946
976
|
};
|
|
947
|
-
const
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
977
|
+
const transientContext = transientListBinding.create(parameters.data, true);
|
|
978
|
+
const fieldMetaContexts = fieldNames.map(name => {
|
|
979
|
+
return metaModel.createBindingContext(`${listMetaPath}/${name}`);
|
|
980
|
+
});
|
|
981
|
+
const createDialog = getCoreUIFactory().newCreateDialog(transientContext, fieldNames, appComponent, parameters.parentControl);
|
|
982
|
+
try {
|
|
983
|
+
await CommonUtils.setUserDefaults(appComponent, fieldMetaContexts, transientContext, false, parameters.createAction, parameters.data);
|
|
984
|
+
createDialog.openDialog();
|
|
985
|
+
} catch (e) {
|
|
986
|
+
await messageHandler.showMessages();
|
|
987
|
+
throw e;
|
|
988
|
+
}
|
|
989
|
+
const resultPromiseKeeper = new PromiseKeeper();
|
|
990
|
+
const onExitDialog = async event => {
|
|
991
|
+
if (!event.getParameter("accept")) {
|
|
992
|
+
// User has cancelled creation: destry the transient list binding and close the dialog
|
|
993
|
+
transientListBinding.destroy();
|
|
994
|
+
createDialog.closeDialog();
|
|
995
|
+
resultPromiseKeeper.reject(FELibrary.Constants.CancelActionDialog);
|
|
996
|
+
return;
|
|
959
997
|
}
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
const allMessages = Messaging.getMessageModel().getData();
|
|
982
|
-
// also remove messages assigned to inner controls, but avoid removing messages for different paramters (with name being substring of another parameter name)
|
|
983
|
-
const relevantMessages = allMessages.filter(msg => msg.getControlIds().some(controlId => controlId.includes(messageControlId)));
|
|
984
|
-
Messaging.removeMessages(relevantMessages);
|
|
985
|
-
};
|
|
986
|
-
let actionParameterInfos;
|
|
987
|
-
const oController = {
|
|
988
|
-
/*
|
|
989
|
-
fired on focus out from field or on selecting a value from the valuehelp.
|
|
990
|
-
the create button (Continue) is always enabled.
|
|
991
|
-
liveChange is not fired when value is added from valuehelp.
|
|
992
|
-
value validation is done for create button.
|
|
993
|
-
*/
|
|
994
|
-
handleChange: async event => {
|
|
995
|
-
const fieldId = event.getParameter("id");
|
|
996
|
-
const field = event.getSource();
|
|
997
|
-
const actionParameterInfo = actionParameterInfos.find(actionParameterInfo => actionParameterInfo.field === field);
|
|
998
|
-
_removeMessagesForActionParamter(fieldId);
|
|
999
|
-
actionParameterInfo.validationPromise = event.getParameter("promise");
|
|
998
|
+
createDialog.setBusy(true);
|
|
999
|
+
parameters.bIsCreateDialog = true;
|
|
1000
|
+
try {
|
|
1001
|
+
const transientData = transientContext.getObject();
|
|
1002
|
+
let createData = {};
|
|
1003
|
+
Object.keys(transientData).forEach(propertyPath => {
|
|
1004
|
+
const oProperty = metaModel.getObject(`${listMetaPath}/${propertyPath}`);
|
|
1005
|
+
// Ensure navigation properties are not part of the payload, as deep create not supported
|
|
1006
|
+
// And remove any property starting by @$ui5 as they are not property created by filling the form
|
|
1007
|
+
if (oProperty && oProperty.$kind !== "NavigationProperty" && !(propertyPath !== null && propertyPath !== void 0 && propertyPath.startsWith("@$ui5"))) {
|
|
1008
|
+
createData[propertyPath] = transientData[propertyPath];
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
if (parameters.beforeCreateCallBack) {
|
|
1012
|
+
//beforeCreateCallBack expects createParameters of type any[]
|
|
1013
|
+
const createDataAsArray = Object.entries(createData).map(_ref2 => {
|
|
1014
|
+
let [key, value] = _ref2;
|
|
1015
|
+
return {
|
|
1016
|
+
[key]: value
|
|
1017
|
+
};
|
|
1018
|
+
});
|
|
1000
1019
|
try {
|
|
1001
|
-
|
|
1002
|
-
|
|
1020
|
+
await toES6Promise(parameters.beforeCreateCallBack({
|
|
1021
|
+
contextPath: listBinding.getPath(),
|
|
1022
|
+
createParameters: createDataAsArray
|
|
1023
|
+
}));
|
|
1003
1024
|
} catch (error) {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
}
|
|
1007
|
-
},
|
|
1008
|
-
/*
|
|
1009
|
-
fired on key press. the create button the create button (Continue) is always enabled.
|
|
1010
|
-
liveChange is not fired when value is added from valuehelp.
|
|
1011
|
-
value validation is done for create button.
|
|
1012
|
-
*/
|
|
1013
|
-
handleLiveChange: event => {
|
|
1014
|
-
const fieldId = event.getParameter("id");
|
|
1015
|
-
_removeMessagesForActionParamter(fieldId);
|
|
1016
|
-
}
|
|
1017
|
-
};
|
|
1018
|
-
const oDialogContent = await Fragment.load({
|
|
1019
|
-
definition: oNewFragment,
|
|
1020
|
-
controller: oController
|
|
1021
|
-
});
|
|
1022
|
-
let oResult;
|
|
1023
|
-
let isDialogConfirmed = false;
|
|
1024
|
-
oDialog = new Dialog(generate(["CreateDialog", sMetaPath]), {
|
|
1025
|
-
title: resourceModel.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE"),
|
|
1026
|
-
content: [oDialogContent],
|
|
1027
|
-
contentWidth: "20rem",
|
|
1028
|
-
beginButton: new Button({
|
|
1029
|
-
text: resourceModel.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON"),
|
|
1030
|
-
type: "Emphasized",
|
|
1031
|
-
press: async _Event => {
|
|
1032
|
-
/* Validation of mandatory and value state for action parameters */
|
|
1033
|
-
if (!(await ActionRuntime.validateProperties(actionParameterInfos, resourceModel))) {
|
|
1034
|
-
return;
|
|
1035
|
-
}
|
|
1036
|
-
BusyLocker.lock(oDialog);
|
|
1037
|
-
mParameters.bIsCreateDialog = true;
|
|
1038
|
-
try {
|
|
1039
|
-
const transientData = oTransientContext.getObject();
|
|
1040
|
-
let createData = {};
|
|
1041
|
-
Object.keys(transientData).forEach(function (sPropertyPath) {
|
|
1042
|
-
const oProperty = oMetaModel.getObject(`${sMetaPath}/${sPropertyPath}`);
|
|
1043
|
-
// ensure navigation properties are not part of the payload, deep create not supported
|
|
1044
|
-
if (oProperty && oProperty.$kind === "NavigationProperty") {
|
|
1045
|
-
return;
|
|
1046
|
-
}
|
|
1047
|
-
// Remove any property starting by @$ui5 as they are not property created by filling the form
|
|
1048
|
-
if (sPropertyPath !== null && sPropertyPath !== void 0 && sPropertyPath.startsWith("@$ui5")) {
|
|
1049
|
-
return;
|
|
1050
|
-
}
|
|
1051
|
-
createData[sPropertyPath] = transientData[sPropertyPath];
|
|
1052
|
-
});
|
|
1053
|
-
if (mParameters.beforeCreateCallBack) {
|
|
1054
|
-
//beforeCreateCallBack expects createParameters of type any[]
|
|
1055
|
-
const parameters = Object.entries(createData).map(_ref2 => {
|
|
1056
|
-
let [key, value] = _ref2;
|
|
1057
|
-
return {
|
|
1058
|
-
[key]: value
|
|
1059
|
-
};
|
|
1060
|
-
});
|
|
1061
|
-
try {
|
|
1062
|
-
await toES6Promise(mParameters.beforeCreateCallBack({
|
|
1063
|
-
contextPath: oListBinding && oListBinding.getPath(),
|
|
1064
|
-
createParameters: parameters
|
|
1065
|
-
}));
|
|
1066
|
-
} catch (error) {
|
|
1067
|
-
Log.error("Error while creating the new document", error);
|
|
1068
|
-
throw FELibrary.Constants.OnBeforeCreateFailed;
|
|
1069
|
-
}
|
|
1070
|
-
createData = parameters.reduce((result, currentObject) => {
|
|
1071
|
-
return {
|
|
1072
|
-
...result,
|
|
1073
|
-
...currentObject
|
|
1074
|
-
};
|
|
1075
|
-
}, {});
|
|
1076
|
-
}
|
|
1077
|
-
if (Object.keys(createData).length > 0) {
|
|
1078
|
-
appComponent.getModel("ui").setProperty(UiModelConstants.DocumentModified, true);
|
|
1079
|
-
}
|
|
1080
|
-
const oNewDocumentContext = await this.createContext(oListBinding, createData, {
|
|
1081
|
-
createAtEnd: !!mParameters.createAtEnd,
|
|
1082
|
-
createInactive: !!mParameters.inactive,
|
|
1083
|
-
parentContext: mParameters.parentContext
|
|
1084
|
-
});
|
|
1085
|
-
const oPromise = this.onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters);
|
|
1086
|
-
const promiseResponse = await oPromise;
|
|
1087
|
-
if (!promiseResponse || !promiseResponse.bKeepDialogOpen) {
|
|
1088
|
-
const oResponse = promiseResponse ?? {};
|
|
1089
|
-
oDialog.setBindingContext(null);
|
|
1090
|
-
oResponse.newContext = oNewDocumentContext;
|
|
1091
|
-
isDialogConfirmed = true;
|
|
1092
|
-
oResult = {
|
|
1093
|
-
response: oResponse
|
|
1094
|
-
};
|
|
1095
|
-
oDialog.close();
|
|
1096
|
-
}
|
|
1097
|
-
} catch (oError) {
|
|
1098
|
-
// in case of creation failed, dialog should stay open - to achieve the same, nothing has to be done (like in case of success with bKeepDialogOpen)
|
|
1099
|
-
if (oError !== FELibrary.Constants.CreationFailed && oError != FELibrary.Constants.OnBeforeCreateFailed) {
|
|
1100
|
-
// other errors are not expected
|
|
1101
|
-
oResult = {
|
|
1102
|
-
error: oError
|
|
1103
|
-
};
|
|
1104
|
-
oDialog.close();
|
|
1105
|
-
}
|
|
1106
|
-
} finally {
|
|
1107
|
-
BusyLocker.unlock(oDialog);
|
|
1108
|
-
messageHandler.showMessages();
|
|
1109
|
-
}
|
|
1025
|
+
Log.error("Error while creating the new document", error);
|
|
1026
|
+
throw FELibrary.Constants.OnBeforeCreateFailed;
|
|
1110
1027
|
}
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
oResult = {
|
|
1116
|
-
error: FELibrary.Constants.CancelActionDialog
|
|
1028
|
+
createData = createDataAsArray.reduce((result, currentObject) => {
|
|
1029
|
+
return {
|
|
1030
|
+
...result,
|
|
1031
|
+
...currentObject
|
|
1117
1032
|
};
|
|
1118
|
-
|
|
1119
|
-
}
|
|
1120
|
-
}),
|
|
1121
|
-
beforeClose: function () {
|
|
1122
|
-
var _oDialog$getBindingCo;
|
|
1123
|
-
/* When the dialog is cancelled, messages need to be removed in case the same action should be executed again */
|
|
1124
|
-
for (const actionParameterInfo of actionParameterInfos) {
|
|
1125
|
-
const fieldId = actionParameterInfo.field.getId();
|
|
1126
|
-
_removeMessagesForActionParamter(fieldId);
|
|
1127
|
-
}
|
|
1128
|
-
// show footer as per UX guidelines when dialog is not open
|
|
1129
|
-
(_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
|
|
1130
|
-
oDialog.destroy();
|
|
1131
|
-
oTransientListBinding.destroy();
|
|
1132
|
-
//rejected/resolved the promis returned by _launchDialogWithKeyFields
|
|
1133
|
-
//as soon as the dialog is closed. Without waiting for the dialog's
|
|
1134
|
-
//animation to finish
|
|
1135
|
-
if (isDialogConfirmed) {
|
|
1136
|
-
resolve(oResult.response);
|
|
1137
|
-
} else {
|
|
1138
|
-
var _oResult;
|
|
1139
|
-
reject(((_oResult = oResult) === null || _oResult === void 0 ? void 0 : _oResult.error) ?? FELibrary.Constants.CancelActionDialog);
|
|
1140
|
-
}
|
|
1033
|
+
}, {});
|
|
1141
1034
|
}
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
try {
|
|
1150
|
-
await CommonUtils.setUserDefaults(appComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data);
|
|
1151
|
-
actionParameterInfos = aFormElements.map(parameterField => {
|
|
1152
|
-
const field = parameterField.getFields()[0];
|
|
1153
|
-
const isMultiValue = field.isA("sap.ui.mdc.MultiValueField");
|
|
1154
|
-
return {
|
|
1155
|
-
parameter: parameterField,
|
|
1156
|
-
isMultiValue: isMultiValue,
|
|
1157
|
-
field: field,
|
|
1158
|
-
value: isMultiValue ? field.getItems() : field.getValue(),
|
|
1159
|
-
validationPromise: undefined,
|
|
1160
|
-
hasError: false
|
|
1161
|
-
};
|
|
1035
|
+
if (Object.keys(createData).length > 0) {
|
|
1036
|
+
appComponent.getModel("ui").setProperty(UiModelConstants.DocumentModified, true);
|
|
1037
|
+
}
|
|
1038
|
+
const newContext = await this.createContext(listBinding, createData, {
|
|
1039
|
+
createAtEnd: parameters.createAtEnd,
|
|
1040
|
+
createInactive: parameters.inactive,
|
|
1041
|
+
parentContext: parameters.parentContext
|
|
1162
1042
|
});
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
if (oContext === oNewDocumentContext) {
|
|
1181
|
-
oListBinding.detachCreateCompleted(fnCreateCompleted, this);
|
|
1182
|
-
fnResolve(bSuccess);
|
|
1043
|
+
const creationSuccess = await this.waitForCreateCompletion(newContext, parameters.keepTransientContextOnFailed === true);
|
|
1044
|
+
if (creationSuccess) {
|
|
1045
|
+
transientListBinding.destroy();
|
|
1046
|
+
createDialog.closeDialog();
|
|
1047
|
+
resultPromiseKeeper.resolve(newContext);
|
|
1048
|
+
}
|
|
1049
|
+
} catch (error) {
|
|
1050
|
+
// in case of creation failed, dialog should stay open - to achieve the same, nothing has to be done (like in case of success with bKeepDialogOpen)
|
|
1051
|
+
if (error !== FELibrary.Constants.CreationFailed && error != FELibrary.Constants.OnBeforeCreateFailed) {
|
|
1052
|
+
// other errors are not expected
|
|
1053
|
+
transientListBinding.destroy();
|
|
1054
|
+
createDialog.closeDialog();
|
|
1055
|
+
resultPromiseKeeper.reject(error);
|
|
1056
|
+
}
|
|
1057
|
+
} finally {
|
|
1058
|
+
createDialog.setBusy(false);
|
|
1059
|
+
messageHandler.showMessages();
|
|
1183
1060
|
}
|
|
1184
1061
|
};
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1062
|
+
createDialog.attachExitDialog({}, onExitDialog);
|
|
1063
|
+
return resultPromiseKeeper.promise;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
/**
|
|
1067
|
+
* Waits for the creation of a context to be finished.
|
|
1068
|
+
*
|
|
1069
|
+
* @param newContext The context being created
|
|
1070
|
+
* @param keepTransientContextOnFailed
|
|
1071
|
+
* @returns True if the creation was successful
|
|
1072
|
+
*/;
|
|
1073
|
+
_proto.waitForCreateCompletion = async function waitForCreateCompletion(newContext, keepTransientContextOnFailed) {
|
|
1074
|
+
const promiseKeeper = new PromiseKeeper();
|
|
1075
|
+
const parentListBinding = newContext.getBinding();
|
|
1076
|
+
const onCreateCompleted = event => {
|
|
1077
|
+
const createdContext = event.getParameter("context");
|
|
1078
|
+
const success = event.getParameter("success");
|
|
1079
|
+
if (createdContext === newContext) {
|
|
1080
|
+
parentListBinding.detachCreateCompleted(onCreateCompleted);
|
|
1081
|
+
promiseKeeper.resolve(success === true);
|
|
1082
|
+
}
|
|
1191
1083
|
};
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
bKeepDialogOpen: true
|
|
1204
|
-
};
|
|
1205
|
-
} else {
|
|
1206
|
-
return oNewDocumentContext.created();
|
|
1084
|
+
parentListBinding.attachCreateCompleted(onCreateCompleted);
|
|
1085
|
+
const creationSuccessful = await promiseKeeper.promise;
|
|
1086
|
+
if (!creationSuccessful) {
|
|
1087
|
+
if (!keepTransientContextOnFailed) {
|
|
1088
|
+
// Cancel the pending POST and delete the context in the listBinding
|
|
1089
|
+
(newContext.created() ?? Promise.resolve()).catch(function (contextError) {
|
|
1090
|
+
Log.trace("transient creation context deletion error", contextError);
|
|
1091
|
+
});
|
|
1092
|
+
parentListBinding.resetChanges();
|
|
1093
|
+
parentListBinding.getModel().resetChanges(parentListBinding.getUpdateGroupId());
|
|
1094
|
+
throw FELibrary.Constants.CreationFailed;
|
|
1207
1095
|
}
|
|
1208
|
-
|
|
1096
|
+
return false;
|
|
1097
|
+
} else {
|
|
1098
|
+
await newContext.created();
|
|
1099
|
+
return true;
|
|
1100
|
+
}
|
|
1209
1101
|
}
|
|
1210
1102
|
|
|
1211
1103
|
/**
|
|
@@ -1259,4 +1151,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/fe/core/ActionRun
|
|
|
1259
1151
|
const singleton = new TransactionHelper();
|
|
1260
1152
|
return singleton;
|
|
1261
1153
|
}, false);
|
|
1262
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiY3JlYXRlQ29udGV4dCIsImluaXRpYWxEYXRhIiwib3B0aW9ucyIsImRhdGFGb3JDcmVhdGlvbiIsInBhcmVudENvbnRleHQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlIiwiY3JlYXRlQXRFbmQiLCJjcmVhdGVJbmFjdGl2ZSIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImNyZWF0ZURhdGEiLCJtZXRhUGF0aCIsIm5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsImZpbHRlciIsImZpZWxkTmFtZSIsImNyZWF0ZURvY3VtZW50IiwibWFpbkxpc3RCaW5kaW5nIiwiaW5QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsIkVycm9yIiwicHJvZ3JhbW1pbmdNb2RlbCIsImdldEJ1c3lQYXRoIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJpbmFjdGl2ZSIsInJlc291cmNlQnVuZGxlQ29yZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInBlcmZvcm1BY3Rpb25PckNyZWF0aW9uIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImVycm9yIiwiQ29uc3RhbnRzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJidXN5TW9kZSIsImJ1c3lJZCIsImNyZWF0ZURvY3VtZW50Q29udGV4dCIsImNyZWF0ZVBhcmFtZXRlcnMiLCJlbnRyaWVzIiwibWFwIiwia2V5IiwidmFsdWUiLCJ0b0VTNlByb21pc2UiLCJjb250ZXh0UGF0aCIsIkxvZyIsIk9uQmVmb3JlQ3JlYXRlRmFpbGVkIiwicmVkdWNlIiwicmVzdWx0IiwiY3VycmVudE9iamVjdCIsIm1lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsImNyZWF0ZUhhc2giLCJnZXRSb3V0ZXJQcm94eSIsImdldEhhc2giLCJjb21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwibmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImNhbGxBY3Rpb24iLCJjb250ZXh0cyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJsYWJlbCIsIl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsIiwiYklzQ3JlYXRlQWN0aW9uIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSIsImlzTmV3UGFnZUNyZWF0aW9uIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJJbmxpbmUiLCJub25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJvbktleUZpZWxkUmVzdWx0IiwiX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMiLCJuZXdDb250ZXh0Iiwib25BZnRlckNyZWF0ZUNvbXBsZXRpb24iLCJfaXNEcmFmdEVuYWJsZWQiLCJ2Q29udGV4dHMiLCJjb250ZXh0Rm9yRHJhZnRNb2RlbCIsInNQcm9ncmFtbWluZ01vZGVsIiwiZGVsZXRlRG9jdW1lbnQiLCJyZXNvdXJjZU1vZGVsIiwiY29udGV4dHNUb0RlbGV0ZSIsIkFycmF5IiwiaXNBcnJheSIsInJlamVjdCIsImRyYWZ0RW5hYmxlZCIsInNlbGVjdGVkQ29udGV4dHMiLCJpdGVtcyIsInVuU2F2ZWRDb250ZXh0IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwibG9ja2VkQ29udGV4dCIsImZpbmQiLCJjb250ZXh0IiwiY29udGV4dERhdGEiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJsb2NraW5nVXNlck5hbWUiLCJNZXNzYWdlQm94Iiwic2hvdyIsImdldFRleHQiLCJ0aXRsZSIsIm9uQ2xvc2UiLCJub25UYWJsZVR4dCIsInVuU2F2ZWRDb250ZXh0VXNlciIsImVudGl0eVNldE5hbWUiLCJkZXNjcmlwdGlvbiIsInB1c2giLCJ0eXBlIiwiZGVsZXRhYmxlQ29udGV4dHMiLCJ0ZXh0Iiwic2VsZWN0ZWQiLCJURVhUIiwidG90YWxEZWxldGFibGUiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZSIsInVuU2F2ZWRDb250ZXh0cyIsInVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwibm9uRGVsZXRhYmxlVGV4dCIsImdldE5vbkRlbGV0YWJsZVRleHQiLCJvcHRpb25zRGVsZXRhYmxlVGV4dHMiLCJnZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMiLCJjb21tb25CaW5kaW5nIiwiZ2V0QmluZGluZyIsImluVHJlZVRhYmxlIiwidXBkYXRlQ29udGVudEZvckRlbGV0ZURpYWxvZyIsImZuQ29uZmlybSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZGVsZXRlQ29uZmlybUhhbmRsZXIiLCJvRXJyb3IiLCJkaWFsb2ciLCJjcmVhdGVEZWxldGVEaWFsb2ciLCJub0RpYWxvZyIsImFkZFN0eWxlQ2xhc3MiLCJvcGVuIiwiZm5SZWplY3QiLCJkaWFsb2dDb25maXJtZWQiLCJ2Qm94IiwiVkJveCIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJlZGl0RG9jdW1lbnQiLCJncm91cElkIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwib05ld0NvbnRleHQiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsImVyciIsInNob3dNZXNzYWdlcyIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImNhbmNlbERvY3VtZW50IiwibUluUGFyYW1ldGVycyIsImlzTmV3T2JqZWN0IiwiaXNPYmplY3RNb2RpZmllZCIsIm9Nb2RlbCIsInJldHVybmVkVmFsdWUiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2tpcERpc2NhcmRQb3BvdmVyIiwiX2NvbmZpcm1EaXNjYXJkIiwiY2FuY2VsQnV0dG9uIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlRHJhZnQiLCJvU2libGluZ0NvbnRleHQiLCJzQ2Fub25pY2FsUGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZGlzY2FyZGVkQ29udGV4dCIsImRpc2NhcmREb2N1bWVudCIsInJlZnJlc2giLCJzYXZlRG9jdW1lbnQiLCJleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYmluZGluZ3NGb3JTaWRlRWZmZWN0cyIsIm9BY3RpdmVEb2N1bWVudCIsImFjdGl2YXRlRG9jdW1lbnQiLCJtZXNzYWdlc1JlY2VpdmVkIiwiZ2V0TWVzc2FnZXMiLCJjb25jYXQiLCJnZXRUeXBlIiwiY29yZUxpYnJhcnkiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJNZXNzYWdlVG9hc3QiLCJmb3JFYWNoIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5Iiwic0FjdGlvbk5hbWUiLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb250ZXh0VG9Qcm9jZXNzIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwic05hbWUiLCJzcGxpdCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJkZWVwQ2xvbmUiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwib1Jlc3VsdCIsImNhbGxCb3VuZEFjdGlvbiIsInBhcmFtZXRlclZhbHVlcyIsImludm9jYXRpb25Hcm91cGluZyIsImFkZGl0aW9uYWxTaWRlRWZmZWN0Iiwib25TdWJtaXR0ZWQiLCJvblJlc3BvbnNlIiwiY29udHJvbElkIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJiR2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJzZWxlY3RlZEl0ZW1zIiwiY2FsbEFjdGlvbkltcG9ydCIsIl9oYW5kbGVBY3Rpb25SZXNwb25zZSIsImFUcmFuc2llbnRNZXNzYWdlcyIsImFjdGlvbk5hbWUiLCJzZXRQcm9wZXJ0eSIsImJ5SWQiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJvTGlzdEJpbmRpbmciLCJtRmllbGRzIiwib0RpYWxvZyIsIm9QYXJlbnRDb250cm9sIiwib1RyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJvVHJhbnNpZW50Q29udGV4dCIsInNGcmFnbWVudE5hbWUiLCJvRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsImdldFJlc291cmNlTW9kZWwiLCJvTWV0YU1vZGVsIiwiYUltbXV0YWJsZUZpZWxkcyIsInNQYXRoIiwib0VudGl0eVNldENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImkiLCJvSW1tdXRhYmxlQ3R4TW9kZWwiLCJKU09OTW9kZWwiLCJvSW1tdXRhYmxlQ3R4IiwiYVJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwiLCJvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4Iiwib05ld0ZyYWdtZW50IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJmaWVsZHMiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJtb2RlbHMiLCJfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlciIsIm1lc3NhZ2VDb250cm9sSWQiLCJhbGxNZXNzYWdlcyIsInJlbGV2YW50TWVzc2FnZXMiLCJtc2ciLCJnZXRDb250cm9sSWRzIiwic29tZSIsImluY2x1ZGVzIiwiYWN0aW9uUGFyYW1ldGVySW5mb3MiLCJvQ29udHJvbGxlciIsImhhbmRsZUNoYW5nZSIsImV2ZW50IiwiZmllbGRJZCIsImdldFBhcmFtZXRlciIsImZpZWxkIiwiZ2V0U291cmNlIiwiYWN0aW9uUGFyYW1ldGVySW5mbyIsInZhbGlkYXRpb25Qcm9taXNlIiwiaGFzRXJyb3IiLCJoYW5kbGVMaXZlQ2hhbmdlIiwib0RpYWxvZ0NvbnRlbnQiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsImlzRGlhbG9nQ29uZmlybWVkIiwiZ2VuZXJhdGUiLCJjb250ZW50V2lkdGgiLCJfRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwidmFsaWRhdGVQcm9wZXJ0aWVzIiwiYklzQ3JlYXRlRGlhbG9nIiwidHJhbnNpZW50RGF0YSIsImtleXMiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJzdGFydHNXaXRoIiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJvTmV3RG9jdW1lbnRDb250ZXh0Iiwib1Byb21pc2UiLCJwcm9taXNlUmVzcG9uc2UiLCJiS2VlcERpYWxvZ09wZW4iLCJvUmVzcG9uc2UiLCJzZXRCaW5kaW5nQ29udGV4dCIsInJlc3BvbnNlIiwiQ3JlYXRpb25GYWlsZWQiLCJiZWZvcmVDbG9zZSIsImdldElkIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJhRm9ybUVsZW1lbnRzIiwiYWRkRGVwZW5kZW50Iiwic2V0VXNlckRlZmF1bHRzIiwiY3JlYXRlQWN0aW9uIiwicGFyYW1ldGVyRmllbGQiLCJnZXRGaWVsZHMiLCJpc011bHRpVmFsdWUiLCJwYXJhbWV0ZXIiLCJnZXRJdGVtcyIsImdldFZhbHVlIiwiZm5SZXNvbHZlIiwiZm5DcmVhdGVDb21wbGV0ZWQiLCJvRXZlbnQiLCJiU3VjY2VzcyIsImRldGFjaENyZWF0ZUNvbXBsZXRlZCIsImZuU2FmZUNvbnRleHRDcmVhdGVkIiwiY3JlYXRlZCIsInRoZW4iLCJ0cmFjZSIsImNhdGNoIiwiY29udGV4dEVycm9yIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsInNOZXdBY3Rpb24iLCJwcmVmZXJyZWRNb2RlIiwidG9VcHBlckNhc2UiLCJzUHJlZmVycmVkTW9kZSIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBMaW5lSXRlbSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblBhcmFtZXRlckluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlT3B0aW9uLCBEZWxldGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgaXNOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IHR5cGUgeyAkUG9wb3ZlclNldHRpbmdzIH0gZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBGb3JtRWxlbWVudCBmcm9tIFwic2FwL3VpL2xheW91dC9mb3JtL0Zvcm1FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgaXNEYXRhRmllbGRGb3JBY3Rpb24gfSBmcm9tIFwiLi4vLi4vY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcywgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdG9FUzZQcm9taXNlIGZyb20gXCIuLi8uLi9oZWxwZXJzL1RvRVM2UHJvbWlzZVwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG4vL0VudW1zIGZvciBkZWxldGUgdGV4dCBjYWxjdWxhdGlvbnMgZm9yIGRlbGV0ZSBjb25maXJtIGRpYWxvZy5cbmNvbnN0IERlbGV0ZU9wdGlvblR5cGVzID0gZGVsZXRlSGVscGVyLkRlbGV0ZU9wdGlvblR5cGVzO1xuY29uc3QgRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wgPSBkZWxldGVIZWxwZXIuRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG5cbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyczxUPihtUGFyYW1ldGVycz86IEV2ZW50IHwgVCk6IFQge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9IGFzIFQ7XG5cdH1cblx0cmV0dXJuIChtUGFyYW1ldGVycyBhcyBUKSB8fCAoe30gYXMgVCk7XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGJ1c3lJZD86IHN0cmluZztcblx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGluYWN0aXZlPzogYm9vbGVhbjtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBDYW5jZWxQYXJhbWV0ZXJzID0geyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuOyBiZWZvcmVDYW5jZWxDYWxsQmFjaz86IEZ1bmN0aW9uIH07XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMgPSBEZWxldGVQYXJhbWV0ZXJzICYge1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdG5vRGlhbG9nPzogYm9vbGVhbjtcbn07XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0YnVzeUxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRidXN5VW5sb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogT0RhdGFWNENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGxldCBwYXRoOiBzdHJpbmc7XG5cdFx0aWYgKHNvdXJjZS5pc0E8T0RhdGFWNENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdHBhdGggPSBzb3VyY2UuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gKHNvdXJjZS5pc1JlbGF0aXZlKCkgPyBzb3VyY2UuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBzb3VyY2UuZ2V0UGF0aCgpKSA/PyBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtUGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG5cdFx0b1ZpZXc6IFZpZXdcblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGRlZmF0dWwgdmFsdWVzIGZyb20gdGhlIERlZmF1bHRWYWx1ZSBmdW5jdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gYmUgdXNlZCBmb3IgY3JlYXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTxvYmplY3QgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgYXMgc3RyaW5nKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ09iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSB8IEVudGl0eVNldCkuYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkKT8uYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25OYW1lID0gZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA/PyBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0O1xuXG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25OYW1lKSB7XG5cdFx0XHQvLyBObyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZ1bmN0aW9uT25OYXZQcm9wID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiYgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBmdW5jdGlvbk9uTmF2UHJvcCA/IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSA6IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbkNvbnRleHQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoZGVmYXVsdEZ1bmN0aW9uQ29udGV4dC5nZXRQYXRoKCkpfS8ke2RlZmF1bHRGdW5jdGlvbk5hbWV9YDtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0aWYgKG9wdGlvbnMucGFyZW50Q29udGV4dD8uaXNFeHBhbmRlZCgpID09PSBmYWxzZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgcGFyZW50IGNvbnRleHQgYWxyZWFkeSBoYXMgY2hpbGRyZW4gYW5kIGlzIGNvbGxhcHNlZCwgd2UgZXhwYW5kIGl0IGZpcnN0XG5cdFx0XHRcdGF3YWl0IGxpc3RCaW5kaW5nLmV4cGFuZChvcHRpb25zLnBhcmVudENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmcuY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBsaXN0QmluZGluZy5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlLCBvcHRpb25zLmNyZWF0ZUF0RW5kLCBvcHRpb25zLmNyZWF0ZUluYWN0aXZlKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cblx0XHRjb25zdCBub25Db21wdXRlZFZpc2libGVGaWVsZHMgPSBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMobWV0YU1vZGVsLCBtZXRhUGF0aCwgYXBwQ29tcG9uZW50KTtcblx0XHQvLyBEbyBub3QgY29uc2lkZXIgZmllbGRzIGZvciB3aGljaCB3ZSBwcm92aWRlIHNvbWUgaW5pdGlhbCBkYXRhXG5cdFx0cmV0dXJuIG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcy5maWx0ZXIoKGZpZWxkTmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuICEoZmllbGROYW1lIGluIChjcmVhdGVEYXRhID8/IHt9KSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeUlkXSBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRpblBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKGluUGFyYW1ldGVycyk7XG5cdFx0aWYgKCFtYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChtYWluTGlzdEJpbmRpbmcpO1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGJ1c3lQYXRoID0gdGhpcy5nZXRCdXN5UGF0aChwYXJhbWV0ZXJzKTtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gZnJvbUNvcHlQYXN0ZSA/IHVuZGVmaW5lZCA6IHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdH1cblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZUNvcmUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdHRyeSB7XG5cdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLnBlcmZvcm1BY3Rpb25PckNyZWF0aW9uKFxuXHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHJlc291cmNlQnVuZGxlQ29yZSxcblx0XHRcdFx0ZnJvbUNvcHlQYXN0ZVxuXHRcdFx0KTtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dCE7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8IGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykgJiZcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0Py5pc1RyYW5zaWVudCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHQvLyB0aGlzIGxpbmUgc2hvd3MgdGhlIGV4cGVjdGVkIGNvbnNvbGUgZXJyb3IgVW5jYXVnaHQgKGluIHByb21pc2UpIEVycm9yOiBSZXF1ZXN0IGNhbmNlbGVkOiBQT1NUIFRyYXZlbDsgZ3JvdXA6IHN1Ym1pdExhdGVyXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRCdXN5UGF0aChtUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID09PSBcIkxvY2FsXCIgPyBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gIDogXCIvYnVzeVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuZGF0YSA/IE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMuZGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkgOiBbXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBtYWluTGlzdEJpbmRpbmcgJiYgbWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZVBhcmFtZXRlcnNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBjcmVhdGVQYXJhbWV0ZXJzLnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0fSwge30pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycy5kYXRhLCB7XG5cdFx0XHRjcmVhdGVBdEVuZDogISFwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0Y3JlYXRlSW5hY3RpdmU6ICEhcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgZWl0aGVyIHZpYSBuZXcgQWN0aW9uIG9yIGNyZWF0ZURvY3VtZW50Q29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5TW9kZSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5SWQgSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmluYWN0aXZlIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGEgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbmx5IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZUNvcmUgQ29yZSByZXNvdXJjZSBidW5kbGVcblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1BY3Rpb25PckNyZWF0aW9uKFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRyZXNvdXJjZUJ1bmRsZUNvcmU6IFJlc291cmNlQnVuZGxlLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IG1vZGVsID0gbWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCksXG5cdFx0XHRtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSksXG5cdFx0XHRtZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobWV0YU1vZGVsLCBtZXRhUGF0aCksXG5cdFx0XHRjcmVhdGVIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0Y29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRzdGFydHVwUGFyYW1ldGVycyA9IChjb21wb25lbnREYXRhICYmIGNvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0bmV3QWN0aW9uID0gIW1haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyB0aGlzLl9nZXROZXdBY3Rpb24oc3RhcnR1cFBhcmFtZXRlcnMsIGNyZWF0ZUhhc2gsIG1ldGFNb2RlbCwgbWV0YVBhdGgpIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJzOiBCaW5kQ29udGV4dFBhcmFtZXRlcnMgPSB7ICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWUgfTtcblxuXHRcdGlmIChtZXNzYWdlc1BhdGgpIHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzW1wiJHNlbGVjdFwiXSA9IG1lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0bGV0IHJlc3VsdDogdW5rbm93bjtcblx0XHRpZiAobmV3QWN0aW9uKSB7XG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGxBY3Rpb24oXG5cdFx0XHRcdG5ld0FjdGlvbixcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnRleHRzOiBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0bGFiZWw6IHRoaXMuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwobWV0YU1vZGVsLCBtZXRhUGF0aCwgbmV3QWN0aW9uLCByZXNvdXJjZUJ1bmRsZUNvcmUpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBiaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0YklzQ3JlYXRlQWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHJlc3VsdCBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IGluaXRpYWxEYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0XHRpZiAoIWZyb21Db3B5UGFzdGUpIHtcblx0XHRcdFx0XHRjb25zdCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tRGVmYXVsdFZhbHVlRnVuY3Rpb24obWFpbkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRcdGRlbGV0ZSBwYXJhbWV0ZXJzLmRhdGFbXCJAb2RhdGEuY29udGV4dFwiXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlzTmV3UGFnZUNyZWF0aW9uID1cblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0XHRjb25zdCBub25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBpc05ld1BhZ2VDcmVhdGlvblxuXHRcdFx0XHRcdD8gdGhpcy5nZXRDcmVhdGlvblBhcmFtZXRlcnMobWFpbkxpc3RCaW5kaW5nLCBpbml0aWFsRGF0YSwgYXBwQ29tcG9uZW50KVxuXHRcdFx0XHRcdDogW107XG5cdFx0XHRcdGlmIChub25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IG9uS2V5RmllbGRSZXN1bHQgPSBhd2FpdCB0aGlzLl9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdFx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0bm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0bW9kZWwsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IG9uS2V5RmllbGRSZXN1bHQubmV3Q29udGV4dDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdGlmICghcGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihtYWluTGlzdEJpbmRpbmcsIG5ld0RvY3VtZW50Q29udGV4dCwgcGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9pc0RyYWZ0RW5hYmxlZCh2Q29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10pOiBib29sZWFuIHtcblx0XHRjb25zdCBjb250ZXh0Rm9yRHJhZnRNb2RlbCA9IHZDb250ZXh0c1swXTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0Rm9yRHJhZnRNb2RlbCk7XG5cdFx0cmV0dXJuIHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudHMgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KFxuXHRcdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10sXG5cdFx0bVBhcmFtZXRlcnM6IFRyYW5zYWN0aW9uRGVsZXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBkZWxldGUgZG9jdW1lbnQgbG9ja1xuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdGNvbnN0IGNvbnRleHRzVG9EZWxldGUgPSBBcnJheS5pc0FycmF5KGNvbnRleHRzKSA/IFsuLi5jb250ZXh0c10gOiBbY29udGV4dHNdO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RW5hYmxlZCA9IHRoaXMuX2lzRHJhZnRFbmFibGVkKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgfHwgY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1zOiBDb250cm9sW10gPSBbXTtcblx0XHRcdFx0bGV0IG9wdGlvbnM6IERlbGV0ZU9wdGlvbltdID0gW107XG5cdFx0XHRcdGxldCB1blNhdmVkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdFx0XHQvLyBpdGVtcyh0ZXh0cykgYW5kIG9wdGlvbnMoY2hlY2tCb3hlcyBhbmQgc2luZ2xlIGRlZmF1bHQgb3B0aW9uKSBmb3IgY29uZmlybSBkaWFsb2cuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHQvLyBub24tVGFibGVcblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgMSBvZiB0aGUgZHJhZnRzIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2VkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHREYXRhID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhY29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChsb2NrZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBtZXNzYWdlIGJveCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBsb2NraW5nIHVzZXIgYW5kIHJldHVyblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tpbmdVc2VyTmFtZSA9IGxvY2tlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NraW5nVXNlck5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdF0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiByZWplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR1blNhdmVkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgeyBJc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIH0gPSBjb250ZXh0LmdldE9iamVjdCgpIHx8IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIElzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmIEhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmICEhRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGE/LkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdGxldCBub25UYWJsZVR4dCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRpZiAodW5TYXZlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdW5TYXZlZENvbnRleHRVc2VyID0gdW5TYXZlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0W3VuU2F2ZWRDb250ZXh0VXNlcl0sXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGUsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX09OTFlcIixcblx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy50aXRsZV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IERlbGV0ZU9wdGlvblR5cGVzLmRlbGV0YWJsZUNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0dGV4dDogbm9uVGFibGVUeHQsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sOiBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbC5URVhUXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGFibGVcblx0XHRcdFx0XHRcdGxldCB0b3RhbERlbGV0YWJsZSA9IGNvbnRleHRzVG9EZWxldGUubGVuZ3RoO1xuXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlICs9XG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhOb25EZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/Lmxlbmd0aCA/PyAwKSArXG5cdFx0XHRcdFx0XHRcdFx0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cz8ubGVuZ3RoID8/IDApO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSxcblx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLFxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5vbkRlbGV0YWJsZVRleHQgPSBkZWxldGVIZWxwZXIuZ2V0Tm9uRGVsZXRhYmxlVGV4dChtUGFyYW1ldGVycywgdG90YWxEZWxldGFibGUsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHRcdFx0XHRpZiAobm9uRGVsZXRhYmxlVGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGl0ZW1zLnB1c2gobm9uRGVsZXRhYmxlVGV4dCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9uc0RlbGV0YWJsZVRleHRzID0gZGVsZXRlSGVscGVyLmdldE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvcHRpb25zID0gWy4uLm9wdGlvbnMsIC4uLm9wdGlvbnNEZWxldGFibGVUZXh0c107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgY29tbW9uQmluZGluZyA9IChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzID8/IGNvbnRleHRzVG9EZWxldGUpWzBdLmdldEJpbmRpbmcoKSBhcyBCaW5kaW5nO1xuXHRcdFx0XHRjb25zdCBpblRyZWVUYWJsZSA9XG5cdFx0XHRcdFx0Y29tbW9uQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSAmJlxuXHRcdFx0XHRcdHRoaXMuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChjb21tb25CaW5kaW5nKTtcblxuXHRcdFx0XHQvLyBDb250ZW50IG9mIERlbGV0ZSBEaWFsb2dcblx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRlbGV0ZUhlbHBlci5kZWxldGVDb25maXJtSGFuZGxlcihcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGRyYWZ0RW5hYmxlZCxcblx0XHRcdFx0XHRcdFx0aW5UcmVlVGFibGVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IGRpYWxvZyA9IHRoaXMuY3JlYXRlRGVsZXRlRGlhbG9nKGl0ZW1zLCBtUGFyYW1ldGVycywgcmVzb3VyY2VNb2RlbCwgZm5Db25maXJtLCByZWplY3QpO1xuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub0RpYWxvZykge1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRkaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHQvLyBkZWxldGUgZG9jdW1lbnQgdW5sb2NrXG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBmbyB0aGUgZGVsZXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBjb250cm9scyB1c2VkIGZvciB0aGUgZGlhbG9nIGNvbnRlbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIG9mIHRoZSBkZWxldGUgYnV0dG9uIGlmIGFueVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIGN1cnJlbnQgZW50aXR5U2V0XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBmbkNvbmZpcm0gRnVuY3Rpb24gZXhlY3V0ZWQgdXBvbiB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZGVsZXRpb25cblx0ICogQHBhcmFtIGZuUmVqZWN0IEZ1bmN0aW9uIGV4ZWN1dGVkIGlmIHRoZSBkaWFsb2cgaXMgY2xvc2VkIHZpYSBDYW5jZWwgb3IgRXNjYXBlIGJ1dHRvblxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBkZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKi9cblx0Y3JlYXRlRGVsZXRlRGlhbG9nKFxuXHRcdGl0ZW1zOiBDb250cm9sW10sXG5cdFx0cGFyYW1ldGVyczogUGFydGlhbDx7IHBhcmVudENvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7IGVudGl0eVNldE5hbWU6IHN0cmluZyB9Pixcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGZuQ29uZmlybTogRnVuY3Rpb24sXG5cdFx0Zm5SZWplY3Q6IEZ1bmN0aW9uXG5cdCk6IERpYWxvZyB7XG5cdFx0bGV0IGRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdGNvbnN0IHZCb3ggPSBuZXcgVkJveCh7IGl0ZW1zOiBpdGVtcyB9KTtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZUNvcmUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdGxldCB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiTV9DT01NT05fVEFCTEVfREVMRVRFXCIsIHVuZGVmaW5lZCwgcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKTtcblx0XHR9XG5cdFx0Y29uc3QgZGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHR0aXRsZTogdGl0bGUsXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBbdkJveF0sXG5cdFx0XHRhcmlhTGFiZWxsZWRCeTogaXRlbXMsXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHRpdGxlLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2dDb25maXJtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRkaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0aWYgKCFkaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRpYWxvZztcblx0fVxuXG5cdC8qKlxuXHQgKiBFZGl0cyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGRyYWZ0IGNvbnRleHQgaW4gY2FzZSBvZiBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGVkaXREb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0Z3JvdXBJZDogc3RyaW5nXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0XHR9XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdC8vIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBlZGl0IGFjdGlvbiB3ZSdsbCBoYXZlIHRvIHJlbW92ZSBhbGwgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9OZXdDb250ZXh0ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvVmlldzogb1ZpZXdcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0XHRcdCAgKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbihvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGNvbmN1cnJlbnRFZGl0RmxhZzogdHJ1ZSB9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlzT2JqZWN0TW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyB8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRpc09iamVjdE1vZGlmaWVkOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuY2VsIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0bGV0IHJldHVybmVkVmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIWlzT2JqZWN0TW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdGlzT2JqZWN0TW9kaWZpZWQgPSBkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2NvbmZpcm1EaXNjYXJkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgY29udGV4dCBpcyBrZXB0IGFsaXZlIHdlIHNldCBpdCBhZ2FpbiB0byBkZXRhY2ggdGhlIG9uQmVmb3JlRGVzdHJveSBjYWxsYmFjayBhbmQgaGFuZGxlIG5hdmlnYXRpb24gaGVyZVxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBuZWVkcyB0byBzdGlsbCBiZSBrZXB0IGFsaXZlIHRvIGJlIGFibGUgdG8gcmVzZXQgY2hhbmdlcyBwcm9wZXJseVxuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUodHJ1ZSwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGlmIChpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWJsaW5nQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBhd2FpdCBvU2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBvTW9kZWwuYmluZENvbnRleHQoc0Nhbm9uaWNhbFBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQpIHtcblx0XHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gZGlzY2FyZGVkQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtb3ZlIGV4aXN0aW5nIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Ly8gc2hvdyB1bmJvdW5kIG1lc3NhZ2VzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHJldHVybiByZXR1cm5lZFZhbHVlO1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHNhdmVkXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBUcnVlIGlmIHdlIHNob3VsZCBleGVjdXRlIHNpZGUgZWZmZWN0cyBpbiBjYXNlIG9mIGFuIGVycm9yXG5cdCAqIEBwYXJhbSBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzIFRoZSBsaXN0QmluZGluZ3MgdG8gYmUgdXNlZCBmb3IgZXhlY3V0aW5nIHNpZGUgZWZmZWN0cyBvbiBlcnJvclxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBzYXZlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBib29sZWFuLFxuXHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM6IE9EYXRhTGlzdEJpbmRpbmdbXSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCwge30sIG1lc3NhZ2VIYW5kbGVyKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQoY29udGV4dCwgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0uZ2V0VHlwZSgpID09PSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZS5TdWNjZXNzKSkge1xuXHRcdFx0XHQvLyBzaG93IG91ciBvYmplY3QgY3JlYXRpb24gdG9hc3Qgb25seSBpZiBpdCBpcyBub3QgY29taW5nIGZyb20gYmFja2VuZFxuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRpc05ld09iamVjdFxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiKVxuXHRcdFx0XHRcdFx0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfU0FWRURcIilcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmdyb3VwSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGRpc2FibGVTdHJpY3RIYW5kbGluZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0XHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0b1ZpZXc6IFZpZXcgfCBudWxsLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG5cdCk6IFByb21pc2U8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDxPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZD5bXT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0bGV0IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycztcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRzQWN0aW9uTmFtZSA9IHNOYW1lIHx8IHNBY3Rpb25OYW1lO1xuXG5cdFx0Y29udGV4dFRvUHJvY2VzcyA9IHNOYW1lID8gdW5kZWZpbmVkIDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0Ly9jaGVja2luZyB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDAgbGVuZ3RoIG9yIG5vdCBhbiBhcnJheShjcmVhdGUgYWN0aW9uKVxuXHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmICgoQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSAmJiBjb250ZXh0VG9Qcm9jZXNzLmxlbmd0aCkgfHwgIUFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykpKSB7XG5cdFx0XHRjb250ZXh0VG9Qcm9jZXNzID0gQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSA/IGNvbnRleHRUb1Byb2Nlc3NbMF0gOiBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdFx0b01vZGVsID0gY29udGV4dFRvUHJvY2Vzcy5nZXRNb2RlbCgpO1xuXHRcdH1cblx0XHRpZiAobVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRcdH1cblx0XHRpZiAoIW9Nb2RlbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUGFzcyBhIGNvbnRleHQgZm9yIGEgYm91bmQgYWN0aW9uIG9yIHBhc3MgdGhlIG1vZGVsIGZvciBhbiB1bmJvdW5kIGFjdGlvblwiKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHRoZSBiaW5kaW5nIHBhcmFtZXRlcnMgJHNlbGVjdCBhbmQgJGV4cGFuZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9uIHRoaXMgYWN0aW9uXG5cdFx0Ly8gYWxzbyBnYXRoZXIgYWRkaXRpb25hbCBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgc3VjaCBhcyB0ZXh0IGFzc29jaWF0aW9uc1xuXHRcdC8vIGVuc3VyZSBkZWVwQ2xvbmUgc28gdGhlIG9yaWdpbmFsIFNpZGVFZmZlY3RzIG1hcHBpbmcgaXMgbm90IG1vZGlmaWVkIChCQ1A6IDIzODAxMTc5NTYpXG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzUGFyYW1ldGVycyA9XG5cdFx0XHRkZWVwQ2xvbmUoYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIGNvbnRleHRUb1Byb2Nlc3MgYXMgT0RhdGFWNENvbnRleHQpKSB8fFxuXHRcdFx0e307XG5cblx0XHR0cnkge1xuXHRcdFx0bGV0IG9SZXN1bHQ6IHVuZGVmaW5lZCB8IE9EYXRhVjRDb250ZXh0IHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQ+W107XG5cdFx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiBvTW9kZWwpIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycy5jb250ZXh0cyBhcyBPRGF0YVY0Q29udGV4dFtdLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0bUJpbmRpbmdQYXJhbWV0ZXJzOiBtQmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvblN1Ym1pdHRlZDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25SZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGNvbnRyb2xJZDogbVBhcmFtZXRlcnMuY29udHJvbElkLFxuXHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0OiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuY29udGV4dHMgYXMgT0RhdGFWNENvbnRleHRbXSxcblx0XHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0Z3JvdXBJZDogbVBhcmFtZXRlcnMuZ3JvdXBJZFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b25TdWJtaXR0ZWQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uUmVzcG9uc2U6ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmxhYmVsXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfaGFuZGxlQWN0aW9uUmVzcG9uc2UoXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdG1QYXJhbWV0ZXJzOiB7IGxhYmVsPzogc3RyaW5nOyBpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDsgY29udHJvbElkPzogc3RyaW5nOyBwYXJlbnRDb250cm9sPzogQ29udHJvbCB9LFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbiB8IERpYWxvZz4ge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRsZXQgY29udHJvbDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkICYmIG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgJiYgbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5pc0E8Vmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSkge1xuXHRcdFx0Y29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgc0FjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGNvbnRyb2w6IGNvbnRyb2wgfSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuXHRcdGNvbnN0IGVycm9yVG9SZW1vdmUgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKGVycm9yOiBNZXNzYWdlKSA9PiBlcnJvci52YWxpZGF0aW9uKTsgLy8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFBvcG92ZXIuIEZhY3RvcnkgbWV0aG9kIHRvIG1ha2UgdW5pdCB0ZXN0cyBlYXNpZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyBJbml0aWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3BvdmVyXG5cdCAqIEByZXR1cm5zIEEgbmV3IFBvcG92ZXJcblx0ICovXG5cdF9jcmVhdGVQb3BvdmVyKHNldHRpbmdzPzogJFBvcG92ZXJTZXR0aW5ncyk6IFBvcG92ZXIge1xuXHRcdHJldHVybiBuZXcgUG9wb3ZlcihzZXR0aW5ncyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIHRvIGNvbmZpcm0gZGlzY2FyZCBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBpc01vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBhbmQgYSBjb25maXJtYXRpb24gcG9wb3ZlciBtdXN0IGJlIHNob3duXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfY29uZmlybURpc2NhcmQoY2FuY2VsQnV0dG9uOiBCdXR0b24sIGlzTW9kaWZpZWQ6IGJvb2xlYW4sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBJZiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCwgZG8gbm90IHNob3cgYW55IGNvbmZpcm1hdGlvbiBwb3BvdmVyXG5cdFx0aWYgKCFpc01vZGlmaWVkKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY29uZmlybWF0aW9uUG9wb3ZlciA9IHRoaXMuX2NyZWF0ZVBvcG92ZXIoe1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkQ29udGVudChuZXcgVkJveCh7IGl0ZW1zOiBbdGl0bGUsIGNvbmZpcm1CdXR0b25dIH0pKTtcblxuXHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQmVmb3JlT3BlbigoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuc2V0SW5pdGlhbEZvY3VzKGNvbmZpcm1CdXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0aWYgKGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiKSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIub3BlbkJ5KGNhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG1GaWVsZHM6IHN0cmluZ1tdLFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRiSXNDcmVhdGVEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPHsgbmV3Q29udGV4dD86IE9EYXRhVjRDb250ZXh0IH0+IHtcblx0XHRsZXQgb0RpYWxvZzogRGlhbG9nO1xuXHRcdGNvbnN0IG9QYXJlbnRDb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblxuXHRcdC8vIENyYXRlIGEgZmFrZSAodHJhbnNpZW50KSBsaXN0QmluZGluZyBhbmQgY29udGV4dCwganVzdCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgZGlhbG9nXG5cdFx0Y29uc3Qgb1RyYW5zaWVudExpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9MaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0JCR1cGRhdGVHcm91cElkOiBcInN1Ym1pdExhdGVyXCJcblx0XHR9KTtcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IG9UcmFuc2llbnRDb250ZXh0ID0gb1RyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShtUGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx7IG5ld0NvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCB9Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9Ob25Db21wdXRlZFZpc2libGVLZXlGaWVsZHNEaWFsb2dcIjtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRyZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCEpLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzOiBDb250ZXh0W10gPSBbXSxcblx0XHRcdFx0c1BhdGggPSAob0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSA/IG9MaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSA6IG9MaXN0QmluZGluZy5nZXRQYXRoKCkpIGFzIHN0cmluZyxcblx0XHRcdFx0b0VudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNQYXRoKSBhcyBDb250ZXh0LFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtRmllbGRzKSB7XG5cdFx0XHRcdGFJbW11dGFibGVGaWVsZHMucHVzaChvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHttRmllbGRzW2ldfWApISk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdFx0XHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyhzTWV0YVBhdGgsIG9NZXRhTW9kZWwpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsID0gbmV3IEpTT05Nb2RlbChhUmVxdWlyZWRQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHggPSBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgb05ld0ZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRmaWVsZHM6IG9JbW11dGFibGVDdHgsXG5cdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXM6IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBvRW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRyZXF1aXJlZFByb3BlcnRpZXM6IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyID0gKG1lc3NhZ2VDb250cm9sSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0XHRjb25zdCBhbGxNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRcdC8vIGFsc28gcmVtb3ZlIG1lc3NhZ2VzIGFzc2lnbmVkIHRvIGlubmVyIGNvbnRyb2xzLCBidXQgYXZvaWQgcmVtb3ZpbmcgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCBwYXJhbXRlcnMgKHdpdGggbmFtZSBiZWluZyBzdWJzdHJpbmcgb2YgYW5vdGhlciBwYXJhbWV0ZXIgbmFtZSlcblx0XHRcdFx0Y29uc3QgcmVsZXZhbnRNZXNzYWdlcyA9IGFsbE1lc3NhZ2VzLmZpbHRlcigobXNnOiBNZXNzYWdlKSA9PlxuXHRcdFx0XHRcdG1zZy5nZXRDb250cm9sSWRzKCkuc29tZSgoY29udHJvbElkOiBzdHJpbmcpID0+IGNvbnRyb2xJZC5pbmNsdWRlcyhtZXNzYWdlQ29udHJvbElkKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKHJlbGV2YW50TWVzc2FnZXMpO1xuXHRcdFx0fTtcblx0XHRcdGxldCBhY3Rpb25QYXJhbWV0ZXJJbmZvczogQWN0aW9uUGFyYW1ldGVySW5mb1tdO1xuXG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRmaXJlZCBvbiBmb2N1cyBvdXQgZnJvbSBmaWVsZCBvciBvbiBzZWxlY3RpbmcgYSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0dGhlIGNyZWF0ZSBidXR0b24gKENvbnRpbnVlKSBpcyBhbHdheXMgZW5hYmxlZC5cblx0XHRcdFx0XHRsaXZlQ2hhbmdlIGlzIG5vdCBmaXJlZCB3aGVuIHZhbHVlIGlzIGFkZGVkIGZyb20gdmFsdWVoZWxwLlxuXHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgZG9uZSBmb3IgY3JlYXRlIGJ1dHRvbi5cblx0XHRcdFx0Ki9cblx0XHRcdFx0aGFuZGxlQ2hhbmdlOiBhc3luYyAoZXZlbnQ6IEV2ZW50PHsgaWQ6IHN0cmluZzsgcHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+IH0+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGRJZCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGZpZWxkID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uUGFyYW1ldGVySW5mbyA9IGFjdGlvblBhcmFtZXRlckluZm9zLmZpbmQoXG5cdFx0XHRcdFx0XHQoYWN0aW9uUGFyYW1ldGVySW5mbykgPT4gYWN0aW9uUGFyYW1ldGVySW5mby5maWVsZCA9PT0gZmllbGRcblx0XHRcdFx0XHQpIGFzIEFjdGlvblBhcmFtZXRlckluZm87XG5cdFx0XHRcdFx0X3JlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW10ZXIoZmllbGRJZCk7XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby52YWxpZGF0aW9uUHJvbWlzZSA9IGV2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8udmFsdWUgPSBhd2FpdCBhY3Rpb25QYXJhbWV0ZXJJbmZvLnZhbGlkYXRpb25Qcm9taXNlO1xuXHRcdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mby5oYXNFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgYWN0aW9uUGFyYW1ldGVySW5mby52YWx1ZTtcblx0XHRcdFx0XHRcdGFjdGlvblBhcmFtZXRlckluZm8uaGFzRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRmaXJlZCBvbiBrZXkgcHJlc3MuIHRoZSBjcmVhdGUgYnV0dG9uIHRoZSBjcmVhdGUgYnV0dG9uIChDb250aW51ZSkgaXMgYWx3YXlzIGVuYWJsZWQuXG5cdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cblx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIGRvbmUgZm9yIGNyZWF0ZSBidXR0b24uXG5cdFx0XHRcdCovXG5cdFx0XHRcdGhhbmRsZUxpdmVDaGFuZ2U6IChldmVudDogRXZlbnQ8eyBpZDogc3RyaW5nIH0+KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGRJZCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdF9yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtdGVyKGZpZWxkSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBvRGlhbG9nQ29udGVudDogQ29udHJvbCA9IChhd2FpdCBGcmFnbWVudC5sb2FkKHtcblx0XHRcdFx0ZGVmaW5pdGlvbjogb05ld0ZyYWdtZW50IGFzIHVua25vd24gYXMgc3RyaW5nLFxuXHRcdFx0XHRjb250cm9sbGVyOiBvQ29udHJvbGxlclxuXHRcdFx0fSkpIGFzIENvbnRyb2w7XG5cdFx0XHRsZXQgb1Jlc3VsdDogeyBlcnJvcjogc3RyaW5nIH0gfCB7IHJlc3BvbnNlOiB7IG5ld0NvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCB9IH07XG5cdFx0XHRsZXQgaXNEaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHRcdG9EaWFsb2cgPSBuZXcgRGlhbG9nKGdlbmVyYXRlKFtcIkNyZWF0ZURpYWxvZ1wiLCBzTWV0YVBhdGhdKSwge1xuXHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSxcblx0XHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50XSxcblx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjIwcmVtXCIsXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblxuXHRcdFx0XHRcdHByZXNzOiBhc3luYyAoX0V2ZW50OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0XHQvKiBWYWxpZGF0aW9uIG9mIG1hbmRhdG9yeSBhbmQgdmFsdWUgc3RhdGUgZm9yIGFjdGlvbiBwYXJhbWV0ZXJzICovXG5cdFx0XHRcdFx0XHRpZiAoIShhd2FpdCBBY3Rpb25SdW50aW1lLnZhbGlkYXRlUHJvcGVydGllcyhhY3Rpb25QYXJhbWV0ZXJJbmZvcywgcmVzb3VyY2VNb2RlbCkpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9EaWFsb2cpO1xuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSBvVHJhbnNpZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0bGV0IGNyZWF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRyYW5zaWVudERhdGEpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGFueSBwcm9wZXJ0eSBzdGFydGluZyBieSBAJHVpNSBhcyB0aGV5IGFyZSBub3QgcHJvcGVydHkgY3JlYXRlZCBieSBmaWxsaW5nIHRoZSBmb3JtXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNQcm9wZXJ0eVBhdGg/LnN0YXJ0c1dpdGgoXCJAJHVpNVwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3NQcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXMoY3JlYXRlRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSk7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhID0gcGFyYW1ldGVycy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHRcdFx0XHRcdFx0fSwge30pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhjcmVhdGVEYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIikuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KG9MaXN0QmluZGluZywgY3JlYXRlRGF0YSwge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiAhIW1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZUluYWN0aXZlOiAhIW1QYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQ6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSB0aGlzLm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9MaXN0QmluZGluZywgb05ld0RvY3VtZW50Q29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9taXNlUmVzcG9uc2UgPSBhd2FpdCBvUHJvbWlzZTtcblx0XHRcdFx0XHRcdFx0aWYgKCFwcm9taXNlUmVzcG9uc2UgfHwgIXByb21pc2VSZXNwb25zZS5iS2VlcERpYWxvZ09wZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUmVzcG9uc2U6IHsgbmV3Q29udGV4dD86IE9EYXRhVjRDb250ZXh0IH0gPSBwcm9taXNlUmVzcG9uc2UgPz8ge307XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIHVua25vd24gYXMgT0RhdGFWNENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdG9SZXNwb25zZS5uZXdDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRpc0RpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgcmVzcG9uc2U6IG9SZXNwb25zZSB9O1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluIGNhc2Ugb2YgY3JlYXRpb24gZmFpbGVkLCBkaWFsb2cgc2hvdWxkIHN0YXkgb3BlbiAtIHRvIGFjaGlldmUgdGhlIHNhbWUsIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUgKGxpa2UgaW4gY2FzZSBvZiBzdWNjZXNzIHdpdGggYktlZXBEaWFsb2dPcGVuKVxuXHRcdFx0XHRcdFx0XHRpZiAob0Vycm9yICE9PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkICYmIG9FcnJvciAhPSBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gb3RoZXIgZXJyb3JzIGFyZSBub3QgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRvUmVzdWx0ID0geyBlcnJvcjogb0Vycm9yIGFzIHN0cmluZyB9O1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fQUNUSU9OX1BBUkFNRVRFUl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvUmVzdWx0ID0geyBlcnJvcjogRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRiZWZvcmVDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdC8qIFdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxsZWQsIG1lc3NhZ2VzIG5lZWQgdG8gYmUgcmVtb3ZlZCBpbiBjYXNlIHRoZSBzYW1lIGFjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgYWdhaW4gKi9cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGFjdGlvblBhcmFtZXRlckluZm8gb2YgYWN0aW9uUGFyYW1ldGVySW5mb3MpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGZpZWxkSWQgPSBhY3Rpb25QYXJhbWV0ZXJJbmZvLmZpZWxkLmdldElkKCk7XG5cdFx0XHRcdFx0XHRfcmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbXRlcihmaWVsZElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0Ly9yZWplY3RlZC9yZXNvbHZlZCB0aGUgcHJvbWlzIHJldHVybmVkIGJ5IF9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzXG5cdFx0XHRcdFx0Ly9hcyBzb29uIGFzIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBXaXRob3V0IHdhaXRpbmcgZm9yIHRoZSBkaWFsb2cnc1xuXHRcdFx0XHRcdC8vYW5pbWF0aW9uIHRvIGZpbmlzaFxuXHRcdFx0XHRcdGlmIChpc0RpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgob1Jlc3VsdCBhcyB7IHJlc3BvbnNlOiB7IG5ld0NvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCB9IH0pLnJlc3BvbnNlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KChvUmVzdWx0IGFzIHsgZXJyb3I6IHN0cmluZyB9KT8uZXJyb3IgPz8gRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhRm9ybUVsZW1lbnRzID0gKFxuXHRcdFx0XHQob0RpYWxvZ0NvbnRlbnQ/LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKSBhcyBNYW5hZ2VkT2JqZWN0KS5nZXRBZ2dyZWdhdGlvbihcImZvcm1Db250YWluZXJzXCIpIGFzIE1hbmFnZWRPYmplY3RbXVxuXHRcdFx0KVswXS5nZXRBZ2dyZWdhdGlvbihcImZvcm1FbGVtZW50c1wiKSBhcyBGb3JtRWxlbWVudFtdO1xuXG5cdFx0XHRpZiAob1BhcmVudENvbnRyb2wgJiYgb1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHR9XG5cblx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQob1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdGFJbW11dGFibGVGaWVsZHMsXG5cdFx0XHRcdFx0b1RyYW5zaWVudENvbnRleHQsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0KTtcblx0XHRcdFx0YWN0aW9uUGFyYW1ldGVySW5mb3MgPSBhRm9ybUVsZW1lbnRzLm1hcCgocGFyYW1ldGVyRmllbGQpOiBBY3Rpb25QYXJhbWV0ZXJJbmZvID0+IHtcblx0XHRcdFx0XHRjb25zdCBmaWVsZDogRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgPSBwYXJhbWV0ZXJGaWVsZC5nZXRGaWVsZHMoKVswXSBhcyBGaWVsZCB8IE11bHRpVmFsdWVGaWVsZDtcblx0XHRcdFx0XHRjb25zdCBpc011bHRpVmFsdWUgPSBmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXI6IHBhcmFtZXRlckZpZWxkLFxuXHRcdFx0XHRcdFx0aXNNdWx0aVZhbHVlOiBpc011bHRpVmFsdWUsXG5cdFx0XHRcdFx0XHRmaWVsZDogZmllbGQsXG5cdFx0XHRcdFx0XHR2YWx1ZTogaXNNdWx0aVZhbHVlID8gZmllbGQuZ2V0SXRlbXMoKSA6IGZpZWxkLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0XHR2YWxpZGF0aW9uUHJvbWlzZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0aGFzRXJyb3I6IGZhbHNlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgb25BZnRlckNyZWF0ZUNvbXBsZXRpb24oXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG9OZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8eyBiS2VlcERpYWxvZ09wZW46IGJvb2xlYW47IG5ld0NvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCB9IHwgdm9pZD4ge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IChvRXZlbnQ6IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIiksXG5cdFx0XHRcdGJTdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAob0NvbnRleHQgPT09IG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nLmRldGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhpcyk7XG5cdFx0XHRcdGZuUmVzb2x2ZShiU3VjY2Vzcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBmblNhZmVDb250ZXh0Q3JlYXRlZCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdChvTmV3RG9jdW1lbnRDb250ZXh0LmNyZWF0ZWQoKSA/PyBQcm9taXNlLnJlc29sdmUoKSlcblx0XHRcdFx0LnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdG9MaXN0QmluZGluZy5hdHRhY2hDcmVhdGVDb21wbGV0ZWQoZm5DcmVhdGVDb21wbGV0ZWQsIHRoaXMpO1xuXG5cdFx0cmV0dXJuIG9Qcm9taXNlLnRoZW4oXG5cdFx0XHRhc3luYyAoXG5cdFx0XHRcdGJTdWNjZXNzOiBib29sZWFuXG5cdFx0XHQpOiBQcm9taXNlPHtcblx0XHRcdFx0YktlZXBEaWFsb2dPcGVuOiBib29sZWFuO1xuXHRcdFx0XHRuZXdDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHR9IHwgdm9pZD4gPT4ge1xuXHRcdFx0XHRpZiAoIWJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHRcdFx0Zm5TYWZlQ29udGV4dENyZWF0ZWQoKTsgLy8gVG8gYXZvaWQgYSAncmVxdWVzdCBjYW5jZWxsZWQnIGVycm9yIGluIHRoZSBjb25zb2xlXG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5yZXNldENoYW5nZXMob0xpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB7IGJLZWVwRGlhbG9nT3BlbjogdHJ1ZSB9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0gW29TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlXVxuXHQgKiBAcGFyYW0gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXROZXdBY3Rpb24oXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiB7XG5cdFx0XHRwcmVmZXJyZWRNb2RlPzogc3RyaW5nW107XG5cdFx0fSxcblx0XHRzQ3JlYXRlSGFzaDogc3RyaW5nLFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nXG5cdCk6IHN0cmluZyB7XG5cdFx0bGV0IHNOZXdBY3Rpb247XG5cblx0XHRpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmIHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJJLUFDVElPTj1DUkVBVEVXSVRIXCIpKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9IHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJDUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJlxuXHRcdFx0c0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUFVVE9DUkVBVEVXSVRIXCIpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9IHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJBVVRPQ1JFQVRFV0lUSDpcIilcblx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHJpbmcoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApIHx8XG5cdFx0XHRcdFx0ICBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHNOZXdBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciB0aGUgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcGFyYW0gc05ld0FjdGlvbiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVDb3JlIFJlc291cmNlQnVuZGxlIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBDcmVhdGUgbGFiZWxcblx0ICogQHJldHVybnMgVGhlIGxhYmVsIGZvciB0aGUgQ3JlYXRlIEFjdGlvbiBEaWFsb2dcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZyxcblx0XHRzTmV3QWN0aW9uOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlQ29yZTogUmVzb3VyY2VCdW5kbGUgfCB1bmRlZmluZWRcblx0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBsaW5lSXRlbXMgPSBvTWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKSBhcyBMaW5lSXRlbSB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGxhYmVsID0gbGluZUl0ZW1zPy5maW5kKChsaW5lSXRlbSkgPT4gaXNEYXRhRmllbGRGb3JBY3Rpb24obGluZUl0ZW0pICYmIGxpbmVJdGVtLkFjdGlvbi5zcGxpdChcIihcIiwgMSlbMF0gPT09IHNOZXdBY3Rpb24pXG5cdFx0XHQ/LkxhYmVsO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGxhYmVsIHx8XG5cdFx0XHRvTWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NOZXdBY3Rpb259QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbGApIHx8XG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlPy5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKVxuXHRcdCk7XG5cdH1cbn1cblxuY29uc3Qgc2luZ2xldG9uID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKCk7XG5leHBvcnQgZGVmYXVsdCBzaW5nbGV0b247XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBZ0VBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFDRCxZQUFZO0VBQzNDLE1BQU1FLGdCQUFnQixHQUFHRCxTQUFTLENBQUNDLGdCQUFnQjs7RUFFbkQ7RUFDQSxNQUFNQyxpQkFBaUIsR0FBR0MsWUFBWSxDQUFDRCxpQkFBaUI7RUFDeEQsTUFBTUUsMEJBQTBCLEdBQUdELFlBQVksQ0FBQ0MsMEJBQTBCOztFQUUxRTtFQUNBLFNBQVNDLGFBQWEsQ0FBSUMsV0FBdUIsRUFBSztJQUNyRCxJQUFJQSxXQUFXLElBQUtBLFdBQVcsQ0FBV0MsV0FBVyxJQUFLRCxXQUFXLENBQVdDLFdBQVcsRUFBRSxDQUFDQyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBRTtNQUNoSUYsV0FBVyxHQUFHLENBQUMsQ0FBTTtJQUN0QjtJQUNBLE9BQVFBLFdBQVcsSUFBVyxDQUFDLENBQU87RUFDdkM7RUFBQyxJQXVCS0csaUJBQWlCO0lBQUE7SUFBQTtJQUFBLE9BQ3RCQyxRQUFRLEdBQVIsa0JBQVNDLFlBQTBCLEVBQUVDLFFBQWlCLEVBQVE7TUFDN0RDLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDSCxZQUFZLENBQUNJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRUgsUUFBUSxDQUFDO0lBQ3ZELENBQUM7SUFBQSxPQUVESSxVQUFVLEdBQVYsb0JBQVdMLFlBQTBCLEVBQUVDLFFBQWlCLEVBQVE7TUFDL0RDLFVBQVUsQ0FBQ0ksTUFBTSxDQUFDTixZQUFZLENBQUNJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRUgsUUFBUSxDQUFDO0lBQ3pELENBQUM7SUFBQSxPQUVETSxtQkFBbUIsR0FBbkIsNkJB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
|
|
1154
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEhlYWRlckNvbnRleHQiLCJkZWZhdWx0RnVuY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJkZWZhdWx0RnVuY3Rpb25PYmplY3RQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uUmVzdWx0IiwiaXNCb3VuZCIsIm9wZXJhdGlvbnMiLCJjYWxsQm91bmRGdW5jdGlvbiIsInRvU3RyaW5nIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbCIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiY3JlYXRlQ29udGV4dCIsImluaXRpYWxEYXRhIiwib3B0aW9ucyIsImRhdGFGb3JDcmVhdGlvbiIsImxpc3RCaW5kaW5nRm9yQ3JlYXRpb24iLCJwYXJlbnRDb250ZXh0IiwiaXNFeHBhbmRlZCIsImV4cGFuZCIsIk9iamVjdCIsImFzc2lnbiIsImJpbmRMaXN0IiwiJCRncm91cElkIiwiZ2V0R3JvdXBJZCIsIiQkdXBkYXRlR3JvdXBJZCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvYmplY3RQYXRoIiwicGFyZW50TmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJBZ2dyZWdhdGlvbiIsIlBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eSIsInZhbHVlIiwiRXJyb3IiLCJwYXJlbnRCaW5kaW5nRGF0YSIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiY3JlYXRlSW5hY3RpdmUiLCJnZXRDcmVhdGlvblBhcmFtZXRlcnMiLCJjcmVhdGVEYXRhIiwibWV0YVBhdGgiLCJub25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJnZXRDcmVhdGVQb3B1cEZpZWxkcyIsImZpbHRlciIsImZpZWxkTmFtZSIsImNyZWF0ZURvY3VtZW50IiwibWFpbkxpc3RCaW5kaW5nIiwiaW5QYXJhbWV0ZXJzIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJyZXNvdXJjZUJ1bmRsZUNvcmUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJwZXJmb3JtQWN0aW9uT3JDcmVhdGlvbiIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udHJvbCIsInBhcmVudENvbnRyb2wiLCJlcnJvciIsIkNvbnN0YW50cyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJjcmVhdGVEb2N1bWVudENvbnRleHQiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiZW50cmllcyIsIm1hcCIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjdXJyZW50T2JqZWN0IiwibWVzc2FnZXNQYXRoIiwiZ2V0TWVzc2FnZXNQYXRoIiwiY3JlYXRlSGFzaCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsImNvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJuZXdBY3Rpb24iLCJfZ2V0TmV3QWN0aW9uIiwiYmluZGluZ1BhcmFtZXRlcnMiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiSXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhIiwiaXNOZXdQYWdlQ3JlYXRpb24iLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsIm5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImNyZWF0ZVdpdGhEaWFsb2ciLCJ3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbiIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJtc2ciLCJtZXNzYWdlIiwiX2lzRHJhZnRFbmFibGVkIiwidkNvbnRleHRzIiwiY29udGV4dEZvckRyYWZ0TW9kZWwiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50IiwicmVzb3VyY2VNb2RlbCIsImNvbnRleHRzVG9EZWxldGUiLCJBcnJheSIsImlzQXJyYXkiLCJyZWplY3QiLCJkcmFmdEVuYWJsZWQiLCJzZWxlY3RlZENvbnRleHRzIiwiaXRlbXMiLCJ1blNhdmVkQ29udGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dCIsImNvbnRleHREYXRhIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwibG9ja2luZ1VzZXJOYW1lIiwiTWVzc2FnZUJveCIsInNob3ciLCJnZXRUZXh0IiwidGl0bGUiLCJvbkNsb3NlIiwibm9uVGFibGVUeHQiLCJ1blNhdmVkQ29udGV4dFVzZXIiLCJlbnRpdHlTZXROYW1lIiwiZGVzY3JpcHRpb24iLCJwdXNoIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJpblRyZWVUYWJsZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJmbkNvbmZpcm0iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0Vycm9yIiwiZGlhbG9nIiwiY3JlYXRlRGVsZXRlRGlhbG9nIiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImZuUmVqZWN0IiwiZGlhbG9nQ29uZmlybWVkIiwidkJveCIsIlZCb3giLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJhcmlhTGFiZWxsZWRCeSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZWRpdERvY3VtZW50IiwiZ3JvdXBJZCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm9OZXdDb250ZXh0IiwiZHJhZnQiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJzdGlja3kiLCJlZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24iLCJlcnIiLCJzaG93TWVzc2FnZXMiLCJjb25jdXJyZW50RWRpdEZsYWciLCJjYW5jZWxEb2N1bWVudCIsIm1JblBhcmFtZXRlcnMiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJvTW9kZWwiLCJyZXR1cm5lZFZhbHVlIiwiZHJhZnREYXRhQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRBZG1pbkRhdGEiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0Iiwib1NpYmxpbmdDb250ZXh0Iiwic0Nhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRpc2NhcmRlZENvbnRleHQiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZWZyZXNoIiwic2F2ZURvY3VtZW50IiwiZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImJpbmRpbmdzRm9yU2lkZUVmZmVjdHMiLCJvQWN0aXZlRG9jdW1lbnQiLCJhY3RpdmF0ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiZ2V0VHlwZSIsImNvcmVMaWJyYXJ5IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiZm9yRWFjaCIsIkNvbW1vblV0aWxzIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNBY3Rpb25OYW1lIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiY29udGV4dFRvUHJvY2VzcyIsIm1CaW5kaW5nUGFyYW1ldGVycyIsInNOYW1lIiwic3BsaXQiLCJtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzIiwiZGVlcENsb25lIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsIm9SZXN1bHQiLCJjYWxsQm91bmRBY3Rpb24iLCJwYXJhbWV0ZXJWYWx1ZXMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsIm9uU3VibWl0dGVkIiwib25SZXNwb25zZSIsImNvbnRyb2xJZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImlnbm9yZUVUYWciLCJjYWxsQWN0aW9uSW1wb3J0IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiYWN0aW9uTmFtZSIsInNldFByb3BlcnR5IiwiYnlJZCIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsImVycm9yVG9SZW1vdmUiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiX2NyZWF0ZVBvcG92ZXIiLCJzZXR0aW5ncyIsIlBvcG92ZXIiLCJpc01vZGlmaWVkIiwic2V0RW5hYmxlZCIsImNvbmZpcm1hdGlvblBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiVGV4dCIsImNvbmZpcm1CdXR0b24iLCJ3aWR0aCIsImFkZENvbnRlbnQiLCJhdHRhY2hCZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsImZpZWxkTmFtZXMiLCJsaXN0TWV0YVBhdGgiLCJ0cmFuc2llbnRMaXN0QmluZGluZyIsInJlZnJlc2hJbnRlcm5hbCIsInRyYW5zaWVudENvbnRleHQiLCJmaWVsZE1ldGFDb250ZXh0cyIsIm5hbWUiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNyZWF0ZURpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdDcmVhdGVEaWFsb2ciLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJvcGVuRGlhbG9nIiwiZSIsInJlc3VsdFByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwib25FeGl0RGlhbG9nIiwiZXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJjbG9zZURpYWxvZyIsInNldEJ1c3kiLCJiSXNDcmVhdGVEaWFsb2ciLCJ0cmFuc2llbnREYXRhIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwic3RhcnRzV2l0aCIsImNyZWF0ZURhdGFBc0FycmF5IiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJuZXdDb250ZXh0IiwiY3JlYXRpb25TdWNjZXNzIiwiQ3JlYXRpb25GYWlsZWQiLCJhdHRhY2hFeGl0RGlhbG9nIiwicHJvbWlzZSIsInByb21pc2VLZWVwZXIiLCJwYXJlbnRMaXN0QmluZGluZyIsIm9uQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRlZENvbnRleHQiLCJzdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRpb25TdWNjZXNzZnVsIiwiY3JlYXRlZCIsImNhdGNoIiwiY29udGV4dEVycm9yIiwidHJhY2UiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJzTmV3QWN0aW9uIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJzUHJlZmVycmVkTW9kZSIsIm9SZXNvdXJjZUJ1bmRsZUNvcmUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBMaW5lSXRlbSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRXhpdERpYWxvZ0V2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB7IGdldENvcmVVSUZhY3RvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzRGF0YUZpZWxkRm9yQWN0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZU9wdGlvbiwgRGVsZXRlUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IGRlbGV0ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRDcmVhdGVQb3B1cEZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHRvRVM2UHJvbWlzZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Ub0VTNlByb21pc2VcIjtcbmltcG9ydCB7IGlzTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCB0eXBlIHsgJFBvcG92ZXJTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG4vL0VudW1zIGZvciBkZWxldGUgdGV4dCBjYWxjdWxhdGlvbnMgZm9yIGRlbGV0ZSBjb25maXJtIGRpYWxvZy5cbmNvbnN0IERlbGV0ZU9wdGlvblR5cGVzID0gZGVsZXRlSGVscGVyLkRlbGV0ZU9wdGlvblR5cGVzO1xuY29uc3QgRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wgPSBkZWxldGVIZWxwZXIuRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG5cbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyczxUPihtUGFyYW1ldGVycz86IEV2ZW50IHwgVCk6IFQge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9IGFzIFQ7XG5cdH1cblx0cmV0dXJuIChtUGFyYW1ldGVycyBhcyBUKSB8fCAoe30gYXMgVCk7XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGJ1c3lJZD86IHN0cmluZztcblx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGluYWN0aXZlPzogYm9vbGVhbjtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBDYW5jZWxQYXJhbWV0ZXJzID0geyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuOyBiZWZvcmVDYW5jZWxDYWxsQmFjaz86IEZ1bmN0aW9uIH07XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMgPSBEZWxldGVQYXJhbWV0ZXJzICYge1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdG5vRGlhbG9nPzogYm9vbGVhbjtcbn07XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0YnVzeUxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRidXN5VW5sb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLCBidXN5UGF0aCk7XG5cdH1cblxuXHRnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogT0RhdGFWNENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdGxldCBwYXRoOiBzdHJpbmc7XG5cdFx0aWYgKHNvdXJjZS5pc0E8T0RhdGFWNENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdHBhdGggPSBzb3VyY2UuZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gKHNvdXJjZS5pc1JlbGF0aXZlKCkgPyBzb3VyY2UuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBzb3VyY2UuZ2V0UGF0aCgpKSA/PyBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBwYXRoKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdFx0fSBlbHNlIGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLlN0aWNreTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuTm9uRHJhZnQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbl0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvVmlldyBDb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyB2YWxpZGF0ZURvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRtUGFyYW1ldGVyczogeyBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24/OiBzdHJpbmc7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG5cdFx0b1ZpZXc6IFZpZXdcblx0KTogUHJvbWlzZTx7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdPiB7XG5cdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjtcblx0XHRpZiAoc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0Y29uc3Qgc01vZHVsZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKDAsIHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpIHx8IC0xKS5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24uc3Vic3RyaW5nKFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRtRGF0YSA9IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRkZWxldGUgbURhdGFbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0cmV0dXJuIEZQTUhlbHBlci52YWxpZGF0aW9uV3JhcHBlcihzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCBtRGF0YSwgb1ZpZXcsIG9Db250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGRlZmF0dWwgdmFsdWVzIGZyb20gdGhlIERlZmF1bHRWYWx1ZSBmdW5jdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gYmUgdXNlZCBmb3IgY3JlYXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWVzIChvciB1bmRlZmluZWQgaWYgdGhlcmUncyBubyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogUHJvbWlzZTxvYmplY3QgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgYXMgc3RyaW5nKTtcblx0XHRjb25zdCBsaXN0QmluZGluZ09iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSB8IEVudGl0eVNldCkuYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkKT8uYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25OYW1lID0gZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA/PyBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0O1xuXG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25OYW1lKSB7XG5cdFx0XHQvLyBObyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZ1bmN0aW9uT25OYXZQcm9wID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiYgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBmdW5jdGlvbk9uTmF2UHJvcCA/IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSA6IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbkNvbnRleHQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoZGVmYXVsdEZ1bmN0aW9uQ29udGV4dC5nZXRQYXRoKCkpfS8ke2RlZmF1bHRGdW5jdGlvbk5hbWV9YDtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW4gYSBsaXN0IGJpbmRpbmcuIEhhbmRsZXMgYm90aCBmbGF0IGFuZCBoaWVyYXJjaGljYWwgY2FzZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gaW5pdGlhbERhdGEgSW5pdGlhbCBkYXRhIHRvIGNyZWF0ZSB0aGUgY29udGV4dC5cblx0ICogQHBhcmFtIG9wdGlvbnMgQ3JlYXRpb24gb3B0aW9ucy5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYVx0IGNoaWxkIG9mIHRoaXMgY29udGV4dCAob255IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5pdGlhbERhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCxcblx0XHRvcHRpb25zOiB7IGNyZWF0ZUF0RW5kPzogYm9vbGVhbjsgY3JlYXRlSW5hY3RpdmU/OiBib29sZWFuOyBwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQgfVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgZGF0YUZvckNyZWF0aW9uID0gaW5pdGlhbERhdGEgPz8ge307XG5cblx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0bGV0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb246IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0Py5pc0V4cGFuZGVkKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCBhbHJlYWR5IGhhcyBjaGlsZHJlbiBhbmQgaXMgY29sbGFwc2VkLCB3ZSBleHBhbmQgaXQgZmlyc3Rcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcuZXhwYW5kKG9wdGlvbnMucGFyZW50Q29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHsgXCJAJHVpNS5ub2RlLnBhcmVudFwiOiBvcHRpb25zLnBhcmVudENvbnRleHQgfSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBsaXN0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEFic29sdXRlIGJpbmRpbmc6IGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnRcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdFx0JCRncm91cElkOiBsaXN0QmluZGluZy5nZXRHcm91cElkKCksXG5cdFx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBsaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIHRoZSBwYXJlbnQgcGF0aCBpbiB0aGUgaW5pdGlhbCBkYXRhIGlmIGEgcGFyZW50IGlzIHByb3ZpZGVkXG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQpIHtcblx0XHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRjb25zdCBoaWVyYXJjaHlRdWFsaWZpZXIgPSAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcjogc3RyaW5nIH0pLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnROYXZpZ2F0aW9uID1cblx0XHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uW2BSZWN1cnNpdmVIaWVyYXJjaHkjJHtoaWVyYXJjaHlRdWFsaWZpZXJ9YF1cblx0XHRcdFx0XHRcdFx0Py5QYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdFx0aWYgKCFwYXJlbnROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHBhcmVudCBuYXZpZ2F0aW9uIHByb3BlcnR5IGZvciAke2xpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50QmluZGluZ0RhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0XHRwYXJlbnRCaW5kaW5nRGF0YVtgJHtwYXJlbnROYXZpZ2F0aW9ufUBvZGF0YS5iaW5kYF0gPSBvcHRpb25zLnBhcmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2UoL15cXC8vLCBcIlwiKTsgLy8gUmVtb3ZlIGxlYWRpbmcgXCIvXCIgZnJvbSB0aGUgcGF0aFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oZGF0YUZvckNyZWF0aW9uLCBwYXJlbnRCaW5kaW5nRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24uY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBsaXN0QmluZGluZy5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlLCBvcHRpb25zLmNyZWF0ZUF0RW5kLCBvcHRpb25zLmNyZWF0ZUluYWN0aXZlKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cblx0XHRjb25zdCBub25Db21wdXRlZFZpc2libGVGaWVsZHMgPSBnZXRDcmVhdGVQb3B1cEZpZWxkcyhtZXRhTW9kZWwsIG1ldGFQYXRoLCBhcHBDb21wb25lbnQpO1xuXHRcdC8vIERvIG5vdCBjb25zaWRlciBmaWVsZHMgZm9yIHdoaWNoIHdlIHByb3ZpZGUgc29tZSBpbml0aWFsIGRhdGFcblx0XHRyZXR1cm4gbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzLmZpbHRlcigoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHJldHVybiAhKGZpZWxkTmFtZSBpbiAoY3JlYXRlRGF0YSA/PyB7fSkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lJZF0gSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuaW5hY3RpdmVdIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhpblBhcmFtZXRlcnMpO1xuXHRcdGlmICghbWFpbkxpc3RCaW5kaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIHJlcXVpcmVkIGZvciBuZXcgZG9jdW1lbnQgY3JlYXRpb25cIik7XG5cdFx0fVxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRjb25zdCBidXN5UGF0aCA9IHRoaXMuZ2V0QnVzeVBhdGgocGFyYW1ldGVycyk7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGZyb21Db3B5UGFzdGUgPyB1bmRlZmluZWQgOiBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHR0cnkge1xuXHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5wZXJmb3JtQWN0aW9uT3JDcmVhdGlvbihcblx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRyZXNvdXJjZUJ1bmRsZUNvcmUsXG5cdFx0XHRcdGZyb21Db3B5UGFzdGVcblx0XHRcdCk7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCB8fCBlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpICYmXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dD8uaXNUcmFuc2llbnQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0QnVzeVBhdGgobVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBzdHJpbmcge1xuXHRcdHJldHVybiBtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiID8gYC9idXN5TG9jYWwvJHttUGFyYW1ldGVycy5idXN5SWR9YCA6IFwiL2J1c3lcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5TW9kZSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5SWQgSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmluYWN0aXZlIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGEgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbmx5IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmRhdGEgPyBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzLmRhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBba2V5XTogdmFsdWUgfSkpIDogW107XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbWFpbkxpc3RCaW5kaW5nICYmIG1haW5MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy5kYXRhID0gY3JlYXRlUGFyYW1ldGVycy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMuZGF0YSwge1xuXHRcdFx0Y3JlYXRlQXRFbmQ6ICEhcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdGNyZWF0ZUluYWN0aXZlOiAhIXBhcmFtZXRlcnMuaW5hY3RpdmUsXG5cdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGVpdGhlciB2aWEgbmV3IEFjdGlvbiBvciBjcmVhdGVEb2N1bWVudENvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeU1vZGUgR2xvYmFsIChkZWZhdWx0KSwgTG9jYWwsIE5vbmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYnVzeUlkIElEIG9mIHRoZSBsb2NhbCBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbmFjdGl2ZSBJZiBzZXQsIHRoZSBjb250ZXh0IGlzIHNldCBhcyBpbmFjdGl2ZSBmb3IgZW1wdHkgcm93c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhIGNoaWxkIG9mIHRoaXMgY29udGV4dCAob25seSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVDb3JlIENvcmUgcmVzb3VyY2UgYnVuZGxlXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQWN0aW9uT3JDcmVhdGlvbihcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0cmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZSxcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCBtb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0bWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpLFxuXHRcdFx0bWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG1ldGFNb2RlbCwgbWV0YVBhdGgpLFxuXHRcdFx0Y3JlYXRlSGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKSxcblx0XHRcdGNvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpLFxuXHRcdFx0c3RhcnR1cFBhcmFtZXRlcnMgPSAoY29tcG9uZW50RGF0YSAmJiBjb21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fSxcblx0XHRcdG5ld0FjdGlvbiA9ICFtYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpID8gdGhpcy5fZ2V0TmV3QWN0aW9uKHN0YXJ0dXBQYXJhbWV0ZXJzLCBjcmVhdGVIYXNoLCBtZXRhTW9kZWwsIG1ldGFQYXRoKSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlIH07XG5cblx0XHRpZiAobWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBtZXNzYWdlc1BhdGg7XG5cdFx0fVxuXHRcdGxldCByZXN1bHQ6IHVua25vd247XG5cdFx0aWYgKG5ld0FjdGlvbikge1xuXHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0XHRuZXdBY3Rpb24sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb250ZXh0czogbWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG1ldGFNb2RlbCwgbWV0YVBhdGgsIG5ld0FjdGlvbiwgcmVzb3VyY2VCdW5kbGVDb3JlKSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0cGFyZW50Q29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdFx0fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiByZXN1bHQgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdFx0aWYgKCFmcm9tQ29weVBhc3RlKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKG1haW5MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0cGFyYW1ldGVycy5kYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhLCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRkZWxldGUgcGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0Y29uc3Qgbm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gaXNOZXdQYWdlQ3JlYXRpb25cblx0XHRcdFx0XHQ/IHRoaXMuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKG1haW5MaXN0QmluZGluZywgaW5pdGlhbERhdGEsIGFwcENvbXBvbmVudClcblx0XHRcdFx0XHQ6IFtdO1xuXHRcdFx0XHRpZiAobm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0XHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRub25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMsXG5cdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0aWYgKCFwYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0RvY3VtZW50Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiA/IGVycm9yIDogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID8/IGVycm9yO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIG1zZyk7XG5cdFx0XHRcdHRocm93IG1zZztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfaXNEcmFmdEVuYWJsZWQodkNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dEZvckRyYWZ0TW9kZWwgPSB2Q29udGV4dHNbMF07XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dEZvckRyYWZ0TW9kZWwpO1xuXHRcdHJldHVybiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVEb2N1bWVudChcblx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdG1QYXJhbWV0ZXJzOiBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gZGVsZXRlIGRvY3VtZW50IGxvY2tcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRjb25zdCBjb250ZXh0c1RvRGVsZXRlID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBbLi4uY29udGV4dHNdIDogW2NvbnRleHRzXTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkcmFmdEVuYWJsZWQgPSB0aGlzLl9pc0RyYWZ0RW5hYmxlZChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIHx8IGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogQ29udHJvbFtdID0gW107XG5cdFx0XHRcdGxldCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXHRcdFx0XHRsZXQgdW5TYXZlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cblx0XHRcdFx0Ly8gaXRlbXModGV4dHMpIGFuZCBvcHRpb25zKGNoZWNrQm94ZXMgYW5kIHNpbmdsZSBkZWZhdWx0IG9wdGlvbikgZm9yIGNvbmZpcm0gZGlhbG9nLlxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGlmIDEgb2YgdGhlIGRyYWZ0cyBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlciAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0IWNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkRyYWZ0SXNDcmVhdGVkQnlNZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAobG9ja2VkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgbWVzc2FnZSBib3ggd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9ja2luZyB1c2VyIGFuZCByZXR1cm5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsb2NraW5nVXNlck5hbWUgPSBsb2NrZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LnNob3coXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9ja2luZ1VzZXJOYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5TYXZlZENvbnRleHQgPSBjb250ZXh0c1RvRGVsZXRlLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgSXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB9ID0gY29udGV4dC5nZXRPYmplY3QoKSB8fCB7fTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBJc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJiBIYXNEcmFmdEVudGl0eSA9PT0gdHJ1ZSAmJiAhIURyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhPy5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKHVuU2F2ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVuU2F2ZWRDb250ZXh0VXNlciA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdFt1blNhdmVkQ29udGV4dFVzZXJdLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9PTkxZXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGVdLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHRleHQ6IG5vblRhYmxlVHh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0Y29udHJvbDogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wuVEVYVFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRhYmxlXG5cdFx0XHRcdFx0XHRsZXQgdG90YWxEZWxldGFibGUgPSBjb250ZXh0c1RvRGVsZXRlLmxlbmd0aDtcblxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSArPVxuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM/Lmxlbmd0aCA/PyAwKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRpdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBub25EZWxldGFibGVUZXh0ID0gZGVsZXRlSGVscGVyLmdldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHRvdGFsRGVsZXRhYmxlLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0aWYgKG5vbkRlbGV0YWJsZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtcy5wdXNoKG5vbkRlbGV0YWJsZVRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9wdGlvbnNEZWxldGFibGVUZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b3B0aW9ucyA9IFsuLi5vcHRpb25zLCAuLi5vcHRpb25zRGVsZXRhYmxlVGV4dHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNvbW1vbkJpbmRpbmcgPSAobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA/PyBjb250ZXh0c1RvRGVsZXRlKVswXS5nZXRCaW5kaW5nKCkgYXMgQmluZGluZztcblx0XHRcdFx0Y29uc3QgaW5UcmVlVGFibGUgPVxuXHRcdFx0XHRcdGNvbW1vbkJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiZcblx0XHRcdFx0XHR0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwoY29tbW9uQmluZGluZyk7XG5cblx0XHRcdFx0Ly8gQ29udGVudCBvZiBEZWxldGUgRGlhbG9nXG5cdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnMsIGl0ZW1zKTtcblx0XHRcdFx0Y29uc3QgZm5Db25maXJtID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkZWxldGVIZWxwZXIuZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRkcmFmdEVuYWJsZWQsXG5cdFx0XHRcdFx0XHRcdGluVHJlZVRhYmxlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCBkaWFsb2cgPSB0aGlzLmNyZWF0ZURlbGV0ZURpYWxvZyhpdGVtcywgbVBhcmFtZXRlcnMsIHJlc291cmNlTW9kZWwsIGZuQ29uZmlybSwgcmVqZWN0KTtcblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0ZGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Ly8gZGVsZXRlIGRvY3VtZW50IHVubG9ja1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZm8gdGhlIGRlbGV0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbXMgQW4gYXJyYXkgb2YgY29udHJvbHMgdXNlZCBmb3IgdGhlIGRpYWxvZyBjb250ZW50XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCBQYXJlbnQgY29udHJvbCBvZiB0aGUgZGVsZXRlIGJ1dHRvbiBpZiBhbnlcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBjdXJyZW50IGVudGl0eVNldFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gZm5Db25maXJtIEZ1bmN0aW9uIGV4ZWN1dGVkIHVwb24gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRlbGV0aW9uXG5cdCAqIEBwYXJhbSBmblJlamVjdCBGdW5jdGlvbiBleGVjdXRlZCBpZiB0aGUgZGlhbG9nIGlzIGNsb3NlZCB2aWEgQ2FuY2VsIG9yIEVzY2FwZSBidXR0b25cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICovXG5cdGNyZWF0ZURlbGV0ZURpYWxvZyhcblx0XHRpdGVtczogQ29udHJvbFtdLFxuXHRcdHBhcmFtZXRlcnM6IFBhcnRpYWw8eyBwYXJlbnRDb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkOyBlbnRpdHlTZXROYW1lOiBzdHJpbmcgfT4sXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmbkNvbmZpcm06IEZ1bmN0aW9uLFxuXHRcdGZuUmVqZWN0OiBGdW5jdGlvblxuXHQpOiBEaWFsb2cge1xuXHRcdGxldCBkaWFsb2dDb25maXJtZWQgPSBmYWxzZTtcblx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGVDb3JlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0XHRsZXQgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy5wYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIk1fQ09NTU9OX1RBQkxFX0RFTEVURVwiLCB1bmRlZmluZWQsIHBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IHRpdGxlLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogW3ZCb3hdLFxuXHRcdFx0YXJpYUxhYmVsbGVkQnk6IGl0ZW1zLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiB0aXRsZSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nQ29uZmlybWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0ZGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdGlmICghZGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0Zm5SZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBkaWFsb2c7XG5cdH1cblxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBlZGl0RG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG9WaWV3OiBGRVZpZXcsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGdyb3VwSWQ6IHN0cmluZ1xuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdFx0fVxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGJQcmVzZXJ2ZUNoYW5nZXM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBjb25jdXJyZW50RWRpdEZsYWc6IHRydWUgfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYW5jZWwgJ2VkaXQnIG1vZGUgb2YgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBpbmNhc2Ugb2YgZHJhZnQgYXBwbGljYXRpb25zIHdoaWxlIG5hdmlnYXRpbmcgb3V0IG9mIE9QXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpc09iamVjdE1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgdXNlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0aXNPYmplY3RNb2RpZmllZDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGxldCByZXR1cm5lZFZhbHVlOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmICFpc09iamVjdE1vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpc09iamVjdE1vZGlmaWVkID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSAhPT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3Zlcikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9jb25maXJtRGlzY2FyZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24sIGlzT2JqZWN0TW9kaWZpZWQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMga2VwdCBhbGl2ZSB3ZSBzZXQgaXQgYWdhaW4gdG8gZGV0YWNoIHRoZSBvbkJlZm9yZURlc3Ryb3kgY2FsbGJhY2sgYW5kIGhhbmRsZSBuYXZpZ2F0aW9uIGhlcmVcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgbmVlZHMgdG8gc3RpbGwgYmUga2VwdCBhbGl2ZSB0byBiZSBhYmxlIHRvIHJlc2V0IGNoYW5nZXMgcHJvcGVybHlcblx0XHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKHRydWUsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvU2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gYXdhaXQgb1NpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gb01vZGVsLmJpbmRDb250ZXh0KHNDYW5vbmljYWxQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgVHJ1ZSBpZiB3ZSBzaG91bGQgZXhlY3V0ZSBzaWRlIGVmZmVjdHMgaW4gY2FzZSBvZiBhbiBlcnJvclxuXHQgKiBAcGFyYW0gYmluZGluZ3NGb3JTaWRlRWZmZWN0cyBUaGUgbGlzdEJpbmRpbmdzIHRvIGJlIHVzZWQgZm9yIGV4ZWN1dGluZyBzaWRlIGVmZmVjdHMgb24gZXJyb3Jcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgc2F2ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYm9vbGVhbixcblx0XHRiaW5kaW5nc0ZvclNpZGVFZmZlY3RzOiBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIHt9LCBtZXNzYWdlSGFuZGxlcilcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cblx0XHRcdGNvbnN0IG1lc3NhZ2VzUmVjZWl2ZWQgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKS5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTsgLy8gZ2V0IHVuYm91bmQgYW5kIGJvdW5kIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIG1vZGVsXG5cdFx0XHRpZiAoIShtZXNzYWdlc1JlY2VpdmVkLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlc1JlY2VpdmVkWzBdLmdldFR5cGUoKSA9PT0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGUuU3VjY2VzcykpIHtcblx0XHRcdFx0Ly8gc2hvdyBvdXIgb2JqZWN0IGNyZWF0aW9uIHRvYXN0IG9ubHkgaWYgaXQgaXMgbm90IGNvbWluZyBmcm9tIGJhY2tlbmRcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0aXNOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX0NSRUFURURcIilcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXBcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ncm91cElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5pZ25vcmVFVGFnXSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGRpc2FibGVTdHJpY3RIYW5kbGluZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0XHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSxcblx0XHRvVmlldzogVmlldyB8IG51bGwsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dCB8IFByb21pc2VTZXR0bGVkUmVzdWx0PE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPltdPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRsZXQgY29udGV4dFRvUHJvY2Vzcztcblx0XHRsZXQgb01vZGVsOiBPRGF0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdGlmICghc0FjdGlvbk5hbWUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGUgbmFtZSBvZiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcIik7XG5cdFx0fVxuXHRcdC8vIGFjdGlvbiBpbXBvcnRzIGFyZSBub3QgZGlyZWN0bHkgb2J0YWluZWQgZnJvbSB0aGUgbWV0YU1vZGVsIGJ5IGl0IGlzIHByZXNlbnQgaW5zaWRlIHRoZSBlbnRpdHlDb250YWluZXJcblx0XHQvLyBhbmQgdGhlIGFjaW9ucyBpdCByZWZlcnMgdG8gcHJlc2VudCBvdXRzaWRlIHRoZSBlbnRpdHljb250YWluZXIsIGhlbmNlIHRvIG9idGFpbiBraW5kIG9mIHRoZSBhY3Rpb25cblx0XHQvLyBzcGxpdCgpIG9uIGl0cyBuYW1lIHdhcyByZXF1aXJlZFxuXHRcdGNvbnN0IHNOYW1lID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuXHRcdHNBY3Rpb25OYW1lID0gc05hbWUgfHwgc0FjdGlvbk5hbWU7XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Ly8gZW5zdXJlIGRlZXBDbG9uZSBzbyB0aGUgb3JpZ2luYWwgU2lkZUVmZmVjdHMgbWFwcGluZyBpcyBub3QgbW9kaWZpZWQgKEJDUDogMjM4MDExNzk1Nilcblx0XHRjb25zdCBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzID1cblx0XHRcdGRlZXBDbG9uZShhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgY29udGV4dFRvUHJvY2VzcyBhcyBPRGF0YVY0Q29udGV4dCkpIHx8XG5cdFx0XHR7fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgb1Jlc3VsdDogdW5kZWZpbmVkIHwgT0RhdGFWNENvbnRleHQgfCBQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmRlZmluZWQgfCBPRGF0YVY0Q29udGV4dD5bXTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG9Nb2RlbCkge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLmNvbnRleHRzIGFzIE9EYXRhVjRDb250ZXh0W10sIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcj8ucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0Yk9iamVjdFBhZ2U6IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5jb250ZXh0cyBhcyBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdFx0XHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZyxcblx0XHRcdFx0XHRncm91cElkOiBtUGFyYW1ldGVycy5ncm91cElkLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxTaWRlRWZmZWN0OiBtU2lkZUVmZmVjdHNQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UsXG5cdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbWVzc2FnZXMgZm9yIGFjdGlvbiBjYWxsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBhcmFtZXRlcnMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIGFjdGlvbi5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmxhYmVsXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGFmdGVyIG1lc3NhZ2UgZGlhbG9nIGlzIG9wZW5lZCBpZiByZXF1aXJlZC5cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfaGFuZGxlQWN0aW9uUmVzcG9uc2UoXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdG1QYXJhbWV0ZXJzOiB7IGxhYmVsPzogc3RyaW5nOyBpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDsgY29udHJvbElkPzogc3RyaW5nOyBwYXJlbnRDb250cm9sPzogQ29udHJvbCB9LFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbiB8IERpYWxvZz4ge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRjb25zdCBhY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChhVHJhbnNpZW50TWVzc2FnZXMubGVuZ3RoID4gMCAmJiBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBtUGFyYW1ldGVycy5sYWJlbCA/IG1QYXJhbWV0ZXJzLmxhYmVsIDogc0FjdGlvbk5hbWUpO1xuXHRcdH1cblx0XHRsZXQgY29udHJvbDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkICYmIG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgJiYgbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5pc0E8Vmlldz4oXCJzYXAudWkuY29yZS5tdmMuVmlld1wiKSkge1xuXHRcdFx0Y29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIGFzIENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgc0FjdGlvbk5hbWU6IGFjdGlvbk5hbWUsIGNvbnRyb2w6IGNvbnRyb2wgfSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuXHRcdGNvbnN0IGVycm9yVG9SZW1vdmUgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKGVycm9yOiBNZXNzYWdlKSA9PiBlcnJvci52YWxpZGF0aW9uKTsgLy8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFBvcG92ZXIuIEZhY3RvcnkgbWV0aG9kIHRvIG1ha2UgdW5pdCB0ZXN0cyBlYXNpZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyBJbml0aWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3BvdmVyXG5cdCAqIEByZXR1cm5zIEEgbmV3IFBvcG92ZXJcblx0ICovXG5cdF9jcmVhdGVQb3BvdmVyKHNldHRpbmdzPzogJFBvcG92ZXJTZXR0aW5ncyk6IFBvcG92ZXIge1xuXHRcdHJldHVybiBuZXcgUG9wb3ZlcihzZXR0aW5ncyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIHRvIGNvbmZpcm0gZGlzY2FyZCBpZiBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBpc01vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBhbmQgYSBjb25maXJtYXRpb24gcG9wb3ZlciBtdXN0IGJlIHNob3duXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfY29uZmlybURpc2NhcmQoY2FuY2VsQnV0dG9uOiBCdXR0b24sIGlzTW9kaWZpZWQ6IGJvb2xlYW4sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBJZiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCwgZG8gbm90IHNob3cgYW55IGNvbmZpcm1hdGlvbiBwb3BvdmVyXG5cdFx0aWYgKCFpc01vZGlmaWVkKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY29uZmlybWF0aW9uUG9wb3ZlciA9IHRoaXMuX2NyZWF0ZVBvcG92ZXIoe1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkQ29udGVudChuZXcgVkJveCh7IGl0ZW1zOiBbdGl0bGUsIGNvbmZpcm1CdXR0b25dIH0pKTtcblxuXHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQmVmb3JlT3BlbigoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuc2V0SW5pdGlhbEZvY3VzKGNvbmZpcm1CdXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0aWYgKGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiKSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIub3BlbkJ5KGNhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBsaXN0TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkhKTtcblxuXHRcdC8vIENyZWF0ZSBhIGZha2UgKHRyYW5zaWVudCkgbGlzdEJpbmRpbmcgYW5kIGNvbnRleHQsIGp1c3QgZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIGRpYWxvZ1xuXHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdH0pO1xuXHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdC8qICovXG5cdFx0fTtcblx0XHRjb25zdCB0cmFuc2llbnRDb250ZXh0ID0gdHJhbnNpZW50TGlzdEJpbmRpbmcuY3JlYXRlKHBhcmFtZXRlcnMuZGF0YSwgdHJ1ZSk7XG5cdFx0Y29uc3QgZmllbGRNZXRhQ29udGV4dHMgPSBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtsaXN0TWV0YVBhdGh9LyR7bmFtZX1gKSBhcyBDb250ZXh0O1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY3JlYXRlRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld0NyZWF0ZURpYWxvZyh0cmFuc2llbnRDb250ZXh0LCBmaWVsZE5hbWVzLCBhcHBDb21wb25lbnQsIHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdGZpZWxkTWV0YUNvbnRleHRzLFxuXHRcdFx0XHR0cmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0KTtcblx0XHRcdGNyZWF0ZURpYWxvZy5vcGVuRGlhbG9nKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdFByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxPRGF0YVY0Q29udGV4dD4oKTtcblxuXHRcdGNvbnN0IG9uRXhpdERpYWxvZyA9IGFzeW5jIChldmVudDogRXhpdERpYWxvZ0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRpZiAoIWV2ZW50LmdldFBhcmFtZXRlcihcImFjY2VwdFwiKSkge1xuXHRcdFx0XHQvLyBVc2VyIGhhcyBjYW5jZWxsZWQgY3JlYXRpb246IGRlc3RyeSB0aGUgdHJhbnNpZW50IGxpc3QgYmluZGluZyBhbmQgY2xvc2UgdGhlIGRpYWxvZ1xuXHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRyZXN1bHRQcm9taXNlS2VlcGVyLnJlamVjdChGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3kodHJ1ZSk7XG5cdFx0XHRwYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB0cmFuc2llbnREYXRhID0gdHJhbnNpZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0bGV0IGNyZWF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdE9iamVjdC5rZXlzKHRyYW5zaWVudERhdGEpLmZvckVhY2goKHByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bGlzdE1ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHQvLyBFbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgYXMgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIEFuZCByZW1vdmUgYW55IHByb3BlcnR5IHN0YXJ0aW5nIGJ5IEAkdWk1IGFzIHRoZXkgYXJlIG5vdCBwcm9wZXJ0eSBjcmVhdGVkIGJ5IGZpbGxpbmcgdGhlIGZvcm1cblx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiAhcHJvcGVydHlQYXRoPy5zdGFydHNXaXRoKFwiQCR1aTVcIikpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURhdGFbcHJvcGVydHlQYXRoXSA9IHRyYW5zaWVudERhdGFbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0XHRcdGNvbnN0IGNyZWF0ZURhdGFBc0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY3JlYXRlRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IGxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVEYXRhQXNBcnJheVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3JlYXRlRGF0YSA9IGNyZWF0ZURhdGFBc0FycmF5LnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdFx0XHR9LCB7fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKGNyZWF0ZURhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKS5zZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQobGlzdEJpbmRpbmcsIGNyZWF0ZURhdGEsIHtcblx0XHRcdFx0XHRjcmVhdGVBdEVuZDogcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRjcmVhdGVJbmFjdGl2ZTogcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgY3JlYXRpb25TdWNjZXNzID0gYXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0LCBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPT09IHRydWUpO1xuXHRcdFx0XHRpZiAoY3JlYXRpb25TdWNjZXNzKSB7XG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmIChlcnJvciAhPT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCAmJiBlcnJvciAhPSBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkKSB7XG5cdFx0XHRcdFx0Ly8gb3RoZXIgZXJyb3JzIGFyZSBub3QgZXhwZWN0ZWRcblx0XHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZWplY3QoZXJyb3IgYXMgc3RyaW5nIHwgRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeShmYWxzZSk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVEaWFsb2cuYXR0YWNoRXhpdERpYWxvZyh7fSwgb25FeGl0RGlhbG9nKTtcblxuXHRcdHJldHVybiByZXN1bHRQcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdHMgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnRleHQgdG8gYmUgZmluaXNoZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuZXdDb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGNyZWF0ZWRcblx0ICogQHBhcmFtIGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWxcblx0ICovXG5cdGFzeW5jIHdhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgcHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPGJvb2xlYW4+KCk7XG5cdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBuZXdDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXG5cdFx0Y29uc3Qgb25DcmVhdGVDb21wbGV0ZWQgPSAoZXZlbnQ6IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKGNyZWF0ZWRDb250ZXh0ID09PSBuZXdDb250ZXh0KSB7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmRldGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cdFx0XHRcdHByb21pc2VLZWVwZXIucmVzb2x2ZShzdWNjZXNzID09PSB0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cGFyZW50TGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKG9uQ3JlYXRlQ29tcGxldGVkKTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uU3VjY2Vzc2Z1bCA9IGF3YWl0IHByb21pc2VLZWVwZXIucHJvbWlzZTtcblx0XHRpZiAoIWNyZWF0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdFx0aWYgKCFrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcGVuZGluZyBQT1NUIGFuZCBkZWxldGUgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3RCaW5kaW5nXG5cdFx0XHRcdChuZXdDb250ZXh0LmNyZWF0ZWQoKSA/PyBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goZnVuY3Rpb24gKGNvbnRleHRFcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0aW9uIGVycm9yXCIsIGNvbnRleHRFcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGFyZW50TGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKHBhcmVudExpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIFtvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZV1cblx0ICogQHBhcmFtIHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0TmV3QWN0aW9uKFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczoge1xuXHRcdFx0cHJlZmVycmVkTW9kZT86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0c0NyZWF0ZUhhc2g6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZ1xuXHQpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049Q1JFQVRFV0lUSFwiKSkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQ1JFQVRFV0lUSDpcIilcblx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHJpbmcoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiZcblx0XHRcdHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJJLUFDVElPTj1BVVRPQ1JFQVRFV0lUSFwiKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQVVUT0NSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKSB8fFxuXHRcdFx0XHRcdCAgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbGFiZWwgZm9yIHRoZSB0aXRsZSBvZiBhIHNwZWNpZmljIGNyZWF0ZSBhY3Rpb24gZGlhbG9nLCBlLmcuIENyZWF0ZSBTYWxlcyBPcmRlciBmcm9tIFF1b3RhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBwcmlvcml0eSBpcyBhcHBsaWVkOlxuXHQgKiAxLiBsYWJlbCBvZiBsaW5lLWl0ZW0gYW5ub3RhdGlvbi5cblx0ICogMi4gbGFiZWwgYW5ub3RhdGVkIGluIHRoZSBhY3Rpb24uXG5cdCAqIDMuIFwiQ3JlYXRlXCIgYXMgYSBjb25zdGFudCBmcm9tIGkxOG4uXG5cdCAqXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwoXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmcsXG5cdFx0c05ld0FjdGlvbjogc3RyaW5nLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZUNvcmU6IFJlc291cmNlQnVuZGxlIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlQ29yZT8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7RUF1REEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFBMEIsR0FBR0QsWUFBWSxDQUFDQywwQkFBMEI7O0VBRTFFO0VBQ0EsU0FBU0MsYUFBYSxDQUFJQyxXQUF1QixFQUFLO0lBQ3JELElBQUlBLFdBQVcsSUFBS0EsV0FBVyxDQUFXQyxXQUFXLElBQUtELFdBQVcsQ0FBV0MsV0FBVyxFQUFFLENBQUNDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFFO01BQ2hJRixXQUFXLEdBQUcsQ0FBQyxDQUFNO0lBQ3RCO0lBQ0EsT0FBUUEsV0FBVyxJQUFXLENBQUMsQ0FBTztFQUN2QztFQUFDLElBdUJLRyxpQkFBaUI7SUFBQTtJQUFBO0lBQUEsT0FDdEJDLFFBQVEsR0FBUixrQkFBU0MsWUFBMEIsRUFBRUMsUUFBaUIsRUFBUTtNQUM3REMsVUFBVSxDQUFDQyxJQUFJLENBQUNILFlBQVksQ0FBQ0ksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFSCxRQUFRLENBQUM7SUFDdkQsQ0FBQztJQUFBLE9BRURJLFVBQVUsR0FBVixvQkFBV0wsWUFBMEIsRUFBRUMsUUFBaUIsRUFBUTtNQUMvREMsVUFBVSxDQUFDSSxNQUFNLENBQUNOLFlBQVksQ0FBQ0ksUUFBUSxDQUFDLElBQUksQ0FB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
|