@sapui5/sap.fe.core 1.124.2 → 1.126.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 +5 -1
- package/src/sap/fe/core/ActionRuntime.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +4 -4
- package/src/sap/fe/core/AppComponent.js +2 -2
- package/src/sap/fe/core/AppComponent.ts +1 -1
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/AppStateHandler.ts +1 -1
- package/src/sap/fe/core/BaseController.js +2 -2
- package/src/sap/fe/core/BaseController.ts +1 -1
- package/src/sap/fe/core/CommonUtils.js +3 -3
- package/src/sap/fe/core/CommonUtils.ts +12 -15
- package/src/sap/fe/core/ExtensionAPI.js +2 -2
- package/src/sap/fe/core/ExtensionAPI.ts +4 -3
- package/src/sap/fe/core/PageController.js +2 -2
- package/src/sap/fe/core/PageController.ts +1 -1
- package/src/sap/fe/core/ResourceModel.js +2 -2
- package/src/sap/fe/core/ResourceModel.ts +1 -1
- package/src/sap/fe/core/ReuseComponent.js +172 -0
- package/src/sap/fe/core/ReuseComponent.ts +165 -0
- package/src/sap/fe/core/TemplateComponent.js +2 -2
- package/src/sap/fe/core/TemplateComponent.ts +5 -1
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +92 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +90 -10
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +30 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +28 -4
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +10 -16
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +19 -16
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +3 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +5 -5
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +2 -2
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +1 -1
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +17 -5
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +14 -6
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +2 -2
- package/src/sap/fe/core/controllerextensions/ContextSharing.ts +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +57 -43
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +61 -46
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +8 -16
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +10 -7
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +5 -5
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +22 -18
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +28 -23
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +4 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +21 -15
- package/src/sap/fe/core/controllerextensions/PageReady.ts +29 -20
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +12 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +15 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +26 -8
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +29 -3
- package/src/sap/fe/core/controllerextensions/Routing.js +5 -7
- package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
- package/src/sap/fe/core/controllerextensions/Share.js +4 -4
- package/src/sap/fe/core/controllerextensions/Share.ts +10 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +20 -5
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -2
- package/src/sap/fe/core/controllerextensions/Telemetry.js +2 -2
- package/src/sap/fe/core/controllerextensions/Telemetry.ts +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js +79 -81
- package/src/sap/fe/core/controllerextensions/ViewState.ts +117 -105
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +3 -3
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +2 -2
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +17 -8
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +8 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +10 -9
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +15 -10
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +130 -158
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +240 -275
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +46 -28
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +60 -32
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +2 -2
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +2 -2
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +27 -3
- package/src/sap/fe/core/controls/CommandExecution.js +2 -2
- package/src/sap/fe/core/controls/CommandExecution.ts +2 -2
- package/src/sap/fe/core/controls/ComponentLoader.js +3 -3
- package/src/sap/fe/core/controls/ComponentLoader.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +2 -2
- package/src/sap/fe/core/controls/EventDelegateHook.js +2 -2
- package/src/sap/fe/core/controls/EventDelegateHook.ts +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +51 -6
- package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +3 -3
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +3 -3
- package/src/sap/fe/core/converters/ConverterContext.js +4 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +5 -2
- package/src/sap/fe/core/converters/ManifestSettings.js +8 -2
- package/src/sap/fe/core/converters/ManifestSettings.ts +25 -3
- package/src/sap/fe/core/converters/ManifestWrapper.js +12 -3
- package/src/sap/fe/core/converters/ManifestWrapper.ts +11 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +7 -6
- package/src/sap/fe/core/converters/MetaModelConverter.ts +6 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +56 -16
- package/src/sap/fe/core/converters/annotations/DataField.ts +74 -25
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +19 -18
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.js +40 -7
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +56 -20
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +8 -11
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +23 -27
- package/src/sap/fe/core/converters/controls/Common/Form.js +10 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +6 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +137 -48
- package/src/sap/fe/core/converters/controls/Common/Table.ts +174 -52
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +73 -21
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +91 -20
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +4 -4
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -16
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +18 -17
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +2 -2
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +9 -9
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +12 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +9 -73
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +4 -74
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +5 -10
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +3 -12
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +4 -7
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FiscalFormat.js +5 -3
- package/src/sap/fe/core/formatters/FiscalFormat.ts +4 -2
- package/src/sap/fe/core/formatters/StandardFormatter.js +2 -2
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/fpm/Component.js +3 -3
- package/src/sap/fe/core/fpm/Component.ts +3 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +2 -2
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +1 -1
- package/src/sap/fe/core/helpers/BindingHelper.js +2 -2
- package/src/sap/fe/core/helpers/BindingHelper.ts +2 -2
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +2 -2
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +2 -2
- package/src/sap/fe/core/helpers/DeleteHelper.js +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.js +5 -5
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +2 -2
- package/src/sap/fe/core/helpers/MetaPath.js +9 -3
- package/src/sap/fe/core/helpers/MetaPath.ts +8 -2
- package/src/sap/fe/core/helpers/ModelHelper.js +149 -3
- package/src/sap/fe/core/helpers/ModelHelper.ts +202 -6
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +3 -3
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +2 -2
- package/src/sap/fe/core/helpers/TitleHelper.js +4 -4
- package/src/sap/fe/core/helpers/TitleHelper.ts +4 -4
- package/src/sap/fe/core/library.js +4 -4
- package/src/sap/fe/core/library.ts +2 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +11 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +10 -2
- package/src/sap/fe/core/messagebundle.properties +8 -57
- package/src/sap/fe/core/messagebundle_ar.properties +2 -0
- package/src/sap/fe/core/messagebundle_bg.properties +2 -0
- package/src/sap/fe/core/messagebundle_ca.properties +2 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
- package/src/sap/fe/core/messagebundle_cs.properties +2 -0
- package/src/sap/fe/core/messagebundle_cy.properties +4 -2
- package/src/sap/fe/core/messagebundle_da.properties +2 -0
- package/src/sap/fe/core/messagebundle_de.properties +2 -0
- package/src/sap/fe/core/messagebundle_el.properties +2 -0
- package/src/sap/fe/core/messagebundle_en.properties +6 -57
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -36
- package/src/sap/fe/core/messagebundle_es.properties +2 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
- package/src/sap/fe/core/messagebundle_et.properties +2 -0
- package/src/sap/fe/core/messagebundle_fi.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +2 -0
- package/src/sap/fe/core/messagebundle_hu.properties +3 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -0
- package/src/sap/fe/core/messagebundle_it.properties +2 -0
- package/src/sap/fe/core/messagebundle_iw.properties +3 -1
- package/src/sap/fe/core/messagebundle_ja.properties +2 -0
- package/src/sap/fe/core/messagebundle_kk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +2 -0
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_mk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +2 -0
- package/src/sap/fe/core/messagebundle_nl.properties +2 -0
- package/src/sap/fe/core/messagebundle_no.properties +2 -0
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
- package/src/sap/fe/core/messagebundle_ro.properties +2 -0
- package/src/sap/fe/core/messagebundle_ru.properties +2 -0
- package/src/sap/fe/core/messagebundle_sh.properties +64 -62
- package/src/sap/fe/core/messagebundle_sk.properties +2 -0
- package/src/sap/fe/core/messagebundle_sl.properties +2 -0
- package/src/sap/fe/core/messagebundle_sr.properties +2 -0
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +2 -0
- package/src/sap/fe/core/messagebundle_tr.properties +2 -0
- package/src/sap/fe/core/messagebundle_uk.properties +3 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/operationsHelper.js +3 -3
- package/src/sap/fe/core/operationsHelper.ts +2 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +3 -3
- package/src/sap/fe/core/rootView/Fcl.controller.ts +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +114 -92
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +120 -106
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +6 -4
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +12 -2
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -2
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +7 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +16 -9
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +22 -11
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/templating/ActionHelper.js +2 -2
- package/src/sap/fe/core/templating/ActionHelper.ts +2 -2
- package/src/sap/fe/core/templating/CommonFormatters.js +2 -2
- package/src/sap/fe/core/templating/CommonFormatters.ts +3 -3
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.js +4 -4
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +2 -2
- package/src/sap/fe/core/templating/EntityTypeHelper.js +2 -2
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +2 -2
- package/src/sap/fe/core/templating/FieldControlHelper.js +2 -2
- package/src/sap/fe/core/templating/FieldControlHelper.ts +2 -2
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +2 -2
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters.js +7 -7
- package/src/sap/fe/core/templating/UIFormatters.ts +6 -6
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +1 -1
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +1 -1
- package/src/sap/fe/core/type/InputMask.js +124 -0
- package/src/sap/fe/core/type/InputMask.ts +131 -0
- package/ui5.yaml +19 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +0 -81
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +0 -117
- package/src/sap/fe/core/helpers/AnnotationEnum.js +0 -33
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +0 -21
- package/src/sap/fe/core/helpers/BindingToolkit.js +0 -1813
- package/src/sap/fe/core/helpers/BindingToolkit.ts +0 -2450
- package/src/sap/fe/core/helpers/ClassSupport.js +0 -584
- package/src/sap/fe/core/helpers/ClassSupport.ts +0 -697
- package/src/sap/fe/core/jsx-runtime/Fragment.js +0 -14
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +0 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +0 -93
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +0 -86
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +0 -177
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +0 -197
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +0 -237
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +0 -246
- package/src/sap/fe/core/jsx-runtime/jsx.js +0 -47
- package/src/sap/fe/core/jsx-runtime/jsx.ts +0 -71
- package/src/sap/fe/core/jsx-runtime/jsxs.js +0 -10
- package/src/sap/fe/core/jsx-runtime/jsxs.ts +0 -3
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +0 -172
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +0 -194
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/buildingBlocks/templating/AttributeModel", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "../TraceInfo"], function (Log, deepClone, uid, BindingToolkit, jsx, AttributeModel, ConfigurableObject, TypeGuards, BindingParser, XMLPreprocessor, JSONModel, TraceInfo) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
9
|
var isFunctionArray = TypeGuards.isFunctionArray;
|
|
10
10
|
var isContext = TypeGuards.isContext;
|
|
11
|
+
var Placement = ConfigurableObject.Placement;
|
|
12
|
+
var isUndefinedExpression = BindingToolkit.isUndefinedExpression;
|
|
11
13
|
var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
|
|
12
14
|
var compileExpression = BindingToolkit.compileExpression;
|
|
13
|
-
var Placement = ConfigurableObject.Placement;
|
|
14
15
|
const LOGGER_SCOPE = "sap.fe.core.buildingBlocks.templating.BuildingBlockTemplateProcessor";
|
|
15
16
|
const XMLTEMPLATING_NS = "http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1";
|
|
16
17
|
const DOMParserInstance = new DOMParser();
|
|
@@ -832,6 +833,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
832
833
|
* @param propertyUID ID to retrieve this value
|
|
833
834
|
* @returns Object value
|
|
834
835
|
*/
|
|
836
|
+
_exports.storeObjectValue = storeObjectValue;
|
|
835
837
|
function unstoreObjectValue(propertyUID) {
|
|
836
838
|
const value = temporaryObjectStore[propertyUID];
|
|
837
839
|
delete temporaryObjectStore[propertyUID];
|
|
@@ -955,6 +957,31 @@ sap.ui.define(["sap/base/Log", "sap/base/util/deepClone", "sap/base/util/uid", "
|
|
|
955
957
|
return outStr;
|
|
956
958
|
};
|
|
957
959
|
_exports.xml = xml;
|
|
960
|
+
const addConditionallyToXML = function (condition, partToAdd) {
|
|
961
|
+
if (condition) {
|
|
962
|
+
return partToAdd;
|
|
963
|
+
} else {
|
|
964
|
+
return "";
|
|
965
|
+
}
|
|
966
|
+
};
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Add an attribute depending on the current value of the property.
|
|
970
|
+
* If it's undefined the attribute is not added.
|
|
971
|
+
*
|
|
972
|
+
* @param attributeName
|
|
973
|
+
* @param value
|
|
974
|
+
* @returns The attribute to add if the value is not undefined, otherwise an empty string
|
|
975
|
+
*/
|
|
976
|
+
_exports.addConditionallyToXML = addConditionallyToXML;
|
|
977
|
+
const addAttributeToXML = function (attributeName, value) {
|
|
978
|
+
if (value !== undefined && !isUndefinedExpression(value)) {
|
|
979
|
+
return () => xml`${attributeName}="${value}"`;
|
|
980
|
+
} else {
|
|
981
|
+
return () => "";
|
|
982
|
+
}
|
|
983
|
+
};
|
|
984
|
+
_exports.addAttributeToXML = addAttributeToXML;
|
|
958
985
|
return _exports;
|
|
959
986
|
}, false);
|
|
960
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJ0cmFuc2Zvcm1NZXRhZGF0YSIsImJ1aWxkaW5nQmxvY2tNZXRhZGF0YSIsImFnZ3JlZ2F0aW9ucyIsImRlcGVuZGVudHMiLCJ0eXBlIiwic2xvdCIsImlzUHVibGljIiwiY3VzdG9tRGF0YSIsImxheW91dERhdGEiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyIsIm9TZXR0aW5ncyIsInNBdHRyaWJ1dGVWYWx1ZSIsInNNZXRhUGF0aCIsInNDb250ZXh0UGF0aCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImVuZHNXaXRoIiwibW9kZWwiLCJwYXRoIiwiX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQiLCJzQXR0cmlidXRlTmFtZSIsInJldHVybkNvbnRleHQiLCJtb2RlbHMiLCJjb252ZXJ0ZXJDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJkYXRhIiwidW5zdG9yZU9iamVjdFZhbHVlIiwic2V0UHJvcGVydHkiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJfZ2V0TWV0YWRhdGFDb250ZXh0Iiwib1Zpc2l0b3IiLCJiRG9Ob3RSZXNvbHZlIiwiaXNPcGVuIiwib01ldGFkYXRhQ29udGV4dCIsImdldEF0dHJpYnV0ZSIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiZ2V0Q29udGV4dCIsImUiLCJwcm9jZXNzUHJvcGVydGllcyIsImRlZmluaXRpb25Qcm9wZXJ0aWVzIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInByb3BlcnR5VmFsdWVzIiwic0tleVZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiZGVlcENsb25lIiwiZXJyb3IiLCJ2aXNpdEF0dHJpYnV0ZSIsImF0dHJpYnV0ZXMiLCJnZXROYW1lZEl0ZW0iLCJ2YWx1ZSIsIk51bWJlciIsInByb2Nlc3NDb250ZXh0cyIsImNvbnRleHRQYXRoIiwibU1pc3NpbmdDb250ZXh0Iiwib0RlZmluaXRpb25Db250ZXh0cyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwiY29udGV4dFBhdGhJbmRleCIsImluZGV4T2YiLCJjb250ZXh0UGF0aERlZmluaXRpb24iLCJzcGxpY2UiLCJwcm9wZXJ0eVZhbHVlIiwibGVuZ3RoIiwibmFtZSIsImFkZFNpbmdsZUNvbnRleHQiLCJwYXJzZUFnZ3JlZ2F0aW9uIiwib0FnZ3JlZ2F0aW9uIiwicHJvY2Vzc0FnZ3JlZ2F0aW9ucyIsIm9PdXRPYmplY3RzIiwiY2hpbGRyZW4iLCJjaGlsZElkeCIsImNoaWxkRGVmaW5pdGlvbiIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwiYWdncmVnYXRpb25PYmplY3QiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiYW5jaG9yIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwicHJvY2Vzc09iamVjdCIsImVsZW1lbnQiLCJteUFycmF5IiwibXlPYmplY3QiLCJjaGlsZE5vZGVOYW1lcyIsIm1hcCIsImxvY2FsTmFtZSIsImNoaWxkSXNBcnJheSIsIlNldCIsInNpemUiLCJwdXNoIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwibmFtZXNwYWNlVVJJIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIkFycmF5IiwiZnJvbSIsInZpc2l0Tm9kZSIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5Iiwib05leHRDaGlsZCIsIm5leHRDaGlsZCIsImhhc1ZpcnR1YWxOb2RlIiwiY2hpbGRXcmFwcGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsImNsb25lTm9kZSIsImFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXMiLCJteUNoaWxkIiwicHJvY2Vzc1Nsb3RzIiwib01ldGFkYXRhQWdncmVnYXRpb25zIiwicHJvY2Vzc0N1c3RvbURhdGEiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQiLCJyZXBsYWNlV2l0aCIsInJlcGxhY2UiLCJwcm9jZXNzQnVpbGRpbmdCbG9jayIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsIm1ldGFkYXRhIiwic0ZyYWdtZW50TmFtZSIsImZyYWdtZW50IiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwieG1sVGFnIiwiZ2V0U2V0dGluZ3MiLCJKU09OTW9kZWwiLCJpbml0aWFsS2V5cyIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyIsInByb3BOYW1lIiwib0RhdGEiLCJvcmlnaW5hbERlZmluaXRpb24iLCJ2YWxpZGF0ZSIsImlzQSIsImdldE1vZGVsIiwib0luc3RhbmNlIiwiZ2V0UHJvcGVydGllcyIsInNDb250ZXh0TmFtZSIsInRhcmdldE9iamVjdCIsImlzQ29udGV4dCIsImF0dHJpYnV0ZVZhbHVlIiwic3RvcmVPYmplY3RWYWx1ZSIsIm5ld0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIm9QcmV2aW91c01hY3JvSW5mbyIsImNvcmVSZXF1aXJlIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvbGRLZXlzIiwidGVtcG9yYXJ5T2JqZWN0U3RvcmUiLCJ0ZW1wbGF0ZVN0cmluZyIsImdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUiLCJqc3giLCJyZW5kZXJBc1hNTCIsImdldFRlbXBsYXRlIiwiaXNSdW50aW1lIiwic3RvcmVLZXkiLCJoYXNFcnJvciIsImhhc1BhcnNlRXJyb3IiLCJwYXJzZWRUZW1wbGF0ZSIsInBhcnNlWE1MU3RyaW5nIiwiaXRlciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwicHJvY2Vzc1htbEluVHJhY2UiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJ2aXNpdGVkTm9kZXMiLCJpbnRlcm5hbE5vZGUiLCJQcm9taXNlIiwiYWxsIiwicmVtb3ZlIiwicmVzb2x2ZSIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwicmVxdWlyZU9uTWFjcm8iLCJnZXRBdHRyaWJ1dGVOUyIsInN1YnN0cmluZyIsInNldEF0dHJpYnV0ZU5TIiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwidW5yZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwicHJvY2Vzc05leHRYbWxJblRyYWNlIiwibWV0aG9kIiwicmV0dXJuVmFsdWUiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0IiwicGFyZW50RWxlbWVudCIsInJlbmRlckluVHJhY2VNb2RlIiwib3V0U3RyIiwieG1sUmVzdWx0IiwiaW5uZXJUZXh0IiwiaW5uZXJIVE1MIiwic3BsaXQiLCJzdHJpbmdzIiwiaSIsInZhbHVlcyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL1J1bnRpbWVCdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgaXNDb250ZXh0LCBpc0Z1bmN0aW9uQXJyYXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQganN4IGZyb20gXCJzYXAvZmUvY29yZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYWNyb0luZm8gfSBmcm9tIFwiLi4vVHJhY2VJbmZvXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuY29uc3QgWE1MVEVNUExBVElOR19OUyA9IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIjtcbmNvbnN0IERPTVBhcnNlckluc3RhbmNlID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSAmIHtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGN1cnJlbnRDb250ZXh0UGF0aDogQ29udGV4dDtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRpc1J1bnRpbWVJbnN0YW50aWF0aW9uPzogYm9vbGVhbjtcblx0bW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gJiB7XG5cdFx0Y29udmVydGVyQ29udGV4dDogSlNPTk1vZGVsO1xuXHRcdHZpZXdEYXRhOiBKU09OTW9kZWw7XG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcInNhcC5mZS5pMThuXCI/OiBSZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmICghb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRraW5kKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRUeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJlxuXHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc1xuXHRcdCkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRUeXBlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXN9JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShcblx0c05hbWU6IHN0cmluZyxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b05vZGU6IEVsZW1lbnRcbik6IHZvaWQge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9Ob2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1thdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdH1cblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKCFzS2V5LmluY2x1ZGVzKFwiOlwiKSAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+ID0ge1xuXHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImRlcGVuZGVudHNcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHRjdXN0b21EYXRhOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJjdXN0b21EYXRhXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0bGF5b3V0RGF0YToge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwibGF5b3V0RGF0YVwiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdC4uLmJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNcblx0fTtcblx0Y29uc3QgbWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+ID0ge307XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlO1xuXG5cdFx0aWYgKHByb3BlcnR5VHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXG5cdFx0aWYgKFtTQVBfVUlfTU9ERUxfQ09OVEVYVCwgXCJvYmplY3RcIiwgXCJhcnJheVwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpKSB7XG5cdFx0XHQvLyBFeHBsaWNpdGx5IGRlZmluZWQgY29udGV4dHMsIG9iamVjdHMsIGFuZCBhcnJheXMgbWF5IGNvbWUgZnJvbSB0aGUgbWV0YWRhdGFDb250ZXh0XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzW3Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdIGFzIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0bWV0YWRhdGFDb250ZXh0cyxcblx0XHRhZ2dyZWdhdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGFic29sdXRlIG9yIGNvbnRleHQgcGF0aHMgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgTWV0YUNvbnRleHQuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRwYXRoOiBzTWV0YVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBoZWxwcyB0byBjcmVhdGUgdGhlIG1ldGFkYXRhIGNvbnRleHQgaW4gY2FzZSBpdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pOiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBwcm9wZXJ0aWVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPj4ge1xuXHRjb25zdCBkZWZpbml0aW9uUHJvcGVydGllcyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzO1xuXG5cdC8vIFJldHJpZXZlIHByb3BlcnRpZXMgdmFsdWVzXG5cdGNvbnN0IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9uUHJvcGVydGllcyk7XG5cblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPiA9IHt9O1xuXHRmb3IgKGNvbnN0IHNLZXlWYWx1ZSBvZiBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzKSB7XG5cdFx0aWYgKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9XG5cdFx0XHRcdGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlICYmIGRlZXBDbG9uZShkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSk7IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHR9XG5cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYyA9PT0gZmFsc2UpIHtcblx0XHRcdExvZy5lcnJvcihgUHJvcGVydHkgJHtzS2V5VmFsdWV9IHdhcyBpZ25vcmVkIGFzIGl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIHVzYWdlYCk7XG5cdFx0fSBlbHNlIGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSkge1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGUob05vZGUsIG9Ob2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKHNLZXlWYWx1ZSkgYXMgQXR0cik7XG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBcInRydWVcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiB2YWx1ZTtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlWYWx1ZXM7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgYmluZGluZyBjb250ZXh0cyBkZWZpbmVkIGluc2lkZS5cbiAqXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgYW5kIG1pc3NpbmcgY29udGV4dHNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdC8vIElmIHRoZSBjb250ZXh0IHdhcyByZXNvbHZlZCBhcyBhIHByb3BlcnR5IChiaW5kaW5nIC8geG1sIGFnZ3JlZ2F0aW9uKSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCBoZXJlLlxuXHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuXHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuID8/IGZhbHNlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAobUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGJpbmRpbmcgY291bGRuJ3QgYmUgcmVzb2x2ZWQgY29uc2lkZXIgdGhhdCB0aGVyZSB3YXMgbm8gdmFsdWUgaGVyZVxuXHRcdFx0XHRkZWxldGUgb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1NaXNzaW5nQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQsIHByb2Nlc3NBZ2dyZWdhdGlvbnM/OiBGdW5jdGlvbik6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4ge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdGxldCBhZ2dyZWdhdGlvbk9iamVjdDogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogKGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIikgYXMgUGxhY2VtZW50KSB8fCBQbGFjZW1lbnQuQWZ0ZXIsXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIikgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocHJvY2Vzc0FnZ3JlZ2F0aW9ucykge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uT2JqZWN0ID0gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhjaGlsZERlZmluaXRpb24sIGFnZ3JlZ2F0aW9uT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvT3V0T2JqZWN0c1thZ2dyZWdhdGlvbk9iamVjdC5rZXldID0gYWdncmVnYXRpb25PYmplY3Q7XG5cdFx0XHR9IGVsc2UgaWYgKGNoaWxkRGVmaW5pdGlvbi50YWdOYW1lICE9PSBcInNsb3RcIikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFRoZSBhZ2dyZWdhdGlvbiAke2NoaWxkRGVmaW5pdGlvbi5ub2RlTmFtZX0gaXMgbWlzc2luZyBhIEtleSBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBkaXNwbGF5ZWRgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9PdXRPYmplY3RzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrIHByb3BlcnRpZXMgd2hlbiB0aGUgdHlwZSBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIFhNTCBlbGVtZW50IHRvIHBhcnNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIG9iamVjdFxuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0KGVsZW1lbnQ6IEVsZW1lbnQpOiBvYmplY3Qge1xuXHRjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG5cdGNvbnN0IG15QXJyYXk6IEFycmF5PHVua25vd24+ID0gW107XG5cdGNvbnN0IG15T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG5cdFx0bXlPYmplY3RbYXR0cmlidXRlTmFtZV0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0fVxuXHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkTm9kZU5hbWVzID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcCgoa2V5KSA9PiBjaGlsZHJlbltrZXkgYXMgdW5rbm93biBhcyBudW1iZXJdLmxvY2FsTmFtZSk7XG5cdFx0Y29uc3QgY2hpbGRJc0FycmF5ID0gY2hpbGROb2RlTmFtZXMubGVuZ3RoICE9PSBuZXcgU2V0KGNoaWxkTm9kZU5hbWVzKS5zaXplO1xuXHRcdGZvciAoY29uc3QgY2hpbGREZWZpbml0aW9uIG9mIGNoaWxkcmVuIGFzIHVua25vd24gYXMgQXJyYXk8RWxlbWVudD4pIHtcblx0XHRcdGlmIChjaGlsZElzQXJyYXkpIHtcblx0XHRcdFx0bXlBcnJheS5wdXNoKHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRteU9iamVjdFtjaGlsZERlZmluaXRpb24ubG9jYWxOYW1lXSA9IHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoaWxkSXNBcnJheSkge1xuXHRcdFx0cmV0dXJuIG15QXJyYXk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBteU9iamVjdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIGZvciB3aGljaCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlblxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSB2YWx1ZXMgb2YgYWxyZWFkeSBwYXJzZWQgcHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgY2hpbGRyZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+XG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+PiB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgYXMgRWxlbWVudCB8IG51bGw7XG5cblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkLm5hbWVzcGFjZVVSSSA9PT0gWE1MVEVNUExBVElOR19OUykge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHdlIGVuY291bnRlciBhIHRlbXBsYXRpbmcgdGFnLCBydW4gdGhlIHZpc2l0b3Igb24gaXQgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlc3VsdGluZyBjaGlsZFxuXHRcdFx0XHRjb25zdCBvUGFyZW50ID0gb0ZpcnN0RWxlbWVudENoaWxkLnBhcmVudE5vZGU7XG5cdFx0XHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgaUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XSA/IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdIDogbnVsbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBOb3Qgc3VyZSBob3cgdGhpcyBjb3VsZCBoYXBwZW4gYnV0IEkgYWxzbyBkb24ndCB3YW50IHRvIGNyZWF0ZSBpbmZpbml0ZSBsb29wc1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkICYmICFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uID0gcGFyc2VBZ2dyZWdhdGlvbihvRmlyc3RFbGVtZW50Q2hpbGQsIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5wcm9jZXNzQWdncmVnYXRpb25zKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IG9OZXh0Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEuYWdncmVnYXRpb25zKS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSAmJlxuXHRcdFx0XHQoIWlzUHVibGljIHx8IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uaXNQdWJsaWMgPT09IHRydWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdHdoaWxlIChjaGlsZERlZmluaXRpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5oYXNWaXJ0dWFsTm9kZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNoaWxkV3JhcHBlci5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkV3JhcHBlcjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSFdID0gY2hpbGREZWZpbml0aW9uO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24ucmVtb3ZlQXR0cmlidXRlKFwia2V5XCIpO1xuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmFwcGVuZENoaWxkKG9GaXJzdEVsZW1lbnRDaGlsZC5jbG9uZU5vZGUodHJ1ZSkgYXMgRWxlbWVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzID0gcHJvY2Vzc09iamVjdChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0fSBlbHNlIGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcImFycmF5XCIpIHtcblx0XHRcdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjtcblx0XHRcdFx0XHRcdGNvbnN0IG9PdXRPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+W10gPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0XHRcdG15Q2hpbGRbYXR0cmlidXRlTmFtZV0gPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pixcblx0b01ldGFkYXRhQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPixcblx0b05vZGU6IEVsZW1lbnQsXG5cdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2Vcbik6IHZvaWQge1xuXHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRpZiAob05vZGUgIT09IG51bGwgJiYgb05vZGUgIT09IHVuZGVmaW5lZCAmJiBvQWdncmVnYXRpb25FbGVtZW50KSB7XG5cdFx0XHRcdC8vIHNsb3RzIGNhbiBoYXZlIDo6IGFzIGtleXMgd2hpY2ggaXMgbm90IGEgdmFsaWQgYWdncmVnYXRpb24gbmFtZSB0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZW1cblx0XHRcdFx0Y29uc3Qgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdGlmICghW1wiZGVwZW5kZW50c1wiLCBcImN1c3RvbURhdGFcIiwgXCJsYXlvdXREYXRhXCJdLmluY2x1ZGVzKHNBZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlLCBzQWdncmVnYXRpb25OYW1lLCBvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBOb2RlW10pKTsgLy8gU29tZWhvdyBUUyBkb2Vzbid0IGxpa2UgdGhpcyBidXQgdGhlIGRvY3VtZW50YXRpb24gc2F5cyBpcyBzaG91bGQgd29ya1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvRWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlOiBFbGVtZW50LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcsIG9FbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsKTogRWxlbWVudCB7XG5cdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUucmVwbGFjZSgvOi9naSwgXCJfXCIpKTtcblx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHR9XG5cdHJldHVybiBvTmV3Q2hpbGQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRCdWlsZGluZ0Jsb2NrQ2xhc3M6IHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9NZXRhZGF0YSA9IHRyYW5zZm9ybU1ldGFkYXRhKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YSk7XG5cblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IG9NZXRhZGF0YS5mcmFnbWVudCA/PyBgJHtvTWV0YWRhdGEubmFtZXNwYWNlID8/IG9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2V9LiR7b01ldGFkYXRhLnhtbFRhZyA/PyBvTWV0YWRhdGEubmFtZX1gO1xuXG5cdGNvbnN0IG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4gPSB7fTtcblx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblxuXHQvLyBBZGQgYW4gZW1wdHkgY29udmVydGVyIGNvbnRleHQgaWYgdGhlcmUgaXMgbm9uZSBpbiBvcmRlciB0byBoYXZlIGEgcGxhY2UgdG8gc3RvcmUgb2JqZWN0IHZhbHVlc1xuXHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQgPz89IG5ldyBKU09OTW9kZWwoKTtcblxuXHQvL0luamVjdCBzdG9yYWdlIGZvciBtYWNyb3Ncblx0aWYgKCFvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0pIHtcblx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0fVxuXG5cdC8vIEZpcnN0IG9mIGFsbCB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBhdHRyaWJ1dGVzIHRvIHJlc29sdmUgdGhlIHByb3BlcnRpZXMgYW5kIHRoZSBtZXRhZGF0YSBjb250ZXh0c1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlcyA9IGF3YWl0IHByb2Nlc3NQcm9wZXJ0aWVzKG9NZXRhZGF0YSwgb05vZGUsIGlzUHVibGljLCBvVmlzaXRvcik7XG5cdGNvbnN0IGluaXRpYWxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQgPSBwcm9jZXNzQ29udGV4dHMob01ldGFkYXRhLCBvU2V0dGluZ3MsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IsIG1Db250ZXh0cywgcHJvcGVydHlWYWx1ZXMpO1xuXG5cdHRyeSB7XG5cdFx0Ly8gQWdncmVnYXRpb24gYW5kIGNvbXBsZXggdHlwZSBzdXBwb3J0XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9ucyA9IGF3YWl0IHByb2Nlc3NDaGlsZHJlbihvTm9kZSwgb1Zpc2l0b3IsIG9NZXRhZGF0YSwgaXNQdWJsaWMsIHByb3BlcnR5VmFsdWVzKTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cblx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdGxldCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHQvL2NoZWNrIGZvciBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gdmFsaWRhdGUgLyBvdmVyd3JpdGUgcGFyYW1ldGVyc1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWxEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0NsYXNzPy5tZXRhZGF0YT8ucHJvcGVydGllc1twcm9wTmFtZV07XG5cdFx0XHRpZiAob3JpZ2luYWxEZWZpbml0aW9uPy52YWxpZGF0ZSkge1xuXHRcdFx0XHRvRGF0YSA9IG9yaWdpbmFsRGVmaW5pdGlvbi52YWxpZGF0ZShvRGF0YSkgfHwgb0RhdGE7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0RhdGE/LmlzQT8uKFNBUF9VSV9NT0RFTF9DT05URVhUKSAmJiAhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdGNvbnN0IG9JbnN0YW5jZSA9IG5ldyBCdWlsZGluZ0Jsb2NrQ2xhc3MoeyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzKTtcblx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IG9JbnN0YW5jZS5nZXRQcm9wZXJ0aWVzKCk7XG5cdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRPYmplY3QgPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHRpZiAoaXNDb250ZXh0KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdCBhcyBDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlT2JqZWN0VmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoYXR0cmlidXRlVmFsdWUsIHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChhdHRyaWJ1dGVWYWx1ZSkhO1xuXHRcdFx0XHRcdHVuc3RvcmVPYmplY3RWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBuZXdDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBCdWlsZGluZ0Jsb2NrQ2xhc3MpO1xuXHRcdG1Db250ZXh0c1tcInRoaXNcIl0gPSBvQXR0cmlidXRlc01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBNYWNyb0luZm8gfCB1bmRlZmluZWQ7XG5cdFx0Ly8gY29yZTpyZXF1aXJlIG5lZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgbm9kZSBpdHNlbGYgdG8gYmUgcGlja2VkIHVwIGR1ZSB0byB0aGUgdGVtcGxhdGluZyBzdGVwXG5cdFx0Y29uc3QgY29yZVJlcXVpcmUgPSBvTm9kZT8uZ2V0QXR0cmlidXRlKFwiY29yZTpyZXF1aXJlXCIpIHx8IHVuZGVmaW5lZDtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8/Lm1hY3JvSW5mbykge1xuXHRcdFx0XHRvUHJldmlvdXNNYWNyb0luZm8gPSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1RyYWNlSW5mby5tYWNyb0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0VmlzaXRvciA9IG9WaXNpdG9yLndpdGgobUNvbnRleHRzLCBvTWV0YWRhdGEuaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhb01ldGFkYXRhLmlzT3BlbiA6IHRydWUpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChvTWV0YWRhdGEuZnJhZ21lbnQpIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb2xkS2V5cyA9IE9iamVjdC5rZXlzKHRlbXBvcmFyeU9iamVjdFN0b3JlKTtcblx0XHRcdFx0bGV0IHRlbXBsYXRlU3RyaW5nO1xuXHRcdFx0XHRpZiAoKG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0XHQob0luc3RhbmNlIGFzIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrKS5nZXRSdW50aW1lQnVpbGRpbmdCbG9ja1RlbXBsYXRlKG9Ob2RlKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGVtcGxhdGVTdHJpbmcgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT4gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5pc1J1bnRpbWUpIHtcblx0XHRcdFx0XHQvLyBGb3IgcnVudGltZSBidWlsZGluZyBibG9ja3MsIHdlIG5lZWQgdG8gYXR0YWNoIGFsbCBvYmplY3RzIHRvIHRoZSBjb252ZXJ0ZXJDb250ZXh0IGRpcmVjdGx5LCBhcyB0aGUgYWN0dWFsIHJlbmRlcmluZyB0YWtlcyBwbGFjZSBhdCBydW50aW1lXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzdG9yZUtleSBpbiB0ZW1wb3JhcnlPYmplY3RTdG9yZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvbGRLZXlzLmluY2x1ZGVzKHN0b3JlS2V5KSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHN0b3JlS2V5KTtcblx0XHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHN0b3JlS2V5LCBkYXRhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgaGFzRXJyb3IgPSBcIlwiO1xuXHRcdFx0XHRpZiAodGVtcGxhdGVTdHJpbmcpIHtcblx0XHRcdFx0XHRsZXQgaGFzUGFyc2VFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKHRlbXBsYXRlU3RyaW5nLCB0cnVlKTtcblx0XHRcdFx0XHQvLyBGb3Igc2FmZXR5IHB1cnBvc2Ugd2UgdHJ5IHRvIGRldGVjdCB0cmFpbGluZyB0ZXh0IGluIGJldHdlZW4gWE1MIFRhZ3Ncblx0XHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGFyc2VkVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZXIgPSBkb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdFx0aGFzUGFyc2VFcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR3aGlsZSAodGV4dG5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRleHRub2RlLnRleHRDb250ZW50ICYmIHRleHRub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGFzRXJyb3IgPSB0ZXh0bm9kZS50ZXh0Q29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaGFzUGFyc2VFcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCwgaGFzRXJyb3IpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSAoYXdhaXQgcHJvY2Vzc1htbEluVHJhY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgaW5pdGlhbFRlbXBsYXRlO1xuXHRcdFx0XHRcdFx0XHRpZiAoKG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0KG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZShvTm9kZSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PiBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pKSBhcyBFbGVtZW50W107XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChoYXNFcnJvci5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyB0cmFpbGluZyB0ZXh0IHdlIGNyZWF0ZSBhIHN0YW5kYXJkIGVycm9yIGFuZCBkaXNwbGF5IGl0LlxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvclRleHQgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgdmlzaXRlZE5vZGVzID0gcGFyc2VkVGVtcGxhdGUubWFwKGFzeW5jIChpbnRlcm5hbE5vZGUpID0+IHtcblx0XHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBpbnRlcm5hbE5vZGUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKGludGVybmFsTm9kZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLmFsbCh2aXNpdGVkTm9kZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgdHJ1ZSk7XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29yZVJlcXVpcmUpIHtcblx0XHRcdFx0XHRsZXQgcmVxdWlyZU9uTWFjcm8gPSBvTWFjcm9FbGVtZW50LmdldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJyZXF1aXJlXCIpO1xuXHRcdFx0XHRcdGlmIChyZXF1aXJlT25NYWNybykge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSByZXF1aXJlT25NYWNyby5zdWJzdHJpbmcoMCwgcmVxdWlyZU9uTWFjcm8ubGVuZ3RoIC0gMSkgKyBcIixcIiArIGNvcmVSZXF1aXJlLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxhc3QgfSBhbmQgZmlyc3Qge1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXF1aXJlT25NYWNybyA9IGNvcmVSZXF1aXJlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJjb3JlOnJlcXVpcmVcIiwgcmVxdWlyZU9uTWFjcm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlOiB1bmtub3duKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pOiB2b2lkIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogVW5SZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gc28gdGhhdCBpdCBpcyBubyBsb25nZXIgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKlxuICogQHBhcmFtIEJ1aWxkaW5nQmxvY2tDbGFzcyBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0bnVsbCxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIns9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfVwiIC8+YDtcblx0fVxuXHRsZXQgYWRkaXRpb25hbFRleHQgPSBcIlwiO1xuXHRpZiAoYWRkaXRpb25hbERhdGEpIHtcblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8Y29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyIHhtbG5zOmNvbnRyb2xzPVwic2FwLmZlLmNvcmUuY29udHJvbHNcIj5cblx0XHRcdFx0XHQ8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzdG9yZVxuICogQHJldHVybnMgSUQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVxuICovXG5mdW5jdGlvbiBzdG9yZU9iamVjdFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0Y29uc3QgcHJvcGVydHlVSUQgPSBgL3VpZC0tJHt1aWQoKX1gO1xuXHR0ZW1wb3JhcnlPYmplY3RTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZTtcblx0cmV0dXJuIHByb3BlcnR5VUlEO1xufVxuXG4vKipcbiAqIFVuc3RvcmVzIGFuIG9iamVjdCBmcm9tIGEgdGVtcG9yYXJ5IHN0b3JlIGJ5IHJlbW92aW5nIGl0IGFuZCByZXR1cm5pbmcgaXRzIG9iamVjdCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHlVSUQgSUQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVxuICogQHJldHVybnMgT2JqZWN0IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHVuc3RvcmVPYmplY3RWYWx1ZShwcm9wZXJ0eVVJRDogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IHZhbHVlID0gdGVtcG9yYXJ5T2JqZWN0U3RvcmVbcHJvcGVydHlVSURdO1xuXHRkZWxldGUgdGVtcG9yYXJ5T2JqZWN0U3RvcmVbcHJvcGVydHlVSURdO1xuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmxldCBwcm9jZXNzTmV4dFhtbEluVHJhY2UgPSBmYWxzZTtcbi8qKlxuICogTWFrZXMgc3VyZSB0aGF0IGFsbCB4bWxgIGNhbGxzIGluc2lkZSB0aGUgZ2l2ZW4gbWV0aG9kIGFyZSBwcm9jZXNzZWQgaW4gdHJhY2UgbW9kZS5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gZXhlY3V0ZVxuICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kXG4gKi9cbmNvbnN0IHByb2Nlc3NYbWxJblRyYWNlID0gYXN5bmMgZnVuY3Rpb24gKG1ldGhvZDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuXHRwcm9jZXNzTmV4dFhtbEluVHJhY2UgPSB0cnVlO1xuXHRsZXQgcmV0dXJuVmFsdWU7XG5cdHRyeSB7XG5cdFx0cmV0dXJuVmFsdWUgPSBtZXRob2QoKTtcblx0fSBmaW5hbGx5IHtcblx0XHRwcm9jZXNzTmV4dFhtbEluVHJhY2UgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuXG4vKipcbiAqIFBhcnNlIGFuIFhNTCBzdHJpbmcgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0geG1sU3RyaW5nIFRoZSB4bWwgc3RyaW5nXG4gKiBAcGFyYW0gW2FkZERlZmF1bHROYW1lc3BhY2VzXSBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IG5hbWVzcGFjZXMgc2hvdWxkIGJlIGFkZGVkXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50W10ge1xuXHRpZiAoYWRkRGVmYXVsdE5hbWVzcGFjZXMpIHtcblx0XHR4bWxTdHJpbmcgPSBgPHRlbXBsYXRlXG5cdFx0XHRcdFx0XHR4bWxuczp0ZW1wbGF0ZT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS50ZW1wbGF0ZS8xXCJcblx0XHRcdFx0XHRcdHhtbG5zOm09XCJzYXAubVwiXG5cdFx0XHRcdFx0XHR4bWxuczptYWNyb3M9XCJzYXAuZmUubWFjcm9zXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczptZGM9XCJzYXAudWkubWRjXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRjb25zdCBjaGlsZHJlbiA9IG91dHB1dD8ucGFyZW50RWxlbWVudCA/IG91dHB1dD8ucGFyZW50RWxlbWVudC5jaGlsZHJlbiA6IFtvdXRwdXQgYXMgRWxlbWVudF07XG5cdHJldHVybiBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgeG1sUmVzdWx0ID0gcGFyc2VYTUxTdHJpbmcob3V0U3RyLCB0cnVlKTtcblx0aWYgKHhtbFJlc3VsdD8ubGVuZ3RoID4gMCAmJiB4bWxSZXN1bHRbMF0/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKHhtbFJlc3VsdFswXSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHRbMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVySFRNTDtcblx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG91dFN0cjtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBYTUxQcm9jZXNzb3JUeXBlVmFsdWUgPVxuXHR8IHN0cmluZ1xuXHR8IGJvb2xlYW5cblx0fCBudW1iZXJcblx0fCB1bmRlZmluZWRcblx0fCBudWxsXG5cdHwgb2JqZWN0XG5cdHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0fCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj5cblx0fCBBcnJheTxzdHJpbmc+XG5cdHwgQXJyYXk8RnVuY3Rpb24+XG5cdHwgRnVuY3Rpb25cblx0fCBDb250ZXh0O1xuLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWwgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBvYmplY3QgY2FzZS5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyBUaGUgc3RyaW5nIHBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgcGFydCBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHJldHVybnMgVGhlIFhNTCBzdHJpbmcgZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzdHJpbmcgdGhhdCB3YXMgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHhtbCA9IChzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4udmFsdWVzOiBYTUxQcm9jZXNzb3JUeXBlVmFsdWVbXSk6IHN0cmluZyA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIHRoZW4gd2UgY29tcGlsZSBpdC5cblx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiB2YWx1ZVswXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLmZsYXQoNSkuam9pbihcIlxcblwiKS50cmltKCk7XG5cdFx0fSBlbHNlIGlmIChpc0Z1bmN0aW9uQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUubWFwKCh2YWx1ZWZuKSA9PiB2YWx1ZWZuKCkpLmpvaW4oXCJcXG5cIik7XG5cdFx0fSBlbHNlIGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVFeHByZXNzaW9uKHZhbHVlKTtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gXCJ7dGhpcz51bmRlZmluZWRWYWx1ZX1cIjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKGlzQ29udGV4dCh2YWx1ZSkpIHtcblx0XHRcdFx0b3V0U3RyICs9IHZhbHVlLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5VUlkID0gc3RvcmVPYmplY3RWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIiZsdDtcIikpIHtcblx0XHRcdG91dFN0ciArPSBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChwcm9jZXNzTmV4dFhtbEluVHJhY2UpIHtcblx0XHRyZXR1cm4gcmVuZGVySW5UcmFjZU1vZGUob3V0U3RyKTtcblx0fVxuXHRyZXR1cm4gb3V0U3RyO1xufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7OztFQWdDQSxNQUFNQSxZQUFZLEdBQUcsc0VBQXNFO0VBQzNGLE1BQU1DLGdCQUFnQixHQUFHLGdFQUFnRTtFQUN6RixNQUFN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
|
|
987
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0dHRVJfU0NPUEUiLCJYTUxURU1QTEFUSU5HX05TIiwiRE9NUGFyc2VySW5zdGFuY2UiLCJET01QYXJzZXIiLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwic05hbWUiLCJtQ29udGV4dHMiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJnZXRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiaGFzT3duUHJvcGVydHkiLCIka2luZCIsInVuZGVmaW5lZCIsImV4cGVjdGVkVHlwZXMiLCJpbmNsdWRlcyIsImdldFBhdGgiLCIkVHlwZSIsImV4cGVjdGVkQW5ub3RhdGlvblR5cGVzIiwidmFsaWRhdGVNYWNyb1NpZ25hdHVyZSIsIm9NZXRhZGF0YSIsIm9Ob2RlIiwiYU1ldGFkYXRhQ29udGV4dEtleXMiLCJtZXRhZGF0YUNvbnRleHRzIiwiT2JqZWN0Iiwia2V5cyIsImFQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIm9BdHRyaWJ1dGVOYW1lcyIsImF0dHJpYnV0ZU5hbWVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJhdHRyaWJ1dGVOYW1lIiwiZm9yRWFjaCIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwiaGFzQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsIkxvZyIsIndhcm5pbmciLCJTQVBfVUlfQ09SRV9FTEVNRU5UIiwiU0FQX1VJX01PREVMX0NPTlRFWFQiLCJ0cmFuc2Zvcm1NZXRhZGF0YSIsImJ1aWxkaW5nQmxvY2tNZXRhZGF0YSIsImFnZ3JlZ2F0aW9ucyIsImRlcGVuZGVudHMiLCJ0eXBlIiwic2xvdCIsImlzUHVibGljIiwiY3VzdG9tRGF0YSIsImxheW91dERhdGEiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyIsIm9TZXR0aW5ncyIsInNBdHRyaWJ1dGVWYWx1ZSIsInNNZXRhUGF0aCIsInNDb250ZXh0UGF0aCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImVuZHNXaXRoIiwibW9kZWwiLCJwYXRoIiwiX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQiLCJzQXR0cmlidXRlTmFtZSIsInJldHVybkNvbnRleHQiLCJtb2RlbHMiLCJjb252ZXJ0ZXJDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJkYXRhIiwidW5zdG9yZU9iamVjdFZhbHVlIiwic2V0UHJvcGVydHkiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJfZ2V0TWV0YWRhdGFDb250ZXh0Iiwib1Zpc2l0b3IiLCJiRG9Ob3RSZXNvbHZlIiwiaXNPcGVuIiwib01ldGFkYXRhQ29udGV4dCIsImdldEF0dHJpYnV0ZSIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiZ2V0Q29udGV4dCIsImUiLCJwcm9jZXNzUHJvcGVydGllcyIsImRlZmluaXRpb25Qcm9wZXJ0aWVzIiwiYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyIsInByb3BlcnR5VmFsdWVzIiwic0tleVZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiZGVlcENsb25lIiwiZXJyb3IiLCJ2aXNpdEF0dHJpYnV0ZSIsImF0dHJpYnV0ZXMiLCJnZXROYW1lZEl0ZW0iLCJ2YWx1ZSIsIk51bWJlciIsInByb2Nlc3NDb250ZXh0cyIsImNvbnRleHRQYXRoIiwibU1pc3NpbmdDb250ZXh0Iiwib0RlZmluaXRpb25Db250ZXh0cyIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwiY29udGV4dFBhdGhJbmRleCIsImluZGV4T2YiLCJjb250ZXh0UGF0aERlZmluaXRpb24iLCJzcGxpY2UiLCJwcm9wZXJ0eVZhbHVlIiwibGVuZ3RoIiwibmFtZSIsImFkZFNpbmdsZUNvbnRleHQiLCJwYXJzZUFnZ3JlZ2F0aW9uIiwib0FnZ3JlZ2F0aW9uIiwicHJvY2Vzc0FnZ3JlZ2F0aW9ucyIsIm9PdXRPYmplY3RzIiwiY2hpbGRyZW4iLCJjaGlsZElkeCIsImNoaWxkRGVmaW5pdGlvbiIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwiYWdncmVnYXRpb25PYmplY3QiLCJrZXkiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiYW5jaG9yIiwidGFnTmFtZSIsIm5vZGVOYW1lIiwicHJvY2Vzc09iamVjdCIsImVsZW1lbnQiLCJteUFycmF5IiwibXlPYmplY3QiLCJjaGlsZE5vZGVOYW1lcyIsIm1hcCIsImxvY2FsTmFtZSIsImNoaWxkSXNBcnJheSIsIlNldCIsInNpemUiLCJwdXNoIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsImZpcnN0RWxlbWVudENoaWxkIiwib0ZpcnN0RWxlbWVudENoaWxkIiwibmFtZXNwYWNlVVJJIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIkFycmF5IiwiZnJvbSIsInZpc2l0Tm9kZSIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJwYXJzZWRBZ2dyZWdhdGlvbiIsInBhcnNlZEFnZ3JlZ2F0aW9uS2V5Iiwib05leHRDaGlsZCIsIm5leHRDaGlsZCIsImhhc1ZpcnR1YWxOb2RlIiwiY2hpbGRXcmFwcGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUF0dHJpYnV0ZSIsIm9OZXdDaGlsZCIsImNsb25lTm9kZSIsImFnZ3JlZ2F0aW9uUHJvcGVydHlWYWx1ZXMiLCJteUNoaWxkIiwicHJvY2Vzc1Nsb3RzIiwib01ldGFkYXRhQWdncmVnYXRpb25zIiwicHJvY2Vzc0N1c3RvbURhdGEiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInByZXBhcmVBZ2dyZWdhdGlvbkVsZW1lbnQiLCJyZXBsYWNlV2l0aCIsInJlcGxhY2UiLCJwcm9jZXNzQnVpbGRpbmdCbG9jayIsIkJ1aWxkaW5nQmxvY2tDbGFzcyIsIm1ldGFkYXRhIiwic0ZyYWdtZW50TmFtZSIsImZyYWdtZW50IiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwieG1sVGFnIiwiZ2V0U2V0dGluZ3MiLCJKU09OTW9kZWwiLCJpbml0aWFsS2V5cyIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyIsInByb3BOYW1lIiwib0RhdGEiLCJvcmlnaW5hbERlZmluaXRpb24iLCJ2YWxpZGF0ZSIsImlzQSIsImdldE1vZGVsIiwib0luc3RhbmNlIiwiZ2V0UHJvcGVydGllcyIsInNDb250ZXh0TmFtZSIsInRhcmdldE9iamVjdCIsImlzQ29udGV4dCIsImF0dHJpYnV0ZVZhbHVlIiwic3RvcmVPYmplY3RWYWx1ZSIsIm5ld0NvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9BdHRyaWJ1dGVzTW9kZWwiLCJBdHRyaWJ1dGVNb2RlbCIsIm9QcmV2aW91c01hY3JvSW5mbyIsImNvcmVSZXF1aXJlIiwiVHJhY2VJbmZvIiwiaXNUcmFjZUluZm9BY3RpdmUiLCJvVHJhY2VJbmZvIiwidHJhY2VNYWNyb0NhbGxzIiwibWFjcm9JbmZvIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9Qcm9taXNlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvbGRLZXlzIiwidGVtcG9yYXJ5T2JqZWN0U3RvcmUiLCJ0ZW1wbGF0ZVN0cmluZyIsImdldFJ1bnRpbWVCdWlsZGluZ0Jsb2NrVGVtcGxhdGUiLCJqc3giLCJyZW5kZXJBc1hNTCIsImdldFRlbXBsYXRlIiwiaXNSdW50aW1lIiwic3RvcmVLZXkiLCJoYXNFcnJvciIsImhhc1BhcnNlRXJyb3IiLCJwYXJzZWRUZW1wbGF0ZSIsInBhcnNlWE1MU3RyaW5nIiwiaXRlciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwicHJvY2Vzc1htbEluVHJhY2UiLCJpbml0aWFsVGVtcGxhdGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJ0ZW1wbGF0ZSIsIm91dGVySFRNTCIsImpvaW4iLCJ2aXNpdGVkTm9kZXMiLCJpbnRlcm5hbE5vZGUiLCJQcm9taXNlIiwiYWxsIiwicmVtb3ZlIiwicmVzb2x2ZSIsIm9NYWNyb0VsZW1lbnQiLCJvUmVtYWluaW5nU2xvdHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwib1Nsb3RFbGVtZW50IiwicmVxdWlyZU9uTWFjcm8iLCJnZXRBdHRyaWJ1dGVOUyIsInN1YnN0cmluZyIsInNldEF0dHJpYnV0ZU5TIiwidHJhY2VEZXRhaWxzIiwiaW5pdGlhbFByb3BlcnRpZXMiLCJyZXNvbHZlZFByb3BlcnRpZXMiLCJtaXNzaW5nQ29udGV4dHMiLCJvRXJyb3IiLCJzdGFjayIsIm9UZW1wbGF0ZSIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwidW5yZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJlcnJvck1lc3NhZ2VzIiwieG1sRnJhZ21lbnQiLCJhZGRpdGlvbmFsRGF0YSIsImVycm9yTGFiZWxzIiwiZXJyb3JNZXNzYWdlIiwieG1sIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlcnJvclN0YWNrIiwic3RhY2tGb3JtYXR0ZWQiLCJidG9hIiwiYWRkaXRpb25hbFRleHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZUFsbCIsInByb3BlcnR5VUlEIiwidWlkIiwicHJvY2Vzc05leHRYbWxJblRyYWNlIiwibWV0aG9kIiwicmV0dXJuVmFsdWUiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0IiwicGFyZW50RWxlbWVudCIsInJlbmRlckluVHJhY2VNb2RlIiwib3V0U3RyIiwieG1sUmVzdWx0IiwiaW5uZXJUZXh0IiwiaW5uZXJIVE1MIiwic3BsaXQiLCJzdHJpbmdzIiwiaSIsInZhbHVlcyIsImlzQXJyYXkiLCJmbGF0IiwiaXNGdW5jdGlvbkFycmF5IiwidmFsdWVmbiIsImlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCIsImFkZENvbmRpdGlvbmFsbHlUb1hNTCIsImNvbmRpdGlvbiIsInBhcnRUb0FkZCIsImFkZEF0dHJpYnV0ZVRvWE1MIiwiaXNVbmRlZmluZWRFeHByZXNzaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzVW5kZWZpbmVkRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IGpzeCBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24sXG5cdE9iamVjdFZhbHVlLFxuXHRPYmplY3RWYWx1ZTJcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL1J1bnRpbWVCdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpc0NvbnRleHQsIGlzRnVuY3Rpb25BcnJheSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYWNyb0luZm8gfSBmcm9tIFwiLi4vVHJhY2VJbmZvXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuY29uc3QgWE1MVEVNUExBVElOR19OUyA9IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIjtcbmNvbnN0IERPTVBhcnNlckluc3RhbmNlID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSAmIHtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xufTtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgbWV0YSBkYXRhIGNvbnRleHRcbiAqL1xudHlwZSBNZXRhRGF0YUNvbnRleHQgPSB7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdG1vZGVsOiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MgPSB7XG5cdGN1cnJlbnRDb250ZXh0UGF0aDogQ29udGV4dDtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRpc1J1bnRpbWVJbnN0YW50aWF0aW9uPzogYm9vbGVhbjtcblx0bW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbD4gJiB7XG5cdFx0Y29udmVydGVyQ29udGV4dDogSlNPTk1vZGVsO1xuXHRcdHZpZXdEYXRhOiBKU09OTW9kZWw7XG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbDtcblx0XHRcInNhcC5mZS5pMThuXCI/OiBSZXNvdXJjZU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+O1xuXHRfbWFjcm9JbmZvPzogTWFjcm9JbmZvO1xuXHRbazogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIElWaXNpdG9yQ2FsbGJhY2sgPSB7XG5cdGdldFNldHRpbmdzKCk6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3M7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0gb05vZGVcblx0ICogICBUaGUgWE1MIERPTSBub2RlXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqL1xuXHR2aXNpdE5vZGUob05vZGU6IE5vZGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBJbnNlcnRzIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHBsYWNlIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBMb2FkcyB0aGVcblx0ICogZnJhZ21lbnQsIHRha2VzIGNhcmUgb2YgY2FjaGluZyAoZm9yIHRoZSBjdXJyZW50IHByZS1wcm9jZXNzb3IgcnVuKSBhbmQgdmlzaXRzIHRoZVxuXHQgKiBmcmFnbWVudCdzIGNvbnRlbnQgb25jZSBpdCBoYXMgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBlbGVtZW50J3Mgb3duZXIgZG9jdW1lbnQgYW5kXG5cdCAqIHB1dCBpbnRvIHBsYWNlLiBMb2FkaW5nIG9mIGZyYWdtZW50cyBpcyBhc3luY2hyb25vdXMgaWYgdGhlIHRlbXBsYXRlIHZpZXcgaXNcblx0ICogYXN5bmNocm9ub3VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0ZyYWdtZW50XG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSBvV2l0aFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zXG5cdCAqIEEgc3luYyBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdpdGggPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBhcyBzb29uIGFzIHRoZSBmcmFnbWVudFxuXHQgKiAgIGhhcyBiZWVuIGluc2VydGVkLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiBsb2FkaW5nIG9yIHZpc2l0aW5nXG5cdCAqICAgZmFpbHMuXG5cdCAqL1xuXHRpbnNlcnRGcmFnbWVudChzRnJhZ21lbnQ6IHN0cmluZywgb0VsZW1lbnQ6IEVsZW1lbnQsIG9XaXRoPzogQ29udHJvbCk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRBdHRyaWJ1dGVzKG9Ob2RlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPjtcblx0Z2V0Vmlld0luZm8oKTogUHJvbWlzZTx1bmtub3duPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIFtlbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJuc1xuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPENvbnRleHQ+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aD86IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWFwIG9mIHZhcmlhYmxlcyB3aGljaFxuXHQgKiBvdmVycmlkZSBjdXJyZW50bHkga25vd24gdmFyaWFibGVzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPGNvZGU+dGhpczwvY29kZT5cblx0ICogcGFyZW50IGludGVyZmFjZSBvciByZXBsYWNlIHRoZW0gYWx0b2dldGhlci4gRWFjaCB2YXJpYWJsZSBuYW1lIGJlY29tZXMgYVxuXHQgKiBuYW1lZCBtb2RlbCB3aXRoIGEgY29ycmVzcG9uZGluZyBvYmplY3QgYmluZGluZyBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZVxuXHQgKiBYTUwgdGVtcGxhdGUgaW4gdGhlIHVzdWFsIHdheSwgdGhhdCBpcywgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvbiBsaWtlXG5cdCAqIDxjb2RlPlwie3Zhcj5zb21lL3JlbGF0aXZlL3BhdGh9XCI8L2NvZGU+IChzZWUgZXhhbXBsZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBbbVZhcmlhYmxlcz17fV1cblx0ICogICBNYXAgZnJvbSB2YXJpYWJsZSBuYW1lIChzdHJpbmcpIHRvIHZhbHVlXG5cdCAqIEBwYXJhbSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zXG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sIGJSZXBsYWNlPzogYm9vbGVhbik6IElWaXNpdG9yQ2FsbGJhY2s7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQ+LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pOiB2b2lkIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIHtcblx0XHQkVHlwZT86IHN0cmluZztcblx0XHQka2luZD86IHN0cmluZztcblx0fTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0T2JqZWN0LiRraW5kICE9PSB1bmRlZmluZWQgJiYgb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmICghb0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZFR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRraW5kKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJGtpbmQnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRUeXBlc30nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRraW5kXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJlxuXHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0b0NvbnRleHRTZXR0aW5ncy5leHBlY3RlZEFubm90YXRpb25UeXBlc1xuXHRcdCkge1xuXHRcdFx0Ly8gQ2hlY2sgb25seSAkVHlwZVxuXHRcdFx0aWYgKCFvQ29udGV4dFNldHRpbmdzLmV4cGVjdGVkQW5ub3RhdGlvblR5cGVzLmluY2x1ZGVzKG9Db250ZXh0T2JqZWN0LiRUeXBlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3MuZXhwZWN0ZWRBbm5vdGF0aW9uVHlwZXN9JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4kVHlwZVxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYWNyb1NpZ25hdHVyZShcblx0c05hbWU6IHN0cmluZyxcblx0b01ldGFkYXRhOiBUcmFuc2Zvcm1lZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0bUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0Pixcblx0b05vZGU6IEVsZW1lbnRcbik6IHZvaWQge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IG9Ob2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1thdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdH1cblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdGNvbnN0IG9Db250ZXh0U2V0dGluZ3MgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0c1tzS2V5XTtcblxuXHRcdHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoc05hbWUsIG1Db250ZXh0cywgb0NvbnRleHRTZXR0aW5ncywgc0tleSk7XG5cdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0fSk7XG5cdC8vQ2hlY2sgcHJvcGVydGllc1xuXHRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKCFzS2V5LmluY2x1ZGVzKFwiOlwiKSAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBTQVBfVUlfTU9ERUxfQ09OVEVYVCA9IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBtZXRhZGF0YSBvZiBhIGJ1aWxkaW5nIGJsb2NrIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGFnZ3JlZ2F0aW9ucyxcbiAqIGFuZCBzcGxpdHRpbmcgcHJvcGVydGllcyBpbnRvIGFjdHVhbCBwcm9wZXJ0aWVzIGFuZCBtZXRhZGF0YSBjb250ZXh0cy5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRjb25zdCBhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+ID0ge1xuXHRcdGRlcGVuZGVudHM6IHtcblx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlQsXG5cdFx0XHRzbG90OiBcImRlcGVuZGVudHNcIixcblx0XHRcdGlzUHVibGljOiB0cnVlXG5cdFx0fSxcblx0XHRjdXN0b21EYXRhOiB7XG5cdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5ULFxuXHRcdFx0c2xvdDogXCJjdXN0b21EYXRhXCIsXG5cdFx0XHRpc1B1YmxpYzogdHJ1ZVxuXHRcdH0sXG5cdFx0bGF5b3V0RGF0YToge1xuXHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVCxcblx0XHRcdHNsb3Q6IFwibGF5b3V0RGF0YVwiLFxuXHRcdFx0aXNQdWJsaWM6IHRydWVcblx0XHR9LFxuXHRcdC4uLmJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNcblx0fTtcblx0Y29uc3QgbWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+ID0ge307XG5cblx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlO1xuXG5cdFx0aWYgKHByb3BlcnR5VHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXG5cdFx0aWYgKFtTQVBfVUlfTU9ERUxfQ09OVEVYVCwgXCJvYmplY3RcIiwgXCJhcnJheVwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpKSB7XG5cdFx0XHQvLyBFeHBsaWNpdGx5IGRlZmluZWQgY29udGV4dHMsIG9iamVjdHMsIGFuZCBhcnJheXMgbWF5IGNvbWUgZnJvbSB0aGUgbWV0YWRhdGFDb250ZXh0XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzW3Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdIGFzIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Li4uYnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRcdHByb3BlcnRpZXMsXG5cdFx0bWV0YWRhdGFDb250ZXh0cyxcblx0XHRhZ2dyZWdhdGlvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGFic29sdXRlIG9yIGNvbnRleHQgcGF0aHMgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgTWV0YUNvbnRleHQuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NoZWNrQWJzb2x1dGVBbmRDb250ZXh0UGF0aHMob1NldHRpbmdzOiBUZW1wbGF0ZVByb2Nlc3NvclNldHRpbmdzLCBzQXR0cmlidXRlVmFsdWU6IHN0cmluZyk6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRwYXRoOiBzTWV0YVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBoZWxwcyB0byBjcmVhdGUgdGhlIG1ldGFkYXRhIGNvbnRleHQgaW4gY2FzZSBpdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIG9TZXR0aW5ncyBBZGRpdGlvbmFsIHNldHRpbmdzXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0gc0F0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBtZXRhIGRhdGEgY29udGV4dCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUluaXRpYWxNZXRhZGF0YUNvbnRleHQoXG5cdG9TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0c0F0dHJpYnV0ZU5hbWU6IHN0cmluZyxcblx0c0F0dHJpYnV0ZVZhbHVlOiBzdHJpbmdcbik6IE1ldGFEYXRhQ29udGV4dCB7XG5cdGxldCByZXR1cm5Db250ZXh0OiBNZXRhRGF0YUNvbnRleHQ7XG5cdGlmIChzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi91aWQtLVwiKSAmJiAhb1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LmdldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSkpIHtcblx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNBdHRyaWJ1dGVWYWx1ZSwgZGF0YSk7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcImNvbnZlcnRlckNvbnRleHRcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoKHNBdHRyaWJ1dGVOYW1lID09PSBcIm1ldGFQYXRoXCIgJiYgb1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCkgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdHJldHVybkNvbnRleHQgPSBfY2hlY2tBYnNvbHV0ZUFuZENvbnRleHRQYXRocyhvU2V0dGluZ3MsIHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdH0gZWxzZSBpZiAoc0F0dHJpYnV0ZVZhbHVlICYmIHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdC8vIGFic29sdXRlIHBhdGggLSB3ZSBqdXN0IHVzZSB0aGlzIG9uZVxuXHRcdHJldHVybkNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuQ29udGV4dCA9IHtcblx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQgPyBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmVudGl0eVNldC5nZXRQYXRoKHNBdHRyaWJ1dGVWYWx1ZSkgOiBzQXR0cmlidXRlVmFsdWVcblx0XHR9O1xuXHR9XG5cdHJldHVybiByZXR1cm5Db250ZXh0O1xufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0YkRvTm90UmVzb2x2ZTogYm9vbGVhbixcblx0aXNPcGVuOiBib29sZWFuXG4pOiBNZXRhRGF0YUNvbnRleHQgfCB1bmRlZmluZWQge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDogTWV0YURhdGFDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoc0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRpZiAoIW9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSBfY3JlYXRlSW5pdGlhbE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIHNBdHRyaWJ1dGVOYW1lLCBzQXR0cmlidXRlVmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgaW5jb21pbmcgWE1MIG5vZGUgYW5kIHRyeSB0byByZXNvbHZlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIG9NZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9ja1xuICogQHBhcmFtIG9Ob2RlIFRoZSBYTUwgbm9kZSB0byBwYXJzZVxuICogQHBhcmFtIGlzUHVibGljIFdoZXRoZXIgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzZWQgaW4gYSBwdWJsaWMgY29udGV4dCBvciBub3RcbiAqIEBwYXJhbSBvVmlzaXRvciBUaGUgdmlzaXRvciBpbnN0YW5jZVxuICogQHJldHVybnMgVGhlIHByb2Nlc3NlZCBwcm9wZXJ0aWVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJVmlzaXRvckNhbGxiYWNrXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPj4ge1xuXHRjb25zdCBkZWZpbml0aW9uUHJvcGVydGllcyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzO1xuXG5cdC8vIFJldHJpZXZlIHByb3BlcnRpZXMgdmFsdWVzXG5cdGNvbnN0IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9uUHJvcGVydGllcyk7XG5cblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPiA9IHt9O1xuXHRmb3IgKGNvbnN0IHNLZXlWYWx1ZSBvZiBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzKSB7XG5cdFx0aWYgKGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9XG5cdFx0XHRcdGRlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlICYmIGRlZXBDbG9uZShkZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZSk7IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHR9XG5cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYyA9PT0gZmFsc2UpIHtcblx0XHRcdExvZy5lcnJvcihgUHJvcGVydHkgJHtzS2V5VmFsdWV9IHdhcyBpZ25vcmVkIGFzIGl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIHVzYWdlYCk7XG5cdFx0fSBlbHNlIGlmIChvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleVZhbHVlKSkge1xuXHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGUob05vZGUsIG9Ob2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKHNLZXlWYWx1ZSkgYXMgQXR0cik7XG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoZGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlID09PSBcInRydWVcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiB2YWx1ZTtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcHJvcGVydHlWYWx1ZXM7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGluY29taW5nIFhNTCBub2RlIGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgYmluZGluZyBjb250ZXh0cyBkZWZpbmVkIGluc2lkZS5cbiAqXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gb1NldHRpbmdzIFRoZSBzZXR0aW5ncyBvYmplY3RcbiAqIEBwYXJhbSBvTm9kZSBUaGUgWE1MIG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpc1B1YmxpYyBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2VkIGluIGEgcHVibGljIGNvbnRleHQgb3Igbm90XG4gKiBAcGFyYW0gb1Zpc2l0b3IgVGhlIHZpc2l0b3IgaW5zdGFuY2VcbiAqIEBwYXJhbSBtQ29udGV4dHMgVGhlIGNvbnRleHRzIHRvIGJlIHVzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgYW5kIG1pc3NpbmcgY29udGV4dHNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHRzKFxuXHRvTWV0YWRhdGE6IFRyYW5zZm9ybWVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IFRlbXBsYXRlUHJvY2Vzc29yU2V0dGluZ3MsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZT5cbik6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Db250ZXh0cyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzO1xuXHRjb25zdCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHQvLyBTaW5jZSB0aGUgbWV0YVBhdGggYW5kIG90aGVyIHByb3BlcnR5IGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dFBhdGggd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgY3VycmVudCBjb250ZXh0UGF0aCBmaXJzdFxuXHRjb25zdCBjb250ZXh0UGF0aEluZGV4ID0gYURlZmluaXRpb25Db250ZXh0c0tleXMuaW5kZXhPZihcImNvbnRleHRQYXRoXCIpO1xuXHRpZiAoY29udGV4dFBhdGhJbmRleCAhPT0gLTEpIHtcblx0XHQvLyBJZiBpdCBpcyBkZWZpbmVkIHdlIGV4dHJhY3QgaXQgYW5kIHJlaW5zZXJ0IGl0IGluIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgYXJyYXlcblx0XHRjb25zdCBjb250ZXh0UGF0aERlZmluaXRpb24gPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zcGxpY2UoY29udGV4dFBhdGhJbmRleCwgMSk7XG5cdFx0YURlZmluaXRpb25Db250ZXh0c0tleXMuc3BsaWNlKDAsIDAsIGNvbnRleHRQYXRoRGVmaW5pdGlvblswXSk7XG5cdH1cblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdC8vIElmIHRoZSBjb250ZXh0IHdhcyByZXNvbHZlZCBhcyBhIHByb3BlcnR5IChiaW5kaW5nIC8geG1sIGFnZ3JlZ2F0aW9uKSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCBoZXJlLlxuXHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuXHRcdFx0ZGVsZXRlIG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgPT09IGZhbHNlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuID8/IGZhbHNlKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgfHwgc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikgJiZcblx0XHRcdFx0IW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAobUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIGJpbmRpbmcgY291bGRuJ3QgYmUgcmVzb2x2ZWQgY29uc2lkZXIgdGhhdCB0aGVyZSB3YXMgbm8gdmFsdWUgaGVyZVxuXHRcdFx0XHRkZWxldGUgb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1NaXNzaW5nQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRrZXk6IHN0cmluZztcblx0cG9zaXRpb246IFBvc2l0aW9uO1xuXHR0eXBlOiBcIlNsb3RcIjtcbn07XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbj86IEVsZW1lbnQsIHByb2Nlc3NBZ2dyZWdhdGlvbnM/OiBGdW5jdGlvbik6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbj4ge1xuXHRjb25zdCBvT3V0T2JqZWN0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uPiA9IHt9O1xuXHRpZiAob0FnZ3JlZ2F0aW9uICYmIG9BZ2dyZWdhdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvQWdncmVnYXRpb24uY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgY2hpbGRJZHggPSAwOyBjaGlsZElkeCA8IGNoaWxkcmVuLmxlbmd0aDsgY2hpbGRJZHgrKykge1xuXHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0bGV0IGNoaWxkS2V5ID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSB8fCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cdFx0XHRpZiAoY2hpbGRLZXkpIHtcblx0XHRcdFx0Y2hpbGRLZXkgPSBgSW5saW5lWE1MXyR7Y2hpbGRLZXl9YDtcblx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnNldEF0dHJpYnV0ZShcImtleVwiLCBjaGlsZEtleSk7XG5cdFx0XHRcdGxldCBhZ2dyZWdhdGlvbk9iamVjdDogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogKGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJwbGFjZW1lbnRcIikgYXMgUGxhY2VtZW50KSB8fCBQbGFjZW1lbnQuQWZ0ZXIsXG5cdFx0XHRcdFx0XHRhbmNob3I6IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJhbmNob3JcIikgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0eXBlOiBcIlNsb3RcIlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocHJvY2Vzc0FnZ3JlZ2F0aW9ucykge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uT2JqZWN0ID0gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhjaGlsZERlZmluaXRpb24sIGFnZ3JlZ2F0aW9uT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvT3V0T2JqZWN0c1thZ2dyZWdhdGlvbk9iamVjdC5rZXldID0gYWdncmVnYXRpb25PYmplY3Q7XG5cdFx0XHR9IGVsc2UgaWYgKGNoaWxkRGVmaW5pdGlvbi50YWdOYW1lICE9PSBcInNsb3RcIikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFRoZSBhZ2dyZWdhdGlvbiAke2NoaWxkRGVmaW5pdGlvbi5ub2RlTmFtZX0gaXMgbWlzc2luZyBhIEtleSBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBkaXNwbGF5ZWRgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9PdXRPYmplY3RzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrIHByb3BlcnRpZXMgd2hlbiB0aGUgdHlwZSBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIFhNTCBlbGVtZW50IHRvIHBhcnNlXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc2VkIG9iamVjdFxuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0KGVsZW1lbnQ6IEVsZW1lbnQpOiBvYmplY3Qge1xuXHRjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG5cdGNvbnN0IG15QXJyYXk6IEFycmF5PHVua25vd24+ID0gW107XG5cdGNvbnN0IG15T2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG5cdFx0bXlPYmplY3RbYXR0cmlidXRlTmFtZV0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0fVxuXHRpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGNoaWxkTm9kZU5hbWVzID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcCgoa2V5KSA9PiBjaGlsZHJlbltrZXkgYXMgdW5rbm93biBhcyBudW1iZXJdLmxvY2FsTmFtZSk7XG5cdFx0Y29uc3QgY2hpbGRJc0FycmF5ID0gY2hpbGROb2RlTmFtZXMubGVuZ3RoICE9PSBuZXcgU2V0KGNoaWxkTm9kZU5hbWVzKS5zaXplO1xuXHRcdGZvciAoY29uc3QgY2hpbGREZWZpbml0aW9uIG9mIGNoaWxkcmVuIGFzIHVua25vd24gYXMgQXJyYXk8RWxlbWVudD4pIHtcblx0XHRcdGlmIChjaGlsZElzQXJyYXkpIHtcblx0XHRcdFx0bXlBcnJheS5wdXNoKHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRteU9iamVjdFtjaGlsZERlZmluaXRpb24ubG9jYWxOYW1lXSA9IHByb2Nlc3NPYmplY3QoY2hpbGREZWZpbml0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGNoaWxkSXNBcnJheSkge1xuXHRcdFx0cmV0dXJuIG15QXJyYXk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBteU9iamVjdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBidWlsZGluZyBibG9jayBhbmQgcGFyc2VzIHRoZW0gYXMgZWl0aGVyIGFnZ3JlZ2F0aW9ucyBvciBvYmplY3QtL2FycmF5LWJhc2VkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gb05vZGUgVGhlIFhNTCBub2RlIGZvciB3aGljaCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlblxuICogQHBhcmFtIG9WaXNpdG9yIFRoZSB2aXNpdG9yIGluc3RhbmNlXG4gKiBAcGFyYW0gb01ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrXG4gKiBAcGFyYW0gaXNQdWJsaWMgV2hldGhlciB0aGUgYnVpbGRpbmcgYmxvY2sgaXMgdXNlZCBpbiBhIHB1YmxpYyBjb250ZXh0IG9yIG5vdFxuICogQHBhcmFtIHByb3BlcnR5VmFsdWVzIFRoZSB2YWx1ZXMgb2YgYWxyZWFkeSBwYXJzZWQgcHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBwcm9jZXNzZWQgY2hpbGRyZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElWaXNpdG9yQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogVHJhbnNmb3JtZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWU+XG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+PiB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEVsZW1lbnQ+ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgYXMgRWxlbWVudCB8IG51bGw7XG5cblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkLm5hbWVzcGFjZVVSSSA9PT0gWE1MVEVNUExBVElOR19OUykge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHdlIGVuY291bnRlciBhIHRlbXBsYXRpbmcgdGFnLCBydW4gdGhlIHZpc2l0b3Igb24gaXQgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlc3VsdGluZyBjaGlsZFxuXHRcdFx0XHRjb25zdCBvUGFyZW50ID0gb0ZpcnN0RWxlbWVudENoaWxkLnBhcmVudE5vZGU7XG5cdFx0XHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgaUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XSA/IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdIDogbnVsbDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBOb3Qgc3VyZSBob3cgdGhpcyBjb3VsZCBoYXBwZW4gYnV0IEkgYWxzbyBkb24ndCB3YW50IHRvIGNyZWF0ZSBpbmZpbml0ZSBsb29wc1xuXHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0XHRsZXQgc0FnZ3JlZ2F0aW9uTmFtZSA9IHNDaGlsZE5hbWU7XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWUgPSBvTWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uIHx8IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkICYmICFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdGNvbnN0IHBhcnNlZEFnZ3JlZ2F0aW9uID0gcGFyc2VBZ2dyZWdhdGlvbihvRmlyc3RFbGVtZW50Q2hpbGQsIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5wcm9jZXNzQWdncmVnYXRpb25zKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdHdoaWxlIChvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IG9OZXh0Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdGNvbnN0IHNDaGlsZE5hbWUgPSBvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lO1xuXHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gc0FnZ3JlZ2F0aW9uTmFtZVswXSkge1xuXHRcdFx0XHQvLyBub3QgYSBzdWIgYWdncmVnYXRpb24sIGdvIGJhY2sgdG8gZGVmYXVsdCBBZ2dyZWdhdGlvblxuXHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRPYmplY3Qua2V5cyhvTWV0YWRhdGEuYWdncmVnYXRpb25zKS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSAmJlxuXHRcdFx0XHQoIWlzUHVibGljIHx8IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uaXNQdWJsaWMgPT09IHRydWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKCFhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwgJiYgb0ZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdHdoaWxlIChjaGlsZERlZmluaXRpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5oYXNWaXJ0dWFsTm9kZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGlsZFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNoaWxkV3JhcHBlci5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IGNoaWxkV3JhcHBlcjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImtleVwiKSFdID0gY2hpbGREZWZpbml0aW9uO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGlsZERlZmluaXRpb24ucmVtb3ZlQXR0cmlidXRlKFwia2V5XCIpO1xuXHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uc2xvdCkge1xuXHRcdFx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Tm9kZShvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRpZiAoIW9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmFwcGVuZENoaWxkKG9GaXJzdEVsZW1lbnRDaGlsZC5jbG9uZU5vZGUodHJ1ZSkgYXMgRWxlbWVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvRmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmNsdWRlcyhzQWdncmVnYXRpb25OYW1lKSkge1xuXHRcdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdE5vZGUob0ZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5wcm9wZXJ0aWVzW3NBZ2dyZWdhdGlvbk5hbWVdLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnR5VmFsdWVzID0gcHJvY2Vzc09iamVjdChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NBZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25Qcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0fSBlbHNlIGlmIChvTWV0YWRhdGEucHJvcGVydGllc1tzQWdncmVnYXRpb25OYW1lXS50eXBlID09PSBcImFycmF5XCIpIHtcblx0XHRcdFx0XHRpZiAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsICYmIG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IG9GaXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjtcblx0XHRcdFx0XHRcdGNvbnN0IG9PdXRPYmplY3RzOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+W10gPSBbXTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGNoaWxkSWR4KyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hpbGREZWZpbml0aW9uID0gY2hpbGRyZW5bY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0XHQvLyBub24ga2V5ZWQgY2hpbGQsIGp1c3QgYWRkIGl0IHRvIHRoZSBhZ2dyZWdhdGlvblxuXHRcdFx0XHRcdFx0XHRjb25zdCBteUNoaWxkOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RWYWx1ZTI+ID0ge307XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVOYW1lcykge1xuXHRcdFx0XHRcdFx0XHRcdG15Q2hpbGRbYXR0cmlidXRlTmFtZV0gPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9PdXRPYmplY3RzLnB1c2gobXlDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXSA9IG9PdXRPYmplY3RzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBFbGVtZW50Pixcblx0b01ldGFkYXRhQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPixcblx0b05vZGU6IEVsZW1lbnQsXG5cdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2Vcbik6IHZvaWQge1xuXHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRpZiAob05vZGUgIT09IG51bGwgJiYgb05vZGUgIT09IHVuZGVmaW5lZCAmJiBvQWdncmVnYXRpb25FbGVtZW50KSB7XG5cdFx0XHRcdC8vIHNsb3RzIGNhbiBoYXZlIDo6IGFzIGtleXMgd2hpY2ggaXMgbm90IGEgdmFsaWQgYWdncmVnYXRpb24gbmFtZSB0aGVyZWZvcmUgcmVwbGFjaW5nIHRoZW1cblx0XHRcdFx0Y29uc3Qgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdGlmICghW1wiZGVwZW5kZW50c1wiLCBcImN1c3RvbURhdGFcIiwgXCJsYXlvdXREYXRhXCJdLmluY2x1ZGVzKHNBZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlLCBzQWdncmVnYXRpb25OYW1lLCBvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBOb2RlW10pKTsgLy8gU29tZWhvdyBUUyBkb2Vzbid0IGxpa2UgdGhpcyBidXQgdGhlIGRvY3VtZW50YXRpb24gc2F5cyBpcyBzaG91bGQgd29ya1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvRWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdChvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvTWV0YWRhdGFBZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTm9kZS5xdWVyeVNlbGVjdG9yKGBzbG90W25hbWU9JyR7c1Nsb3ROYW1lfSddYCk7XG5cdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gcHJlcGFyZUFnZ3JlZ2F0aW9uRWxlbWVudChvTm9kZSwgc0FnZ3JlZ2F0aW9uTmFtZSwgb0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIHVua25vd24gYXMgTm9kZVtdKSk7IC8vIFNvbWVob3cgVFMgZG9lc24ndCBsaWtlIHRoaXMgYnV0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMgaXMgc2hvdWxkIHdvcmtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b05vZGUuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlQWdncmVnYXRpb25FbGVtZW50KG9Ob2RlOiBFbGVtZW50LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcsIG9FbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsKTogRWxlbWVudCB7XG5cdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUucmVwbGFjZSgvOi9naSwgXCJfXCIpKTtcblx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHR9XG5cdHJldHVybiBvTmV3Q2hpbGQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRCdWlsZGluZ0Jsb2NrQ2xhc3M6IHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UsXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IG9NZXRhZGF0YSA9IHRyYW5zZm9ybU1ldGFkYXRhKEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YSk7XG5cblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IG9NZXRhZGF0YS5mcmFnbWVudCA/PyBgJHtvTWV0YWRhdGEubmFtZXNwYWNlID8/IG9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2V9LiR7b01ldGFkYXRhLnhtbFRhZyA/PyBvTWV0YWRhdGEubmFtZX1gO1xuXG5cdGNvbnN0IG1Db250ZXh0czogUmVjb3JkPHN0cmluZywgQ29udGV4dD4gPSB7fTtcblx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblxuXHQvLyBBZGQgYW4gZW1wdHkgY29udmVydGVyIGNvbnRleHQgaWYgdGhlcmUgaXMgbm9uZSBpbiBvcmRlciB0byBoYXZlIGEgcGxhY2UgdG8gc3RvcmUgb2JqZWN0IHZhbHVlc1xuXHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQgPz89IG5ldyBKU09OTW9kZWwoKTtcblxuXHQvL0luamVjdCBzdG9yYWdlIGZvciBtYWNyb3Ncblx0aWYgKCFvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0pIHtcblx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0fVxuXG5cdC8vIEZpcnN0IG9mIGFsbCB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBhdHRyaWJ1dGVzIHRvIHJlc29sdmUgdGhlIHByb3BlcnRpZXMgYW5kIHRoZSBtZXRhZGF0YSBjb250ZXh0c1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlcyA9IGF3YWl0IHByb2Nlc3NQcm9wZXJ0aWVzKG9NZXRhZGF0YSwgb05vZGUsIGlzUHVibGljLCBvVmlzaXRvcik7XG5cdGNvbnN0IGluaXRpYWxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZXMpO1xuXHRjb25zdCBtTWlzc2luZ0NvbnRleHQgPSBwcm9jZXNzQ29udGV4dHMob01ldGFkYXRhLCBvU2V0dGluZ3MsIG9Ob2RlLCBpc1B1YmxpYywgb1Zpc2l0b3IsIG1Db250ZXh0cywgcHJvcGVydHlWYWx1ZXMpO1xuXG5cdHRyeSB7XG5cdFx0Ly8gQWdncmVnYXRpb24gYW5kIGNvbXBsZXggdHlwZSBzdXBwb3J0XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9ucyA9IGF3YWl0IHByb2Nlc3NDaGlsZHJlbihvTm9kZSwgb1Zpc2l0b3IsIG9NZXRhZGF0YSwgaXNQdWJsaWMsIHByb3BlcnR5VmFsdWVzKTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cblx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdGxldCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cdFx0XHQvL2NoZWNrIGZvciBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gdmFsaWRhdGUgLyBvdmVyd3JpdGUgcGFyYW1ldGVyc1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWxEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0NsYXNzPy5tZXRhZGF0YT8ucHJvcGVydGllc1twcm9wTmFtZV07XG5cdFx0XHRpZiAob3JpZ2luYWxEZWZpbml0aW9uPy52YWxpZGF0ZSkge1xuXHRcdFx0XHRvRGF0YSA9IG9yaWdpbmFsRGVmaW5pdGlvbi52YWxpZGF0ZShvRGF0YSkgfHwgb0RhdGE7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0RhdGE/LmlzQT8uKFNBUF9VSV9NT0RFTF9DT05URVhUKSAmJiAhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdGNvbnN0IG9JbnN0YW5jZSA9IG5ldyBCdWlsZGluZ0Jsb2NrQ2xhc3MoeyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzKTtcblx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IG9JbnN0YW5jZS5nZXRQcm9wZXJ0aWVzKCk7XG5cdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRPYmplY3QgPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHRpZiAoaXNDb250ZXh0KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdCBhcyBDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlT2JqZWN0VmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoYXR0cmlidXRlVmFsdWUsIHRhcmdldE9iamVjdCk7XG5cdFx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChhdHRyaWJ1dGVWYWx1ZSkhO1xuXHRcdFx0XHRcdHVuc3RvcmVPYmplY3RWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBuZXdDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBCdWlsZGluZ0Jsb2NrQ2xhc3MpO1xuXHRcdG1Db250ZXh0c1tcInRoaXNcIl0gPSBvQXR0cmlidXRlc01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBNYWNyb0luZm8gfCB1bmRlZmluZWQ7XG5cdFx0Ly8gY29yZTpyZXF1aXJlIG5lZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgbm9kZSBpdHNlbGYgdG8gYmUgcGlja2VkIHVwIGR1ZSB0byB0aGUgdGVtcGxhdGluZyBzdGVwXG5cdFx0Y29uc3QgY29yZVJlcXVpcmUgPSBvTm9kZT8uZ2V0QXR0cmlidXRlKFwiY29yZTpyZXF1aXJlXCIpIHx8IHVuZGVmaW5lZDtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8/Lm1hY3JvSW5mbykge1xuXHRcdFx0XHRvUHJldmlvdXNNYWNyb0luZm8gPSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1RyYWNlSW5mby5tYWNyb0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0VmlzaXRvciA9IG9WaXNpdG9yLndpdGgobUNvbnRleHRzLCBvTWV0YWRhdGEuaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhb01ldGFkYXRhLmlzT3BlbiA6IHRydWUpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChvTWV0YWRhdGEuZnJhZ21lbnQpIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb2xkS2V5cyA9IE9iamVjdC5rZXlzKHRlbXBvcmFyeU9iamVjdFN0b3JlKTtcblx0XHRcdFx0bGV0IHRlbXBsYXRlU3RyaW5nO1xuXHRcdFx0XHRpZiAoKG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdHRlbXBsYXRlU3RyaW5nID0gYXdhaXQganN4LnJlbmRlckFzWE1MKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0XHQob0luc3RhbmNlIGFzIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrKS5nZXRSdW50aW1lQnVpbGRpbmdCbG9ja1RlbXBsYXRlKG9Ob2RlKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGVtcGxhdGVTdHJpbmcgPSBhd2FpdCBqc3gucmVuZGVyQXNYTUwoYXN5bmMgKCkgPT4gb0luc3RhbmNlLmdldFRlbXBsYXRlIShvTm9kZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKEJ1aWxkaW5nQmxvY2tDbGFzcy5pc1J1bnRpbWUpIHtcblx0XHRcdFx0XHQvLyBGb3IgcnVudGltZSBidWlsZGluZyBibG9ja3MsIHdlIG5lZWQgdG8gYXR0YWNoIGFsbCBvYmplY3RzIHRvIHRoZSBjb252ZXJ0ZXJDb250ZXh0IGRpcmVjdGx5LCBhcyB0aGUgYWN0dWFsIHJlbmRlcmluZyB0YWtlcyBwbGFjZSBhdCBydW50aW1lXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzdG9yZUtleSBpbiB0ZW1wb3JhcnlPYmplY3RTdG9yZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvbGRLZXlzLmluY2x1ZGVzKHN0b3JlS2V5KSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gdW5zdG9yZU9iamVjdFZhbHVlKHN0b3JlS2V5KTtcblx0XHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHN0b3JlS2V5LCBkYXRhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgaGFzRXJyb3IgPSBcIlwiO1xuXHRcdFx0XHRpZiAodGVtcGxhdGVTdHJpbmcpIHtcblx0XHRcdFx0XHRsZXQgaGFzUGFyc2VFcnJvciA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKHRlbXBsYXRlU3RyaW5nLCB0cnVlKTtcblx0XHRcdFx0XHQvLyBGb3Igc2FmZXR5IHB1cnBvc2Ugd2UgdHJ5IHRvIGRldGVjdCB0cmFpbGluZyB0ZXh0IGluIGJldHdlZW4gWE1MIFRhZ3Ncblx0XHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcGFyc2VkVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZXIgPSBkb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdFx0aGFzUGFyc2VFcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR3aGlsZSAodGV4dG5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHRleHRub2RlLnRleHRDb250ZW50ICYmIHRleHRub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGFzRXJyb3IgPSB0ZXh0bm9kZS50ZXh0Q29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaGFzUGFyc2VFcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke29NZXRhZGF0YS54bWxUYWcgfHwgb01ldGFkYXRhLm5hbWV9YCwgaGFzRXJyb3IpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSAoYXdhaXQgcHJvY2Vzc1htbEluVHJhY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgaW5pdGlhbFRlbXBsYXRlO1xuXHRcdFx0XHRcdFx0XHRpZiAoKG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0KG9JbnN0YW5jZSBhcyBSdW50aW1lQnVpbGRpbmdCbG9jaykuZ2V0UnVudGltZUJ1aWxkaW5nQmxvY2tUZW1wbGF0ZShvTm9kZSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGluaXRpYWxUZW1wbGF0ZSA9IGF3YWl0IGpzeC5yZW5kZXJBc1hNTChhc3luYyAoKSA9PiBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUhKG9Ob2RlKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGluaXRpYWxUZW1wbGF0ZSA/PyBcIlwiLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0pKSBhcyBFbGVtZW50W107XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChoYXNFcnJvci5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBpcyB0cmFpbGluZyB0ZXh0IHdlIGNyZWF0ZSBhIHN0YW5kYXJkIGVycm9yIGFuZCBkaXNwbGF5IGl0LlxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvclRleHQgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7b01ldGFkYXRhLnhtbFRhZyB8fCBvTWV0YWRhdGEubmFtZX1gLFxuXHRcdFx0XHRcdFx0XHRcdGBUcmFpbGluZyB0ZXh0IHdhcyBmb3VuZCBpbiB0aGUgWE1MOiAke2hhc0Vycm9yfWBcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUub3V0ZXJIVE1MKS5qb2luKFwiXFxuXCIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyc2VkVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgoLi4ucGFyc2VkVGVtcGxhdGUpO1xuXG5cdFx0XHRcdFx0Y29uc3QgdmlzaXRlZE5vZGVzID0gcGFyc2VkVGVtcGxhdGUubWFwKGFzeW5jIChpbnRlcm5hbE5vZGUpID0+IHtcblx0XHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBpbnRlcm5hbE5vZGUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJldHVybiBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKGludGVybmFsTm9kZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLmFsbCh2aXNpdGVkTm9kZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRwcm9jZXNzU2xvdHMob0FnZ3JlZ2F0aW9ucywgb01ldGFkYXRhLmFnZ3JlZ2F0aW9ucywgb01hY3JvRWxlbWVudCwgdHJ1ZSk7XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoY29yZVJlcXVpcmUpIHtcblx0XHRcdFx0XHRsZXQgcmVxdWlyZU9uTWFjcm8gPSBvTWFjcm9FbGVtZW50LmdldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJyZXF1aXJlXCIpO1xuXHRcdFx0XHRcdGlmIChyZXF1aXJlT25NYWNybykge1xuXHRcdFx0XHRcdFx0cmVxdWlyZU9uTWFjcm8gPSByZXF1aXJlT25NYWNyby5zdWJzdHJpbmcoMCwgcmVxdWlyZU9uTWFjcm8ubGVuZ3RoIC0gMSkgKyBcIixcIiArIGNvcmVSZXF1aXJlLnN1YnN0cmluZygxKTsgLy8gUmVtb3ZlIGxhc3QgfSBhbmQgZmlyc3Qge1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXF1aXJlT25NYWNybyA9IGNvcmVSZXF1aXJlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwic2FwLnVpLmNvcmVcIiwgXCJjb3JlOnJlcXVpcmVcIiwgcmVxdWlyZU9uTWFjcm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlOiB1bmtub3duKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKCFpbml0aWFsS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdGlmIChpc0NvbnRleHQocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cmFjZURldGFpbHMucmVzb2x2ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdExvZy5lcnJvcihlIGFzIHN0cmluZyk7XG5cdFx0Y29uc3Qgb0Vycm9yID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRbYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtvTWV0YWRhdGEubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdChlIGFzIEVycm9yKS5zdGFja1xuXHRcdCk7XG5cdFx0Y29uc3Qgb1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yLCB0cnVlKTtcblx0XHRvTm9kZS5yZXBsYWNlV2l0aCguLi5vVGVtcGxhdGUpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KFxuXHRtQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIENvbnRleHQgfCB1bmRlZmluZWQ+LFxuXHRvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjayxcblx0b0N0eDoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHR9XG4pOiB2b2lkIHtcblx0Y29uc3Qgc0tleSA9IChvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQpIGFzIHN0cmluZztcblx0aWYgKG1Db250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoIC8qLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0qLyk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSBpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsIV0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWwhXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LFxuXHRcdC8vIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3IgcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gQnVpbGRpbmdCbG9ja0NsYXNzIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0YXN5bmMgKG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSVZpc2l0b3JDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS54bWxUYWcgfHwgQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogVW5SZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gc28gdGhhdCBpdCBpcyBubyBsb25nZXIgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKlxuICogQHBhcmFtIEJ1aWxkaW5nQmxvY2tDbGFzcyBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckJ1aWxkaW5nQmxvY2soQnVpbGRpbmdCbG9ja0NsYXNzOiB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKTogdm9pZCB7XG5cdGlmIChCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0bnVsbCxcblx0XHRcdEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lc3BhY2UsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEueG1sVGFnIHx8IEJ1aWxkaW5nQmxvY2tDbGFzcy5tZXRhZGF0YS5uYW1lXG5cdFx0KTtcblx0fVxuXHRpZiAoQnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdG51bGwsXG5cdFx0XHRCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0QnVpbGRpbmdCbG9ja0NsYXNzLm1ldGFkYXRhLnhtbFRhZyB8fCBCdWlsZGluZ0Jsb2NrQ2xhc3MubWV0YWRhdGEubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIns9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfVwiIC8+YDtcblx0fVxuXHRsZXQgYWRkaXRpb25hbFRleHQgPSBcIlwiO1xuXHRpZiAoYWRkaXRpb25hbERhdGEpIHtcblx0XHRhZGRpdGlvbmFsVGV4dCA9IHhtbGA8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIlRyYWNlIEluZm9cIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJqc29uXCIgIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8Y29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyIHhtbG5zOmNvbnRyb2xzPVwic2FwLmZlLmNvcmUuY29udHJvbHNcIj5cblx0XHRcdFx0XHQ8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiIGNvcmU6cmVxdWlyZT1cIntCQkY6J3NhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdFx0JHtlcnJvckxhYmVsc31cblx0XHRcdFx0XHQke2Vycm9yU3RhY2t9XG5cdFx0XHRcdFx0XHQ8Z3JpZDpDU1NHcmlkIGdyaWRUZW1wbGF0ZVJvd3M9XCJmclwiIGdyaWRUZW1wbGF0ZUNvbHVtbnM9XCJyZXBlYXQoMiwxZnIpXCIgZ3JpZEdhcD1cIjFyZW1cIiB4bWxuczpncmlkPVwic2FwLnVpLmxheW91dC5jc3NncmlkXCIgPlxuXHRcdFx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoeG1sRnJhZ21lbnQucmVwbGFjZUFsbChcIiZndDtcIiwgXCI+XCIpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdFx0XHQke2FkZGl0aW9uYWxUZXh0fVxuXHRcdFx0XHRcdFx0PC9ncmlkOkNTU0dyaWQ+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdDwvY29udHJvbHM6Rm9ybUVsZW1lbnRXcmFwcGVyPmA7XG59XG5cbmNvbnN0IHRlbXBvcmFyeU9iamVjdFN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4vKipcbiAqIFN0b3JlcyBhbiBvYmplY3QgdmFsdWUgaW4gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhbmQgcmV0dXJucyBhbiBJRCB1c2VkIHRvIHJldHJpZXZlIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLlxuICpcbiAqIFJlcXVpcmVkIGFzIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgeG1sYCBmdW5jdGlvbiwgd2hpY2ggbWlnaHQgdGFrZSBvYmplY3RzIGFzIHBhcmFtZXRlcnMgYnV0IG5lZWRzIHRvIHJldHVybiBhIHNlcmlhbGl6ZWQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzdG9yZVxuICogQHJldHVybnMgSUQgdG8gcmV0cmlldmUgdGhpcyB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVPYmplY3RWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYC91aWQtLSR7dWlkKCl9YDtcblx0dGVtcG9yYXJ5T2JqZWN0U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWU7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBVbnN0b3JlcyBhbiBvYmplY3QgZnJvbSBhIHRlbXBvcmFyeSBzdG9yZSBieSByZW1vdmluZyBpdCBhbmQgcmV0dXJuaW5nIGl0cyBvYmplY3QgdmFsdWUuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5VUlEIElEIHRvIHJldHJpZXZlIHRoaXMgdmFsdWVcbiAqIEByZXR1cm5zIE9iamVjdCB2YWx1ZVxuICovXG5mdW5jdGlvbiB1bnN0b3JlT2JqZWN0VmFsdWUocHJvcGVydHlVSUQ6IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCB2YWx1ZSA9IHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0ZGVsZXRlIHRlbXBvcmFyeU9iamVjdFN0b3JlW3Byb3BlcnR5VUlEXTtcblx0cmV0dXJuIHZhbHVlO1xufVxuXG5sZXQgcHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBhbGwgeG1sYCBjYWxscyBpbnNpZGUgdGhlIGdpdmVuIG1ldGhvZCBhcmUgcHJvY2Vzc2VkIGluIHRyYWNlIG1vZGUuXG4gKlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGdpdmVuIG1ldGhvZFxuICovXG5jb25zdCBwcm9jZXNzWG1sSW5UcmFjZSA9IGFzeW5jIGZ1bmN0aW9uIChtZXRob2Q6ICguLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcblx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gdHJ1ZTtcblx0bGV0IHJldHVyblZhbHVlO1xuXHR0cnkge1xuXHRcdHJldHVyblZhbHVlID0gbWV0aG9kKCk7XG5cdH0gZmluYWxseSB7XG5cdFx0cHJvY2Vzc05leHRYbWxJblRyYWNlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIHJldHVyblZhbHVlO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIFthZGREZWZhdWx0TmFtZXNwYWNlc10gV2hldGhlciBvciBub3QgZGVmYXVsdCBuYW1lc3BhY2VzIHNob3VsZCBiZSBhZGRlZFxuICogQHJldHVybnMgVGhlIFhNTCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlcyA9IGZhbHNlKTogRWxlbWVudFtdIHtcblx0aWYgKGFkZERlZmF1bHROYW1lc3BhY2VzKSB7XG5cdFx0eG1sU3RyaW5nID0gYDx0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0eG1sbnM6dGVtcGxhdGU9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiXG5cdFx0XHRcdFx0XHR4bWxuczptPVwic2FwLm1cIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWFjcm9zPVwic2FwLmZlLm1hY3Jvc1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWRjPVwic2FwLnVpLm1kY1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0Y29uc3QgY2hpbGRyZW4gPSBvdXRwdXQ/LnBhcmVudEVsZW1lbnQgPyBvdXRwdXQ/LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4gOiBbb3V0cHV0IGFzIEVsZW1lbnRdO1xuXHRyZXR1cm4gQXJyYXkuZnJvbShjaGlsZHJlbik7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gdmFsdWU/LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJmFwb3M7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdGlmICh4bWxSZXN1bHQ/Lmxlbmd0aCA+IDAgJiYgeG1sUmVzdWx0WzBdPy5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICh4bWxSZXN1bHRbMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCAoeG1sUmVzdWx0WzBdIGFzIEhUTUxFbGVtZW50KS5pbm5lckhUTUw7XG5cdFx0cmV0dXJuIGNyZWF0ZUVycm9yWE1MKFtlcnJvck1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF1dLCBvdXRTdHIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvdXRTdHI7XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgWE1MUHJvY2Vzc29yVHlwZVZhbHVlID1cblx0fCBzdHJpbmdcblx0fCBib29sZWFuXG5cdHwgbnVtYmVyXG5cdHwgdW5kZWZpbmVkXG5cdHwgbnVsbFxuXHR8IG9iamVjdFxuXHR8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cdHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+XG5cdHwgQXJyYXk8c3RyaW5nPlxuXHR8IEFycmF5PEZ1bmN0aW9uPlxuXHR8IEZ1bmN0aW9uXG5cdHwgQ29udGV4dDtcbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgb2JqZWN0IGNhc2UuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogWE1MUHJvY2Vzc29yVHlwZVZhbHVlW10pOiBzdHJpbmcgPT4ge1xuXHRsZXQgb3V0U3RyID0gXCJcIjtcblx0bGV0IGk7XG5cdGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblxuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVbMF0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZS5mbGF0KDUpLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAoaXNGdW5jdGlvbkFycmF5KHZhbHVlKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlLm1hcCgodmFsdWVmbikgPT4gdmFsdWVmbigpKS5qb2luKFwiXFxuXCIpO1xuXHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZSk7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0b3V0U3RyICs9IFwie3RoaXM+dW5kZWZpbmVkVmFsdWV9XCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGlmIChpc0NvbnRleHQodmFsdWUpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZS5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlT2JqZWN0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIjxcIikgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRvdXRTdHIgPSBvdXRTdHIudHJpbSgpO1xuXHRpZiAocHJvY2Vzc05leHRYbWxJblRyYWNlKSB7XG5cdFx0cmV0dXJuIHJlbmRlckluVHJhY2VNb2RlKG91dFN0cik7XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDb25kaXRpb25hbGx5VG9YTUwgPSBmdW5jdGlvbiAoY29uZGl0aW9uOiBib29sZWFuLCBwYXJ0VG9BZGQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmIChjb25kaXRpb24pIHtcblx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhdHRyaWJ1dGUgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cbiAqIElmIGl0J3MgdW5kZWZpbmVkIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGFkZGVkLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zIFRoZSBhdHRyaWJ1dGUgdG8gYWRkIGlmIHRoZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRBdHRyaWJ1dGVUb1hNTCA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHZhbHVlPzogWE1MUHJvY2Vzc29yVHlwZVZhbHVlKTogKCkgPT4gc3RyaW5nIHtcblx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzVW5kZWZpbmVkRXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRyZXR1cm4gKCkgPT4geG1sYCR7YXR0cmlidXRlTmFtZX09XCIke3ZhbHVlfVwiYDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKCkgPT4gXCJcIjtcblx0fVxufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7RUFnQ0EsTUFBTUEsWUFBWSxHQUFHLHNFQUFzRTtFQUMzRixNQUFNQyxnQkFBZ0IsR0FBRyxnRUFBZ0U7RUFDekYsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsU0FBUyxFQUFFO0VBNkd6QyxTQUFTQyw0QkFBNEIsQ0FDcENDLEtBQWEsRUFDYkMs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
|