@sapui5/sap.fe.core 1.134.0 → 1.136.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 +6 -62
- package/src/sap/fe/core/ActionRuntime.ts +14 -65
- package/src/sap/fe/core/AppComponent.js +10 -2
- package/src/sap/fe/core/AppComponent.ts +6 -0
- package/src/sap/fe/core/AppStateHandler.js +9 -7
- package/src/sap/fe/core/AppStateHandler.ts +7 -5
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/CommonUtils.js +8 -4
- package/src/sap/fe/core/CommonUtils.ts +19 -4
- package/src/sap/fe/core/ExtensionAPI.js +7 -5
- package/src/sap/fe/core/ExtensionAPI.ts +5 -3
- package/src/sap/fe/core/IRowBindingInterface.js +1 -1
- package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
- package/src/sap/fe/core/PageController.js +36 -6
- package/src/sap/fe/core/PageController.ts +30 -0
- package/src/sap/fe/core/ResourceModel.js +1 -1
- package/src/sap/fe/core/ReuseComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/UIProvider.js +2 -2
- package/src/sap/fe/core/UIProvider.ts +3 -32
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
- package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
- package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
- package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
- package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
- package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
- package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
- package/src/sap/fe/core/controls/DataWatcher.js +4 -3
- package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
- package/src/sap/fe/core/converters/ConverterContext.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
- package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
- package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
- package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
- package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
- package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
- package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
- package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
- package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +25 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
- package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
- package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
- package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +9 -3
- package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
- package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
- package/src/sap/fe/core/helpers/ManifestHelper.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
- package/src/sap/fe/core/helpers/MetaPath.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
- package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
- package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
- package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/WebSocket.js +11 -2
- package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
- package/src/sap/fe/core/library.js +16 -4
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +1 -0
- package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +41 -2
- package/src/sap/fe/core/messagebundle_ar.properties +25 -4
- package/src/sap/fe/core/messagebundle_bg.properties +25 -4
- package/src/sap/fe/core/messagebundle_ca.properties +24 -3
- package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
- package/src/sap/fe/core/messagebundle_cs.properties +23 -2
- package/src/sap/fe/core/messagebundle_cy.properties +24 -3
- package/src/sap/fe/core/messagebundle_da.properties +25 -4
- package/src/sap/fe/core/messagebundle_de.properties +28 -7
- package/src/sap/fe/core/messagebundle_el.properties +23 -2
- package/src/sap/fe/core/messagebundle_en.properties +25 -4
- package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
- package/src/sap/fe/core/messagebundle_es.properties +23 -2
- package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
- package/src/sap/fe/core/messagebundle_et.properties +23 -2
- package/src/sap/fe/core/messagebundle_fi.properties +23 -2
- package/src/sap/fe/core/messagebundle_fr.properties +26 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
- package/src/sap/fe/core/messagebundle_hi.properties +24 -3
- package/src/sap/fe/core/messagebundle_hr.properties +27 -6
- package/src/sap/fe/core/messagebundle_hu.properties +23 -2
- package/src/sap/fe/core/messagebundle_id.properties +23 -2
- package/src/sap/fe/core/messagebundle_it.properties +25 -4
- package/src/sap/fe/core/messagebundle_iw.properties +24 -3
- package/src/sap/fe/core/messagebundle_ja.properties +24 -3
- package/src/sap/fe/core/messagebundle_kk.properties +23 -2
- package/src/sap/fe/core/messagebundle_ko.properties +25 -4
- package/src/sap/fe/core/messagebundle_lt.properties +23 -2
- package/src/sap/fe/core/messagebundle_lv.properties +25 -4
- package/src/sap/fe/core/messagebundle_mk.properties +23 -2
- package/src/sap/fe/core/messagebundle_ms.properties +24 -3
- package/src/sap/fe/core/messagebundle_nl.properties +23 -2
- package/src/sap/fe/core/messagebundle_no.properties +23 -2
- package/src/sap/fe/core/messagebundle_pl.properties +25 -4
- package/src/sap/fe/core/messagebundle_pt.properties +25 -4
- package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
- package/src/sap/fe/core/messagebundle_ro.properties +25 -4
- package/src/sap/fe/core/messagebundle_ru.properties +24 -3
- package/src/sap/fe/core/messagebundle_sh.properties +25 -4
- package/src/sap/fe/core/messagebundle_sk.properties +24 -3
- package/src/sap/fe/core/messagebundle_sl.properties +28 -7
- package/src/sap/fe/core/messagebundle_sr.properties +25 -4
- package/src/sap/fe/core/messagebundle_sv.properties +23 -2
- package/src/sap/fe/core/messagebundle_th.properties +25 -4
- package/src/sap/fe/core/messagebundle_tr.properties +23 -2
- package/src/sap/fe/core/messagebundle_uk.properties +25 -4
- package/src/sap/fe/core/messagebundle_vi.properties +25 -4
- package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
- package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
- package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
- package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
- package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
- package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
- package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
- package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
- package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/ActionHelper.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
- package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +8 -10
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
- package/src/sap/fe/core/templating/UIFormatters.js +5 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
- package/src/sap/fe/core/type/Date.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +1 -1
- package/src/sap/fe/core/type/InputMask.js +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
- package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
- package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
- package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
- package/src/sap/fe/core/operationsHelper.js +0 -192
- package/src/sap/fe/core/operationsHelper.ts +0 -277
|
@@ -1,71 +1,11 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/fe/core/
|
|
5
|
+
sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "./Operation"], function (MetaModelConverter, Operation) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
function __ui5_require_async(path) {
|
|
9
|
-
return new Promise((resolve, reject) => {
|
|
10
|
-
sap.ui.require([path], module => {
|
|
11
|
-
if (!(module && module.__esModule)) {
|
|
12
|
-
module = module === null || !(typeof module === "object" && path.endsWith("/library")) ? {
|
|
13
|
-
default: module
|
|
14
|
-
} : module;
|
|
15
|
-
Object.defineProperty(module, "__esModule", {
|
|
16
|
-
value: true
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
resolve(module);
|
|
20
|
-
}, err => {
|
|
21
|
-
reject(err);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
var getResourceModel = ResourceModelHelper.getResourceModel;
|
|
26
8
|
var convertTypes = MetaModelConverter.convertTypes;
|
|
27
|
-
var getCoreUIFactory = UIProvider.getCoreUIFactory;
|
|
28
|
-
const Constants = FELibrary.Constants,
|
|
29
|
-
InvocationGrouping = FELibrary.InvocationGrouping;
|
|
30
|
-
const Action = MessageBox.Action;
|
|
31
|
-
/**
|
|
32
|
-
* Calls a bound action for one or multiple contexts.
|
|
33
|
-
* @param sActionName The name of the action to be called
|
|
34
|
-
* @param contexts Either one context or an array with contexts for which the action is to be be called
|
|
35
|
-
* @param oModel OData Model
|
|
36
|
-
* @param oAppComponent The AppComponent
|
|
37
|
-
* @param [mParameters] Optional, can contain the following attributes:
|
|
38
|
-
* @param [mParameters.parameterValues] A map of action parameter names and provided values
|
|
39
|
-
* @param [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
|
|
40
|
-
* @param [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
|
|
41
|
-
* @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
|
|
42
|
-
* @param [mParameters.label] A human-readable label for the action
|
|
43
|
-
* @param [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
|
|
44
|
-
* @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
|
|
45
|
-
* @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
|
|
46
|
-
* @param [mParameters.parentControl] If specified, the dialogs are added as dependent of the parent control
|
|
47
|
-
* @param [mParameters.ignoreETag] If specified, the action is called without ETag handling
|
|
48
|
-
* @returns Promise resolves with an array of response objects
|
|
49
|
-
*/
|
|
50
|
-
async function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
|
|
51
|
-
if (!contexts || contexts.length === 0) {
|
|
52
|
-
//In Freestyle apps bound actions can have no context
|
|
53
|
-
throw new Error("Bound actions always requires at least one context");
|
|
54
|
-
}
|
|
55
|
-
mParameters.aContexts = Array.isArray(contexts) ? contexts : [contexts];
|
|
56
|
-
const oMetaModel = oModel.getMetaModel(),
|
|
57
|
-
// Analyzing metaModelPath for action only from first context seems weird, but probably works in all existing scenarios - if several contexts are passed, they probably
|
|
58
|
-
// belong to the same metamodelpath. TODO: Check, whether this can be improved / scenarios with different metaModelPaths might exist
|
|
59
|
-
sActionPath = `${oMetaModel.getMetaPath(mParameters.aContexts[0].getPath())}/${sActionName}`,
|
|
60
|
-
oBoundAction = oMetaModel.createBindingContext(`${sActionPath}/@$ui5.overload/0`);
|
|
61
|
-
mParameters.isCriticalAction = await ActionRuntime.getIsActionCritical(oMetaModel, sActionPath, mParameters.aContexts);
|
|
62
|
-
const convertedTypes = convertTypes(oModel.getMetaModel());
|
|
63
|
-
const convertedAction = convertedTypes.resolvePath(oBoundAction.getPath()).target;
|
|
64
|
-
if (!convertedAction) {
|
|
65
|
-
throw new Error("Unknown bound action");
|
|
66
|
-
}
|
|
67
|
-
return callAction(convertedAction, oModel, oBoundAction, oAppComponent, mParameters);
|
|
68
|
-
}
|
|
69
9
|
/**
|
|
70
10
|
* Calls an action import.
|
|
71
11
|
* @param actionName The name of the action import to be called
|
|
@@ -89,11 +29,7 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
|
|
|
89
29
|
if (!convertedAction) {
|
|
90
30
|
throw new Error("Unknown action import");
|
|
91
31
|
}
|
|
92
|
-
|
|
93
|
-
actionNameFromModel = convertedActionImport.actionName,
|
|
94
|
-
actionImport = metaModel.createBindingContext(`/${actionNameFromModel}/${unboundActionIndex}`);
|
|
95
|
-
parameters.isCriticalAction = await ActionRuntime.getIsActionCritical(metaModel, `${actionPath}/@$ui5.overload`);
|
|
96
|
-
return callAction(convertedActionImport.action, model, actionImport, appComponent, parameters);
|
|
32
|
+
return new Operation(appComponent, model, convertedActionImport.action, parameters).execute();
|
|
97
33
|
}
|
|
98
34
|
async function callBoundFunction(sFunctionName, context, oModel) {
|
|
99
35
|
if (!context) {
|
|
@@ -123,507 +59,11 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
|
|
|
123
59
|
}
|
|
124
60
|
const functionToCall = oModel.bindContext(`${context?.getPath() ?? ""}/${sFunctionName}(...)`);
|
|
125
61
|
const groupId = context ? "functionGroup" : "functionImport";
|
|
126
|
-
const executionPromise = functionToCall.
|
|
62
|
+
const executionPromise = functionToCall.invoke(groupId);
|
|
127
63
|
oModel.submitBatch(groupId);
|
|
128
64
|
await executionPromise;
|
|
129
65
|
return functionToCall.getBoundContext();
|
|
130
66
|
}
|
|
131
|
-
async function checkParameterTypeAndReturnConvertedValue(parameter, value) {
|
|
132
|
-
if (value === undefined || value === null) {
|
|
133
|
-
return value;
|
|
134
|
-
}
|
|
135
|
-
const BaseType = (await __ui5_require_async("sap/ui/mdc/enums/BaseType")).default;
|
|
136
|
-
const TypeMap = (await __ui5_require_async("sap/ui/mdc/odata/v4/TypeMap")).default;
|
|
137
|
-
const parameterType = parameter.type ? TypeMap.getBaseType(parameter.type) : BaseType.String;
|
|
138
|
-
const typeInstance = TypeMap.getDataTypeInstance(parameterType);
|
|
139
|
-
return typeInstance.parseValue(value, "string");
|
|
140
|
-
}
|
|
141
|
-
async function callAction(convertedAction, oModel, oAction, oAppComponent, mParameters) {
|
|
142
|
-
let strictHandlingUtilities = {
|
|
143
|
-
is412Executed: false,
|
|
144
|
-
strictHandlingTransitionFails: [],
|
|
145
|
-
strictHandlingPromises: [],
|
|
146
|
-
strictHandlingWarningMessages: [],
|
|
147
|
-
delaySuccessMessages: [],
|
|
148
|
-
processedMessageIds: new Set()
|
|
149
|
-
};
|
|
150
|
-
const sActionName = convertedAction.isBound ? convertedAction.fullyQualifiedName.replace(/\(.*\)$/g, "") // remove the part related to the overlay
|
|
151
|
-
: convertedAction.name;
|
|
152
|
-
mParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
|
|
153
|
-
return new Promise(async function (resolve, reject) {
|
|
154
|
-
const sActionLabel = mParameters.label;
|
|
155
|
-
let bSkipParameterDialog = mParameters.skipParameterDialog;
|
|
156
|
-
const aContexts = mParameters.aContexts;
|
|
157
|
-
const bIsCreateAction = mParameters.bIsCreateAction;
|
|
158
|
-
const bIsCriticalAction = mParameters.isCriticalAction;
|
|
159
|
-
let oMetaModel;
|
|
160
|
-
let sMessagesPath;
|
|
161
|
-
let iMessageSideEffect;
|
|
162
|
-
let isSameEntity;
|
|
163
|
-
let bValuesProvidedForAllMandatoryParameters;
|
|
164
|
-
const actionDefinition = oAction.getObject();
|
|
165
|
-
|
|
166
|
-
//in case of bound actions, ignore the first parameter and consider the rest
|
|
167
|
-
const actionParameters = convertedAction.isBound ? convertedAction.parameters.slice(1) : convertedAction.parameters;
|
|
168
|
-
|
|
169
|
-
// Check if the action has parameters and would need a parameter dialog
|
|
170
|
-
// The parameter ResultIsActiveEntity is always hidden in the dialog! Hence if
|
|
171
|
-
// this is the only parameter, this is treated as no parameter here because the
|
|
172
|
-
// dialog would be empty!
|
|
173
|
-
// FIXME: Should only ignore this if this is a 'create' action, otherwise it is just some normal parameter that happens to have this name
|
|
174
|
-
const bActionNeedsParameterDialog = actionParameters.length > 0 && !(actionParameters.length === 1 && actionParameters[0].name === "ResultIsActiveEntity");
|
|
175
|
-
|
|
176
|
-
// Provided values for the action parameters from invokeAction call
|
|
177
|
-
const aParameterValues = mParameters.parameterValues;
|
|
178
|
-
|
|
179
|
-
// Determine startup parameters if provided
|
|
180
|
-
const oComponentData = oAppComponent.getComponentData();
|
|
181
|
-
const oStartupParameters = oComponentData && oComponentData.startupParameters || {};
|
|
182
|
-
|
|
183
|
-
// If all parameters are hidden and all mandatory parameters values are available, then we skip the dialog.
|
|
184
|
-
bSkipParameterDialog = actionParameters.length && actionParameters.filter(actionParameter => actionParameter.name !== "ResultIsActiveEntity").every(parameter => parameter.annotations.UI?.Hidden?.valueOf() === true) ? true : bSkipParameterDialog;
|
|
185
|
-
// In case an action parameter is needed, and we shall skip the dialog, check if values are provided for all parameters
|
|
186
|
-
if (bActionNeedsParameterDialog && bSkipParameterDialog) {
|
|
187
|
-
bValuesProvidedForAllMandatoryParameters = _valuesProvidedForAllMandatoryParameters(!!bIsCreateAction, actionParameters, aParameterValues, oStartupParameters);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Depending on the previously determined data, either set a dialog or leave it empty which
|
|
191
|
-
// will lead to direct execution of the action without a dialog
|
|
192
|
-
|
|
193
|
-
const mActionExecutionParameters = {
|
|
194
|
-
defaultParametersValues: {},
|
|
195
|
-
appComponent: oAppComponent,
|
|
196
|
-
fnOnSubmitted: mParameters.onSubmitted,
|
|
197
|
-
fnOnResponse: mParameters.onResponse,
|
|
198
|
-
actionName: sActionName,
|
|
199
|
-
aContexts: [],
|
|
200
|
-
model: oModel,
|
|
201
|
-
aActionParameters: actionParameters,
|
|
202
|
-
defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction,
|
|
203
|
-
label: mParameters.label,
|
|
204
|
-
selectedItems: mParameters.selectedItems
|
|
205
|
-
};
|
|
206
|
-
if (convertedAction.isBound) {
|
|
207
|
-
oMetaModel = oModel.getMetaModel();
|
|
208
|
-
const convertedMetaData = convertTypes(oMetaModel);
|
|
209
|
-
const filteredEntitySet = convertedMetaData.entitySets.filter(singleEntitySet => singleEntitySet.entityType === convertedAction.returnEntityType);
|
|
210
|
-
const currentEntitySet = filteredEntitySet.length > 0 ? filteredEntitySet[0] : undefined;
|
|
211
|
-
isSameEntity = !convertedAction.returnCollection && convertedAction.returnEntityType && convertedAction.sourceEntityType === convertedAction.returnEntityType;
|
|
212
|
-
if (isSameEntity && ModelHelper.isDraftRoot(currentEntitySet)) {
|
|
213
|
-
mParameters.mBindingParameters ??= {};
|
|
214
|
-
mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? `${mParameters.mBindingParameters.$select},HasActiveEntity` : "HasActiveEntity";
|
|
215
|
-
}
|
|
216
|
-
if (mParameters.additionalSideEffect?.pathExpressions) {
|
|
217
|
-
sMessagesPath = ModelHelper.getMessagesPath(oMetaModel, aContexts[0].getPath());
|
|
218
|
-
if (sMessagesPath) {
|
|
219
|
-
// '*' effectively includes the messages path if there is one
|
|
220
|
-
iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(exp => typeof exp === "string" && (exp === sMessagesPath || exp === "*"));
|
|
221
|
-
|
|
222
|
-
// Add SAP_Messages by default if not annotated by side effects, action does not return a collection and
|
|
223
|
-
// the return type is the same as the bound type
|
|
224
|
-
if (iMessageSideEffect > -1 || isSameEntity) {
|
|
225
|
-
// the message path is annotated as side effect. As there's no binding for it and the model does currently not allow
|
|
226
|
-
// to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
|
|
227
|
-
mParameters.mBindingParameters ??= {};
|
|
228
|
-
if (convertedAction.returnEntityType?.entityProperties.find(property => property.name === sMessagesPath) && !(mParameters.mBindingParameters.$select ?? "").split(",").includes(sMessagesPath)) {
|
|
229
|
-
if (isSameEntity) {
|
|
230
|
-
// We request messages from the return context as it might not exist as a part of the bound action's source context's $select.
|
|
231
|
-
// Example: Create on a List. Messages path might not be part of the list.
|
|
232
|
-
mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? `${mParameters.mBindingParameters.$select},${sMessagesPath}` : sMessagesPath;
|
|
233
|
-
// We need the return context to be fetched with all the existing properties of the bound action's source context.
|
|
234
|
-
mParameters.mBindingParameters.$$inheritExpandSelect = true;
|
|
235
|
-
}
|
|
236
|
-
if (mParameters.additionalSideEffect.triggerActions?.length === 0 && iMessageSideEffect > -1) {
|
|
237
|
-
// no trigger action therefore no need to request messages again
|
|
238
|
-
mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
mActionExecutionParameters.aContexts = aContexts ?? [];
|
|
245
|
-
mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
|
|
246
|
-
mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
|
|
247
|
-
mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
|
|
248
|
-
mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
|
|
249
|
-
mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
|
|
250
|
-
mActionExecutionParameters.isCreateAction = bIsCreateAction;
|
|
251
|
-
mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
|
|
252
|
-
mActionExecutionParameters.disableStrictHandling = mParameters.disableStrictHandling;
|
|
253
|
-
mActionExecutionParameters.groupId = mParameters.groupId;
|
|
254
|
-
if (mParameters.controlId) {
|
|
255
|
-
mActionExecutionParameters.control = mParameters.parentControl.byId(mParameters.controlId);
|
|
256
|
-
mParameters.control = mActionExecutionParameters.control;
|
|
257
|
-
} else {
|
|
258
|
-
mActionExecutionParameters.control = mParameters.parentControl;
|
|
259
|
-
mParameters.control = mParameters.parentControl;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
|
|
263
|
-
if (bIsCreateAction) {
|
|
264
|
-
mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
|
|
265
|
-
}
|
|
266
|
-
mActionExecutionParameters.isStatic = convertedAction.isBound && !!convertedAction.parameters[0]?.isCollection;
|
|
267
|
-
let operationResult = [];
|
|
268
|
-
let executionWitDialog = false;
|
|
269
|
-
try {
|
|
270
|
-
if (bActionNeedsParameterDialog) {
|
|
271
|
-
if (!(bSkipParameterDialog && bValuesProvidedForAllMandatoryParameters)) {
|
|
272
|
-
executionWitDialog = true;
|
|
273
|
-
const parameterDialog = getCoreUIFactory().newParameterDialog(convertedAction, oAction, mActionExecutionParameters, aParameterValues, mParameters.entitySetName, mParameters.view, mParameters.messageHandler, strictHandlingUtilities, {
|
|
274
|
-
beforeShowingMessage: actionParameterShowMessageCallback
|
|
275
|
-
}, mParameters.ignoreETag);
|
|
276
|
-
await parameterDialog.createDialog();
|
|
277
|
-
operationResult = await parameterDialog.openDialog(mParameters.parentControl);
|
|
278
|
-
}
|
|
279
|
-
} else if (bIsCriticalAction) {
|
|
280
|
-
executionWitDialog = true;
|
|
281
|
-
operationResult = await confirmCriticalAction(convertedAction, sActionName, mActionExecutionParameters, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
|
|
282
|
-
}
|
|
283
|
-
} catch (e) {
|
|
284
|
-
reject(e);
|
|
285
|
-
}
|
|
286
|
-
if (executionWitDialog) {
|
|
287
|
-
afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
|
|
288
|
-
resolve(operationResult);
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Take over all provided parameter values and call the action.
|
|
293
|
-
// This shall only happen if values are provided for all the parameters, otherwise the parameter dialog shall be shown which is ensured earlier
|
|
294
|
-
|
|
295
|
-
if (aParameterValues) {
|
|
296
|
-
for (const i in mActionExecutionParameters.aActionParameters) {
|
|
297
|
-
mActionExecutionParameters.defaultParametersValues[mActionExecutionParameters.aActionParameters[i].name] = aParameterValues?.find(element => element.name === mActionExecutionParameters.aActionParameters[i].name)?.value;
|
|
298
|
-
}
|
|
299
|
-
} else {
|
|
300
|
-
let actionParameter, parameterValueNotConverted;
|
|
301
|
-
for (const i in mActionExecutionParameters.aActionParameters) {
|
|
302
|
-
actionParameter = mActionExecutionParameters.aActionParameters[i];
|
|
303
|
-
parameterValueNotConverted = oStartupParameters[actionParameter.name]?.[0] || actionParameter.annotations?.UI?.ParameterDefaultValue?.valueOf();
|
|
304
|
-
mActionExecutionParameters.defaultParametersValues[actionParameter.name] = parameterValueNotConverted === undefined ? parameterValueNotConverted : await checkParameterTypeAndReturnConvertedValue(actionParameter, parameterValueNotConverted);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
let oOperationResult = [];
|
|
308
|
-
try {
|
|
309
|
-
oOperationResult = await new ODataOperation(convertedAction, mActionExecutionParameters, mParameters.messageHandler, strictHandlingUtilities, {
|
|
310
|
-
ignoreETag: mParameters.ignoreETag
|
|
311
|
-
}).execute();
|
|
312
|
-
const messages = Messaging.getMessageModel().getData();
|
|
313
|
-
if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
|
|
314
|
-
strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
|
|
315
|
-
}
|
|
316
|
-
afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
|
|
317
|
-
resolve(oOperationResult);
|
|
318
|
-
} catch (e) {
|
|
319
|
-
reject(e);
|
|
320
|
-
} finally {
|
|
321
|
-
if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length && mParameters.aContexts.length > 1) {
|
|
322
|
-
try {
|
|
323
|
-
const strictHandlingFails = strictHandlingUtilities.strictHandlingTransitionFails;
|
|
324
|
-
const aFailedContexts = [];
|
|
325
|
-
strictHandlingFails.forEach(function (fail) {
|
|
326
|
-
aFailedContexts.push(fail.oAction.getContext());
|
|
327
|
-
});
|
|
328
|
-
mActionExecutionParameters.aContexts = aFailedContexts;
|
|
329
|
-
const oFailedOperationResult = await new ODataOperation(convertedAction, mActionExecutionParameters, mParameters.messageHandler, strictHandlingUtilities, {
|
|
330
|
-
ignoreETag: mParameters.ignoreETag
|
|
331
|
-
}).execute();
|
|
332
|
-
strictHandlingUtilities.strictHandlingTransitionFails = [];
|
|
333
|
-
Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
|
|
334
|
-
afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
|
|
335
|
-
resolve(oFailedOperationResult);
|
|
336
|
-
} catch (e) {
|
|
337
|
-
reject(e);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
let showGenericErrorMessageForChangeSet = false;
|
|
341
|
-
if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
|
|
342
|
-
showGenericErrorMessageForChangeSet = true;
|
|
343
|
-
}
|
|
344
|
-
mParameters?.messageHandler?.showMessageDialog({
|
|
345
|
-
control: mActionExecutionParameters?.control,
|
|
346
|
-
onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
|
|
347
|
-
return actionParameterShowMessageCallback(mActionExecutionParameters, aContexts, undefined, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet, oOperationResult.length > 0 && oOperationResult.every(res => res.status === "fulfilled"));
|
|
348
|
-
},
|
|
349
|
-
aSelectedContexts: mParameters.aContexts,
|
|
350
|
-
sActionName: sActionLabel,
|
|
351
|
-
entitySet: mParameters.entitySetName,
|
|
352
|
-
boundActionName: sActionName
|
|
353
|
-
}).then(() => {
|
|
354
|
-
mParameters.messageHandler.clearStrictWarningMessages();
|
|
355
|
-
return;
|
|
356
|
-
});
|
|
357
|
-
if (strictHandlingUtilities) {
|
|
358
|
-
strictHandlingUtilities = {
|
|
359
|
-
is412Executed: false,
|
|
360
|
-
strictHandlingTransitionFails: [],
|
|
361
|
-
strictHandlingPromises: [],
|
|
362
|
-
strictHandlingWarningMessages: [],
|
|
363
|
-
delaySuccessMessages: [],
|
|
364
|
-
processedMessageIds: new Set()
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Reads a title from custom i18n file.
|
|
373
|
-
* @param oParentControl The view where the action is called
|
|
374
|
-
* @param suffixResourceKey The key of the title
|
|
375
|
-
* @returns Title if defined
|
|
376
|
-
*/
|
|
377
|
-
function getConfirmTitle(oParentControl, suffixResourceKey) {
|
|
378
|
-
// A title only exists if it has been defined in the extension. Otherwise "Confirmation"
|
|
379
|
-
// is used from the MessageBox control.
|
|
380
|
-
const key = "C_OPERATIONS_ACTION_CONFIRM_TITLE";
|
|
381
|
-
const resourceModel = getResourceModel(oParentControl);
|
|
382
|
-
const titleOverrideExists = resourceModel.checkIfResourceKeyExists(`${key}|${suffixResourceKey}`);
|
|
383
|
-
if (titleOverrideExists) {
|
|
384
|
-
return resourceModel.getText(key, undefined, suffixResourceKey);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
async function confirmCriticalAction(convertedAction, sActionName, mParameters, oParentControl, entitySetName, messageHandler, strictHandlingUtilities, ignoreETag) {
|
|
388
|
-
return new Promise((resolve, reject) => {
|
|
389
|
-
let boundActionName = sActionName;
|
|
390
|
-
boundActionName = boundActionName.includes(".") ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
|
|
391
|
-
const suffixResourceKey = boundActionName && entitySetName ? `${entitySetName}|${boundActionName}` : "";
|
|
392
|
-
const resourceModel = getResourceModel(oParentControl);
|
|
393
|
-
const sConfirmationText = resourceModel.getText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", undefined, suffixResourceKey);
|
|
394
|
-
MessageBox.confirm(sConfirmationText, {
|
|
395
|
-
title: getConfirmTitle(oParentControl, suffixResourceKey),
|
|
396
|
-
onClose: async function (sAction) {
|
|
397
|
-
if (sAction === Action.OK) {
|
|
398
|
-
try {
|
|
399
|
-
const oOperation = await new ODataOperation(convertedAction, mParameters, messageHandler, strictHandlingUtilities, {
|
|
400
|
-
ignoreETag
|
|
401
|
-
}).execute();
|
|
402
|
-
resolve(oOperation);
|
|
403
|
-
} catch (oError) {
|
|
404
|
-
try {
|
|
405
|
-
await messageHandler.showMessageDialog();
|
|
406
|
-
reject(oError);
|
|
407
|
-
} catch (e) {
|
|
408
|
-
reject(oError);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
} else {
|
|
412
|
-
reject(Constants.CancelActionDialog);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
function afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition) {
|
|
419
|
-
if (mActionExecutionParameters.internalModelContext && mActionExecutionParameters.operationAvailableMap && mActionExecutionParameters.aContexts && mActionExecutionParameters.aContexts.length && actionDefinition.$IsBound) {
|
|
420
|
-
let selectedContexts = [];
|
|
421
|
-
//check for skipping static actions
|
|
422
|
-
const isStatic = mActionExecutionParameters.isStatic;
|
|
423
|
-
if (!isStatic) {
|
|
424
|
-
selectedContexts = mActionExecutionParameters.internalModelContext.getProperty("selectedContexts") || [];
|
|
425
|
-
ActionRuntime.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), selectedContexts, "table");
|
|
426
|
-
} else if (mActionExecutionParameters.control) {
|
|
427
|
-
const control = mActionExecutionParameters.control;
|
|
428
|
-
if (control.isA("sap.ui.mdc.Table")) {
|
|
429
|
-
selectedContexts = control.getSelectedContexts();
|
|
430
|
-
ActionRuntime.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), selectedContexts, "table");
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
//update delete button
|
|
434
|
-
DeleteHelper.updateDeleteInfoForSelectedContexts(mActionExecutionParameters.internalModelContext, selectedContexts);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Filters an array of messages based on various conditions and returns an object containing the filtered messages and other properties.
|
|
440
|
-
* @param messages The messages to filter.
|
|
441
|
-
* @param errorTargetsInAPD Indicates whether error targets are in APD.
|
|
442
|
-
* @param contexts An array of contexts.
|
|
443
|
-
* @param unboundMessages An array of unbound messages.
|
|
444
|
-
* @param control A control object.
|
|
445
|
-
* @param isAPDOPen Indicates whether APD is open.
|
|
446
|
-
* @param showMessageDialog Indicates whether to show the message dialog.
|
|
447
|
-
* @returns An object containing a boolean indicating whether the result contains a bound transition, an array of messages to show, and a boolean indicating whether to show the message in a dialog.
|
|
448
|
-
*/
|
|
449
|
-
function filterAPDandContextMessages(messages, errorTargetsInAPD, contexts, unboundMessages, control, isAPDOPen, showMessageDialog) {
|
|
450
|
-
if (isAPDOPen && errorTargetsInAPD) {
|
|
451
|
-
/* When APD is open, we need to remove the messages which are related to the objectpage context */
|
|
452
|
-
messageHandling.removeContextMessagesfromModel(messages, contexts);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// Filter out messages which are not related to the action parameter dialog in the edit mode and display mode
|
|
456
|
-
let containsBoundTransistion;
|
|
457
|
-
if (!(control && CommonUtils.getIsEditable(control))) {
|
|
458
|
-
if (isAPDOPen && errorTargetsInAPD) {
|
|
459
|
-
if (unboundMessages?.length === 0) {
|
|
460
|
-
containsBoundTransistion = false;
|
|
461
|
-
showMessageDialog = false;
|
|
462
|
-
}
|
|
463
|
-
messages = messageHandling.removeMessagesForActionParameterDialog(messages);
|
|
464
|
-
}
|
|
465
|
-
} else {
|
|
466
|
-
if (unboundMessages?.length === 0) {
|
|
467
|
-
containsBoundTransistion = false;
|
|
468
|
-
}
|
|
469
|
-
messages = messageHandling.removeMessagesForActionParameterDialog(messages);
|
|
470
|
-
}
|
|
471
|
-
return {
|
|
472
|
-
messagesToShow: messages,
|
|
473
|
-
containsBoundTransistion: containsBoundTransistion,
|
|
474
|
-
showMessageInDialog: showMessageDialog
|
|
475
|
-
};
|
|
476
|
-
}
|
|
477
|
-
function actionParameterShowMessageCallback(mParameters, aContexts, oDialog, messages, showMessageParametersIn, showGenericErrorMessageForChangeSet, isActionSuccessful, is412WarningDialogCancelled) {
|
|
478
|
-
let showMessageBox = showMessageParametersIn.showMessageBox,
|
|
479
|
-
showMessageDialog = showMessageParametersIn.showMessageDialog;
|
|
480
|
-
const oControl = mParameters.control;
|
|
481
|
-
const oResourceBundle = Library.getResourceBundleFor("sap.fe.core");
|
|
482
|
-
const unboundMessages = messages.filter(function (message) {
|
|
483
|
-
return message.getTargets()?.[0] === "";
|
|
484
|
-
});
|
|
485
|
-
const APDmessages = messages.filter(function (message) {
|
|
486
|
-
return message.getTargets && message.getTargets()?.[0].includes(mParameters.actionName) && mParameters?.aActionParameters?.some(function (actionParam) {
|
|
487
|
-
return message.getTargets()?.[0].includes(actionParam.name);
|
|
488
|
-
});
|
|
489
|
-
});
|
|
490
|
-
APDmessages?.forEach(function (APDMessage) {
|
|
491
|
-
APDMessage.isAPDTarget = true;
|
|
492
|
-
});
|
|
493
|
-
const errorTargetsInAPD = APDmessages.length ? true : false;
|
|
494
|
-
//If Action is successful with warnings, dont show the generic error message for changeset in dialog
|
|
495
|
-
if (showGenericErrorMessageForChangeSet && !errorTargetsInAPD && !isActionSuccessful) {
|
|
496
|
-
const messageModel = Messaging.getMessageModel();
|
|
497
|
-
const messagesInModel = messageModel.getData();
|
|
498
|
-
const aBoundMessages = messageHandling.getMessages(true);
|
|
499
|
-
let genericMessage;
|
|
500
|
-
const isEditable = (oControl && CommonUtils.getIsEditable(oControl)) ?? false;
|
|
501
|
-
const nonErrorMessageExistsInDialog = messages.findIndex(function (message) {
|
|
502
|
-
return message.getType() === "Error" || message.getType() === "Warning";
|
|
503
|
-
});
|
|
504
|
-
const nonErrorMessageExistsInModel = messagesInModel.findIndex(function (message) {
|
|
505
|
-
return message.getType() === "Error" || message.getType() === "Warning";
|
|
506
|
-
});
|
|
507
|
-
if (nonErrorMessageExistsInDialog !== 1 && nonErrorMessageExistsInModel !== -1 && mParameters.aContexts && mParameters.aContexts.length > 1) {
|
|
508
|
-
if (messagesInModel.length === 1) {
|
|
509
|
-
genericMessage = getGenericMsgForSingleErrorInChangeSet(isEditable, oResourceBundle);
|
|
510
|
-
messages.unshift(genericMessage);
|
|
511
|
-
showMessageBox = true;
|
|
512
|
-
showMessageDialog = false;
|
|
513
|
-
} else {
|
|
514
|
-
const sMessage = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_TEXT");
|
|
515
|
-
const sDescriptionText = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_DETAIL_TEXT");
|
|
516
|
-
genericMessage = new Message({
|
|
517
|
-
message: sMessage,
|
|
518
|
-
type: MessageType.Error,
|
|
519
|
-
target: "",
|
|
520
|
-
persistent: true,
|
|
521
|
-
description: sDescriptionText,
|
|
522
|
-
code: "FE_CUSTOM_MESSAGE_CHANGESET_ALL_FAILED"
|
|
523
|
-
});
|
|
524
|
-
messages.unshift(genericMessage);
|
|
525
|
-
if (messages.length === 1) {
|
|
526
|
-
showMessageBox = true;
|
|
527
|
-
showMessageDialog = false;
|
|
528
|
-
} else {
|
|
529
|
-
showMessageDialog = true;
|
|
530
|
-
showMessageBox = false;
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
let bIsAPDOpen = oDialog && oDialog.isOpen();
|
|
536
|
-
// NOTE: we don't use isOpen again after we close the dialog as isOpen(sync API) doesn't return false until the dialog animations and dialog events end.
|
|
537
|
-
if (oDialog && bIsAPDOpen && aContexts.length !== 0 && !mParameters.isStatic) {
|
|
538
|
-
if (!mParameters.bGrouped) {
|
|
539
|
-
//isolated
|
|
540
|
-
if (aContexts.length > 1 || !errorTargetsInAPD) {
|
|
541
|
-
// does not matter if error is in APD or not, if there are multiple contexts selected or if the error is not the APD, we close it.
|
|
542
|
-
// TODO: Dilaog handling should not be part of message handling. Refactor accordingly - dialog should not be needed inside this method - neither
|
|
543
|
-
// to ask whether it's open, nor to close/destroy it!
|
|
544
|
-
oDialog.close();
|
|
545
|
-
bIsAPDOpen = false;
|
|
546
|
-
}
|
|
547
|
-
} else if (!errorTargetsInAPD && !is412WarningDialogCancelled) {
|
|
548
|
-
//changeset
|
|
549
|
-
oDialog.close();
|
|
550
|
-
bIsAPDOpen = false;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
const filteredMessages = [];
|
|
554
|
-
const {
|
|
555
|
-
messagesToShow,
|
|
556
|
-
containsBoundTransistion,
|
|
557
|
-
showMessageInDialog
|
|
558
|
-
} = filterAPDandContextMessages(messages, errorTargetsInAPD, aContexts, unboundMessages, oControl, bIsAPDOpen);
|
|
559
|
-
messages = messagesToShow;
|
|
560
|
-
showMessageDialog = showMessageInDialog ?? showMessageDialog;
|
|
561
|
-
if (!bIsAPDOpen && errorTargetsInAPD && !mParameters.bGrouped) {
|
|
562
|
-
// If APD is not open and there are messages related to APD, then show in the message dialog. since
|
|
563
|
-
showMessageDialog = true;
|
|
564
|
-
messages = messages.concat(APDmessages);
|
|
565
|
-
}
|
|
566
|
-
let fnGetMessageSubtitle;
|
|
567
|
-
if (oControl && oControl.isA("sap.ui.mdc.Table")) {
|
|
568
|
-
fnGetMessageSubtitle = messageHandling.setMessageSubtitle.bind({}, oControl, aContexts);
|
|
569
|
-
}
|
|
570
|
-
return {
|
|
571
|
-
showMessageBox: showMessageBox,
|
|
572
|
-
showMessageDialog: showMessageDialog,
|
|
573
|
-
filteredMessages: filteredMessages.length ? filteredMessages : messages,
|
|
574
|
-
fnGetMessageSubtitle: fnGetMessageSubtitle,
|
|
575
|
-
showChangeSetErrorDialog: mParameters.bGrouped,
|
|
576
|
-
containsBoundTransistion: containsBoundTransistion
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
function _valuesProvidedForAllMandatoryParameters(isCreateAction, actionParameters, parameterValues, startupParameters) {
|
|
580
|
-
const hiddenAnnotationSetOnAllActions = actionParameters.every(parameter => parameter?.annotations?.UI?.Hidden?.valueOf() === true);
|
|
581
|
-
if (parameterValues?.length && !hiddenAnnotationSetOnAllActions) {
|
|
582
|
-
// If showDialog is false but there are parameters from the invokeAction call which need to be checked on existance
|
|
583
|
-
for (const actionParameter of actionParameters) {
|
|
584
|
-
if (actionParameter.name !== "ResultIsActiveEntity" && !parameterValues?.find(element => element.name === actionParameter.name)) {
|
|
585
|
-
// At least for one parameter no value has been provided, so we can't skip the dialog
|
|
586
|
-
return false;
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
if (isCreateAction && startupParameters?.length && !hiddenAnnotationSetOnAllActions) {
|
|
591
|
-
// If parameters have been provided during application launch, we need to check if the set is complete
|
|
592
|
-
// If not, the parameter dialog still needs to be shown.
|
|
593
|
-
for (const actionParameter of actionParameters) {
|
|
594
|
-
if (startupParameters && !startupParameters[actionParameter.name]) {
|
|
595
|
-
// At least for one parameter no value has been provided, so we can't skip the dialog
|
|
596
|
-
return false;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
if (actionParameters.length && hiddenAnnotationSetOnAllActions) {
|
|
601
|
-
return actionParameters.every(function (parameter) {
|
|
602
|
-
const fieldControl = parameter.annotations?.Common?.FieldControl;
|
|
603
|
-
const isMandatory = fieldControl?.toString() === "Common.FieldControlType/Mandatory";
|
|
604
|
-
|
|
605
|
-
// Possible sources may be startupParameters, parameterValues, defaultValues per annotation (ParameterDefaultValue)
|
|
606
|
-
// If none is found, return false
|
|
607
|
-
return !isMandatory || startupParameters && startupParameters[parameter.name] || parameterValues?.find(parameterValue => parameterValue.name === parameter.name) || parameter?.annotations?.UI?.ParameterDefaultValue?.valueOf();
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
return true;
|
|
611
|
-
}
|
|
612
|
-
function getGenericMsgForSingleErrorInChangeSet(isEditable, resourceBundle) {
|
|
613
|
-
const message = isEditable ? resourceBundle.getText("C_COMMON_DIALOG_CANCEL_SINGLE_ERROR_MESSAGE_TEXT_EDIT") : resourceBundle.getText("C_COMMON_DIALOG_CANCEL_SINGLE_ERROR_MESSAGE_TEXT");
|
|
614
|
-
return new Message({
|
|
615
|
-
message,
|
|
616
|
-
type: MessageType.Error,
|
|
617
|
-
target: "",
|
|
618
|
-
persistent: true,
|
|
619
|
-
code: "FE_CUSTOM_MESSAGE_CHANGESET_ALL_FAILED",
|
|
620
|
-
technicalDetails: {
|
|
621
|
-
fe: {
|
|
622
|
-
changeSetPreTextForSingleError: message
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
});
|
|
626
|
-
}
|
|
627
67
|
|
|
628
68
|
/**
|
|
629
69
|
* Static functions to call OData actions (bound/import) and functions (bound/import)
|
|
@@ -632,16 +72,10 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
|
|
|
632
72
|
* @since 1.56.0
|
|
633
73
|
*/
|
|
634
74
|
const operations = {
|
|
635
|
-
callBoundAction: callBoundAction,
|
|
636
75
|
callActionImport: callActionImport,
|
|
637
76
|
callBoundFunction: callBoundFunction,
|
|
638
|
-
callFunctionImport: callFunctionImport
|
|
639
|
-
valuesProvidedForAllMandatoryParameters: _valuesProvidedForAllMandatoryParameters,
|
|
640
|
-
actionParameterShowMessageCallback: actionParameterShowMessageCallback,
|
|
641
|
-
afterActionResolution: afterActionResolution,
|
|
642
|
-
checkParameterTypeAndReturnConvertedValue: checkParameterTypeAndReturnConvertedValue,
|
|
643
|
-
getConfirmTitle: getConfirmTitle
|
|
77
|
+
callFunctionImport: callFunctionImport
|
|
644
78
|
};
|
|
645
79
|
return operations;
|
|
646
80
|
}, false);
|
|
647
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsImxlbmd0aCIsIkVycm9yIiwiYUNvbnRleHRzIiwiQXJyYXkiLCJpc0FycmF5Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNBY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwib0JvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJpc0NyaXRpY2FsQWN0aW9uIiwiQWN0aW9uUnVudGltZSIsImdldElzQWN0aW9uQ3JpdGljYWwiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJhcHBDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwibWV0YU1vZGVsIiwiYWN0aW9uUGF0aCIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsImFjdGlvbiIsInVuYm91bmRBY3Rpb25JbmRleCIsImFjdGlvbnMiLCJmaWx0ZXIiLCJuYW1lIiwiZmluZEluZGV4IiwiaXNCb3VuZCIsImFjdGlvbk5hbWVGcm9tTW9kZWwiLCJhY3Rpb25JbXBvcnQiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0IiwiUHJvbWlzZSIsInJlamVjdCIsInNGdW5jdGlvblBhdGgiLCJvQm91bmRGdW5jdGlvbiIsIl9leGVjdXRlRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9GdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsIm9GdW5jdGlvbiIsImZ1bmN0aW9uVG9DYWxsIiwiZ3JvdXBJZCIsImV4ZWN1dGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZSIsInBhcmFtZXRlciIsInZhbHVlIiwidW5kZWZpbmVkIiwiQmFzZVR5cGUiLCJfX3VpNV9yZXF1aXJlX2FzeW5jIiwiZGVmYXVsdCIsIlR5cGVNYXAiLCJwYXJhbWV0ZXJUeXBlIiwidHlwZSIsImdldEJhc2VUeXBlIiwiU3RyaW5nIiwidHlwZUluc3RhbmNlIiwiZ2V0RGF0YVR5cGVJbnN0YW5jZSIsInBhcnNlVmFsdWUiLCJvQWN0aW9uIiwic3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMiLCJpczQxMkV4ZWN1dGVkIiwic3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMiLCJzdHJpY3RIYW5kbGluZ1Byb21pc2VzIiwic3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMiLCJkZWxheVN1Y2Nlc3NNZXNzYWdlcyIsInByb2Nlc3NlZE1lc3NhZ2VJZHMiLCJTZXQiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJyZXBsYWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJyZXNvbHZlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2tpcFBhcmFtZXRlckRpYWxvZyIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJpc1NhbWVFbnRpdHkiLCJiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwiYWN0aW9uRGVmaW5pdGlvbiIsImFjdGlvblBhcmFtZXRlcnMiLCJzbGljZSIsImJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyIsImFQYXJhbWV0ZXJWYWx1ZXMiLCJwYXJhbWV0ZXJWYWx1ZXMiLCJvQ29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1ldGVycyIsImFjdGlvblBhcmFtZXRlciIsImV2ZXJ5IiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJkZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJhQWN0aW9uUGFyYW1ldGVycyIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJjb252ZXJ0ZWRNZXRhRGF0YSIsImZpbHRlcmVkRW50aXR5U2V0IiwiZW50aXR5U2V0cyIsInNpbmdsZUVudGl0eVNldCIsImVudGl0eVR5cGUiLCJyZXR1cm5FbnRpdHlUeXBlIiwiY3VycmVudEVudGl0eVNldCIsInJldHVybkNvbGxlY3Rpb24iLCJzb3VyY2VFbnRpdHlUeXBlIiwiTW9kZWxIZWxwZXIiLCJpc0RyYWZ0Um9vdCIsIm1CaW5kaW5nUGFyYW1ldGVycyIsIiRzZWxlY3QiLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsInBhdGhFeHByZXNzaW9ucyIsImdldE1lc3NhZ2VzUGF0aCIsImV4cCIsImVudGl0eVByb3BlcnRpZXMiLCJmaW5kIiwicHJvcGVydHkiLCJzcGxpdCIsImluY2x1ZGVzIiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0IiwidHJpZ2dlckFjdGlvbnMiLCJzcGxpY2UiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImlzQ3JlYXRlQWN0aW9uIiwiYk9iamVjdFBhZ2UiLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb250cm9sSWQiLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJpc1N0YXRpYyIsImlzQ29sbGVjdGlvbiIsIm9wZXJhdGlvblJlc3VsdCIsImV4ZWN1dGlvbldpdERpYWxvZyIsInBhcmFtZXRlckRpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdQYXJhbWV0ZXJEaWFsb2ciLCJlbnRpdHlTZXROYW1lIiwidmlldyIsIm1lc3NhZ2VIYW5kbGVyIiwiYmVmb3JlU2hvd2luZ01lc3NhZ2UiLCJhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrIiwiaWdub3JlRVRhZyIsImNyZWF0ZURpYWxvZyIsIm9wZW5EaWFsb2ciLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJlIiwiYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uIiwiaSIsImVsZW1lbnQiLCJwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZCIsIlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsIm9PcGVyYXRpb25SZXN1bHQiLCJPRGF0YU9wZXJhdGlvbiIsIm1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImNvbmNhdCIsInN0cmljdEhhbmRsaW5nRmFpbHMiLCJhRmFpbGVkQ29udGV4dHMiLCJmb3JFYWNoIiwiZmFpbCIsInB1c2giLCJnZXRDb250ZXh0Iiwib0ZhaWxlZE9wZXJhdGlvblJlc3VsdCIsImFkZE1lc3NhZ2VzIiwic2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncyIsInNob3dNZXNzYWdlRGlhbG9nIiwib25CZWZvcmVTaG93TWVzc2FnZSIsImFNZXNzYWdlcyIsInNob3dNZXNzYWdlUGFyYW1ldGVyc0luIiwicmVzIiwic3RhdHVzIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJib3VuZEFjdGlvbk5hbWUiLCJ0aGVuIiwiY2xlYXJTdHJpY3RXYXJuaW5nTWVzc2FnZXMiLCJnZXRDb25maXJtVGl0bGUiLCJvUGFyZW50Q29udHJvbCIsInN1ZmZpeFJlc291cmNlS2V5Iiwia2V5IiwicmVzb3VyY2VNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJ0aXRsZU92ZXJyaWRlRXhpc3RzIiwiY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzIiwiZ2V0VGV4dCIsInNDb25maXJtYXRpb25UZXh0IiwiY29uZmlybSIsInRpdGxlIiwib25DbG9zZSIsInNBY3Rpb24iLCJPSyIsIm9PcGVyYXRpb24iLCJvRXJyb3IiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCIkSXNCb3VuZCIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJpc0EiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiRGVsZXRlSGVscGVyIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXJBUERhbmRDb250ZXh0TWVzc2FnZXMiLCJlcnJvclRhcmdldHNJbkFQRCIsInVuYm91bmRNZXNzYWdlcyIsImlzQVBET1BlbiIsInJlbW92ZUNvbnRleHRNZXNzYWdlc2Zyb21Nb2RlbCIsImNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiIsIkNvbW1vblV0aWxzIiwiZ2V0SXNFZGl0YWJsZSIsInJlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibWVzc2FnZXNUb1Nob3ciLCJzaG93TWVzc2FnZUluRGlhbG9nIiwib0RpYWxvZyIsImlzQWN0aW9uU3VjY2Vzc2Z1bCIsImlzNDEyV2FybmluZ0RpYWxvZ0NhbmNlbGxlZCIsInNob3dNZXNzYWdlQm94Iiwib0NvbnRyb2wiLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsIkFQRG1lc3NhZ2VzIiwic29tZSIsImFjdGlvblBhcmFtIiwiQVBETWVzc2FnZSIsImlzQVBEVGFyZ2V0IiwibWVzc2FnZU1vZGVsIiwibWVzc2FnZXNJbk1vZGVsIiwiYUJvdW5kTWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImdlbmVyaWNNZXNzYWdlIiwiaXNFZGl0YWJsZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nIiwiZ2V0VHlwZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luTW9kZWwiLCJnZXRHZW5lcmljTXNnRm9yU2luZ2xlRXJyb3JJbkNoYW5nZVNldCIsInVuc2hpZnQiLCJzTWVzc2FnZSIsInNEZXNjcmlwdGlvblRleHQiLCJNZXNzYWdlIiwiTWVzc2FnZVR5cGUiLCJwZXJzaXN0ZW50IiwiZGVzY3JpcHRpb24iLCJjb2RlIiwiYklzQVBET3BlbiIsImlzT3BlbiIsImNsb3NlIiwiZmlsdGVyZWRNZXNzYWdlcyIsImZuR2V0TWVzc2FnZVN1YnRpdGxlIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYmluZCIsInNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZyIsImhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMiLCJmaWVsZENvbnRyb2wiLCJDb21tb24iLCJGaWVsZENvbnRyb2wiLCJpc01hbmRhdG9yeSIsInRvU3RyaW5nIiwicGFyYW1ldGVyVmFsdWUiLCJyZXNvdXJjZUJ1bmRsZSIsInRlY2huaWNhbERldGFpbHMiLCJmZSIsImNoYW5nZVNldFByZVRleHRGb3JTaW5nbGVFcnJvciIsIm9wZXJhdGlvbnMiLCJ2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImZhY2FkZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG5cdEFjdGlvbkltcG9ydCxcblx0QWN0aW9uUGFyYW1ldGVyLFxuXHRBY3Rpb24gYXMgRWRtQWN0aW9uLFxuXHRBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLFxuXHRQcmltaXRpdmVUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRDb3JlVUlGYWN0b3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VXaXRoSGVhZGVyLCBTaG93TWVzc2FnZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgdHlwZSBNZXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBEZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vLi4vLi4vQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyB0eXBlIFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzIH0gZnJvbSBcIi4uLy4uLy4uL29wZXJhdGlvbnNIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi8uLi9NZXNzYWdlSGFuZGxlclwiO1xuXG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IE9EYXRhT3BlcmF0aW9uLCB7IHR5cGUgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL09EYXRhT3BlcmF0aW9uXCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdEludm9jYXRpb25Hcm91cGluZyA9IEZFTGlicmFyeS5JbnZvY2F0aW9uR3JvdXBpbmc7XG5jb25zdCBBY3Rpb24gPSBNZXNzYWdlQm94LkFjdGlvbjtcblxuZXhwb3J0IHR5cGUgU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMgPSB7XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRmbk9uU3VibWl0dGVkPzogRnVuY3Rpb247XG5cdGZuT25SZXNwb25zZT86IEZ1bmN0aW9uO1xuXHRhY3Rpb25OYW1lOiBzdHJpbmc7XG5cdG1vZGVsOiBPRGF0YU1vZGVsO1xuXHRhQWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW107XG5cdGRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0c2VsZWN0ZWRJdGVtczogT0RhdGFWNENvbnRleHRbXTtcblx0YUNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRtQmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGFkZGl0aW9uYWxTaWRlRWZmZWN0PzogQWN0aW9uU2lkZUVmZmVjdHNUeXBlO1xuXHRiR3JvdXBlZD86IGJvb2xlYW47XG5cdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdGlzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuO1xuXHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRncm91cElkPzogc3RyaW5nO1xuXHRpc1N0YXRpYz86IGJvb2xlYW47XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRvRGlhbG9nPzogRGlhbG9nO1xuXHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIENhbGxBY3Rpb25QYXJhbWV0ZXJzID0ge1xuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRsYWJlbD86IHN0cmluZztcblx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdG9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0b25SZXNwb25zZTogRnVuY3Rpb247XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXI7XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdGNvbnRyb2xJZD86IHN0cmluZztcblx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdHZpZXc6IFZpZXcgfCBudWxsO1xufSAmIHtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRhQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZEl0ZW1zPzogT0RhdGFWNENvbnRleHRbXTtcblx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdG1CaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcbn07XG5cbnR5cGUgQmFzZVR5cGVQYXJhbWV0ZXIgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBjb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgT0RhdGEgTW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQsIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmlnbm9yZUVUYWddIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBFVGFnIGhhbmRsaW5nXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0c1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBjb250ZXh0cyA6IFtjb250ZXh0c107XG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHQvLyBBbmFseXppbmcgbWV0YU1vZGVsUGF0aCBmb3IgYWN0aW9uIG9ubHkgZnJvbSBmaXJzdCBjb250ZXh0IHNlZW1zIHdlaXJkLCBidXQgcHJvYmFibHkgd29ya3MgaW4gYWxsIGV4aXN0aW5nIHNjZW5hcmlvcyAtIGlmIHNldmVyYWwgY29udGV4dHMgYXJlIHBhc3NlZCwgdGhleSBwcm9iYWJseVxuXHRcdC8vIGJlbG9uZyB0byB0aGUgc2FtZSBtZXRhbW9kZWxwYXRoLiBUT0RPOiBDaGVjaywgd2hldGhlciB0aGlzIGNhbiBiZSBpbXByb3ZlZCAvIHNjZW5hcmlvcyB3aXRoIGRpZmZlcmVudCBtZXRhTW9kZWxQYXRocyBtaWdodCBleGlzdFxuXHRcdHNBY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIG1QYXJhbWV0ZXJzLmFDb250ZXh0cyk7XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4ob0JvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xuXHRpZiAoIWNvbnZlcnRlZEFjdGlvbikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYm91bmQgYWN0aW9uXCIpO1xuXHR9XG5cdHJldHVybiBjYWxsQWN0aW9uKGNvbnZlcnRlZEFjdGlvbiwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG1vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuICogQHBhcmFtIFtwYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5pZ25vcmVFVGFnXSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChcblx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRtb2RlbDogT0RhdGFNb2RlbCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdHBhcmFtZXRlcnM6IHtcblx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0b25TdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xuXHRcdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0dmlldzogVmlldyB8IG51bGw7XG5cdH0gJiB7XG5cdFx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdH1cbik6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPiB7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBhY3Rpb25QYXRoID0gYC8ke2FjdGlvbk5hbWV9YDtcblx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKTtcblx0Y29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8QWN0aW9uSW1wb3J0IHwgdW5kZWZpbmVkPihhY3Rpb25QYXRoKS50YXJnZXQsXG5cdFx0Y29udmVydGVkQWN0aW9uID0gY29udmVydGVkQWN0aW9uSW1wb3J0Py5hY3Rpb247XG5cdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBhY3Rpb24gaW1wb3J0XCIpO1xuXHR9XG5cdGNvbnN0IHVuYm91bmRBY3Rpb25JbmRleCA9IGNvbnZlcnRlZFR5cGVzLmFjdGlvbnNcblx0XHRcdC5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLm5hbWUgPT09IGNvbnZlcnRlZEFjdGlvbi5uYW1lKVxuXHRcdFx0LmZpbmRJbmRleCgoYWN0aW9uKSA9PiAhYWN0aW9uLmlzQm91bmQpLFxuXHRcdGFjdGlvbk5hbWVGcm9tTW9kZWwgPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uTmFtZSxcblx0XHRhY3Rpb25JbXBvcnQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke2FjdGlvbk5hbWVGcm9tTW9kZWx9LyR7dW5ib3VuZEFjdGlvbkluZGV4fWApO1xuXHRwYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwobWV0YU1vZGVsLCBgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZGApO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uLCBtb2RlbCwgYWN0aW9uSW1wb3J0LCBhcHBDb21wb25lbnQsIHBhcmFtZXRlcnMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFvRnVuY3Rpb24/LmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0Y29uc3QgZnVuY3Rpb25Ub0NhbGw6IE9EYXRhQ29udGV4dEJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7Y29udGV4dD8uZ2V0UGF0aCgpID8/IFwiXCJ9LyR7c0Z1bmN0aW9uTmFtZX0oLi4uKWApO1xuXHRjb25zdCBncm91cElkID0gY29udGV4dCA/IFwiZnVuY3Rpb25Hcm91cFwiIDogXCJmdW5jdGlvbkltcG9ydFwiO1xuXHRjb25zdCBleGVjdXRpb25Qcm9taXNlID0gZnVuY3Rpb25Ub0NhbGwuZXhlY3V0ZShncm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRhd2FpdCBleGVjdXRpb25Qcm9taXNlO1xuXHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGFyYW1ldGVyVHlwZUFuZFJldHVybkNvbnZlcnRlZFZhbHVlKFxuXHRwYXJhbWV0ZXI6IEFjdGlvblBhcmFtZXRlcixcblx0dmFsdWU/OiBCYXNlVHlwZVBhcmFtZXRlciB8IG51bGxcbik6IFByb21pc2U8QmFzZVR5cGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQgfCBudWxsPiB7XG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGNvbnN0IEJhc2VUeXBlID0gKGF3YWl0IGltcG9ydChcInNhcC91aS9tZGMvZW51bXMvQmFzZVR5cGVcIikpLmRlZmF1bHQ7XG5cdGNvbnN0IFR5cGVNYXAgPSAoYXdhaXQgaW1wb3J0KFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCIpKS5kZWZhdWx0O1xuXHRjb25zdCBwYXJhbWV0ZXJUeXBlID0gKFxuXHRcdHBhcmFtZXRlciBhcyB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0KS50eXBlXG5cdFx0PyBUeXBlTWFwLmdldEJhc2VUeXBlKFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0cGFyYW1ldGVyIGFzIHtcblx0XHRcdFx0XHRcdG5hbWU6IHN0cmluZztcblx0XHRcdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkudHlwZVxuXHRcdCAgKVxuXHRcdDogQmFzZVR5cGUuU3RyaW5nO1xuXHRjb25zdCB0eXBlSW5zdGFuY2UgPSBUeXBlTWFwLmdldERhdGFUeXBlSW5zdGFuY2UocGFyYW1ldGVyVHlwZSk7XG5cdHJldHVybiB0eXBlSW5zdGFuY2UucGFyc2VWYWx1ZSh2YWx1ZSwgXCJzdHJpbmdcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BY3Rpb246IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRsZXQgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IG5ldyBTZXQ8c3RyaW5nPigpXG5cdH07XG5cdGNvbnN0IHNBY3Rpb25OYW1lID0gY29udmVydGVkQWN0aW9uLmlzQm91bmRcblx0XHQ/IGNvbnZlcnRlZEFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZSgvXFwoLipcXCkkL2csIFwiXCIpIC8vIHJlbW92ZSB0aGUgcGFydCByZWxhdGVkIHRvIHRoZSBvdmVybGF5XG5cdFx0OiBjb252ZXJ0ZWRBY3Rpb24ubmFtZTtcblx0bVBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdHJldHVybiBuZXcgUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+KGFzeW5jIGZ1bmN0aW9uIChcblx0XHRyZXNvbHZlOiAodmFsdWU6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4gdm9pZCxcblx0XHRyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXHQpIHtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNraXBQYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IGlNZXNzYWdlU2lkZUVmZmVjdDtcblx0XHRsZXQgaXNTYW1lRW50aXR5O1xuXHRcdGxldCBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGFjdGlvbkRlZmluaXRpb24gPSBvQWN0aW9uLmdldE9iamVjdCgpIGFzIE1ldGFNb2RlbEFjdGlvbjtcblxuXHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJzID0gY29udmVydGVkQWN0aW9uLmlzQm91bmQgPyBjb252ZXJ0ZWRBY3Rpb24ucGFyYW1ldGVycy5zbGljZSgxKSA6IGNvbnZlcnRlZEFjdGlvbi5wYXJhbWV0ZXJzO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgcGFyYW1ldGVycyBhbmQgd291bGQgbmVlZCBhIHBhcmFtZXRlciBkaWFsb2dcblx0XHQvLyBUaGUgcGFyYW1ldGVyIFJlc3VsdElzQWN0aXZlRW50aXR5IGlzIGFsd2F5cyBoaWRkZW4gaW4gdGhlIGRpYWxvZyEgSGVuY2UgaWZcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHBhcmFtZXRlciwgdGhpcyBpcyB0cmVhdGVkIGFzIG5vIHBhcmFtZXRlciBoZXJlIGJlY2F1c2UgdGhlXG5cdFx0Ly8gZGlhbG9nIHdvdWxkIGJlIGVtcHR5IVxuXHRcdC8vIEZJWE1FOiBTaG91bGQgb25seSBpZ25vcmUgdGhpcyBpZiB0aGlzIGlzIGEgJ2NyZWF0ZScgYWN0aW9uLCBvdGhlcndpc2UgaXQgaXMganVzdCBzb21lIG5vcm1hbCBwYXJhbWV0ZXIgdGhhdCBoYXBwZW5zIHRvIGhhdmUgdGhpcyBuYW1lXG5cdFx0Y29uc3QgYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiAhKGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAxICYmIGFjdGlvblBhcmFtZXRlcnNbMF0ubmFtZSA9PT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiKTtcblxuXHRcdC8vIFByb3ZpZGVkIHZhbHVlcyBmb3IgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzIGZyb20gaW52b2tlQWN0aW9uIGNhbGxcblx0XHRjb25zdCBhUGFyYW1ldGVyVmFsdWVzID0gbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHN0YXJ0dXAgcGFyYW1ldGVycyBpZiBwcm92aWRlZFxuXHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gb0FwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fTtcblxuXHRcdC8vIElmIGFsbCBwYXJhbWV0ZXJzIGFyZSBoaWRkZW4gIGFuZCBhbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgdmFsdWVzIGFyZSBhdmFpbGFibGUsIHRoZW4gd2Ugc2tpcCB0aGUgZGlhbG9nLlxuXHRcdGJTa2lwUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJzXG5cdFx0XHRcdC5maWx0ZXIoKGFjdGlvblBhcmFtZXRlcikgPT4gYWN0aW9uUGFyYW1ldGVyLm5hbWUgIT09IFwiUmVzdWx0SXNBY3RpdmVFbnRpdHlcIilcblx0XHRcdFx0LmV2ZXJ5KChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5hbm5vdGF0aW9ucy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGJTa2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdC8vIEluIGNhc2UgYW4gYWN0aW9uIHBhcmFtZXRlciBpcyBuZWVkZWQsIGFuZCB3ZSBzaGFsbCBza2lwIHRoZSBkaWFsb2csIGNoZWNrIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBwYXJhbWV0ZXJzXG5cdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyAmJiBiU2tpcFBhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0YlZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycyA9IF92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMoXG5cdFx0XHRcdCEhYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gRGVwZW5kaW5nIG9uIHRoZSBwcmV2aW91c2x5IGRldGVybWluZWQgZGF0YSwgZWl0aGVyIHNldCBhIGRpYWxvZyBvciBsZWF2ZSBpdCBlbXB0eSB3aGljaFxuXHRcdC8vIHdpbGwgbGVhZCB0byBkaXJlY3QgZXhlY3V0aW9uIG9mIHRoZSBhY3Rpb24gd2l0aG91dCBhIGRpYWxvZ1xuXG5cdFx0Y29uc3QgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRcdFx0ZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXM6IHt9LFxuXHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0Zm5PblN1Ym1pdHRlZDogbVBhcmFtZXRlcnMub25TdWJtaXR0ZWQsXG5cdFx0XHRmbk9uUmVzcG9uc2U6IG1QYXJhbWV0ZXJzLm9uUmVzcG9uc2UsXG5cdFx0XHRhY3Rpb25OYW1lOiBzQWN0aW9uTmFtZSxcblx0XHRcdGFDb250ZXh0czogW10sXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdHNlbGVjdGVkSXRlbXM6IG1QYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXMhXG5cdFx0fTtcblx0XHRpZiAoY29udmVydGVkQWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFEYXRhID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdFx0Y29uc3QgZmlsdGVyZWRFbnRpdHlTZXQgPSBjb252ZXJ0ZWRNZXRhRGF0YS5lbnRpdHlTZXRzLmZpbHRlcihcblx0XHRcdFx0KHNpbmdsZUVudGl0eVNldCkgPT4gc2luZ2xlRW50aXR5U2V0LmVudGl0eVR5cGUgPT09IGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGZpbHRlcmVkRW50aXR5U2V0Lmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEVudGl0eVNldFswXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0aXNTYW1lRW50aXR5ID1cblx0XHRcdFx0IWNvbnZlcnRlZEFjdGlvbi5yZXR1cm5Db2xsZWN0aW9uICYmXG5cdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlICYmXG5cdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID09PSBjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuRW50aXR5VHlwZTtcblxuXHRcdFx0aWYgKGlzU2FtZUVudGl0eSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPz89IHt9O1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0PyBgJHttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdH0sSGFzQWN0aXZlRW50aXR5YFxuXHRcdFx0XHRcdDogXCJIYXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0Py5wYXRoRXhwcmVzc2lvbnMpIHtcblx0XHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBhQ29udGV4dHMhWzBdLmdldFBhdGgoKSkhO1xuXG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0Ly8gJyonIGVmZmVjdGl2ZWx5IGluY2x1ZGVzIHRoZSBtZXNzYWdlcyBwYXRoIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0XHRcdGlNZXNzYWdlU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0XHQoZXhwKSA9PiB0eXBlb2YgZXhwID09PSBcInN0cmluZ1wiICYmIChleHAgPT09IHNNZXNzYWdlc1BhdGggfHwgZXhwID09PSBcIipcIilcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEgfHwgaXNTYW1lRW50aXR5KSB7XG5cdFx0XHRcdFx0XHQvLyB0aGUgbWVzc2FnZSBwYXRoIGlzIGFubm90YXRlZCBhcyBzaWRlIGVmZmVjdC4gQXMgdGhlcmUncyBubyBiaW5kaW5nIGZvciBpdCBhbmQgdGhlIG1vZGVsIGRvZXMgY3VycmVudGx5IG5vdCBhbGxvd1xuXHRcdFx0XHRcdFx0Ly8gdG8gYWRkIGl0IGF0IGEgbGF0ZXIgcG9pbnQgb2YgdGltZSB3ZSBoYXZlIHRvIHRha2UgY2FyZSBpdCdzIHBhcnQgb2YgdGhlICRzZWxlY3Qgb2YgdGhlIFBPU1QsIHRoZXJlZm9yZSBtb3ZpbmcgaXQuXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPz89IHt9O1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlPy5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBzTWVzc2FnZXNQYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHQhKG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID8/IFwiXCIpLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhzTWVzc2FnZXNQYXRoKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSByZXF1ZXN0IG1lc3NhZ2VzIGZyb20gdGhlIHJldHVybiBjb250ZXh0IGFzIGl0IG1pZ2h0IG5vdCBleGlzdCBhcyBhIHBhcnQgb2YgdGhlIGJvdW5kIGFjdGlvbidzIHNvdXJjZSBjb250ZXh0J3MgJHNlbGVjdC5cblx0XHRcdFx0XHRcdFx0XHQvLyBFeGFtcGxlOiBDcmVhdGUgb24gYSBMaXN0LiBNZXNzYWdlcyBwYXRoIG1pZ2h0IG5vdCBiZSBwYXJ0IG9mIHRoZSBsaXN0LlxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Rcblx0XHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0aGUgcmV0dXJuIGNvbnRleHQgdG8gYmUgZmV0Y2hlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcHJvcGVydGllcyBvZiB0aGUgYm91bmQgYWN0aW9uJ3Mgc291cmNlIGNvbnRleHQuXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiQkaW5oZXJpdEV4cGFuZFNlbGVjdCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCA9PT0gMCAmJiBpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG5vIHRyaWdnZXIgYWN0aW9uIHRoZXJlZm9yZSBubyBuZWVkIHRvIHJlcXVlc3QgbWVzc2FnZXMgYWdhaW5cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuc3BsaWNlKGlNZXNzYWdlU2lkZUVmZmVjdCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzID0gYUNvbnRleHRzID8/IFtdO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyA9IG1QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmdyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc1N0YXRpYyA9IGNvbnZlcnRlZEFjdGlvbi5pc0JvdW5kICYmICEhY29udmVydGVkQWN0aW9uLnBhcmFtZXRlcnNbMF0/LmlzQ29sbGVjdGlvbjtcblxuXHRcdGxldCBvcGVyYXRpb25SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSA9IFtdO1xuXHRcdGxldCBleGVjdXRpb25XaXREaWFsb2cgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0XHRpZiAoIShiU2tpcFBhcmFtZXRlckRpYWxvZyAmJiBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKSkge1xuXHRcdFx0XHRcdGV4ZWN1dGlvbldpdERpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld1BhcmFtZXRlckRpYWxvZyhcblx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbixcblx0XHRcdFx0XHRcdG9BY3Rpb24gYXMgT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcgfCBudWxsLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YmVmb3JlU2hvd2luZ01lc3NhZ2U6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2tcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRhd2FpdCBwYXJhbWV0ZXJEaWFsb2cuY3JlYXRlRGlhbG9nKCk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgcGFyYW1ldGVyRGlhbG9nLm9wZW5EaWFsb2cobVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdFx0ZXhlY3V0aW9uV2l0RGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgY29uZmlybUNyaXRpY2FsQWN0aW9uKFxuXHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbixcblx0XHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJlamVjdChlKTtcblx0XHR9XG5cdFx0aWYgKGV4ZWN1dGlvbldpdERpYWxvZykge1xuXHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRyZXNvbHZlKG9wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVGFrZSBvdmVyIGFsbCBwcm92aWRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBjYWxsIHRoZSBhY3Rpb24uXG5cdFx0Ly8gVGhpcyBzaGFsbCBvbmx5IGhhcHBlbiBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMsIG90aGVyd2lzZSB0aGUgcGFyYW1ldGVyIGRpYWxvZyBzaGFsbCBiZSBzaG93biB3aGljaCBpcyBlbnN1cmVkIGVhcmxpZXJcblxuXHRcdGlmIChhUGFyYW1ldGVyVmFsdWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXNbbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZV0gPVxuXHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZSk/LnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgYWN0aW9uUGFyYW1ldGVyLCBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZDtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXIgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXTtcblx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPVxuXHRcdFx0XHRcdChvU3RhcnR1cFBhcmFtZXRlcnNbYWN0aW9uUGFyYW1ldGVyLm5hbWVdPy5bMF0gYXMgQmFzZVR5cGVQYXJhbWV0ZXIpIHx8XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVyLmFubm90YXRpb25zPy5VST8uUGFyYW1ldGVyRGVmYXVsdFZhbHVlPy52YWx1ZU9mKCk7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzW2FjdGlvblBhcmFtZXRlci5uYW1lXSA9XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0PyBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiBhd2FpdCBjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZShhY3Rpb25QYXJhbWV0ZXIsIHBhcmFtZXRlclZhbHVlTm90Q29udmVydGVkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IG9PcGVyYXRpb25SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSA9IFtdO1xuXHRcdHRyeSB7XG5cdFx0XHRvT3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgbmV3IE9EYXRhT3BlcmF0aW9uKFxuXHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb24sXG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdHsgaWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZyB9XG5cdFx0XHQpLmV4ZWN1dGUoKTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJlxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdH1cblx0XHRcdGFmdGVyQWN0aW9uUmVzb2x1dGlvbihtUGFyYW1ldGVycywgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIGFjdGlvbkRlZmluaXRpb24pO1xuXHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZWplY3QoZSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuaXM0MTJFeGVjdXRlZCAmJlxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGggJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzIS5sZW5ndGggPiAxXG5cdFx0XHQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdHJpY3RIYW5kbGluZ0ZhaWxzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM7XG5cdFx0XHRcdFx0Y29uc3QgYUZhaWxlZENvbnRleHRzID0gW10gYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ0ZhaWxzLmZvckVhY2goZnVuY3Rpb24gKGZhaWw6IHsgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZzsgZ3JvdXBJZDogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHRcdFx0XHRcdGFGYWlsZWRDb250ZXh0cy5wdXNoKGZhaWwub0FjdGlvbi5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFGYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBvRmFpbGVkT3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgbmV3IE9EYXRhT3BlcmF0aW9uKFxuXHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uLFxuXHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0eyBpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnIH1cblx0XHRcdFx0XHQpLmV4ZWN1dGUoKTtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyA9IFtdO1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcyk7XG5cdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0cmVzb2x2ZShvRmFpbGVkT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG1QYXJhbWV0ZXJzPy5tZXNzYWdlSGFuZGxlclxuXHRcdFx0XHQ/LnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjb250cm9sOiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycz8uY29udHJvbCxcblx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoYU1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdHJldHVybiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzISxcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCxcblx0XHRcdFx0XHRcdFx0b09wZXJhdGlvblJlc3VsdC5sZW5ndGggPiAwICYmIG9PcGVyYXRpb25SZXN1bHQuZXZlcnkoKHJlcykgPT4gcmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWwsXG5cdFx0XHRcdFx0ZW50aXR5U2V0OiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGJvdW5kQWN0aW9uTmFtZTogc0FjdGlvbk5hbWVcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLmNsZWFyU3RyaWN0V2FybmluZ01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KTtcblx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdFx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBuZXcgU2V0KClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgdGl0bGUgZnJvbSBjdXN0b20gaTE4biBmaWxlLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFRoZSB2aWV3IHdoZXJlIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG4gKiBAcGFyYW0gc3VmZml4UmVzb3VyY2VLZXkgVGhlIGtleSBvZiB0aGUgdGl0bGVcbiAqIEByZXR1cm5zIFRpdGxlIGlmIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gZ2V0Q29uZmlybVRpdGxlKG9QYXJlbnRDb250cm9sOiBWaWV3LCBzdWZmaXhSZXNvdXJjZUtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQSB0aXRsZSBvbmx5IGV4aXN0cyBpZiBpdCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24uIE90aGVyd2lzZSBcIkNvbmZpcm1hdGlvblwiXG5cdC8vIGlzIHVzZWQgZnJvbSB0aGUgTWVzc2FnZUJveCBjb250cm9sLlxuXHRjb25zdCBrZXkgPSBcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9USVRMRVwiO1xuXHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdGNvbnN0IHRpdGxlT3ZlcnJpZGVFeGlzdHMgPSByZXNvdXJjZU1vZGVsLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhgJHtrZXl9fCR7c3VmZml4UmVzb3VyY2VLZXl9YCk7XG5cdGlmICh0aXRsZU92ZXJyaWRlRXhpc3RzKSB7XG5cdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChrZXksIHVuZGVmaW5lZCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXHR9XG59XG5hc3luYyBmdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdG9QYXJlbnRDb250cm9sOiBWaWV3LFxuXHRlbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRsZXQgYm91bmRBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWU7XG5cdFx0Ym91bmRBY3Rpb25OYW1lID0gYm91bmRBY3Rpb25OYW1lLmluY2x1ZGVzKFwiLlwiKVxuXHRcdFx0PyBib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpW2JvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIikubGVuZ3RoIC0gMV1cblx0XHRcdDogYm91bmRBY3Rpb25OYW1lO1xuXHRcdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIGVudGl0eVNldE5hbWUgPyBgJHtlbnRpdHlTZXROYW1lfXwke2JvdW5kQWN0aW9uTmFtZX1gIDogXCJcIjtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdFx0Y29uc3Qgc0NvbmZpcm1hdGlvblRleHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX09QRVJBVElPTlNfQUNUSU9OX0NPTkZJUk1fTUVTU0FHRVwiLCB1bmRlZmluZWQsIHN1ZmZpeFJlc291cmNlS2V5KTtcblxuXHRcdE1lc3NhZ2VCb3guY29uZmlybShzQ29uZmlybWF0aW9uVGV4dCwge1xuXHRcdFx0dGl0bGU6IGdldENvbmZpcm1UaXRsZShvUGFyZW50Q29udHJvbCwgc3VmZml4UmVzb3VyY2VLZXkpLFxuXHRcdFx0b25DbG9zZTogYXN5bmMgZnVuY3Rpb24gKHNBY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0FjdGlvbiA9PT0gQWN0aW9uLk9LKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9PcGVyYXRpb24gPSBhd2FpdCBuZXcgT0RhdGFPcGVyYXRpb24oY29udmVydGVkQWN0aW9uLCBtUGFyYW1ldGVycywgbWVzc2FnZUhhbmRsZXIsIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLCB7XG5cdFx0XHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKFxuXHRtUGFyYW1ldGVyczogQ2FsbEFjdGlvblBhcmFtZXRlcnMsXG5cdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YWN0aW9uRGVmaW5pdGlvbjogTWV0YU1vZGVsQWN0aW9uXG4pOiB2b2lkIHtcblx0aWYgKFxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzLmxlbmd0aCAmJlxuXHRcdGFjdGlvbkRlZmluaXRpb24uJElzQm91bmRcblx0KSB7XG5cdFx0bGV0IHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdGNvbnN0IGlzU3RhdGljID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNTdGF0aWM7XG5cdFx0aWYgKCFpc1N0YXRpYykge1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHRpZiAoY29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gY29udHJvbC5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0RGVsZXRlSGVscGVyLnVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LCBzZWxlY3RlZENvbnRleHRzKTtcblx0fVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgb2YgbWVzc2FnZXMgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBtZXNzYWdlcyBhbmQgb3RoZXIgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIGVycm9yVGFyZ2V0c0luQVBEIEluZGljYXRlcyB3aGV0aGVyIGVycm9yIHRhcmdldHMgYXJlIGluIEFQRC5cbiAqIEBwYXJhbSBjb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cy5cbiAqIEBwYXJhbSB1bmJvdW5kTWVzc2FnZXMgQW4gYXJyYXkgb2YgdW5ib3VuZCBtZXNzYWdlcy5cbiAqIEBwYXJhbSBjb250cm9sIEEgY29udHJvbCBvYmplY3QuXG4gKiBAcGFyYW0gaXNBUERPUGVuIEluZGljYXRlcyB3aGV0aGVyIEFQRCBpcyBvcGVuLlxuICogQHBhcmFtIHNob3dNZXNzYWdlRGlhbG9nIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIG1lc3NhZ2UgZGlhbG9nLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzdWx0IGNvbnRhaW5zIGEgYm91bmQgdHJhbnNpdGlvbiwgYW4gYXJyYXkgb2YgbWVzc2FnZXMgdG8gc2hvdywgYW5kIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2hvdyB0aGUgbWVzc2FnZSBpbiBhIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZmlsdGVyQVBEYW5kQ29udGV4dE1lc3NhZ2VzKFxuXHRtZXNzYWdlczogTWVzc2FnZVtdLFxuXHRlcnJvclRhcmdldHNJbkFQRD86IGJvb2xlYW4sXG5cdGNvbnRleHRzPzogQ29udGV4dFtdLFxuXHR1bmJvdW5kTWVzc2FnZXM/OiBNZXNzYWdlW10sXG5cdGNvbnRyb2w/OiBDb250cm9sLFxuXHRpc0FQRE9QZW4/OiBib29sZWFuLFxuXHRzaG93TWVzc2FnZURpYWxvZz86IGJvb2xlYW5cbik6IHsgY29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkOyBtZXNzYWdlc1RvU2hvdzogTWVzc2FnZVtdOyBzaG93TWVzc2FnZUluRGlhbG9nPzogYm9vbGVhbiB9IHtcblx0aWYgKGlzQVBET1BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdC8qIFdoZW4gQVBEIGlzIG9wZW4sIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgb2JqZWN0cGFnZSBjb250ZXh0ICovXG5cdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUNvbnRleHRNZXNzYWdlc2Zyb21Nb2RlbChtZXNzYWdlcywgY29udGV4dHMpO1xuXHR9XG5cblx0Ly8gRmlsdGVyIG91dCBtZXNzYWdlcyB3aGljaCBhcmUgbm90IHJlbGF0ZWQgdG8gdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGluIHRoZSBlZGl0IG1vZGUgYW5kIGRpc3BsYXkgbW9kZVxuXHRsZXQgY29udGFpbnNCb3VuZFRyYW5zaXN0aW9uO1xuXHRpZiAoIShjb250cm9sICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUoY29udHJvbCkpKSB7XG5cdFx0aWYgKGlzQVBET1BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0aWYgKHVuYm91bmRNZXNzYWdlcz8ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcucmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbWV0ZXJEaWFsb2cobWVzc2FnZXMpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAodW5ib3VuZE1lc3NhZ2VzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdH1cblx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtZXRlckRpYWxvZyhtZXNzYWdlcyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtZXNzYWdlc1RvU2hvdzogbWVzc2FnZXMsXG5cdFx0Y29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBjb250YWluc0JvdW5kVHJhbnNpc3Rpb24sXG5cdFx0c2hvd01lc3NhZ2VJbkRpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2dcblx0fTtcbn1cblxuZnVuY3Rpb24gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9EaWFsb2c6IERpYWxvZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycyxcblx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQ6IGJvb2xlYW4sXG5cdGlzQWN0aW9uU3VjY2Vzc2Z1bD86IGJvb2xlYW4sXG5cdGlzNDEyV2FybmluZ0RpYWxvZ0NhbmNlbGxlZD86IGJvb2xlYW5cbik6IFNob3dNZXNzYWdlUGFyYW1ldGVycyB7XG5cdGxldCBzaG93TWVzc2FnZUJveCA9IHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLnNob3dNZXNzYWdlQm94LFxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4uc2hvd01lc3NhZ2VEaWFsb2c7XG5cdGNvbnN0IG9Db250cm9sID0gbVBhcmFtZXRlcnMuY29udHJvbDtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0Y29uc3QgdW5ib3VuZE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0gPT09IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBBUERtZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZXNzYWdlLmdldFRhcmdldHMgJiZcblx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMobVBhcmFtZXRlcnMuYWN0aW9uTmFtZSkgJiZcblx0XHRcdG1QYXJhbWV0ZXJzPy5hQWN0aW9uUGFyYW1ldGVycz8uc29tZShmdW5jdGlvbiAoYWN0aW9uUGFyYW0pIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMoYWN0aW9uUGFyYW0ubmFtZSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0pO1xuXHRBUERtZXNzYWdlcz8uZm9yRWFjaChmdW5jdGlvbiAoQVBETWVzc2FnZSkge1xuXHRcdChBUERNZXNzYWdlIGFzIHVua25vd24gYXMgeyBpc0FQRFRhcmdldDogYm9vbGVhbiB9KS5pc0FQRFRhcmdldCA9IHRydWU7XG5cdH0pO1xuXG5cdGNvbnN0IGVycm9yVGFyZ2V0c0luQVBEID0gQVBEbWVzc2FnZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuXHQvL0lmIEFjdGlvbiBpcyBzdWNjZXNzZnVsIHdpdGggd2FybmluZ3MsIGRvbnQgc2hvdyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGZvciBjaGFuZ2VzZXQgaW4gZGlhbG9nXG5cdGlmIChzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCAmJiAhZXJyb3JUYXJnZXRzSW5BUEQgJiYgIWlzQWN0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlc0luTW9kZWwgPSBtZXNzYWdlTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGFCb3VuZE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUpO1xuXHRcdGxldCBnZW5lcmljTWVzc2FnZTtcblx0XHRjb25zdCBpc0VkaXRhYmxlID0gKG9Db250cm9sICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob0NvbnRyb2wpKSA/PyBmYWxzZTtcblxuXHRcdGNvbnN0IG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nID0gbWVzc2FnZXMuZmluZEluZGV4KGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgbm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCA9IG1lc3NhZ2VzSW5Nb2RlbC5maW5kSW5kZXgoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0XHR9KTtcblxuXHRcdGlmIChcblx0XHRcdG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nICE9PSAxICYmXG5cdFx0XHRub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsICE9PSAtMSAmJlxuXHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoID4gMVxuXHRcdCkge1xuXHRcdFx0aWYgKG1lc3NhZ2VzSW5Nb2RlbC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBnZXRHZW5lcmljTXNnRm9yU2luZ2xlRXJyb3JJbkNoYW5nZVNldChpc0VkaXRhYmxlLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfRVJST1JfTUVTU0FHRVNfVEVYVFwiKTtcblx0XHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uVGV4dCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9FUlJPUl9NRVNTQUdFU19ERVRBSUxfVEVYVFwiKTtcblx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogc01lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNEZXNjcmlwdGlvblRleHQsXG5cdFx0XHRcdFx0Y29kZTogXCJGRV9DVVNUT01fTUVTU0FHRV9DSEFOR0VTRVRfQUxMX0ZBSUxFRFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bGV0IGJJc0FQRE9wZW4gPSBvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCk7XG5cdC8vIE5PVEU6IHdlIGRvbid0IHVzZSBpc09wZW4gYWdhaW4gYWZ0ZXIgd2UgY2xvc2UgdGhlIGRpYWxvZyBhcyBpc09wZW4oc3luYyBBUEkpIGRvZXNuJ3QgcmV0dXJuIGZhbHNlIHVudGlsIHRoZSBkaWFsb2cgYW5pbWF0aW9ucyBhbmQgZGlhbG9nIGV2ZW50cyBlbmQuXG5cdGlmIChvRGlhbG9nICYmIGJJc0FQRE9wZW4gJiYgYUNvbnRleHRzLmxlbmd0aCAhPT0gMCAmJiAhbVBhcmFtZXRlcnMuaXNTdGF0aWMpIHtcblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHQvL2lzb2xhdGVkXG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEgfHwgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdC8vIGRvZXMgbm90IG1hdHRlciBpZiBlcnJvciBpcyBpbiBBUEQgb3Igbm90LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29udGV4dHMgc2VsZWN0ZWQgb3IgaWYgdGhlIGVycm9yIGlzIG5vdCB0aGUgQVBELCB3ZSBjbG9zZSBpdC5cblx0XHRcdFx0Ly8gVE9ETzogRGlsYW9nIGhhbmRsaW5nIHNob3VsZCBub3QgYmUgcGFydCBvZiBtZXNzYWdlIGhhbmRsaW5nLiBSZWZhY3RvciBhY2NvcmRpbmdseSAtIGRpYWxvZyBzaG91bGQgbm90IGJlIG5lZWRlZCBpbnNpZGUgdGhpcyBtZXRob2QgLSBuZWl0aGVyXG5cdFx0XHRcdC8vIHRvIGFzayB3aGV0aGVyIGl0J3Mgb3Blbiwgbm9yIHRvIGNsb3NlL2Rlc3Ryb3kgaXQhXG5cdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0YklzQVBET3BlbiA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIWVycm9yVGFyZ2V0c0luQVBEICYmICFpczQxMldhcm5pbmdEaWFsb2dDYW5jZWxsZWQpIHtcblx0XHRcdC8vY2hhbmdlc2V0XG5cdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRiSXNBUERPcGVuID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGZpbHRlcmVkTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuXG5cdGNvbnN0IHsgbWVzc2FnZXNUb1Nob3csIGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiwgc2hvd01lc3NhZ2VJbkRpYWxvZyB9ID0gZmlsdGVyQVBEYW5kQ29udGV4dE1lc3NhZ2VzKFxuXHRcdG1lc3NhZ2VzLFxuXHRcdGVycm9yVGFyZ2V0c0luQVBELFxuXHRcdGFDb250ZXh0cyxcblx0XHR1bmJvdW5kTWVzc2FnZXMsXG5cdFx0b0NvbnRyb2wsXG5cdFx0YklzQVBET3BlblxuXHQpO1xuXHRtZXNzYWdlcyA9IG1lc3NhZ2VzVG9TaG93O1xuXHRzaG93TWVzc2FnZURpYWxvZyA9IHNob3dNZXNzYWdlSW5EaWFsb2cgPz8gc2hvd01lc3NhZ2VEaWFsb2c7XG5cblx0aWYgKCFiSXNBUERPcGVuICYmIGVycm9yVGFyZ2V0c0luQVBEICYmICFtUGFyYW1ldGVycy5iR3JvdXBlZCkge1xuXHRcdC8vIElmIEFQRCBpcyBub3Qgb3BlbiBhbmQgdGhlcmUgYXJlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gQVBELCB0aGVuIHNob3cgaW4gdGhlIG1lc3NhZ2UgZGlhbG9nLiBzaW5jZVxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VzLmNvbmNhdChBUERtZXNzYWdlcyk7XG5cdH1cblxuXHRsZXQgZm5HZXRNZXNzYWdlU3VidGl0bGU7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdGZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCBvQ29udHJvbCwgYUNvbnRleHRzKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNob3dNZXNzYWdlQm94OiBzaG93TWVzc2FnZUJveCxcblx0XHRzaG93TWVzc2FnZURpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2csXG5cdFx0ZmlsdGVyZWRNZXNzYWdlczogZmlsdGVyZWRNZXNzYWdlcy5sZW5ndGggPyBmaWx0ZXJlZE1lc3NhZ2VzIDogbWVzc2FnZXMsXG5cdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGU6IGZuR2V0TWVzc2FnZVN1YnRpdGxlLFxuXHRcdHNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZzogbVBhcmFtZXRlcnMuYkdyb3VwZWQsXG5cdFx0Y29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBjb250YWluc0JvdW5kVHJhbnNpc3Rpb25cblx0fTtcbn1cblxuZnVuY3Rpb24gX3ZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycyhcblx0aXNDcmVhdGVBY3Rpb246IGJvb2xlYW4sXG5cdGFjdGlvblBhcmFtZXRlcnM6IEVkbUFjdGlvblBhcmFtZXRlcltdLFxuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRzdGFydHVwUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBib29sZWFuIHtcblx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucyA9IGFjdGlvblBhcmFtZXRlcnMuZXZlcnkoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKTtcblxuXHRpZiAocGFyYW1ldGVyVmFsdWVzPy5sZW5ndGggJiYgIWhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHQvLyBJZiBzaG93RGlhbG9nIGlzIGZhbHNlIGJ1dCB0aGVyZSBhcmUgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnZva2VBY3Rpb24gY2FsbCB3aGljaCBuZWVkIHRvIGJlIGNoZWNrZWQgb24gZXhpc3RhbmNlXG5cdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXIgb2YgYWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXIubmFtZSAhPT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiICYmXG5cdFx0XHRcdCFwYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gYWN0aW9uUGFyYW1ldGVyLm5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGlzQ3JlYXRlQWN0aW9uICYmIHN0YXJ0dXBQYXJhbWV0ZXJzPy5sZW5ndGggJiYgIWhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHQvLyBJZiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZCBkdXJpbmcgYXBwbGljYXRpb24gbGF1bmNoLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzZXQgaXMgY29tcGxldGVcblx0XHQvLyBJZiBub3QsIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIHN0aWxsIG5lZWRzIHRvIGJlIHNob3duLlxuXHRcdGZvciAoY29uc3QgYWN0aW9uUGFyYW1ldGVyIG9mIGFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdGlmIChzdGFydHVwUGFyYW1ldGVycyAmJiAhc3RhcnR1cFBhcmFtZXRlcnNbYWN0aW9uUGFyYW1ldGVyLm5hbWVdKSB7XG5cdFx0XHRcdC8vIEF0IGxlYXN0IGZvciBvbmUgcGFyYW1ldGVyIG5vIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkLCBzbyB3ZSBjYW4ndCBza2lwIHRoZSBkaWFsb2dcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChhY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCAmJiBoaWRkZW5Bbm5vdGF0aW9uU2V0T25BbGxBY3Rpb25zKSB7XG5cdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlcnMuZXZlcnkoZnVuY3Rpb24gKHBhcmFtZXRlcikge1xuXHRcdFx0Y29uc3QgZmllbGRDb250cm9sID0gcGFyYW1ldGVyLmFubm90YXRpb25zPy5Db21tb24/LkZpZWxkQ29udHJvbDtcblx0XHRcdGNvbnN0IGlzTWFuZGF0b3J5ID0gZmllbGRDb250cm9sPy50b1N0cmluZygpID09PSBcIkNvbW1vbi5GaWVsZENvbnRyb2xUeXBlL01hbmRhdG9yeVwiO1xuXG5cdFx0XHQvLyBQb3NzaWJsZSBzb3VyY2VzIG1heSBiZSBzdGFydHVwUGFyYW1ldGVycywgcGFyYW1ldGVyVmFsdWVzLCBkZWZhdWx0VmFsdWVzIHBlciBhbm5vdGF0aW9uIChQYXJhbWV0ZXJEZWZhdWx0VmFsdWUpXG5cdFx0XHQvLyBJZiBub25lIGlzIGZvdW5kLCByZXR1cm4gZmFsc2Vcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdCFpc01hbmRhdG9yeSB8fFxuXHRcdFx0XHQoc3RhcnR1cFBhcmFtZXRlcnMgJiYgc3RhcnR1cFBhcmFtZXRlcnNbcGFyYW1ldGVyLm5hbWVdKSB8fFxuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKHBhcmFtZXRlclZhbHVlKSA9PiBwYXJhbWV0ZXJWYWx1ZS5uYW1lID09PSBwYXJhbWV0ZXIubmFtZSkgfHxcblx0XHRcdFx0cGFyYW1ldGVyPy5hbm5vdGF0aW9ucz8uVUk/LlBhcmFtZXRlckRlZmF1bHRWYWx1ZT8udmFsdWVPZigpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyaWNNc2dGb3JTaW5nbGVFcnJvckluQ2hhbmdlU2V0KGlzRWRpdGFibGU6IGJvb2xlYW4sIHJlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSk6IE1lc3NhZ2VXaXRoSGVhZGVyIHtcblx0Y29uc3QgbWVzc2FnZSA9IGlzRWRpdGFibGVcblx0XHQ/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRfRURJVFwiKVxuXHRcdDogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfU0lOR0xFX0VSUk9SX01FU1NBR0VfVEVYVFwiKTtcblx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRtZXNzYWdlLFxuXHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdHRhcmdldDogXCJcIixcblx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIixcblx0XHR0ZWNobmljYWxEZXRhaWxzOiB7XG5cdFx0XHRmZToge1xuXHRcdFx0XHRjaGFuZ2VTZXRQcmVUZXh0Rm9yU2luZ2xlRXJyb3I6IG1lc3NhZ2Vcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHR2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnM6IF92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMsXG5cdGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2s6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2ssXG5cdGFmdGVyQWN0aW9uUmVzb2x1dGlvbjogYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uLFxuXHRjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZTogY2hlY2tQYXJhbWV0ZXJUeXBlQW5kUmV0dXJuQ29udmVydGVkVmFsdWUsXG5cdGdldENvbmZpcm1UaXRsZTogZ2V0Q29uZmlybVRpdGxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQ0EsTUFBTUEsU0FBUyxHQUFHQyxTQUFTLENBQUNELFNBQVM7SUFDcENFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQUFrQjtFQUNsRCxNQUFNQyxNQUFNLEdBQUdDLFVBQVUsQ0FBQ0QsTUFBTTtFQWdFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlRSxlQUFlQSxDQUM3QkMsV0FBbUIsRUFDbkJDLFFBQTBCLEVBQzFCQyxNQUFr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
|
|
81
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsQWN0aW9uSW1wb3J0IiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYXBwQ29tcG9uZW50IiwicGFyYW1ldGVycyIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImFjdGlvblBhdGgiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiY29udmVydGVkQWN0aW9uIiwiYWN0aW9uIiwiRXJyb3IiLCJPcGVyYXRpb24iLCJleGVjdXRlIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJzRnVuY3Rpb25OYW1lIiwiY29udGV4dCIsIm9Nb2RlbCIsIlByb21pc2UiLCJyZWplY3QiLCJvTWV0YU1vZGVsIiwic0Z1bmN0aW9uUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfZXhlY3V0ZUZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiYmluZENvbnRleHQiLCJvRnVuY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJvRnVuY3Rpb24iLCJmdW5jdGlvblRvQ2FsbCIsImdyb3VwSWQiLCJleGVjdXRpb25Qcm9taXNlIiwiaW52b2tlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJvcGVyYXRpb25zIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJmYWNhZGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25JbXBvcnQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uLy4uLy4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uLy4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgT3BlcmF0aW9uLCB7IHR5cGUgT3BlcmF0aW9uUGFyYW1ldGVyc1R5cGUgfSBmcm9tIFwiLi9PcGVyYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgQ2FsbEFjdGlvblBhcmFtZXRlcnMgPSB7XG5cdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W107XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0b0RhdGFFdmVudHM/OiB7XG5cdFx0b25PRGF0YVJlc3BvbnNlPzogRnVuY3Rpb247XG5cdFx0b25PRGF0YVN1Ym1pdD86IEZ1bmN0aW9uO1xuXHRcdG9uUmVxdWVzdFNpZGVFZmZlY3RzPzogRnVuY3Rpb247XG5cdH07XG5cdG9wZXJhdGlvbkV2ZW50cz86IHtcblx0XHRvblJlc3BvbnNlPzogRnVuY3Rpb247XG5cdH07XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0dmlldzogRkVWaWV3O1xufSAmIHtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIGltcG9ydCB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBtb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzXSBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuaWdub3JlRVRhZ10gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoXG5cdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0bW9kZWw6IE9EYXRhTW9kZWwsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRwYXJhbWV0ZXJzOiBPcGVyYXRpb25QYXJhbWV0ZXJzVHlwZVxuKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IGFjdGlvblBhdGggPSBgLyR7YWN0aW9uTmFtZX1gO1xuXHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRjb25zdCBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQgPSBjb252ZXJ0ZWRUeXBlcy5yZXNvbHZlUGF0aDxBY3Rpb25JbXBvcnQgfCB1bmRlZmluZWQ+KGFjdGlvblBhdGgpLnRhcmdldCxcblx0XHRjb252ZXJ0ZWRBY3Rpb24gPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQ/LmFjdGlvbjtcblx0aWYgKCFjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvbiBpbXBvcnRcIik7XG5cdH1cblx0cmV0dXJuIG5ldyBPcGVyYXRpb24oYXBwQ29tcG9uZW50LCBtb2RlbCwgY29udmVydGVkQWN0aW9uSW1wb3J0LmFjdGlvbiwgcGFyYW1ldGVycykuZXhlY3V0ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24gYXMgT0RhdGFWNENvbnRleHQsIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCBhcyBPRGF0YVY0Q29udGV4dCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBPRGF0YVY0Q29udGV4dCB8IG51bGwsXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRpZiAoIW9GdW5jdGlvbj8uZ2V0T2JqZWN0KCkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGdW5jdGlvbiAke3NGdW5jdGlvbk5hbWV9IG5vdCBmb3VuZGApKTtcblx0fVxuXHRjb25zdCBmdW5jdGlvblRvQ2FsbDogT0RhdGFDb250ZXh0QmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtjb250ZXh0Py5nZXRQYXRoKCkgPz8gXCJcIn0vJHtzRnVuY3Rpb25OYW1lfSguLi4pYCk7XG5cdGNvbnN0IGdyb3VwSWQgPSBjb250ZXh0ID8gXCJmdW5jdGlvbkdyb3VwXCIgOiBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdGNvbnN0IGV4ZWN1dGlvblByb21pc2UgPSBmdW5jdGlvblRvQ2FsbC5pbnZva2UoZ3JvdXBJZCk7XG5cdG9Nb2RlbC5zdWJtaXRCYXRjaChncm91cElkKTtcblx0YXdhaXQgZXhlY3V0aW9uUHJvbWlzZTtcblx0cmV0dXJuIGZ1bmN0aW9uVG9DYWxsLmdldEJvdW5kQ29udGV4dCgpO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxBY3Rpb25JbXBvcnQ6IGNhbGxBY3Rpb25JbXBvcnQsXG5cdGNhbGxCb3VuZEZ1bmN0aW9uOiBjYWxsQm91bmRGdW5jdGlvbixcblx0Y2FsbEZ1bmN0aW9uSW1wb3J0OiBjYWxsRnVuY3Rpb25JbXBvcnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wZXJhdGlvbnM7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
|