@sapui5/sap.fe.core 1.102.3 → 1.105.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -2,11 +2,39 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, CommonUtils, BusyLocker, messageHandling, FPMHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel"], function (Log, ActionRuntime, CommonUtils, BusyLocker, messageHandling, FPMHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, JSONModel) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var generate = StableIdHelper.generate;
|
|
9
9
|
|
|
10
|
+
function _catch(body, recover) {
|
|
11
|
+
try {
|
|
12
|
+
var result = body();
|
|
13
|
+
} catch (e) {
|
|
14
|
+
return recover(e);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (result && result.then) {
|
|
18
|
+
return result.then(void 0, recover);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function _finallyRethrows(body, finalizer) {
|
|
25
|
+
try {
|
|
26
|
+
var result = body();
|
|
27
|
+
} catch (e) {
|
|
28
|
+
return finalizer(true, e);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (result && result.then) {
|
|
32
|
+
return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return finalizer(false, result);
|
|
36
|
+
}
|
|
37
|
+
|
|
10
38
|
var Constants = FELibrary.Constants,
|
|
11
39
|
InvocationGrouping = FELibrary.InvocationGrouping;
|
|
12
40
|
var Action = MessageBox.Action;
|
|
@@ -17,22 +45,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
17
45
|
* @static
|
|
18
46
|
* @name sap.fe.core.actions.operations.callBoundAction
|
|
19
47
|
* @memberof sap.fe.core.actions.operations
|
|
20
|
-
* @param
|
|
21
|
-
* @param
|
|
22
|
-
* @param
|
|
23
|
-
* @param
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @param
|
|
27
|
-
* @param
|
|
28
|
-
* @param
|
|
29
|
-
* @param
|
|
30
|
-
* @param
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
33
|
-
* @param
|
|
34
|
-
* @param
|
|
35
|
-
* @returns
|
|
48
|
+
* @param sActionName The name of the action to be called
|
|
49
|
+
* @param contexts Either one context or an array with contexts for which the action is to be be called
|
|
50
|
+
* @param oModel OData Model
|
|
51
|
+
* @param oAppComponent The AppComponent
|
|
52
|
+
* @param [mParameters] Optional, can contain the following attributes:
|
|
53
|
+
* @param [mParameters.actionParameters] A map of parameters to be sent for every action call
|
|
54
|
+
* @param [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
|
|
55
|
+
* @param [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
|
|
56
|
+
* @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
|
|
57
|
+
* @param [mParameters.label] A human-readable label for the action
|
|
58
|
+
* @param [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
|
|
59
|
+
* @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
|
|
60
|
+
* @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
|
|
61
|
+
* @param [mParameters.parentControl] If specified the dialogs are added as dependent of the parent control
|
|
62
|
+
* @param [mParameters.bGetBoundContext] If specified the action promise returns the bound context
|
|
63
|
+
* @returns Promise resolves with an array of response objects (TODO: to be changed)
|
|
36
64
|
* @private
|
|
37
65
|
* @ui5-restricted
|
|
38
66
|
*/
|
|
@@ -52,8 +80,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
52
80
|
}
|
|
53
81
|
|
|
54
82
|
var oMetaModel = oModel.getMetaModel(),
|
|
55
|
-
sActionPath = oMetaModel.getMetaPath(contexts[0].getPath())
|
|
56
|
-
oBoundAction = oMetaModel.createBindingContext(sActionPath
|
|
83
|
+
sActionPath = "".concat(oMetaModel.getMetaPath(contexts[0].getPath()), "/").concat(sActionName),
|
|
84
|
+
oBoundAction = oMetaModel.createBindingContext("".concat(sActionPath, "/@$ui5.overload/0"));
|
|
57
85
|
mParameters.aContexts = contexts;
|
|
58
86
|
mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath, contexts, oBoundAction);
|
|
59
87
|
return callAction(sActionName, oModel, oBoundAction, oAppComponent, mParameters);
|
|
@@ -65,16 +93,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
65
93
|
* @static
|
|
66
94
|
* @name sap.fe.core.actions.operations.callActionImport
|
|
67
95
|
* @memberof sap.fe.core.actions.operations
|
|
68
|
-
* @param
|
|
69
|
-
* @param
|
|
70
|
-
* @param
|
|
71
|
-
* @param
|
|
72
|
-
* @param
|
|
73
|
-
* @param
|
|
74
|
-
* @param
|
|
75
|
-
* @param
|
|
76
|
-
* @param
|
|
77
|
-
* @returns
|
|
96
|
+
* @param sActionName The name of the action import to be called
|
|
97
|
+
* @param oModel An instance of an OData v4 model
|
|
98
|
+
* @param oAppComponent The AppComponent
|
|
99
|
+
* @param [mParameters] Optional, can contain the following attributes:
|
|
100
|
+
* @param [mParameters.actionParameters] A map of parameters to be sent with the action import
|
|
101
|
+
* @param [mParameters.label] A human-readable label for the action
|
|
102
|
+
* @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
|
|
103
|
+
* @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
|
|
104
|
+
* @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
|
|
105
|
+
* @returns Promise resolves with an array of response objects (TODO: to be changed)
|
|
78
106
|
* @private
|
|
79
107
|
* @ui5-restricted
|
|
80
108
|
*/
|
|
@@ -86,9 +114,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
86
114
|
}
|
|
87
115
|
|
|
88
116
|
var oMetaModel = oModel.getMetaModel(),
|
|
89
|
-
sActionPath = oModel.bindContext("/"
|
|
90
|
-
oActionImport = oMetaModel.createBindingContext("/"
|
|
91
|
-
mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath
|
|
117
|
+
sActionPath = oModel.bindContext("/".concat(sActionName)).getPath(),
|
|
118
|
+
oActionImport = oMetaModel.createBindingContext("/".concat(oMetaModel.createBindingContext(sActionPath).getObject("$Action"), "/0"));
|
|
119
|
+
mParameters.isCriticalAction = getIsActionCritical(oMetaModel, "".concat(sActionPath, "/@$ui5.overload"));
|
|
92
120
|
return callAction(sActionName, oModel, oActionImport, oAppComponent, mParameters);
|
|
93
121
|
}
|
|
94
122
|
|
|
@@ -98,7 +126,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
98
126
|
}
|
|
99
127
|
|
|
100
128
|
var oMetaModel = oModel.getMetaModel(),
|
|
101
|
-
sFunctionPath = oMetaModel.getMetaPath(context.getPath())
|
|
129
|
+
sFunctionPath = "".concat(oMetaModel.getMetaPath(context.getPath()), "/").concat(sFunctionName),
|
|
102
130
|
oBoundFunction = oMetaModel.createBindingContext(sFunctionPath);
|
|
103
131
|
return _executeFunction(sFunctionName, oModel, oBoundFunction, context);
|
|
104
132
|
}
|
|
@@ -109,9 +137,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
109
137
|
* @static
|
|
110
138
|
* @name sap.fe.core.actions.operations.callFunctionImport
|
|
111
139
|
* @memberof sap.fe.core.actions.operations
|
|
112
|
-
* @param
|
|
113
|
-
* @param
|
|
114
|
-
* @returns
|
|
140
|
+
* @param sFunctionName The name of the function to be called
|
|
141
|
+
* @param oModel An instance of an OData v4 model
|
|
142
|
+
* @returns Promise resolves
|
|
115
143
|
* @private
|
|
116
144
|
*/
|
|
117
145
|
|
|
@@ -122,8 +150,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
122
150
|
}
|
|
123
151
|
|
|
124
152
|
var oMetaModel = oModel.getMetaModel(),
|
|
125
|
-
sFunctionPath = oModel.bindContext("/"
|
|
126
|
-
oFunctionImport = oMetaModel.createBindingContext("/"
|
|
153
|
+
sFunctionPath = oModel.bindContext("/".concat(sFunctionName)).getPath(),
|
|
154
|
+
oFunctionImport = oMetaModel.createBindingContext("/".concat(oMetaModel.createBindingContext(sFunctionPath).getObject("$Function"), "/0"));
|
|
127
155
|
return _executeFunction(sFunctionName, oModel, oFunctionImport);
|
|
128
156
|
}
|
|
129
157
|
|
|
@@ -131,14 +159,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
131
159
|
var sGroupId;
|
|
132
160
|
|
|
133
161
|
if (!oFunction || !oFunction.getObject()) {
|
|
134
|
-
return Promise.reject(new Error("Function "
|
|
162
|
+
return Promise.reject(new Error("Function ".concat(sFunctionName, " not found")));
|
|
135
163
|
}
|
|
136
164
|
|
|
137
165
|
if (context) {
|
|
138
|
-
oFunction = oModel.bindContext(sFunctionName
|
|
166
|
+
oFunction = oModel.bindContext("".concat(sFunctionName, "(...)"), context);
|
|
139
167
|
sGroupId = "functionGroup";
|
|
140
168
|
} else {
|
|
141
|
-
oFunction = oModel.bindContext("/"
|
|
169
|
+
oFunction = oModel.bindContext("/".concat(sFunctionName, "(...)"));
|
|
142
170
|
sGroupId = "functionImport";
|
|
143
171
|
}
|
|
144
172
|
|
|
@@ -169,16 +197,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
169
197
|
var actionDefinition = oAction.getObject();
|
|
170
198
|
|
|
171
199
|
if (!oAction || !oAction.getObject()) {
|
|
172
|
-
return reject(new Error("Action "
|
|
200
|
+
return reject(new Error("Action ".concat(sActionName, " not found")));
|
|
173
201
|
}
|
|
174
202
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if (!aActionParameters || aActionParameters.length === 0) {
|
|
179
|
-
bShowActionParameterDialog = false;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
203
|
+
aActionParameters = getActionParameters(oAction);
|
|
204
|
+
bShowActionParameterDialog = _showActionParameterDialog(bShowActionParameterDialog, aActionParameters);
|
|
182
205
|
|
|
183
206
|
if (bShowActionParameterDialog) {
|
|
184
207
|
fnDialog = showActionParameterDialog;
|
|
@@ -194,14 +217,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
194
217
|
aActionParameters: aActionParameters,
|
|
195
218
|
bGetBoundContext: mParameters.bGetBoundContext,
|
|
196
219
|
defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction,
|
|
197
|
-
label: mParameters.label
|
|
220
|
+
label: mParameters.label,
|
|
221
|
+
selectedItems: mParameters.selectedItems
|
|
198
222
|
};
|
|
199
223
|
|
|
200
224
|
if (oAction.getObject("$IsBound")) {
|
|
201
225
|
if (mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions) {
|
|
202
226
|
oMetaModel = oModel.getMetaModel();
|
|
203
227
|
sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
|
|
204
|
-
sMessagesPath = oMetaModel.getObject(sMetaPath
|
|
228
|
+
sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
205
229
|
|
|
206
230
|
if (sMessagesPath) {
|
|
207
231
|
iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(function (exp) {
|
|
@@ -217,8 +241,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
217
241
|
// to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
|
|
218
242
|
mParameters.mBindingParameters = mParameters.mBindingParameters || {};
|
|
219
243
|
|
|
220
|
-
if (oAction.getObject("$ReturnType/$Type/"
|
|
221
|
-
mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? mParameters.mBindingParameters.$select
|
|
244
|
+
if (oAction.getObject("$ReturnType/$Type/".concat(sMessagesPath)) && (!mParameters.mBindingParameters.$select || mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)) {
|
|
245
|
+
mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? "".concat(mParameters.mBindingParameters.$select, ",").concat(sMessagesPath) : sMessagesPath; // Add side effects at entity level because $select stops these being returned by the action
|
|
222
246
|
// Only if no other side effects were added for Messages
|
|
223
247
|
|
|
224
248
|
if (iMessageSideEffect === -1) {
|
|
@@ -241,6 +265,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
241
265
|
mActionExecutionParameters.bReturnAsArray = mParameters.bReturnAsArray;
|
|
242
266
|
mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
|
|
243
267
|
mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
|
|
268
|
+
mActionExecutionParameters.isCreateAction = bIsCreateAction;
|
|
244
269
|
mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
|
|
245
270
|
|
|
246
271
|
if (mParameters.controlId) {
|
|
@@ -257,7 +282,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
257
282
|
if (fnDialog) {
|
|
258
283
|
oActionPromise = fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, aActionParameters, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler);
|
|
259
284
|
} else {
|
|
260
|
-
oActionPromise = _executeAction(oAppComponent, mActionExecutionParameters);
|
|
285
|
+
oActionPromise = _executeAction(oAppComponent, mActionExecutionParameters, mParameters.parentControl);
|
|
261
286
|
}
|
|
262
287
|
|
|
263
288
|
return oActionPromise.then(function (oOperationResult) {
|
|
@@ -268,7 +293,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
268
293
|
});
|
|
269
294
|
|
|
270
295
|
if (!isStatic) {
|
|
271
|
-
|
|
296
|
+
ActionRuntime.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), mParameters.selectedItems, "table");
|
|
272
297
|
}
|
|
273
298
|
}
|
|
274
299
|
|
|
@@ -283,23 +308,39 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
283
308
|
return new Promise(function (resolve, reject) {
|
|
284
309
|
var boundActionName = sActionName ? sActionName : null;
|
|
285
310
|
boundActionName = boundActionName.indexOf(".") >= 0 ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
|
|
286
|
-
var suffixResourceKey = boundActionName && entitySetName ? entitySetName
|
|
311
|
+
var suffixResourceKey = boundActionName && entitySetName ? "".concat(entitySetName, "|").concat(boundActionName) : "";
|
|
287
312
|
var oResourceBundle = oParentControl.getController().oResourceBundle;
|
|
288
313
|
var sConfirmationText = CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", oResourceBundle, null, suffixResourceKey);
|
|
289
314
|
MessageBox.confirm(sConfirmationText, {
|
|
290
315
|
onClose: function (sAction) {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
316
|
+
try {
|
|
317
|
+
var _temp4 = function () {
|
|
318
|
+
if (sAction === Action.OK) {
|
|
319
|
+
var _temp5 = _catch(function () {
|
|
320
|
+
return Promise.resolve(_executeAction(oAppComponent, mParameters, oParentControl)).then(function (oOperation) {
|
|
321
|
+
resolve(oOperation);
|
|
322
|
+
});
|
|
323
|
+
}, function (oError) {
|
|
324
|
+
var _temp = _catch(function () {
|
|
325
|
+
return Promise.resolve(messageHandler.showMessageDialog()).then(function () {
|
|
326
|
+
reject(oError);
|
|
327
|
+
});
|
|
328
|
+
}, function () {
|
|
329
|
+
reject(oError);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
return _temp && _temp.then ? _temp.then(function () {}) : void 0;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
if (_temp5 && _temp5.then) return _temp5.then(function () {});
|
|
336
|
+
} else {
|
|
337
|
+
resolve();
|
|
338
|
+
}
|
|
339
|
+
}();
|
|
340
|
+
|
|
341
|
+
return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(function () {}) : void 0);
|
|
342
|
+
} catch (e) {
|
|
343
|
+
return Promise.reject(e);
|
|
303
344
|
}
|
|
304
345
|
}
|
|
305
346
|
});
|
|
@@ -312,500 +353,599 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
312
353
|
entitySetContext = metaModel.createBindingContext(sPath),
|
|
313
354
|
sActionNamePath = oActionContext.getObject("$IsBound") ? oActionContext.getPath().split("/@$ui5.overload/0")[0] : oActionContext.getPath().split("/0")[0],
|
|
314
355
|
actionNameContext = metaModel.createBindingContext(sActionNamePath),
|
|
356
|
+
bIsCreateAction = mParameters.isCreateAction,
|
|
315
357
|
sFragmentName = "sap/fe/core/controls/ActionParameterDialog";
|
|
316
358
|
|
|
317
359
|
return new Promise(function (resolve, reject) {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
var aFieldInvalid = [];
|
|
323
|
-
var aFormElements = [];
|
|
324
|
-
var mFieldValueMap = {};
|
|
325
|
-
|
|
326
|
-
var validateRequiredProperties = function () {
|
|
327
|
-
return Promise.all(aFormElements.filter(function (oFormElement) {
|
|
328
|
-
var oField = oFormElement.getFields()[0];
|
|
329
|
-
return oField.getRequired() && oField.getValueState() !== "Error";
|
|
330
|
-
}).map(function (oFormElement) {
|
|
331
|
-
var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField") ? oFormElement.getFields()[0].getItems() : oFormElement.getFields()[0].getValue();
|
|
332
|
-
|
|
333
|
-
if (value === undefined || value === null || value === "" || Array.isArray(value) && !value.length) {
|
|
334
|
-
return oFormElement.getLabel().getText();
|
|
335
|
-
}
|
|
336
|
-
})).then(function (aResults) {
|
|
337
|
-
aResults = aResults.filter(function (result) {
|
|
338
|
-
return result !== undefined;
|
|
339
|
-
});
|
|
340
|
-
return aResults;
|
|
360
|
+
try {
|
|
361
|
+
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
362
|
+
var oParameterModel = new JSONModel({
|
|
363
|
+
$displayMode: {}
|
|
341
364
|
});
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
var
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
var sParam = sParameter.replace("-inner", "");
|
|
357
|
-
|
|
358
|
-
if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::" + sParameter) || oMessage.getControlId().includes("APD_::" + sParameter + "inner") && aFieldInvalid.indexOf("APD_::" + sParam) < 0)) {
|
|
359
|
-
if (bClearTarget) {
|
|
360
|
-
oMessageManager.removeMessages(oMessage);
|
|
361
|
-
} else {
|
|
362
|
-
aFieldInvalid.push("APD_::" + sParam);
|
|
363
|
-
}
|
|
364
|
-
} // Handle messages related to input with invalid token
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
if (oMessage.target.includes("APD_::" + sParameter)) {
|
|
368
|
-
aFieldInvalid.push("APD_::" + sParam);
|
|
369
|
-
oMessage.target = bClearTarget ? "" : oMessage.target;
|
|
370
|
-
|
|
371
|
-
if (bClearTarget) {
|
|
372
|
-
oMessageManager.removeMessages(oMessage);
|
|
365
|
+
var aFieldInvalid = [];
|
|
366
|
+
var aFormElements = [];
|
|
367
|
+
var mFieldValueMap = {};
|
|
368
|
+
|
|
369
|
+
var validateRequiredProperties = function () {
|
|
370
|
+
try {
|
|
371
|
+
return Promise.resolve(Promise.all(aFormElements.filter(function (oFormElement) {
|
|
372
|
+
var oField = oFormElement.getFields()[0];
|
|
373
|
+
return oField.getRequired() && oField.getValueState() !== "Error";
|
|
374
|
+
}).map(function (oFormElement) {
|
|
375
|
+
var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField") ? oFormElement.getFields()[0].getItems() : oFormElement.getFields()[0].getValue();
|
|
376
|
+
|
|
377
|
+
if (value === undefined || value === null || value === "" || Array.isArray(value) && !value.length) {
|
|
378
|
+
return oFormElement.getLabel().getText();
|
|
373
379
|
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
var oController = {
|
|
381
|
-
handleChange: function (oEvent) {
|
|
382
|
-
messageHandler.removeTransitionMessages();
|
|
383
|
-
var oField = oEvent.getSource();
|
|
384
|
-
var sFieldId = oEvent.getParameter("id");
|
|
385
|
-
var oFieldPromise = oEvent.getParameter("promise");
|
|
386
|
-
|
|
387
|
-
if (oFieldPromise) {
|
|
388
|
-
mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
|
|
389
|
-
return oField.getValue();
|
|
380
|
+
}))).then(function (aResults) {
|
|
381
|
+
return aResults.filter(function (result) {
|
|
382
|
+
return result !== undefined;
|
|
383
|
+
});
|
|
390
384
|
});
|
|
385
|
+
} catch (e) {
|
|
386
|
+
return Promise.reject(e);
|
|
391
387
|
}
|
|
388
|
+
};
|
|
392
389
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
name: sFragmentName
|
|
398
|
-
}, {
|
|
399
|
-
bindingContexts: {
|
|
400
|
-
action: oActionContext,
|
|
401
|
-
actionName: actionNameContext,
|
|
402
|
-
entitySet: entitySetContext
|
|
403
|
-
},
|
|
404
|
-
models: {
|
|
405
|
-
action: oActionContext.getModel(),
|
|
406
|
-
actionName: actionNameContext.getModel(),
|
|
407
|
-
entitySet: entitySetContext.getModel(),
|
|
408
|
-
metaModel: entitySetContext.getModel()
|
|
409
|
-
}
|
|
410
|
-
})).then(function (oFragment) {
|
|
411
|
-
// TODO: move the dialog into the fragment and move the handlers to the oController
|
|
412
|
-
var aContexts;
|
|
413
|
-
var aFunctionParams = [];
|
|
414
|
-
var oOperationBinding;
|
|
415
|
-
return CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true).then(function () {
|
|
416
|
-
// TODO: move the dialog into the fragment and move the handlers to the oController
|
|
417
|
-
return Fragment.load({
|
|
418
|
-
definition: oFragment,
|
|
419
|
-
controller: oController
|
|
420
|
-
}).then(function (oDialogContent) {
|
|
421
|
-
var oResourceBundle = oParentControl.getController().oResourceBundle;
|
|
422
|
-
var oDialog = new Dialog(undefined, {
|
|
423
|
-
title: sActionLabel || CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE", oResourceBundle),
|
|
424
|
-
content: [oDialogContent],
|
|
425
|
-
escapeHandler: function () {
|
|
426
|
-
oDialog.close();
|
|
427
|
-
messageHandler.removeTransitionMessages();
|
|
428
|
-
reject();
|
|
429
|
-
},
|
|
430
|
-
beginButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Ok"]), {
|
|
431
|
-
text: sActionLabel || CommonUtils.getTranslatedText("C_COMMON_DIALOG_OK", oResourceBundle),
|
|
432
|
-
type: "Emphasized",
|
|
433
|
-
press: function () {
|
|
434
|
-
validateRequiredProperties().then(function (aEmptyMandatoryFields) {
|
|
435
|
-
if (aEmptyMandatoryFields.length) {
|
|
436
|
-
var oMessages = [];
|
|
437
|
-
|
|
438
|
-
for (var i = 0; i < aEmptyMandatoryFields.length; i++) {
|
|
439
|
-
oMessages.push({
|
|
440
|
-
text: CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_MISSING_MANDATORY_MSG", oResourceBundle, aEmptyMandatoryFields[i]),
|
|
441
|
-
code: 200,
|
|
442
|
-
type: "Error"
|
|
443
|
-
});
|
|
444
|
-
}
|
|
390
|
+
var _validateMessages = function (actionParameters, invalidFields, bClearTarget) {
|
|
391
|
+
var oMessageManager = Core.getMessageManager();
|
|
392
|
+
var aMessages = oMessageManager.getMessageModel().getData();
|
|
393
|
+
invalidFields = invalidFields || [];
|
|
445
394
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
395
|
+
if (!aMessages.length) {
|
|
396
|
+
invalidFields = [];
|
|
397
|
+
}
|
|
451
398
|
|
|
452
|
-
|
|
399
|
+
actionParameters.forEach(function (oActionParameters) {
|
|
400
|
+
var sParameter = oActionParameters.$Name;
|
|
401
|
+
aMessages.forEach(function (oMessage) {
|
|
402
|
+
var sParam = sParameter.replace("-inner", "");
|
|
453
403
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
404
|
+
if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::".concat(sParameter)) || oMessage.getControlId().includes("APD_::".concat(sParameter, "inner")) && invalidFields.indexOf("APD_::".concat(sParam)) < 0)) {
|
|
405
|
+
if (bClearTarget) {
|
|
406
|
+
oMessageManager.removeMessages(oMessage);
|
|
407
|
+
} else {
|
|
408
|
+
invalidFields.push("APD_::".concat(sParam));
|
|
409
|
+
}
|
|
410
|
+
} // Handle messages related to input with invalid token
|
|
457
411
|
|
|
458
|
-
BusyLocker.lock(oDialog);
|
|
459
|
-
return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
|
|
460
|
-
return mFieldValueMap[sKey];
|
|
461
|
-
})).then(function () {
|
|
462
|
-
// TODO: due to using the search and value helps on the action dialog transient messages could appear
|
|
463
|
-
// we need an UX design for those to show them to the user - for now remove them before continuing
|
|
464
|
-
messageHandler.removeTransitionMessages(); // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
|
|
465
412
|
|
|
466
|
-
|
|
467
|
-
|
|
413
|
+
if (oMessage.target.includes("APD_::".concat(sParameter))) {
|
|
414
|
+
invalidFields.push("APD_::".concat(sParam));
|
|
415
|
+
oMessage.target = bClearTarget ? "" : oMessage.target;
|
|
468
416
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
417
|
+
if (bClearTarget) {
|
|
418
|
+
oMessageManager.removeMessages(oMessage);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
return invalidFields;
|
|
424
|
+
};
|
|
473
425
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
426
|
+
var oController = {
|
|
427
|
+
handleChange: function (oEvent) {
|
|
428
|
+
messageHandler.removeTransitionMessages();
|
|
429
|
+
var oField = oEvent.getSource();
|
|
430
|
+
var sFieldId = oEvent.getParameter("id");
|
|
431
|
+
var oFieldPromise = oEvent.getParameter("promise");
|
|
477
432
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
433
|
+
if (oFieldPromise) {
|
|
434
|
+
mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
|
|
435
|
+
return oField.getValue();
|
|
436
|
+
});
|
|
437
|
+
}
|
|
482
438
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
439
|
+
_validateMessages(aActionParameters, aFieldInvalid);
|
|
440
|
+
}
|
|
441
|
+
};
|
|
486
442
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
443
|
+
var _temp7 = _catch(function () {
|
|
444
|
+
return Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
445
|
+
name: sFragmentName
|
|
446
|
+
}, {
|
|
447
|
+
bindingContexts: {
|
|
448
|
+
action: oActionContext,
|
|
449
|
+
actionName: actionNameContext,
|
|
450
|
+
entitySet: entitySetContext
|
|
451
|
+
},
|
|
452
|
+
models: {
|
|
453
|
+
action: oActionContext.getModel(),
|
|
454
|
+
actionName: actionNameContext.getModel(),
|
|
455
|
+
entitySet: entitySetContext.getModel(),
|
|
456
|
+
metaModel: entitySetContext.getModel()
|
|
457
|
+
}
|
|
458
|
+
})).then(function (createdFragment) {
|
|
459
|
+
// TODO: move the dialog into the fragment and move the handlers to the oController
|
|
460
|
+
var aContexts = mParameters.aContexts || [];
|
|
461
|
+
var aFunctionParams = []; // eslint-disable-next-line prefer-const
|
|
462
|
+
|
|
463
|
+
var oOperationBinding;
|
|
464
|
+
return Promise.resolve(CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true)).then(function () {
|
|
465
|
+
return Promise.resolve(Fragment.load({
|
|
466
|
+
definition: createdFragment,
|
|
467
|
+
controller: oController
|
|
468
|
+
})).then(function (_Fragment$load) {
|
|
469
|
+
var oDialogContent = _Fragment$load;
|
|
470
|
+
var oResourceBundle = oParentControl.getController().oResourceBundle;
|
|
471
|
+
var oDialog = new Dialog(undefined, {
|
|
472
|
+
title: sActionLabel || CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE", oResourceBundle),
|
|
473
|
+
content: [oDialogContent],
|
|
474
|
+
escapeHandler: function () {
|
|
475
|
+
oDialog.close();
|
|
476
|
+
messageHandler.removeTransitionMessages();
|
|
477
|
+
reject(Constants.CancelActionDialog);
|
|
478
|
+
},
|
|
479
|
+
beginButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Ok"]), {
|
|
480
|
+
text: bIsCreateAction ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE_BUTTON", oResourceBundle) : _getActionParameterActionName(oResourceBundle, sActionLabel, sActionName, entitySetName),
|
|
481
|
+
type: "Emphasized",
|
|
482
|
+
press: function () {
|
|
483
|
+
try {
|
|
484
|
+
return Promise.resolve(_catch(function () {
|
|
485
|
+
return Promise.resolve(validateRequiredProperties()).then(function (aEmptyMandatoryFields) {
|
|
486
|
+
var _exit = false;
|
|
487
|
+
|
|
488
|
+
function _temp9(_result2) {
|
|
489
|
+
if (_exit) return _result2;
|
|
490
|
+
BusyLocker.lock(oDialog);
|
|
491
|
+
return _finallyRethrows(function () {
|
|
492
|
+
return _catch(function () {
|
|
493
|
+
return Promise.resolve(Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
|
|
494
|
+
return mFieldValueMap[sKey];
|
|
495
|
+
}))).then(function () {
|
|
496
|
+
// TODO: due to using the search and value helps on the action dialog transient messages could appear
|
|
497
|
+
// we need an UX design for those to show them to the user - for now remove them before continuing
|
|
498
|
+
messageHandler.removeTransitionMessages(); // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
|
|
499
|
+
|
|
500
|
+
var vParameterValue;
|
|
501
|
+
var oParameterContext = oOperationBinding && oOperationBinding.getParameterContext();
|
|
502
|
+
|
|
503
|
+
for (var i in aActionParameters) {
|
|
504
|
+
if (aActionParameters[i].$isCollection) {
|
|
505
|
+
var aMVFContent = oDialog.getModel("mvfview").getProperty("/".concat(aActionParameters[i].$Name)),
|
|
506
|
+
aKeyValues = [];
|
|
507
|
+
|
|
508
|
+
for (var j in aMVFContent) {
|
|
509
|
+
aKeyValues.push(aMVFContent[j].Key);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
vParameterValue = aKeyValues;
|
|
513
|
+
} else {
|
|
514
|
+
vParameterValue = oParameterContext.getProperty(aActionParameters[i].$Name);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
aActionParameters[i].value = vParameterValue;
|
|
518
|
+
vParameterValue = undefined;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
mParameters.label = sActionLabel;
|
|
522
|
+
return _catch(function () {
|
|
523
|
+
return Promise.resolve(_executeAction(oAppComponent, mParameters, oParentControl)).then(function (oOperation) {
|
|
524
|
+
oDialog.close();
|
|
525
|
+
resolve(oOperation);
|
|
526
|
+
});
|
|
527
|
+
}, function (oError) {
|
|
528
|
+
var messages = messageHandling.getMessages();
|
|
529
|
+
messages = messages.concat(messageHandling.getMessages(true, true));
|
|
530
|
+
|
|
531
|
+
if (!mParameters.bGrouped && !(!mParameters.control.isA("sap.ui.mdc.Table") && aContexts.length === 1) && messages.length) {
|
|
532
|
+
var errorTargetsInAPD = false;
|
|
533
|
+
messages.forEach(function (message) {
|
|
534
|
+
if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPD === false) {
|
|
535
|
+
errorTargetsInAPD = true;
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
if (!errorTargetsInAPD) {
|
|
540
|
+
oDialog.close();
|
|
541
|
+
oDialog.destroy();
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
throw oError;
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
}, function () {
|
|
549
|
+
var oMessageManager = Core.getMessageManager();
|
|
550
|
+
var messages = oMessageManager.getMessageModel().getData();
|
|
551
|
+
var subtitleColumn = CommonUtils.getMessageColumn(mParameters.control);
|
|
552
|
+
var errorContext;
|
|
553
|
+
var errorTargetsInAPD = false;
|
|
554
|
+
messages.forEach(function (message) {
|
|
555
|
+
var messageTargets = message.getTargets();
|
|
556
|
+
|
|
557
|
+
if (messageTargets && messageTargets.length === 1 && messageTargets[0].length) {
|
|
558
|
+
errorContext = aContexts.find(function (oContext) {
|
|
559
|
+
return message.getTarget().indexOf(oContext.getPath()) !== -1;
|
|
560
|
+
});
|
|
561
|
+
message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (message.getTarget().indexOf(mParameters.actionName) !== -1 && message.getTarget().indexOf(mParameters.aActionParameters[0].$Name) !== -1 && errorTargetsInAPD === false) {
|
|
565
|
+
errorTargetsInAPD = true;
|
|
566
|
+
}
|
|
567
|
+
});
|
|
494
568
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
569
|
+
if (oDialog.isOpen()) {
|
|
570
|
+
if (!mParameters.bGrouped) {
|
|
571
|
+
//isolated
|
|
572
|
+
if (aContexts.length > 1 || !errorTargetsInAPD) {
|
|
573
|
+
// does not matter if error is in APD or not, if there are multiple contexts selected or if the error is not the APD, we close it.
|
|
574
|
+
oDialog.close();
|
|
575
|
+
oDialog.destroy();
|
|
576
|
+
}
|
|
577
|
+
} else if (mParameters.bGrouped && !errorTargetsInAPD) {
|
|
578
|
+
//changeset
|
|
579
|
+
oDialog.close();
|
|
580
|
+
oDialog.destroy();
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
var showErrorInAPD = oDialog.isOpen() && errorTargetsInAPD;
|
|
585
|
+
var bShowMessageBox = false;
|
|
586
|
+
|
|
587
|
+
if (messages.length === 1 && messages[0].getTarget() !== undefined && messages[0].getTarget() !== "") {
|
|
588
|
+
bShowMessageBox = true;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
var bHasEtagMessage = messageHandling.modifyETagMessagesOnly(oMessageManager, oResourceBundle, undefined);
|
|
592
|
+
messageHandler.showMessages({
|
|
593
|
+
bHasEtagMessage: bHasEtagMessage,
|
|
594
|
+
context: mParameters.aContexts[0],
|
|
595
|
+
isActionParameterDialogOpen: oDialog.isOpen(),
|
|
596
|
+
messagePageNavigationCallback: function () {
|
|
597
|
+
oDialog.close();
|
|
598
|
+
},
|
|
599
|
+
showErrorInAPD: showErrorInAPD,
|
|
600
|
+
bShowMessageBox: bShowMessageBox
|
|
601
|
+
});
|
|
498
602
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
var messageTargets = message.getTargets();
|
|
510
|
-
|
|
511
|
-
if (messageTargets && messageTargets.length === 1 && messageTargets[0].length) {
|
|
512
|
-
errorContext = aContexts.find(function (oContext) {
|
|
513
|
-
return message.getTarget().indexOf(oContext.getPath()) !== -1;
|
|
514
|
-
});
|
|
515
|
-
message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
|
|
516
|
-
}
|
|
603
|
+
if (oDialog && bHasEtagMessage && oDialog.isOpen()) {
|
|
604
|
+
oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
}, function (_wasThrown, _result4) {
|
|
608
|
+
BusyLocker.unlock(oDialog);
|
|
609
|
+
if (_wasThrown) throw _result4;
|
|
610
|
+
return _result4;
|
|
611
|
+
});
|
|
612
|
+
}
|
|
517
613
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
}
|
|
521
|
-
});
|
|
614
|
+
if (aEmptyMandatoryFields.length) {
|
|
615
|
+
var oMessages = [];
|
|
522
616
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
617
|
+
for (var i = 0; i < aEmptyMandatoryFields.length; i++) {
|
|
618
|
+
oMessages.push({
|
|
619
|
+
text: CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_MISSING_MANDATORY_MSG", oResourceBundle, aEmptyMandatoryFields[i]),
|
|
620
|
+
code: 200,
|
|
621
|
+
type: "Error"
|
|
622
|
+
});
|
|
623
|
+
}
|
|
526
624
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
isActionParameterDialogOpen: oDialog.isOpen(),
|
|
532
|
-
messagePageNavigationCallback: function () {
|
|
533
|
-
oDialog.close();
|
|
534
|
-
},
|
|
535
|
-
errorTargetsInAPM: errorTargetsInAPM,
|
|
536
|
-
bShowMessageBox: bShowMessageBox
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
if (oDialog && bHasEtagMessage && oDialog.isOpen()) {
|
|
540
|
-
oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
|
|
541
|
-
}
|
|
542
|
-
}).finally(function () {
|
|
543
|
-
BusyLocker.unlock(oDialog);
|
|
544
|
-
});
|
|
545
|
-
}).catch(function () {
|
|
546
|
-
return messageHandler.showMessageDialog();
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
}),
|
|
550
|
-
endButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Cancel"]), {
|
|
551
|
-
text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
|
|
552
|
-
press: function () {
|
|
553
|
-
_validateMessages(aActionParameters, aFieldInvalid, true);
|
|
554
|
-
|
|
555
|
-
oDialog.close();
|
|
556
|
-
messageHandler.removeTransitionMessages();
|
|
557
|
-
reject(Constants.CancelActionDialog);
|
|
558
|
-
}
|
|
559
|
-
}),
|
|
560
|
-
beforeOpen: function (oEvent) {
|
|
561
|
-
// clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
|
|
562
|
-
var oCloneEvent = Object.assign({}, oEvent);
|
|
563
|
-
messageHandler.removeTransitionMessages();
|
|
564
|
-
|
|
565
|
-
var getDefaultValuesFunction = function () {
|
|
566
|
-
var oMetaModel = oDialog.getModel().getMetaModel(),
|
|
567
|
-
sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
|
|
568
|
-
sDefaultValuesFunction = oMetaModel.getObject(sActionPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
|
|
569
|
-
return sDefaultValuesFunction;
|
|
570
|
-
};
|
|
571
|
-
|
|
572
|
-
var fnSetDefaultsAndOpenDialog = function (sBindingParameter) {
|
|
573
|
-
var sBoundFunctionName = getDefaultValuesFunction();
|
|
574
|
-
|
|
575
|
-
var prefillParameter = function (sParamName, vParamDefaultValue) {
|
|
576
|
-
return new Promise(function (resolve) {
|
|
577
|
-
// Case 1: There is a ParameterDefaultValue annotation
|
|
578
|
-
if (vParamDefaultValue !== undefined) {
|
|
579
|
-
if (aContexts.length > 0 && vParamDefaultValue.$Path) {
|
|
580
|
-
var oPromise = CommonUtils.requestSingletonProperty(vParamDefaultValue.$Path, oOperationBinding.getModel());
|
|
581
|
-
oPromise.then(function (oValue) {
|
|
582
|
-
if (oValue === null) {
|
|
583
|
-
return oOperationBinding.getParameterContext().requestProperty(vParamDefaultValue.$Path);
|
|
625
|
+
messageHandler.showMessageDialog({
|
|
626
|
+
customMessages: oMessages
|
|
627
|
+
});
|
|
628
|
+
return;
|
|
584
629
|
}
|
|
585
630
|
|
|
586
|
-
|
|
587
|
-
}).then(function (vParamValue) {
|
|
588
|
-
if (aContexts.length > 1) {
|
|
589
|
-
// For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
|
|
590
|
-
var sPathForContext = vParamDefaultValue.$Path;
|
|
631
|
+
aFieldInvalid = _validateMessages(aActionParameters, aFieldInvalid);
|
|
591
632
|
|
|
592
|
-
|
|
593
|
-
|
|
633
|
+
var _temp8 = function () {
|
|
634
|
+
if (aFieldInvalid.length > 0) {
|
|
635
|
+
return Promise.resolve(messageHandling.showUnboundMessages()).then(function () {
|
|
636
|
+
_exit = true;
|
|
637
|
+
});
|
|
594
638
|
}
|
|
639
|
+
}();
|
|
595
640
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
641
|
+
return _temp8 && _temp8.then ? _temp8.then(_temp9) : _temp9(_temp8);
|
|
642
|
+
});
|
|
643
|
+
}, function () {
|
|
644
|
+
messageHandler.showMessageDialog();
|
|
645
|
+
}));
|
|
646
|
+
} catch (e) {
|
|
647
|
+
return Promise.reject(e);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}),
|
|
651
|
+
endButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Cancel"]), {
|
|
652
|
+
text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
|
|
653
|
+
press: function () {
|
|
654
|
+
_validateMessages(aActionParameters, aFieldInvalid, true);
|
|
655
|
+
|
|
656
|
+
oDialog.close();
|
|
657
|
+
messageHandler.removeTransitionMessages();
|
|
658
|
+
reject(Constants.CancelActionDialog);
|
|
659
|
+
}
|
|
660
|
+
}),
|
|
661
|
+
beforeOpen: function (oEvent) {
|
|
662
|
+
// clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
|
|
663
|
+
var oCloneEvent = Object.assign({}, oEvent);
|
|
664
|
+
messageHandler.removeTransitionMessages();
|
|
665
|
+
|
|
666
|
+
var getDefaultValuesFunction = function () {
|
|
667
|
+
var oMetaModel = oDialog.getModel().getMetaModel(),
|
|
668
|
+
sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
|
|
669
|
+
sDefaultValuesFunction = oMetaModel.getObject("".concat(sActionPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"));
|
|
670
|
+
return sDefaultValuesFunction;
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
var fnSetDefaultsAndOpenDialog = function (sBindingParameter) {
|
|
674
|
+
try {
|
|
675
|
+
var sBoundFunctionName = getDefaultValuesFunction();
|
|
676
|
+
|
|
677
|
+
var prefillParameter = function (sParamName, vParamDefaultValue) {
|
|
678
|
+
// eslint-disable-next-line promise/param-names
|
|
679
|
+
return new Promise(function (inResolve) {
|
|
680
|
+
try {
|
|
681
|
+
var _temp17 = function () {
|
|
682
|
+
if (vParamDefaultValue !== undefined) {
|
|
683
|
+
var _temp18 = function () {
|
|
684
|
+
if (aContexts.length > 0 && vParamDefaultValue.$Path) {
|
|
685
|
+
var _temp19 = _catch(function () {
|
|
686
|
+
return Promise.resolve(CommonUtils.requestSingletonProperty(vParamDefaultValue.$Path, oOperationBinding.getModel())).then(function (vParamValue) {
|
|
687
|
+
function _temp13() {
|
|
688
|
+
if (aContexts.length > 1) {
|
|
689
|
+
// For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
|
|
690
|
+
var sPathForContext = vParamDefaultValue.$Path;
|
|
691
|
+
|
|
692
|
+
if (sPathForContext.indexOf("".concat(sBindingParameter, "/")) === 0) {
|
|
693
|
+
sPathForContext = sPathForContext.replace("".concat(sBindingParameter, "/"), "");
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
for (var i = 1; i < aContexts.length; i++) {
|
|
697
|
+
if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
|
|
698
|
+
// if the values from the contexts are not all the same, do not prefill
|
|
699
|
+
inResolve({
|
|
700
|
+
paramName: sParamName,
|
|
701
|
+
value: undefined,
|
|
702
|
+
bNoPossibleValue: true
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
inResolve({
|
|
709
|
+
paramName: sParamName,
|
|
710
|
+
value: vParamValue
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
var _temp12 = function () {
|
|
715
|
+
if (vParamValue === null) {
|
|
716
|
+
return Promise.resolve(oOperationBinding.getParameterContext().requestProperty(vParamDefaultValue.$Path)).then(function (_oOperationBinding$ge) {
|
|
717
|
+
vParamValue = _oOperationBinding$ge;
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}();
|
|
721
|
+
|
|
722
|
+
return _temp12 && _temp12.then ? _temp12.then(_temp13) : _temp13(_temp12);
|
|
723
|
+
});
|
|
724
|
+
}, function () {
|
|
725
|
+
Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
|
|
726
|
+
inResolve({
|
|
727
|
+
paramName: sParamName,
|
|
728
|
+
value: undefined,
|
|
729
|
+
bLatePropertyError: true
|
|
730
|
+
});
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
if (_temp19 && _temp19.then) return _temp19.then(function () {});
|
|
734
|
+
} else {
|
|
735
|
+
// Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
|
|
736
|
+
inResolve({
|
|
737
|
+
paramName: sParamName,
|
|
738
|
+
value: vParamDefaultValue
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
}();
|
|
742
|
+
|
|
743
|
+
if (_temp18 && _temp18.then) return _temp18.then(function () {});
|
|
744
|
+
} else if (oParameterModel && oParameterModel.oData[sParamName]) {
|
|
745
|
+
// Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
|
|
746
|
+
inResolve({
|
|
600
747
|
paramName: sParamName,
|
|
601
|
-
value:
|
|
602
|
-
|
|
748
|
+
value: oParameterModel.oData[sParamName]
|
|
749
|
+
});
|
|
750
|
+
} else {
|
|
751
|
+
inResolve({
|
|
752
|
+
paramName: sParamName,
|
|
753
|
+
value: undefined
|
|
603
754
|
});
|
|
604
755
|
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
756
|
+
}();
|
|
607
757
|
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
// Simply clear parameter default if an error has occurred
|
|
614
|
-
Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
|
|
615
|
-
resolve({
|
|
616
|
-
paramName: sParamName,
|
|
617
|
-
value: undefined,
|
|
618
|
-
bLatePropertyError: true
|
|
619
|
-
});
|
|
620
|
-
});
|
|
621
|
-
} else {
|
|
622
|
-
// Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
|
|
623
|
-
resolve({
|
|
624
|
-
paramName: sParamName,
|
|
625
|
-
value: vParamDefaultValue
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
} else {
|
|
629
|
-
// Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
|
|
630
|
-
if (oParameterModel && oParameterModel.oData[sParamName]) {
|
|
631
|
-
resolve({
|
|
632
|
-
paramName: sParamName,
|
|
633
|
-
value: oParameterModel.oData[sParamName]
|
|
634
|
-
});
|
|
635
|
-
} else {
|
|
636
|
-
resolve({
|
|
637
|
-
paramName: sParamName,
|
|
638
|
-
value: undefined
|
|
758
|
+
// Case 1: There is a ParameterDefaultValue annotation
|
|
759
|
+
return Promise.resolve(_temp17 && _temp17.then ? _temp17.then(function () {}) : void 0);
|
|
760
|
+
} catch (e) {
|
|
761
|
+
return Promise.reject(e);
|
|
762
|
+
}
|
|
639
763
|
});
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
});
|
|
643
|
-
};
|
|
764
|
+
};
|
|
644
765
|
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
|
|
766
|
+
var getParameterDefaultValue = function (sParamName) {
|
|
767
|
+
var oMetaModel = oDialog.getModel().getMetaModel(),
|
|
768
|
+
sActionParameterAnnotationPath = CommonUtils.getParameterPath(oActionContext.getPath(), sParamName) + "@",
|
|
769
|
+
oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationPath),
|
|
770
|
+
oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
|
|
651
771
|
|
|
652
|
-
|
|
653
|
-
|
|
772
|
+
return oParameterDefaultValue;
|
|
773
|
+
};
|
|
654
774
|
|
|
655
|
-
|
|
656
|
-
|
|
775
|
+
var aCurrentParamDefaultValue = [];
|
|
776
|
+
var sParamName, vParameterDefaultValue;
|
|
657
777
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
778
|
+
for (var i in aActionParameters) {
|
|
779
|
+
sParamName = aActionParameters[i].$Name;
|
|
780
|
+
vParameterDefaultValue = getParameterDefaultValue(sParamName);
|
|
781
|
+
aCurrentParamDefaultValue.push(prefillParameter(sParamName, vParameterDefaultValue));
|
|
782
|
+
}
|
|
663
783
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
784
|
+
if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
|
|
785
|
+
if (sBoundFunctionName && sBoundFunctionName.length > 0 && typeof sBoundFunctionName === "string") {
|
|
786
|
+
for (var _i in aContexts) {
|
|
787
|
+
aFunctionParams.push(callBoundFunction(sBoundFunctionName, aContexts[_i], mParameters.model));
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
671
791
|
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
792
|
+
var aPrefillParamPromises = Promise.all(aCurrentParamDefaultValue);
|
|
793
|
+
var aExecFunctionPromises = Promise.resolve([]);
|
|
794
|
+
var oExecFunctionFromManifestPromise;
|
|
675
795
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
796
|
+
if (aFunctionParams && aFunctionParams.length > 0) {
|
|
797
|
+
aExecFunctionPromises = Promise.all(aFunctionParams);
|
|
798
|
+
}
|
|
679
799
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
800
|
+
if (mParameters.defaultValuesExtensionFunction) {
|
|
801
|
+
var sModule = mParameters.defaultValuesExtensionFunction.substring(0, mParameters.defaultValuesExtensionFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
|
|
802
|
+
sFunctionName = mParameters.defaultValuesExtensionFunction.substring(mParameters.defaultValuesExtensionFunction.lastIndexOf(".") + 1, mParameters.defaultValuesExtensionFunction.length);
|
|
803
|
+
oExecFunctionFromManifestPromise = FPMHelper.actionWrapper(oCloneEvent, sModule, sFunctionName, {
|
|
804
|
+
"contexts": aContexts
|
|
805
|
+
});
|
|
806
|
+
}
|
|
687
807
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
808
|
+
var _temp11 = _catch(function () {
|
|
809
|
+
return Promise.resolve(Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise])).then(function (aPromises) {
|
|
810
|
+
var currentParamDefaultValue = aPromises[0];
|
|
811
|
+
var functionParams = aPromises[1];
|
|
812
|
+
var oFunctionParamsFromManifest = aPromises[2];
|
|
813
|
+
var sDialogParamName;
|
|
814
|
+
|
|
815
|
+
for (var _i2 in aActionParameters) {
|
|
816
|
+
sDialogParamName = aActionParameters[_i2].$Name;
|
|
817
|
+
|
|
818
|
+
if (oFunctionParamsFromManifest && oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)) {
|
|
819
|
+
oOperationBinding.setParameter(aActionParameters[_i2].$Name, oFunctionParamsFromManifest[sDialogParamName]);
|
|
820
|
+
} else if (currentParamDefaultValue[_i2] && currentParamDefaultValue[_i2].value !== undefined) {
|
|
821
|
+
oOperationBinding.setParameter(aActionParameters[_i2].$Name, currentParamDefaultValue[_i2].value); // if the default value had not been previously determined due to different contexts, we do nothing else
|
|
822
|
+
} else if (sBoundFunctionName && !currentParamDefaultValue[_i2].bNoPossibleValue) {
|
|
823
|
+
if (aContexts.length > 1) {
|
|
824
|
+
// we check if the function retrieves the same param value for all the contexts:
|
|
825
|
+
var j = 0;
|
|
826
|
+
|
|
827
|
+
while (j < aContexts.length - 1) {
|
|
828
|
+
if (functionParams[j] && functionParams[j + 1] && functionParams[j].getObject(sDialogParamName) === functionParams[j + 1].getObject(sDialogParamName)) {
|
|
829
|
+
j++;
|
|
830
|
+
} else {
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
} //param values are all the same:
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
if (j === aContexts.length - 1) {
|
|
837
|
+
oOperationBinding.setParameter(aActionParameters[_i2].$Name, functionParams[j].getObject(sDialogParamName));
|
|
838
|
+
}
|
|
839
|
+
} else if (functionParams[0] && functionParams[0].getObject(sDialogParamName)) {
|
|
840
|
+
//Only one context, then the default param values are to be verified from the function:
|
|
841
|
+
oOperationBinding.setParameter(aActionParameters[_i2].$Name, functionParams[0].getObject(sDialogParamName));
|
|
842
|
+
}
|
|
843
|
+
}
|
|
711
844
|
}
|
|
712
|
-
} //param values are all the same:
|
|
713
845
|
|
|
846
|
+
var bErrorFound = currentParamDefaultValue.some(function (oValue) {
|
|
847
|
+
if (oValue.bLatePropertyError) {
|
|
848
|
+
return oValue.bLatePropertyError;
|
|
849
|
+
}
|
|
850
|
+
}); // If at least one Default Property is a Late Property and an eTag error was raised.
|
|
714
851
|
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
}
|
|
852
|
+
if (bErrorFound) {
|
|
853
|
+
var sText = CommonUtils.getTranslatedText("C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY", oResourceBundle);
|
|
854
|
+
MessageBox.warning(sText, {
|
|
855
|
+
contentWidth: "25em"
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
});
|
|
859
|
+
}, function (oError) {
|
|
860
|
+
Log.error("Error while retrieving the parameter", oError);
|
|
861
|
+
});
|
|
726
862
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
return
|
|
863
|
+
return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(function () {}) : void 0);
|
|
864
|
+
} catch (e) {
|
|
865
|
+
return Promise.reject(e);
|
|
730
866
|
}
|
|
731
|
-
}
|
|
867
|
+
};
|
|
868
|
+
|
|
869
|
+
var fnAsyncBeforeOpen = function () {
|
|
870
|
+
try {
|
|
871
|
+
var _temp22 = function () {
|
|
872
|
+
if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
|
|
873
|
+
var aParameters = oActionContext.getObject("$Parameter");
|
|
874
|
+
var sBindingParameter = aParameters[0] && aParameters[0].$Name;
|
|
875
|
+
|
|
876
|
+
var _temp23 = _catch(function () {
|
|
877
|
+
return Promise.resolve(aContexts[0].requestObject()).then(function (oContextObject) {
|
|
878
|
+
if (oContextObject) {
|
|
879
|
+
oOperationBinding.setParameter(sBindingParameter, oContextObject);
|
|
880
|
+
}
|
|
732
881
|
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
}
|
|
739
|
-
}).catch();
|
|
740
|
-
};
|
|
741
|
-
|
|
742
|
-
if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
|
|
743
|
-
var aParameters = oActionContext.getObject("$Parameter"),
|
|
744
|
-
sBindingParameter = aParameters[0] && aParameters[0].$Name;
|
|
745
|
-
aContexts[0].requestObject().then(function (oContextObject) {
|
|
746
|
-
if (oContextObject) {
|
|
747
|
-
oOperationBinding.setParameter(sBindingParameter, oContextObject);
|
|
748
|
-
}
|
|
882
|
+
fnSetDefaultsAndOpenDialog(sBindingParameter);
|
|
883
|
+
});
|
|
884
|
+
}, function (oError) {
|
|
885
|
+
Log.error("Error while retrieving the parameter", oError);
|
|
886
|
+
});
|
|
749
887
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
888
|
+
if (_temp23 && _temp23.then) return _temp23.then(function () {});
|
|
889
|
+
} else {
|
|
890
|
+
fnSetDefaultsAndOpenDialog();
|
|
891
|
+
}
|
|
892
|
+
}();
|
|
893
|
+
|
|
894
|
+
return Promise.resolve(_temp22 && _temp22.then ? _temp22.then(function () {}) : void 0);
|
|
895
|
+
} catch (e) {
|
|
896
|
+
return Promise.reject(e);
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
|
|
900
|
+
fnAsyncBeforeOpen();
|
|
901
|
+
},
|
|
902
|
+
afterClose: function () {
|
|
903
|
+
oDialog.destroy();
|
|
904
|
+
}
|
|
905
|
+
});
|
|
906
|
+
aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
|
|
907
|
+
oDialog.setModel(oActionContext.getModel().oModel);
|
|
908
|
+
oDialog.setModel(oParameterModel, "paramsModel");
|
|
909
|
+
oDialog.bindElement({
|
|
910
|
+
path: "/",
|
|
911
|
+
model: "paramsModel"
|
|
912
|
+
}); // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
|
|
913
|
+
|
|
914
|
+
var oMVFModel = new JSONModel({});
|
|
915
|
+
oDialog.setModel(oMVFModel, "mvfview");
|
|
916
|
+
var sActionPath = "".concat(sActionName, "(...)");
|
|
917
|
+
|
|
918
|
+
if (!aContexts.length) {
|
|
919
|
+
sActionPath = "/".concat(sActionPath);
|
|
756
920
|
}
|
|
757
|
-
},
|
|
758
|
-
afterClose: function () {
|
|
759
|
-
oDialog.destroy();
|
|
760
|
-
}
|
|
761
|
-
});
|
|
762
|
-
aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
|
|
763
|
-
oDialog.setModel(oActionContext.getModel().oModel);
|
|
764
|
-
oDialog.setModel(oParameterModel, "paramsModel");
|
|
765
|
-
oDialog.bindElement({
|
|
766
|
-
path: "/",
|
|
767
|
-
model: "paramsModel"
|
|
768
|
-
}); // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
|
|
769
|
-
|
|
770
|
-
var oMVFModel = new JSONModel({});
|
|
771
|
-
oDialog.setModel(oMVFModel, "mvfview");
|
|
772
|
-
var sActionPath = sActionName + "(...)";
|
|
773
|
-
aContexts = mParameters.aContexts || [];
|
|
774
|
-
|
|
775
|
-
if (!aContexts.length) {
|
|
776
|
-
sActionPath = "/" + sActionPath;
|
|
777
|
-
}
|
|
778
921
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
922
|
+
oDialog.bindElement({
|
|
923
|
+
path: sActionPath
|
|
924
|
+
});
|
|
782
925
|
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
926
|
+
if (oParentControl) {
|
|
927
|
+
// if there is a parent control specified add the dialog as dependent
|
|
928
|
+
oParentControl.addDependent(oDialog);
|
|
929
|
+
}
|
|
787
930
|
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
931
|
+
if (aContexts.length > 0) {
|
|
932
|
+
oDialog.setBindingContext(aContexts[0]); // use context of first selected line item
|
|
933
|
+
}
|
|
791
934
|
|
|
792
|
-
|
|
793
|
-
|
|
935
|
+
oOperationBinding = oDialog.getObjectBinding();
|
|
936
|
+
oDialog.open();
|
|
937
|
+
});
|
|
938
|
+
});
|
|
794
939
|
});
|
|
940
|
+
}, function (oError) {
|
|
941
|
+
reject(oError);
|
|
795
942
|
});
|
|
796
|
-
}).catch(reject);
|
|
797
|
-
});
|
|
798
|
-
}
|
|
799
943
|
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
if (aPredefinedParameters.length > 0) {// TODO: merge the predefined once with the real existing one
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
return aParameters;
|
|
944
|
+
return Promise.resolve(_temp7 && _temp7.then ? _temp7.then(function () {}) : void 0);
|
|
945
|
+
} catch (e) {
|
|
946
|
+
return Promise.reject(e);
|
|
947
|
+
}
|
|
948
|
+
});
|
|
809
949
|
}
|
|
810
950
|
|
|
811
951
|
function getActionParameters(oAction) {
|
|
@@ -822,7 +962,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
822
962
|
}
|
|
823
963
|
|
|
824
964
|
function getIsActionCritical(oMetaModel, sPath, contexts, oBoundAction) {
|
|
825
|
-
var vActionCritical = oMetaModel.getObject(sPath
|
|
965
|
+
var vActionCritical = oMetaModel.getObject("".concat(sPath, "@com.sap.vocabularies.Common.v1.IsActionCritical"));
|
|
826
966
|
var sCriticalPath = vActionCritical && vActionCritical.$Path;
|
|
827
967
|
|
|
828
968
|
if (!sCriticalPath) {
|
|
@@ -851,7 +991,30 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
851
991
|
}
|
|
852
992
|
}
|
|
853
993
|
|
|
854
|
-
function
|
|
994
|
+
function _getActionParameterActionName(oResourceBundle, sActionLabel, sActionName, sEntitySetName) {
|
|
995
|
+
var boundActionName = sActionName ? sActionName : null;
|
|
996
|
+
var aActionName = boundActionName.split(".");
|
|
997
|
+
boundActionName = boundActionName.indexOf(".") >= 0 ? aActionName[aActionName.length - 1] : boundActionName;
|
|
998
|
+
var suffixResourceKey = boundActionName && sEntitySetName ? "".concat(sEntitySetName, "|").concat(boundActionName) : "";
|
|
999
|
+
var sKey = "ACTION_PARAMETER_DIALOG_ACTION_NAME";
|
|
1000
|
+
var bResourceKeyExists = oResourceBundle && CommonUtils.checkIfResourceKeyExists(oResourceBundle.aCustomBundles, "".concat(sKey, "|").concat(suffixResourceKey));
|
|
1001
|
+
|
|
1002
|
+
if (sActionLabel) {
|
|
1003
|
+
if (bResourceKeyExists) {
|
|
1004
|
+
return CommonUtils.getTranslatedText(sKey, oResourceBundle, null, suffixResourceKey);
|
|
1005
|
+
} else if (oResourceBundle && CommonUtils.checkIfResourceKeyExists(oResourceBundle.aCustomBundles, "".concat(sKey, "|").concat(sEntitySetName))) {
|
|
1006
|
+
return CommonUtils.getTranslatedText(sKey, oResourceBundle, null, "".concat(sEntitySetName));
|
|
1007
|
+
} else if (oResourceBundle && CommonUtils.checkIfResourceKeyExists(oResourceBundle.aCustomBundles, "".concat(sKey))) {
|
|
1008
|
+
return CommonUtils.getTranslatedText(sKey, oResourceBundle);
|
|
1009
|
+
} else {
|
|
1010
|
+
return sActionLabel;
|
|
1011
|
+
}
|
|
1012
|
+
} else {
|
|
1013
|
+
return CommonUtils.getTranslatedText("C_COMMON_DIALOG_OK", oResourceBundle);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
function executeDependingOnSelectedContexts(oAction, mParameters, bGetBoundContext, sGroupId, oResourceBundle) {
|
|
855
1018
|
var oActionPromise,
|
|
856
1019
|
bEnableStrictHandling = true;
|
|
857
1020
|
|
|
@@ -873,15 +1036,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
873
1036
|
return oAction.getBoundContext();
|
|
874
1037
|
}) : oAction.execute(sGroupId);
|
|
875
1038
|
} else {
|
|
876
|
-
oActionPromise = bGetBoundContext ? oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters
|
|
1039
|
+
oActionPromise = bGetBoundContext ? oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters, oResourceBundle)).then(function () {
|
|
877
1040
|
return oAction.getBoundContext();
|
|
878
|
-
}) : oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters
|
|
1041
|
+
}) : oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, mParameters, oResourceBundle));
|
|
879
1042
|
}
|
|
880
1043
|
|
|
881
1044
|
return oActionPromise;
|
|
882
1045
|
}
|
|
883
1046
|
|
|
884
|
-
function _executeAction(oAppComponent, mParameters) {
|
|
1047
|
+
function _executeAction(oAppComponent, mParameters, oParentControl) {
|
|
885
1048
|
var aContexts = mParameters.aContexts || [];
|
|
886
1049
|
var oModel = mParameters.model;
|
|
887
1050
|
var iExistingMessages = messageHandling.getMessages().length || 0;
|
|
@@ -890,6 +1053,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
890
1053
|
var fnOnSubmitted = mParameters.fnOnSubmitted;
|
|
891
1054
|
var fnOnResponse = mParameters.fnOnResponse;
|
|
892
1055
|
var bIsCreateAction = mParameters.bIsCreateAction;
|
|
1056
|
+
var oResourceBundle = oParentControl && oParentControl.isA("sap.ui.core.mvc.View") && oParentControl.getController().oResourceBundle;
|
|
893
1057
|
var oAction; // let contextIndex = 0;
|
|
894
1058
|
// let aMessages: any[] = [];
|
|
895
1059
|
|
|
@@ -959,89 +1123,46 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
959
1123
|
var i;
|
|
960
1124
|
var sGroupId;
|
|
961
1125
|
|
|
962
|
-
var fnExecuteAction = function (
|
|
1126
|
+
var fnExecuteAction = function (actionContext, index, oSideEffect) {
|
|
963
1127
|
setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
|
|
964
1128
|
|
|
965
|
-
sGroupId = !bGrouped ? "$auto."
|
|
966
|
-
|
|
1129
|
+
sGroupId = !bGrouped ? "$auto.".concat(index) : actionContext.getUpdateGroupId();
|
|
1130
|
+
mParameters.requestSideEffects = fnRequestSideEffects.bind(operations, oAppComponent, oSideEffect, mParameters);
|
|
1131
|
+
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, oResourceBundle);
|
|
967
1132
|
aActionPromises.push(oActionPromise);
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
|
|
971
|
-
oSideEffect.triggerActions.forEach(function (sTriggerAction) {
|
|
972
|
-
if (sTriggerAction) {
|
|
973
|
-
oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
|
|
974
|
-
}
|
|
975
|
-
});
|
|
976
|
-
} // request side effects for this action
|
|
977
|
-
// as we move the messages request to POST $select we need to be prepared for an empty array
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
|
|
981
|
-
oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId).then(function () {
|
|
982
|
-
if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
|
|
983
|
-
CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
|
|
984
|
-
}
|
|
985
|
-
}).catch(function (oError) {
|
|
986
|
-
Log.error("Error while requesting side effects", oError);
|
|
987
|
-
});
|
|
988
|
-
}
|
|
1133
|
+
fnRequestSideEffects(oAppComponent, oSideEffect, mParameters, sGroupId);
|
|
989
1134
|
};
|
|
990
1135
|
|
|
991
|
-
var fnExecuteSingleAction = function (
|
|
992
|
-
|
|
993
|
-
|
|
1136
|
+
var fnExecuteSingleAction = function (actionContext, index, oSideEffect) {
|
|
1137
|
+
// eslint-disable-next-line promise/param-names
|
|
1138
|
+
return new Promise(function (actionResolve) {
|
|
994
1139
|
var aLocalPromise = [];
|
|
995
1140
|
setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
|
|
996
1141
|
|
|
997
|
-
sGroupId = "apiMode"
|
|
998
|
-
|
|
1142
|
+
sGroupId = "apiMode".concat(index);
|
|
1143
|
+
mParameters.requestSideEffects = fnRequestSideEffects.bind(operations, oAppComponent, oSideEffect, mParameters, sGroupId, aLocalPromise);
|
|
1144
|
+
oActionPromise = executeDependingOnSelectedContexts(actionContext, mParameters, bGetBoundContext, sGroupId, oResourceBundle);
|
|
999
1145
|
aActionPromises.push(oActionPromise);
|
|
1000
1146
|
aLocalPromise.push(oActionPromise);
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
|
|
1004
|
-
oSideEffect.triggerActions.forEach(function (sTriggerAction) {
|
|
1005
|
-
if (sTriggerAction) {
|
|
1006
|
-
oLocalPromise = oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
|
|
1007
|
-
aLocalPromise.push(oLocalPromise);
|
|
1008
|
-
}
|
|
1009
|
-
});
|
|
1010
|
-
} // request side effects for this action
|
|
1011
|
-
// as we move the messages request to POST $select we need to be prepared for an empty array
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
|
|
1015
|
-
oLocalPromise = oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId);
|
|
1016
|
-
aLocalPromise.push(oLocalPromise);
|
|
1017
|
-
oLocalPromise.then(function () {
|
|
1018
|
-
if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
|
|
1019
|
-
CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
|
|
1020
|
-
}
|
|
1021
|
-
}).catch(function (oError) {
|
|
1022
|
-
Log.error("Error while requesting side effects", oError);
|
|
1023
|
-
});
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1147
|
+
fnRequestSideEffects(oAppComponent, oSideEffect, mParameters, sGroupId, aLocalPromise);
|
|
1026
1148
|
oModel.submitBatch(sGroupId);
|
|
1027
1149
|
Promise.all(aLocalPromise).then(function () {
|
|
1028
|
-
return
|
|
1150
|
+
return actionResolve();
|
|
1029
1151
|
}).catch(function () {
|
|
1030
|
-
return
|
|
1152
|
+
return actionResolve();
|
|
1031
1153
|
});
|
|
1032
1154
|
});
|
|
1033
|
-
return oPromise;
|
|
1034
1155
|
};
|
|
1035
1156
|
|
|
1036
|
-
function fnExecuteSequentially(
|
|
1157
|
+
function fnExecuteSequentially(contextsToExecute) {
|
|
1037
1158
|
// One action and its side effects are completed before the next action is executed
|
|
1038
1159
|
(fnOnSubmitted || function noop() {
|
|
1039
1160
|
/**/
|
|
1040
1161
|
})(aActionPromises);
|
|
1041
1162
|
|
|
1042
|
-
function processOneAction(context,
|
|
1043
|
-
oAction = oModel.bindContext(sActionName
|
|
1044
|
-
return fnExecuteSingleAction(oAction,
|
|
1163
|
+
function processOneAction(context, actionIndex) {
|
|
1164
|
+
oAction = oModel.bindContext("".concat(sActionName, "(...)"), context, mBindingParameters);
|
|
1165
|
+
return fnExecuteSingleAction(oAction, actionIndex, {
|
|
1045
1166
|
context: context,
|
|
1046
1167
|
pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
|
|
1047
1168
|
triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
|
|
@@ -1050,7 +1171,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1050
1171
|
|
|
1051
1172
|
var oActionAndSideEffectPromise = Promise.resolve();
|
|
1052
1173
|
var j = 0;
|
|
1053
|
-
|
|
1174
|
+
contextsToExecute.forEach(function (context) {
|
|
1054
1175
|
var id = ++j;
|
|
1055
1176
|
oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function () {
|
|
1056
1177
|
return processOneAction(context, id);
|
|
@@ -1058,7 +1179,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1058
1179
|
});
|
|
1059
1180
|
oActionAndSideEffectPromise.then(function () {
|
|
1060
1181
|
fnHandleResults();
|
|
1061
|
-
}).catch()
|
|
1182
|
+
}).catch(function (oError) {
|
|
1183
|
+
Log.error(oError);
|
|
1184
|
+
});
|
|
1062
1185
|
}
|
|
1063
1186
|
|
|
1064
1187
|
if (!bGrouped) {
|
|
@@ -1068,7 +1191,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1068
1191
|
fnExecuteSequentially(aContexts);
|
|
1069
1192
|
} else {
|
|
1070
1193
|
for (i = 0; i < aContexts.length; i++) {
|
|
1071
|
-
oAction = oModel.bindContext(sActionName
|
|
1194
|
+
oAction = oModel.bindContext("".concat(sActionName, "(...)"), aContexts[i], mBindingParameters);
|
|
1072
1195
|
fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
|
|
1073
1196
|
context: aContexts[i],
|
|
1074
1197
|
pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
|
|
@@ -1130,10 +1253,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1130
1253
|
})();
|
|
1131
1254
|
});
|
|
1132
1255
|
} else {
|
|
1133
|
-
oAction = oModel.bindContext("/"
|
|
1256
|
+
oAction = oModel.bindContext("/".concat(sActionName, "(...)"));
|
|
1134
1257
|
setActionParameterDefaultValue();
|
|
1135
1258
|
var sGroupId = "actionImport";
|
|
1136
|
-
var oActionPromise = oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId,
|
|
1259
|
+
var oActionPromise = oAction.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(operations, sGroupId, {
|
|
1260
|
+
label: mParameters.label,
|
|
1261
|
+
model: oModel
|
|
1262
|
+
}, oResourceBundle));
|
|
1137
1263
|
oModel.submitBatch(sGroupId); // trigger onSubmitted "event"
|
|
1138
1264
|
|
|
1139
1265
|
(fnOnSubmitted || function noop() {
|
|
@@ -1150,7 +1276,52 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1150
1276
|
function _getPath(oActionContext, sActionName) {
|
|
1151
1277
|
var sPath = oActionContext.getPath();
|
|
1152
1278
|
sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
|
|
1153
|
-
return sPath.split("/"
|
|
1279
|
+
return sPath.split("/".concat(sActionName))[0];
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
function _showActionParameterDialog(showDialog, actionParameters) {
|
|
1283
|
+
if (showDialog || actionParameters.length > 0) {
|
|
1284
|
+
if (!actionParameters || actionParameters.length === 0 || actionParameters.length === 1 && actionParameters[0].$Name === "ResultIsActiveEntity") {
|
|
1285
|
+
showDialog = false;
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
return showDialog;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
function fnRequestSideEffects(oAppComponent, oSideEffect, mParameters, sGroupId, aLocalPromise) {
|
|
1293
|
+
var oSideEffectsService = oAppComponent.getSideEffectsService();
|
|
1294
|
+
var oLocalPromise; // trigger actions from side effects
|
|
1295
|
+
|
|
1296
|
+
if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
|
|
1297
|
+
oSideEffect.triggerActions.forEach(function (sTriggerAction) {
|
|
1298
|
+
if (sTriggerAction) {
|
|
1299
|
+
oLocalPromise = oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
|
|
1300
|
+
|
|
1301
|
+
if (aLocalPromise) {
|
|
1302
|
+
aLocalPromise.push(oLocalPromise);
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
});
|
|
1306
|
+
} // request side effects for this action
|
|
1307
|
+
// as we move the messages request to POST $select we need to be prepared for an empty array
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
|
|
1311
|
+
oLocalPromise = oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId);
|
|
1312
|
+
|
|
1313
|
+
if (aLocalPromise) {
|
|
1314
|
+
aLocalPromise.push(oLocalPromise);
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
oLocalPromise.then(function () {
|
|
1318
|
+
if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
|
|
1319
|
+
ActionRuntime.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.selectedItems, "table");
|
|
1320
|
+
}
|
|
1321
|
+
}).catch(function (oError) {
|
|
1322
|
+
Log.error("Error while requesting side effects", oError);
|
|
1323
|
+
});
|
|
1324
|
+
}
|
|
1154
1325
|
}
|
|
1155
1326
|
/**
|
|
1156
1327
|
* Static functions to call OData actions (bound/import) and functions (bound/import)
|
|
@@ -1168,8 +1339,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1168
1339
|
callActionImport: callActionImport,
|
|
1169
1340
|
callBoundFunction: callBoundFunction,
|
|
1170
1341
|
callFunctionImport: callFunctionImport,
|
|
1171
|
-
executeDependingOnSelectedContexts: executeDependingOnSelectedContexts
|
|
1342
|
+
executeDependingOnSelectedContexts: executeDependingOnSelectedContexts,
|
|
1343
|
+
showActionParameterDialog: _showActionParameterDialog,
|
|
1344
|
+
getActionParameterActionName: _getActionParameterActionName
|
|
1172
1345
|
};
|
|
1173
1346
|
return operations;
|
|
1174
1347
|
}, false);
|
|
1175
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOlsiQ29uc3RhbnRzIiwiRkVMaWJyYXJ5IiwiSW52b2NhdGlvbkdyb3VwaW5nIiwiQWN0aW9uIiwiTWVzc2FnZUJveCIsImNhbGxCb3VuZEFjdGlvbiIsInNBY3Rpb25OYW1lIiwiY29udGV4dHMiLCJvTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwibVBhcmFtZXRlcnMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYlJldHVybkFzQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImFDb250ZXh0cyIsImlzQ3JpdGljYWxBY3Rpb24iLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwib0Z1bmN0aW9uUHJvbWlzZSIsImV4ZWN1dGUiLCJzdWJtaXRCYXRjaCIsInRoZW4iLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJhY3Rpb25EZWZpbml0aW9uIiwicHJlcGFyZUFjdGlvblBhcmFtZXRlcnMiLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJmbk9uU3VibWl0dGVkIiwib25TdWJtaXR0ZWQiLCJmbk9uUmVzcG9uc2UiLCJvblJlc3BvbnNlIiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYkdldEJvdW5kQ29udGV4dCIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImFkZGl0aW9uYWxTaWRlRWZmZWN0IiwicGF0aEV4cHJlc3Npb25zIiwiZmluZEluZGV4IiwiZXhwIiwiJGlzQ29sbGVjdGlvbiIsImdldE1vZGVsIiwiJFR5cGUiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkc2VsZWN0Iiwic3BsaXQiLCJpbmRleE9mIiwicHVzaCIsInRyaWdnZXJBY3Rpb25zIiwic3BsaWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJPYmplY3RQYWdlIiwiY29udHJvbElkIiwiY29udHJvbCIsInBhcmVudENvbnRyb2wiLCJieUlkIiwiZW50aXR5U2V0TmFtZSIsIm1lc3NhZ2VIYW5kbGVyIiwiX2V4ZWN1dGVBY3Rpb24iLCJvT3BlcmF0aW9uUmVzdWx0IiwiJElzQm91bmQiLCJpc1N0YXRpYyIsIiRQYXJhbWV0ZXIiLCJzb21lIiwiYVBhcmFtZXRlciIsIiRFbnRpdHlTZXRQYXRoIiwiJE5hbWUiLCJDb21tb25VdGlscyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJjYXRjaCIsIm9BY3Rpb25Db250ZXh0Iiwib1BhcmVudENvbnRyb2wiLCJib3VuZEFjdGlvbk5hbWUiLCJzdWZmaXhSZXNvdXJjZUtleSIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldENvbnRyb2xsZXIiLCJzQ29uZmlybWF0aW9uVGV4dCIsImdldFRyYW5zbGF0ZWRUZXh0IiwiY29uZmlybSIsIm9uQ2xvc2UiLCJzQWN0aW9uIiwiT0siLCJvT3BlcmF0aW9uIiwib0Vycm9yIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJzUGF0aCIsIl9nZXRQYXRoIiwibWV0YU1vZGVsIiwiZW50aXR5U2V0Q29udGV4dCIsInNBY3Rpb25OYW1lUGF0aCIsImFjdGlvbk5hbWVDb250ZXh0Iiwic0ZyYWdtZW50TmFtZSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib1BhcmFtZXRlck1vZGVsIiwiSlNPTk1vZGVsIiwiJGRpc3BsYXlNb2RlIiwiYUZpZWxkSW52YWxpZCIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYWxsIiwiZmlsdGVyIiwib0Zvcm1FbGVtZW50Iiwib0ZpZWxkIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwibWFwIiwidmFsdWUiLCJpc0EiLCJnZXRJdGVtcyIsImdldFZhbHVlIiwidW5kZWZpbmVkIiwiZ2V0TGFiZWwiLCJnZXRUZXh0IiwiYVJlc3VsdHMiLCJyZXN1bHQiLCJfdmFsaWRhdGVNZXNzYWdlcyIsImJDbGVhclRhcmdldCIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFNZXNzYWdlcyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib0FjdGlvblBhcmFtZXRlcnMiLCJzUGFyYW1ldGVyIiwib01lc3NhZ2UiLCJzUGFyYW0iLCJyZXBsYWNlIiwiY29udHJvbElkcyIsImdldENvbnRyb2xJZCIsImluY2x1ZGVzIiwicmVtb3ZlTWVzc2FnZXMiLCJ0YXJnZXQiLCJvQ29udHJvbGxlciIsImhhbmRsZUNoYW5nZSIsIm9FdmVudCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImdldFNvdXJjZSIsInNGaWVsZElkIiwiZ2V0UGFyYW1ldGVyIiwib0ZpZWxkUHJvbWlzZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiYWN0aW9uIiwiZW50aXR5U2V0IiwibW9kZWxzIiwiYUZ1bmN0aW9uUGFyYW1zIiwib09wZXJhdGlvbkJpbmRpbmciLCJzZXRVc2VyRGVmYXVsdHMiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9EaWFsb2dDb250ZW50Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwiY29udGVudCIsImVzY2FwZUhhbmRsZXIiLCJjbG9zZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiZ2VuZXJhdGUiLCJ0ZXh0IiwidHlwZSIsInByZXNzIiwiYUVtcHR5TWFuZGF0b3J5RmllbGRzIiwib01lc3NhZ2VzIiwiaSIsImNvZGUiLCJjdXN0b21NZXNzYWdlcyIsIm1lc3NhZ2VIYW5kbGluZyIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9iamVjdCIsImtleXMiLCJzS2V5IiwidlBhcmFtZXRlclZhbHVlIiwib1BhcmFtZXRlckNvbnRleHQiLCJnZXRQYXJhbWV0ZXJDb250ZXh0IiwiYU1WRkNvbnRlbnQiLCJnZXRQcm9wZXJ0eSIsImFLZXlWYWx1ZXMiLCJqIiwiS2V5IiwibWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImNvbmNhdCIsInN1YnRpdGxlQ29sdW1uIiwiZ2V0TWVzc2FnZUNvbHVtbiIsImVycm9yQ29udGV4dCIsImVycm9yVGFyZ2V0c0luQVBNIiwiYlNob3dNZXNzYWdlQm94IiwibWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXRzIiwiZ2V0VGFyZ2V0cyIsImZpbmQiLCJvQ29udGV4dCIsImdldFRhcmdldCIsImFkZGl0aW9uYWxUZXh0IiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsInNob3dNZXNzYWdlcyIsImlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3BlbiIsImlzT3BlbiIsIm1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrIiwiZmluYWxseSIsInVubG9jayIsImVuZEJ1dHRvbiIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImJlZm9yZU9wZW4iLCJvQ2xvbmVFdmVudCIsImFzc2lnbiIsImdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInNEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyIsInNCaW5kaW5nUGFyYW1ldGVyIiwic0JvdW5kRnVuY3Rpb25OYW1lIiwicHJlZmlsbFBhcmFtZXRlciIsInNQYXJhbU5hbWUiLCJ2UGFyYW1EZWZhdWx0VmFsdWUiLCIkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5Iiwib1ZhbHVlIiwicmVxdWVzdFByb3BlcnR5IiwidlBhcmFtVmFsdWUiLCJzUGF0aEZvckNvbnRleHQiLCJwYXJhbU5hbWUiLCJiTm9Qb3NzaWJsZVZhbHVlIiwiTG9nIiwiZXJyb3IiLCJiTGF0ZVByb3BlcnR5RXJyb3IiLCJvRGF0YSIsImdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsInNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0Iiwib1BhcmFtZXRlckFubm90YXRpb25zIiwib1BhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJ2UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYVByZWZpbGxQYXJhbVByb21pc2VzIiwiYUV4ZWNGdW5jdGlvblByb21pc2VzIiwib0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2UiLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJGUE1IZWxwZXIiLCJhY3Rpb25XcmFwcGVyIiwiYVByb21pc2VzIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsImhhc093blByb3BlcnR5Iiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJzVGV4dCIsIndhcm5pbmciLCJjb250ZW50V2lkdGgiLCJhUGFyYW1ldGVycyIsInJlcXVlc3RPYmplY3QiLCJvQ29udGV4dE9iamVjdCIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiZ2V0QWdncmVnYXRpb24iLCJzZXRNb2RlbCIsImJpbmRFbGVtZW50IiwicGF0aCIsIm9NVkZNb2RlbCIsImFkZERlcGVuZGVudCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0QmluZGluZyIsIm9wZW4iLCJhUHJlZGVmaW5lZFBhcmFtZXRlcnMiLCJnZXRBY3Rpb25QYXJhbWV0ZXJzIiwic2xpY2UiLCJ2QWN0aW9uQ3JpdGljYWwiLCJzQ3JpdGljYWxQYXRoIiwiYUJpbmRpbmdQYXJhbXMiLCJhUGF0aHMiLCJiQ29uZGl0aW9uIiwib1BhcmFtcyIsImluZGV4Iiwiam9pbiIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvUHJvcGVydHkiLCIka2luZCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJvcGVyYXRpb25zIiwiaUV4aXN0aW5nTWVzc2FnZXMiLCJmbkRpZmZlcmVudGlhdGUiLCJwcm9taXNlIiwicmVzcG9uc2UiLCJzdGF0dXMiLCJzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhQWN0aW9uUHJvbWlzZXMiLCJmbkV4ZWN1dGVBY3Rpb24iLCJvU2lkZUVmZmVjdCIsImdldFVwZGF0ZUdyb3VwSWQiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1RyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZm5FeGVjdXRlU2luZ2xlQWN0aW9uIiwib0xvY2FsUHJvbWlzZSIsImFMb2NhbFByb21pc2UiLCJmbkV4ZWN1dGVTZXF1ZW50aWFsbHkiLCJub29wIiwicHJvY2Vzc09uZUFjdGlvbiIsIm9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSIsImlkIiwiZm5IYW5kbGVSZXN1bHRzIiwicmVzdWx0cyIsImFSZWplY3RlZEl0ZW1zIiwiYVJlc29sdmVkSXRlbXMiLCJpUmVzdWx0Q291bnQiLCJiQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkIiwicmVzb2x2ZWRJdGVtcyIsInJlamVjdGVkSXRlbXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQWNBLE1BQU1BLFNBQVMsR0FBR0MsU0FBUyxDQUFDRCxTQUE1QjtBQUFBLE1BQ0NFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQURoQztBQUVBLE1BQU1DLE1BQU0sR0FBSUMsVUFBRCxDQUFvQkQsTUFBbkM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFdBQVNFLGVBQVQsQ0FBeUJDLFdBQXpCLEVBQThDQyxRQUE5QyxFQUE2REMsTUFBN0QsRUFBMEVDLGFBQTFFLEVBQWlHQyxXQUFqRyxFQUFtSDtBQUNsSCxRQUFJLENBQUNILFFBQUQsSUFBYUEsUUFBUSxDQUFDSSxNQUFULEtBQW9CLENBQXJDLEVBQXdDO0FBQ3ZDO0FBQ0EsYUFBT0MsT0FBTyxDQUFDQyxNQUFSLENBQWUsb0RBQWYsQ0FBUDtBQUNBLEtBSmlILENBS2xIOzs7QUFDQSxRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY1IsUUFBZCxDQUFKLEVBQTZCO0FBQzVCRyxNQUFBQSxXQUFXLENBQUNNLGNBQVosR0FBNkIsSUFBN0I7QUFDQSxLQUZELE1BRU87QUFDTjtBQUNB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Q0FBa0JoQixjQUFsQixFQUF1Qy9HLFdBQXZDLEVBQXlEO0FBQ3hELFFBQUk4SCxLQUFLLEdBQUdmLGNBQWMsQ0FBQ2hHLE9BQWYsRUFBWjtBQUNBK0csSUFBQUEsS0FBSyxHQUFHZixjQUFjLENBQUN0RixTQUFmLENBQXlCLFVBQXpCLElBQXVDcUcsS0FBSyxDQUFDOUMsS0FBTixDQUFZLGdCQUFaLEVBQThCLENBQTlCLENBQXZDLEdBQTBFOEMsS0FBSyxDQUFDOUMsS0FBTixDQUFZLElBQVosRUFBa0IsQ0FBbEIsQ0FBbEY7QUFDQSxXQUFPOEMsS0FBSyxDQUFDOUMsS0FBTixDQUFZLE1BQU1oRixXQUFsQixFQUErQixDQUEvQixDQUFQO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLE1BQU1rVixVQUFVLEdBQUc7QUFDbEJuVixJQUFBQSxlQUFlLEVBQUVBLGVBREM7QUFFbEJ1QixJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBRkE7QUFHbEJJLElBQUFBLGlCQUFpQixFQUFFQSxpQkFIRDtBQUlsQk0sSUFBQUEsa0JBQWtCLEVBQUVBLGtCQUpGO0FBS2xCMlMsSUFBQUEsa0NBQWtDLEVBQUVBO0FBTGxCLEdBQW5CO1NBUWVPLFUiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxuY29uc3QgQ29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0SW52b2NhdGlvbkdyb3VwaW5nID0gRkVMaWJyYXJ5Lkludm9jYXRpb25Hcm91cGluZztcbmNvbnN0IEFjdGlvbiA9IChNZXNzYWdlQm94IGFzIGFueSkuQWN0aW9uO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IGNvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuTW9kZWx9IG9Nb2RlbCBPRGF0YSBNb2RlbFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVyc10gQSBtYXAgb2YgcGFyYW1ldGVycyB0byBiZSBzZW50IGZvciBldmVyeSBhY3Rpb24gY2FsbFxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnNdIEEgbWFwIG9mIGJpbmRpbmcgcGFyYW1ldGVycyB0aGF0IHdvdWxkIGJlIHBhcnQgb2YgJHNlbGVjdCBhbmQgJGV4cGFuZCBjb21pbmcgZnJvbSBzaWRlIGVmZmVjdHMgZm9yIGJvdW5kIGFjdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6IENoYW5nZXNldCB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsIElzb2xhdGVkIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0cywgZGVmYXVsdHMgdG8gSXNvbGF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIHtzYXAudWkuY29yZS5FbGVtZW50fSBbbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbF0gSWYgc3BlY2lmaWVkIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0XSBJZiBzcGVjaWZpZWQgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHRzOiBhbnksIG9Nb2RlbDogYW55LCBvQXBwQ29tcG9uZW50OiBvYmplY3QsIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKCFjb250ZXh0cyB8fCBjb250ZXh0cy5sZW5ndGggPT09IDApIHtcblx0XHQvL0luIEZyZWVzdHlsZSBhcHBzIGJvdW5kIGFjdGlvbnMgY2FuIGhhdmUgbm8gY29udGV4dFxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGFjdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb250ZXh0XCIpO1xuXHR9XG5cdC8vIHdlIGV4cGVjdCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHNcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udGV4dHMpKSB7XG5cdFx0bVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXkgPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vYWN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGlzIGNvbnRleHQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmcgc28gVUkgZmllbGRzIGFyZSB1cGRhdGVkIHdpdGggcmVzcG9uc2UgZGF0YVxuXHRcdGNvbnRleHRzID0gW2NvbnRleHRzXTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNBY3Rpb25QYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0c1swXS5nZXRQYXRoKCkpICsgXCIvXCIgKyBzQWN0aW9uTmFtZSxcblx0XHRvQm91bmRBY3Rpb24gPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25QYXRoICsgXCIvQCR1aTUub3ZlcmxvYWQvMFwiKTtcblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gY29udGV4dHM7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoLCBjb250ZXh0cywgb0JvdW5kQWN0aW9uKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kQWN0aW9uLCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycyk7XG59XG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzXSBBIG1hcCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgYWN0aW9uIGltcG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnksIG9BcHBDb21wb25lbnQ6IG9iamVjdCwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAoIW9Nb2RlbCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFjdGlvbiBleHBlY3RzIGEgbW9kZWwvY29udGV4dCBmb3IgZXhlY3V0aW9uXCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0FjdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzQWN0aW9uTmFtZSkuZ2V0UGF0aCgpLFxuXHRcdG9BY3Rpb25JbXBvcnQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiICsgb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQWN0aW9uUGF0aCkuZ2V0T2JqZWN0KFwiJEFjdGlvblwiKSArIFwiLzBcIik7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIHNBY3Rpb25QYXRoICsgXCIvQCR1aTUub3ZlcmxvYWRcIik7XG5cdHJldHVybiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lLCBvTW9kZWwsIG9BY3Rpb25JbXBvcnQsIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbmZ1bmN0aW9uIGNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogYW55LCBvTW9kZWw6IGFueSkge1xuXHRpZiAoIWNvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCb3VuZCBmdW5jdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGEgY29udGV4dFwiKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSArIFwiL1wiICsgc0Z1bmN0aW9uTmFtZSxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzRnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbkltcG9ydChzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIG9Nb2RlbDogYW55KSB7XG5cdGlmICghc0Z1bmN0aW9uTmFtZSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzRnVuY3Rpb25OYW1lKS5nZXRQYXRoKCksXG5cdFx0b0Z1bmN0aW9uSW1wb3J0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFwiL1wiICsgb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkRnVuY3Rpb25cIikgKyBcIi8wXCJcblx0XHQpO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5mdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWU6IGFueSwgb01vZGVsOiBhbnksIG9GdW5jdGlvbjogYW55LCBjb250ZXh0PzogYW55KSB7XG5cdGxldCBzR3JvdXBJZDtcblx0aWYgKCFvRnVuY3Rpb24gfHwgIW9GdW5jdGlvbi5nZXRPYmplY3QoKSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGdW5jdGlvbiBcIiArIHNGdW5jdGlvbk5hbWUgKyBcIiBub3QgZm91bmRcIikpO1xuXHR9XG5cdGlmIChjb250ZXh0KSB7XG5cdFx0b0Z1bmN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNGdW5jdGlvbk5hbWUgKyBcIiguLi4pXCIsIGNvbnRleHQpO1xuXHRcdHNHcm91cElkID0gXCJmdW5jdGlvbkdyb3VwXCI7XG5cdH0gZWxzZSB7XG5cdFx0b0Z1bmN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KFwiL1wiICsgc0Z1bmN0aW9uTmFtZSArIFwiKC4uLilcIik7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdH1cblx0Y29uc3Qgb0Z1bmN0aW9uUHJvbWlzZSA9IG9GdW5jdGlvbi5leGVjdXRlKHNHcm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0cmV0dXJuIG9GdW5jdGlvblByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIG9GdW5jdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjYWxsQWN0aW9uKHNBY3Rpb25OYW1lOiBhbnksIG9Nb2RlbDogYW55LCBvQWN0aW9uOiBhbnksIG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRsZXQgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGxldCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGZuRGlhbG9nO1xuXHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IGFueTtcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGxldCBiSXNTYW1lRW50aXR5O1xuXHRcdGxldCBvUmV0dXJuVHlwZTtcblx0XHRjb25zdCBhY3Rpb25EZWZpbml0aW9uID0gb0FjdGlvbi5nZXRPYmplY3QoKTtcblx0XHRpZiAoIW9BY3Rpb24gfHwgIW9BY3Rpb24uZ2V0T2JqZWN0KCkpIHtcblx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKFwiQWN0aW9uIFwiICsgc0FjdGlvbk5hbWUgKyBcIiBub3QgZm91bmRcIikpO1xuXHRcdH1cblx0XHRpZiAoYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgfHwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnMgPSBwcmVwYXJlQWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uLCBhQWN0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzIHx8IGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cpIHtcblx0XHRcdGZuRGlhbG9nID0gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZztcblx0XHR9IGVsc2UgaWYgKGJJc0NyaXRpY2FsQWN0aW9uKSB7XG5cdFx0XHRmbkRpYWxvZyA9IGNvbmZpcm1Dcml0aWNhbEFjdGlvbjtcblx0XHR9XG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRmbk9uU3VibWl0dGVkOiBtUGFyYW1ldGVycy5vblN1Ym1pdHRlZCxcblx0XHRcdGZuT25SZXNwb25zZTogbVBhcmFtZXRlcnMub25SZXNwb25zZSxcblx0XHRcdGFjdGlvbk5hbWU6IHNBY3Rpb25OYW1lLFxuXHRcdFx0bW9kZWw6IG9Nb2RlbCxcblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzOiBhQWN0aW9uUGFyYW1ldGVycyxcblx0XHRcdGJHZXRCb3VuZENvbnRleHQ6IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbFxuXHRcdH07XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMpIHtcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChhQ29udGV4dHNbMF0uZ2V0UGF0aCgpKTtcblx0XHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChleHA6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgZXhwID09PSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRvUmV0dXJuVHlwZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGVcIik7XG5cdFx0XHRcdFx0YklzU2FtZUVudGl0eSA9XG5cdFx0XHRcdFx0XHRvUmV0dXJuVHlwZSAmJiAhb1JldHVyblR5cGUuJGlzQ29sbGVjdGlvbiAmJiBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCkuJFR5cGUgPT09IG9SZXR1cm5UeXBlLiRUeXBlO1xuXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGJJc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldE9iamVjdChcIiRSZXR1cm5UeXBlLyRUeXBlL1wiICsgc01lc3NhZ2VzUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0KCFtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCB8fFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0LnNwbGl0KFwiLFwiKS5pbmRleE9mKHNNZXNzYWdlc1BhdGgpID09PSAtMSlcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0XHRcdFx0PyBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCArIFwiLFwiICsgc01lc3NhZ2VzUGF0aFxuXHRcdFx0XHRcdFx0XHRcdDogc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0XHRcdFx0Ly8gQWRkIHNpZGUgZWZmZWN0cyBhdCBlbnRpdHkgbGV2ZWwgYmVjYXVzZSAkc2VsZWN0IHN0b3BzIHRoZXNlIGJlaW5nIHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0XHRcdFx0XHRcdFx0Ly8gT25seSBpZiBubyBvdGhlciBzaWRlIGVmZmVjdHMgd2VyZSBhZGRlZCBmb3IgTWVzc2FnZXNcblx0XHRcdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMucHVzaChcIipcIik7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoID09PSAwICYmIGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbm8gdHJpZ2dlciBhY3Rpb24gdGhlcmVmb3JlIG5vIG5lZWQgdG8gcmVxdWVzdCBtZXNzYWdlcyBhZ2FpblxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5zcGxpY2UoaU1lc3NhZ2VTaWRlRWZmZWN0LCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgPSBhQ29udGV4dHM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnM7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iUmV0dXJuQXNBcnJheSA9IG1QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2U7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2wgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYklzQ3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0fVxuXHRcdGlmIChmbkRpYWxvZykge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBmbkRpYWxvZyhcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdHNBY3Rpb25MYWJlbCxcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMgJiZcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoICYmXG5cdFx0XHRcdFx0YWN0aW9uRGVmaW5pdGlvbi4kSXNCb3VuZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0XHRcdGNvbnN0IGlzU3RhdGljID0gKGFjdGlvbkRlZmluaXRpb24uJFBhcmFtZXRlciB8fCBbXSkuc29tZSgoYVBhcmFtZXRlcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRhY3Rpb25EZWZpbml0aW9uLiRFbnRpdHlTZXRQYXRoICYmXG5cdFx0XHRcdFx0XHRcdGFjdGlvbkRlZmluaXRpb24uJEVudGl0eVNldFBhdGggPT09IGFQYXJhbWV0ZXIuJE5hbWUgJiZcblx0XHRcdFx0XHRcdFx0YVBhcmFtZXRlci4kaXNDb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmICghaXNTdGF0aWMpIHtcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IGFueSxcblx0c0FjdGlvbkxhYmVsOiBhbnksXG5cdG1QYXJhbWV0ZXJzOiBhbnksXG5cdGFBY3Rpb25QYXJhbWV0ZXJzOiBhbnksXG5cdG9BY3Rpb25Db250ZXh0OiBhbnksXG5cdG9QYXJlbnRDb250cm9sOiBhbnksXG5cdGVudGl0eVNldE5hbWU6IGFueSxcblx0bWVzc2FnZUhhbmRsZXI6IGFueVxuKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0bGV0IGJvdW5kQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBudWxsO1xuXHRcdGJvdW5kQWN0aW9uTmFtZSA9XG5cdFx0XHRib3VuZEFjdGlvbk5hbWUuaW5kZXhPZihcIi5cIikgPj0gMCA/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXSA6IGJvdW5kQWN0aW9uTmFtZTtcblx0XHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBlbnRpdHlTZXROYW1lID8gZW50aXR5U2V0TmFtZSArIFwifFwiICsgYm91bmRBY3Rpb25OYW1lIDogXCJcIjtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IHNDb25maXJtYXRpb25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0c3VmZml4UmVzb3VyY2VLZXlcblx0XHQpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBmdW5jdGlvbiAoc0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdGlmIChzQWN0aW9uID09PSBBY3Rpb24uT0spIHtcblx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob09wZXJhdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdC5zaG93TWVzc2FnZURpYWxvZygpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nKFxuXHRzQWN0aW9uTmFtZTogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBhbnksXG5cdHNBY3Rpb25MYWJlbDogYW55LFxuXHRtUGFyYW1ldGVyczogYW55LFxuXHRhQWN0aW9uUGFyYW1ldGVyczogYW55LFxuXHRvQWN0aW9uQ29udGV4dDogYW55LFxuXHRvUGFyZW50Q29udHJvbDogYW55LFxuXHRlbnRpdHlTZXROYW1lOiBhbnksXG5cdG1lc3NhZ2VIYW5kbGVyOiBhbnlcbikge1xuXHRjb25zdCBzUGF0aCA9IF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0LCBzQWN0aW9uTmFtZSksXG5cdFx0bWV0YU1vZGVsID0gb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cdFx0bGV0IGFGaWVsZEludmFsaWQ6IGFueVtdID0gW107XG5cdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSAmJiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpICE9PSBcIkVycm9yXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIilcblx0XHRcdFx0XHRcdFx0PyBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0SXRlbXMoKVxuXHRcdFx0XHRcdFx0XHQ6IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0TGFiZWwoKS5nZXRUZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdCkudGhlbihmdW5jdGlvbiAoYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdGFSZXN1bHRzID0gYVJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBhUmVzdWx0cztcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgX3ZhbGlkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAoYUFjdGlvblBhcmFtZXRlcnM6IGFueSwgYUZpZWxkSW52YWxpZDogYW55LCBiQ2xlYXJUYXJnZXQ/OiBib29sZWFuKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXG5cdFx0XHRhRmllbGRJbnZhbGlkID0gYUZpZWxkSW52YWxpZCB8fCBbXTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGFGaWVsZEludmFsaWQgPSBbXTtcblx0XHRcdH1cblx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlciA9IG9BY3Rpb25QYXJhbWV0ZXJzLiROYW1lO1xuXHRcdFx0XHRhTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXJhbSA9IHNQYXJhbWV0ZXIucmVwbGFjZShcIi1pbm5lclwiLCBcIlwiKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZS5jb250cm9sSWRzLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHRcdChvTWVzc2FnZS5nZXRDb250cm9sSWQoKS5pbmNsdWRlcyhcIkFQRF86OlwiICsgc1BhcmFtZXRlcikgfHxcblx0XHRcdFx0XHRcdFx0KG9NZXNzYWdlLmdldENvbnRyb2xJZCgpLmluY2x1ZGVzKFwiQVBEXzo6XCIgKyBzUGFyYW1ldGVyICsgXCJpbm5lclwiKSAmJlxuXHRcdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQuaW5kZXhPZihcIkFQRF86OlwiICsgc1BhcmFtKSA8IDApKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKGJDbGVhclRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZC5wdXNoKFwiQVBEXzo6XCIgKyBzUGFyYW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBIYW5kbGUgbWVzc2FnZXMgcmVsYXRlZCB0byBpbnB1dCB3aXRoIGludmFsaWQgdG9rZW5cblx0XHRcdFx0XHRpZiAob01lc3NhZ2UudGFyZ2V0LmluY2x1ZGVzKFwiQVBEXzo6XCIgKyBzUGFyYW1ldGVyKSkge1xuXHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZC5wdXNoKFwiQVBEXzo6XCIgKyBzUGFyYW0pO1xuXHRcdFx0XHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gYkNsZWFyVGFyZ2V0ID8gXCJcIiA6IG9NZXNzYWdlLnRhcmdldDtcblx0XHRcdFx0XHRcdGlmIChiQ2xlYXJUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYUZpZWxkSW52YWxpZDtcblx0XHR9O1xuXHRcdGNvbnN0IG9Db250cm9sbGVyID0ge1xuXHRcdFx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRcdFx0aWYgKG9GaWVsZFByb21pc2UpIHtcblx0XHRcdFx0XHRtRmllbGRWYWx1ZU1hcFtzRmllbGRJZF0gPSBvRmllbGRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQsXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBlbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0ZyYWdtZW50OiBhbnkpIHtcblx0XHRcdFx0Ly8gVE9ETzogbW92ZSB0aGUgZGlhbG9nIGludG8gdGhlIGZyYWdtZW50IGFuZCBtb3ZlIHRoZSBoYW5kbGVycyB0byB0aGUgb0NvbnRyb2xsZXJcblx0XHRcdFx0bGV0IGFDb250ZXh0czogYW55W107XG5cdFx0XHRcdGNvbnN0IGFGdW5jdGlvblBhcmFtczogYW55W10gPSBbXTtcblx0XHRcdFx0bGV0IG9PcGVyYXRpb25CaW5kaW5nOiBhbnk7XG5cdFx0XHRcdHJldHVybiBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMob0FwcENvbXBvbmVudCwgYUFjdGlvblBhcmFtZXRlcnMsIG9QYXJhbWV0ZXJNb2RlbCwgdHJ1ZSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gVE9ETzogbW92ZSB0aGUgZGlhbG9nIGludG8gdGhlIGZyYWdtZW50IGFuZCBtb3ZlIHRoZSBoYW5kbGVycyB0byB0aGUgb0NvbnRyb2xsZXJcblx0XHRcdFx0XHRyZXR1cm4gRnJhZ21lbnQubG9hZCh7IGRlZmluaXRpb246IG9GcmFnbWVudCwgY29udHJvbGxlcjogb0NvbnRyb2xsZXIgfSkudGhlbihmdW5jdGlvbiAob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTpcblx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uTGFiZWwgfHxcblx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19USVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbihnZW5lcmF0ZShbXCJmZVwiLCBcIkFQRF9cIiwgc0FjdGlvbk5hbWUsIFwiQWN0aW9uXCIsIFwiT2tcIl0pLCB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogc0FjdGlvbkxhYmVsIHx8IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fRElBTE9HX09LXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFFbXB0eU1hbmRhdG9yeUZpZWxkczogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUVtcHR5TWFuZGF0b3J5RmllbGRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbXB0eU1hbmRhdG9yeUZpZWxkc1tpXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29kZTogMjAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRXJyb3JcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IG9NZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZCA9IF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRmllbGRJbnZhbGlkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxpbmcuc2hvd1VuYm91bmRNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBkdWUgdG8gdXNpbmcgdGhlIHNlYXJjaCBhbmQgdmFsdWUgaGVscHMgb24gdGhlIGFjdGlvbiBkaWFsb2cgdHJhbnNpZW50IG1lc3NhZ2VzIGNvdWxkIGFwcGVhclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBuZWVkIGFuIFVYIGRlc2lnbiBmb3IgdGhvc2UgdG8gc2hvdyB0aGVtIHRvIHRoZSB1c2VyIC0gZm9yIG5vdyByZW1vdmUgdGhlbSBiZWZvcmUgY29udGludWluZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbW92ZSBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gRGlhbG9nIChTaW1wbGVGb3JtKSB0byBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGluIHRoZSBvcGVyYXRpb24gYmluZGluZ3MgZm9yIGFsbCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyQ29udGV4dCA9IG9PcGVyYXRpb25CaW5kaW5nICYmIG9PcGVyYXRpb25CaW5kaW5nLmdldFBhcmFtZXRlckNvbnRleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiRpc0NvbGxlY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFNVkZDb250ZW50ID0gb0RpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRNb2RlbChcIm12ZnZpZXdcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0UHJvcGVydHkoXCIvXCIgKyBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaiBpbiBhTVZGQ29udGVudCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhS2V5VmFsdWVzLnB1c2goYU1WRkNvbnRlbnRbal0uS2V5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IGFLZXlWYWx1ZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IG9QYXJhbWV0ZXJDb250ZXh0LmdldFByb3BlcnR5KGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0udmFsdWUgPSB2UGFyYW1ldGVyVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlclZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmxhYmVsID0gc0FjdGlvbkxhYmVsO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9PcGVyYXRpb246IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBtZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMgPSBtZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IW1QYXJhbWV0ZXJzLmJHcm91cGVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCEoIW1QYXJhbWV0ZXJzLmNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID09PSAxKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgbWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWJ0aXRsZUNvbHVtbiA9IENvbW1vblV0aWxzLmdldE1lc3NhZ2VDb2x1bW4obVBhcmFtZXRlcnMuY29udHJvbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvckNvbnRleHQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvclRhcmdldHNJbkFQTSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYlNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1lc3NhZ2VUYXJnZXRzID0gbWVzc2FnZS5nZXRUYXJnZXRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG1lc3NhZ2VUYXJnZXRzICYmIG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldCgpLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuYWRkaXRpb25hbFRleHQgPSBlcnJvckNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBlcnJvckNvbnRleHQuZ2V0T2JqZWN0KClbc3VidGl0bGVDb2x1bW5dXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1swXS4kTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQTSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBNID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlc1swXS5nZXRUYXJnZXQoKSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXNbMF0uZ2V0VGFyZ2V0KCkgIT09IFwiXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJIYXNFdGFnTWVzc2FnZSA9IG1lc3NhZ2VIYW5kbGluZy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiSGFzRXRhZ01lc3NhZ2U6IGJIYXNFdGFnTWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2dPcGVuOiBvRGlhbG9nLmlzT3BlbigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQTTogZXJyb3JUYXJnZXRzSW5BUE0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94OiBiU2hvd01lc3NhZ2VCb3hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nICYmIGJIYXNFdGFnTWVzc2FnZSAmJiBvRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpOyAvL2Nsb3NlIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBhZnRlciByZWZyZXNoIG9mIHRoZSBjb250ZXh0IGFmdGVyIGV0YWcgbWlzbWF0Y2hcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0X3ZhbGlkYXRlTWVzc2FnZXMoYUFjdGlvblBhcmFtZXRlcnMsIGFGaWVsZEludmFsaWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRlZmF1bHRWYWx1ZXNGdW5jdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc0RlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nID0gZnVuY3Rpb24gKHNCaW5kaW5nUGFyYW1ldGVyPzogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzQm91bmRGdW5jdGlvbk5hbWUgPSBnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24oKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHByZWZpbGxQYXJhbWV0ZXIgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogYW55LCB2UGFyYW1EZWZhdWx0VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtRGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCAmJiB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb21pc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb25CaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0UHJvcGVydHkodlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAodlBhcmFtVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBtdWx0aSBzZWxlY3QsIG5lZWQgdG8gbG9vcCBvdmVyIGFDb250ZXh0cyAoYXMgY29udGV4dHMgY2Fubm90IGJlIHJldHJpZXZlZCB2aWEgYmluZGluZyBwYXJhbWV0ZXIgb2YgdGhlIG9wZXJhdGlvbiBiaW5kaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc1BhdGhGb3JDb250ZXh0ID0gdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1BhdGhGb3JDb250ZXh0LmluZGV4T2Yoc0JpbmRpbmdQYXJhbWV0ZXIgKyBcIi9cIikgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzUGF0aEZvckNvbnRleHQgPSBzUGF0aEZvckNvbnRleHQucmVwbGFjZShzQmluZGluZ1BhcmFtZXRlciArIFwiL1wiLCBcIlwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHNbaV0uZ2V0UHJvcGVydHkoc1BhdGhGb3JDb250ZXh0KSAhPT0gdlBhcmFtVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29udGV4dHMgYXJlIG5vdCBhbGwgdGhlIHNhbWUsIGRvIG5vdCBwcmVmaWxsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTm9Qb3NzaWJsZVZhbHVlOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoeyBwYXJhbU5hbWU6IHNQYXJhbU5hbWUsIHZhbHVlOiB2UGFyYW1WYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTaW1wbHkgY2xlYXIgcGFyYW1ldGVyIGRlZmF1bHQgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWZhdWx0IGFjdGlvbiBwYXJhbWV0ZXJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWN0aW9uTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbU5hbWU6IHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJMYXRlUHJvcGVydHlFcnJvcjogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDEuMjogUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGRlZmluZXMgYSBmaXhlZCBzdHJpbmcgdmFsdWUgKGkuZS4gdlBhcmFtRGVmYXVsdFZhbHVlID0gJ3NvbWVTdHJpbmcnKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtRGVmYXVsdFZhbHVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDI6IFRoZXJlIGlzIG5vIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uICg9PiBsb29rIGludG8gdGhlIEZMUCBVc2VyIERlZmF1bHRzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbWV0ZXJNb2RlbCAmJiAob1BhcmFtZXRlck1vZGVsIGFzIGFueSkub0RhdGFbc1BhcmFtTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAob1BhcmFtZXRlck1vZGVsIGFzIGFueSkub0RhdGFbc1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggPSBvQWN0aW9uQ29udGV4dC5zUGF0aCAmJiBvQWN0aW9uQ29udGV4dC5zUGF0aC5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0ID0gc0FjdGlvblBhdGggKyBcIi9cIiArIHNQYXJhbU5hbWUgKyBcIkBcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblRhcmdldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckRlZmF1bHRWYWx1ZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl07IC8vIGVpdGhlciB7ICRQYXRoOiAnc29tZVBhdGgnIH0gb3IgJ3NvbWVTdHJpbmcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlKHNQYXJhbU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnB1c2gocHJlZmlsbFBhcmFtZXRlcihzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmIHNCb3VuZEZ1bmN0aW9uTmFtZS5sZW5ndGggPiAwICYmIHR5cGVvZiBzQm91bmRGdW5jdGlvbk5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsbEJvdW5kRnVuY3Rpb24oc0JvdW5kRnVuY3Rpb25OYW1lLCBhQ29udGV4dHNbaV0sIG1QYXJhbWV0ZXJzLm1vZGVsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVByZWZpbGxQYXJhbVByb21pc2VzID0gUHJvbWlzZS5hbGwoYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYUV4ZWNGdW5jdGlvblByb21pc2VzOiBQcm9taXNlPGFueVtdPiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZ1bmN0aW9uUGFyYW1zICYmIGFGdW5jdGlvblBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFFeGVjRnVuY3Rpb25Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFGdW5jdGlvblBhcmFtcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNNb2R1bGUgPSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zdWJzdHJpbmcoMCwgbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlID0gRlBNSGVscGVyLmFjdGlvbldyYXBwZXIob0Nsb25lRXZlbnQsIHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbnRleHRzXCI6IGFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0UHJvbWlzZS5hbGwoW2FQcmVmaWxsUGFyYW1Qcm9taXNlcywgYUV4ZWNGdW5jdGlvblByb21pc2VzLCBvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZV0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChhUHJvbWlzZXM6IFthbnlbXSwgYW55W10sIGFueV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlOiBhbnkgPSBhUHJvbWlzZXNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZ1bmN0aW9uUGFyYW1zID0gYVByb21pc2VzWzFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCA9IGFQcm9taXNlc1syXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc0RpYWxvZ1BhcmFtTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNEaWFsb2dQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eShzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3Rbc0RpYWxvZ1BhcmFtTmFtZV1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0udmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIGRlZmF1bHQgdmFsdWUgaGFkIG5vdCBiZWVuIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBkdWUgdG8gZGlmZmVyZW50IGNvbnRleHRzLCB3ZSBkbyBub3RoaW5nIGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmICFhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLmJOb1Bvc3NpYmxlVmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gd2UgY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgc2FtZSBwYXJhbSB2YWx1ZSBmb3IgYWxsIHRoZSBjb250ZXh0czpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGogPCBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2ogKyAxXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpID09PVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqICsgMV0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vcGFyYW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWU6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT09IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbal0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL09ubHkgb25lIGNvbnRleHQsIHRoZW4gdGhlIGRlZmF1bHQgcGFyYW0gdmFsdWVzIGFyZSB0byBiZSB2ZXJpZmllZCBmcm9tIHRoZSBmdW5jdGlvbjpcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRnVuY3Rpb25QYXJhbXNbMF0gJiYgYUZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYkVycm9yRm91bmQgPSBhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1ZhbHVlLmJMYXRlUHJvcGVydHlFcnJvcjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgRGVmYXVsdCBQcm9wZXJ0eSBpcyBhIExhdGUgUHJvcGVydHkgYW5kIGFuIGVUYWcgZXJyb3Igd2FzIHJhaXNlZC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYkVycm9yRm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfTEFURV9QUk9QRVJUWVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcoc1RleHQsIHsgY29udGVudFdpZHRoOiBcIjI1ZW1cIiB9IGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNCaW5kaW5nUGFyYW1ldGVyID0gYVBhcmFtZXRlcnNbMF0gJiYgYVBhcmFtZXRlcnNbMF0uJE5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHNbMF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0NvbnRleHRPYmplY3Q6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKHNCaW5kaW5nUGFyYW1ldGVyLCBvQ29udGV4dE9iamVjdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhcmFtZXRlclwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzID0gb0RpYWxvZ0NvbnRlbnRcblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKVxuXHRcdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCkub01vZGVsKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob1BhcmFtZXRlck1vZGVsLCBcInBhcmFtc01vZGVsXCIpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHRcdFx0XHRtb2RlbDogXCJwYXJhbXNNb2RlbFwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIGVtcHR5IG1vZGVsIHRvIGFkZCBlbGVtZW50cyBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIE1WRiBmaWVsZHMgZGVmaW5lZCBvbiB0aGUgZGlhbG9nXG5cdFx0XHRcdFx0XHRjb25zdCBvTVZGTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob01WRk1vZGVsLCBcIm12ZnZpZXdcIik7XG5cblx0XHRcdFx0XHRcdGxldCBzQWN0aW9uUGF0aCA9IHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiO1xuXHRcdFx0XHRcdFx0YUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRcdFx0XHRcdFx0aWYgKCFhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gXCIvXCIgKyBzQWN0aW9uUGF0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBzQWN0aW9uUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAob1BhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBwYXJlbnQgY29udHJvbCBzcGVjaWZpZWQgYWRkIHRoZSBkaWFsb2cgYXMgZGVwZW5kZW50XG5cdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLmFkZERlcGVuZGVudChvRGlhbG9nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KGFDb250ZXh0c1swXSk7IC8vIHVzZSBjb250ZXh0IG9mIGZpcnN0IHNlbGVjdGVkIGxpbmUgaXRlbVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcgPSBvRGlhbG9nLmdldE9iamVjdEJpbmRpbmcoKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0fSk7XG59XG5mdW5jdGlvbiBwcmVwYXJlQWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uOiBhbnksIGFQcmVkZWZpbmVkUGFyYW1ldGVyczogYW55KSB7XG5cdC8vIGNoZWNrIGlmIHBhcmFtZXRlcnMgZXhpc3QgYXQgYWxsXG5cdGNvbnN0IGFQYXJhbWV0ZXJzID0gZ2V0QWN0aW9uUGFyYW1ldGVycyhvQWN0aW9uKTtcblx0YVByZWRlZmluZWRQYXJhbWV0ZXJzID0gYVByZWRlZmluZWRQYXJhbWV0ZXJzIHx8IFtdO1xuXG5cdGlmIChhUHJlZGVmaW5lZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIFRPRE86IG1lcmdlIHRoZSBwcmVkZWZpbmVkIG9uY2Ugd2l0aCB0aGUgcmVhbCBleGlzdGluZyBvbmVcblx0fVxuXG5cdHJldHVybiBhUGFyYW1ldGVycztcbn1cbmZ1bmN0aW9uIGdldEFjdGlvblBhcmFtZXRlcnMob0FjdGlvbjogYW55KSB7XG5cdGNvbnN0IGFQYXJhbWV0ZXJzID0gb0FjdGlvbi5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpIHx8IFtdO1xuXHRpZiAoYVBhcmFtZXRlcnMgJiYgYVBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0aWYgKG9BY3Rpb24uZ2V0T2JqZWN0KFwiJElzQm91bmRcIikpIHtcblx0XHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRcdHJldHVybiBhUGFyYW1ldGVycy5zbGljZSgxLCBhUGFyYW1ldGVycy5sZW5ndGgpIHx8IFtdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVBhcmFtZXRlcnM7XG59XG5mdW5jdGlvbiBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWw6IGFueSwgc1BhdGg6IGFueSwgY29udGV4dHM/OiBhbnksIG9Cb3VuZEFjdGlvbj86IGFueSkge1xuXHRjb25zdCB2QWN0aW9uQ3JpdGljYWwgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzUGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0FjdGlvbkNyaXRpY2FsXCIpO1xuXHRsZXQgc0NyaXRpY2FsUGF0aCA9IHZBY3Rpb25Dcml0aWNhbCAmJiB2QWN0aW9uQ3JpdGljYWwuJFBhdGg7XG5cdGlmICghc0NyaXRpY2FsUGF0aCkge1xuXHRcdC8vIHRoZSBzdGF0aWMgdmFsdWUgc2NlbmFyaW8gZm9yIGlzQWN0aW9uQ3JpdGljYWxcblx0XHRyZXR1cm4gISF2QWN0aW9uQ3JpdGljYWw7XG5cdH1cblx0Y29uc3QgYUJpbmRpbmdQYXJhbXMgPSBvQm91bmRBY3Rpb24gJiYgb0JvdW5kQWN0aW9uLmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIiksXG5cdFx0YVBhdGhzID0gc0NyaXRpY2FsUGF0aCAmJiBzQ3JpdGljYWxQYXRoLnNwbGl0KFwiL1wiKSxcblx0XHRiQ29uZGl0aW9uID1cblx0XHRcdGFCaW5kaW5nUGFyYW1zICYmIGFCaW5kaW5nUGFyYW1zLmxlbmd0aCAmJiB0eXBlb2YgYUJpbmRpbmdQYXJhbXMgPT09IFwib2JqZWN0XCIgJiYgc0NyaXRpY2FsUGF0aCAmJiBjb250ZXh0cyAmJiBjb250ZXh0cy5sZW5ndGg7XG5cdGlmIChiQ29uZGl0aW9uKSB7XG5cdFx0Ly9pbiBjYXNlIGJpbmRpbmcgcGF0YW1ldGVycyBhcmUgdGhlcmUgaW4gcGF0aCBuZWVkIHRvIHJlbW92ZSBlZzogLSBfaXQvaXNWZXJpZmllZCA9PiBuZWVkIHRvIHJlbW92ZSBfaXQgYW5kIHRoZSBwYXRoIHNob3VsZCBiZSBpc1ZlcmlmaWVkXG5cdFx0YUJpbmRpbmdQYXJhbXMuZmlsdGVyKGZ1bmN0aW9uIChvUGFyYW1zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gYVBhdGhzICYmIGFQYXRocy5pbmRleE9mKG9QYXJhbXMuJE5hbWUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0YVBhdGhzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c0NyaXRpY2FsUGF0aCA9IGFQYXRocy5qb2luKFwiL1wiKTtcblx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0T2JqZWN0KHNDcml0aWNhbFBhdGgpO1xuXHR9IGVsc2UgaWYgKHNDcml0aWNhbFBhdGgpIHtcblx0XHQvL2lmIHNjZW5hcmlvIGlzIHBhdGggYmFzZWQgcmV0dXJuIHRoZSBwYXRoIHZhbHVlXG5cdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChzQ3JpdGljYWxQYXRoKTtcblx0fVxufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb246IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgYkdldEJvdW5kQ29udGV4dDogYm9vbGVhbiwgc0dyb3VwSWQ6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvblByb21pc2UsXG5cdFx0YkVuYWJsZVN0cmljdEhhbmRsaW5nID0gdHJ1ZTtcblx0aWYgKGJHZXRCb3VuZENvbnRleHQpIHtcblx0XHRjb25zdCBzUGF0aCA9IG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCkuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb0FjdGlvbi5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5WzBdPy4ka2luZCAhPT0gXCJBY3Rpb25cIikge1xuXHRcdFx0Ly9kbyBub3QgZW5hYmxlIHRoZSBzdHJpY3QgaGFuZGxpbmcgaWYgaXRzIG5vdCBhbiBhY3Rpb25cblx0XHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChcblx0XHQobVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID4gMSkgfHxcblx0XHQhYkVuYWJsZVN0cmljdEhhbmRsaW5nXG5cdCkge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0ICB9KVxuXHRcdFx0OiBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0PyBvQWN0aW9uXG5cdFx0XHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKG9wZXJhdGlvbnMsIHNHcm91cElkLCBtUGFyYW1ldGVycy5sYWJlbCwgbVBhcmFtZXRlcnMubW9kZWwpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQ6IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBtUGFyYW1ldGVycy5tb2RlbClcblx0XHRcdCAgKTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRjb25zdCBhQ29udGV4dHMgPSBtUGFyYW1ldGVycy5hQ29udGV4dHMgfHwgW107XG5cdGNvbnN0IG9Nb2RlbCA9IG1QYXJhbWV0ZXJzLm1vZGVsO1xuXHRjb25zdCBpRXhpc3RpbmdNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmxlbmd0aCB8fCAwO1xuXHRjb25zdCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRjb25zdCBzQWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWU7XG5cdGNvbnN0IGZuT25TdWJtaXR0ZWQgPSBtUGFyYW1ldGVycy5mbk9uU3VibWl0dGVkO1xuXHRjb25zdCBmbk9uUmVzcG9uc2UgPSBtUGFyYW1ldGVycy5mbk9uUmVzcG9uc2U7XG5cdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0bGV0IG9BY3Rpb246IGFueTtcblx0Ly8gbGV0IGNvbnRleHRJbmRleCA9IDA7XG5cdC8vIGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cblx0ZnVuY3Rpb24gZm5EaWZmZXJlbnRpYXRlKHByb21pc2U6IGFueSkge1xuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0XHRmdW5jdGlvbiAocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRsZXQgYU1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdGFNZXNzYWdlcyA9IGFNZXNzYWdlcy5jb25jYXQobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0Ly8gQWN0aW9uIERpYWxvZyBtdXN0IHJlbWFpbiBvcGVuIGlmIHRoZXJlIGFyZSByZXNwb25zZSBlcnJvci1tZXNzYWdlcywgYmVjYXVzZSBpbiB0aGUgamF2YSBzdGFjayB0aGUgZGlhbG9nIHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseS5cblx0XHRcdFx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPiBpRXhpc3RpbmdNZXNzYWdlcyAmJiBhTWVzc2FnZXNbYU1lc3NhZ2VzLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZXNvbHZlZFwiIH07XG5cdFx0XHR9LFxuXHRcdFx0ZnVuY3Rpb24gKHJlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiB9O1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKSB7XG5cdFx0aWYgKGFBY3Rpb25QYXJhbWV0ZXJzICYmIGFBY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAoIWFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3dpdGNoIChhQWN0aW9uUGFyYW1ldGVyc1tqXS4kVHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5TdHJpbmdcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQxNlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0XHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gdGJjXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0b0FjdGlvbi5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbal0uJE5hbWUsIGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbiAob0FjdGlvbjogYW55LCBpbmRleDogYW55LCBvU2lkZUVmZmVjdDogYW55KSB7XG5cdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0c0dyb3VwSWQgPSAhYkdyb3VwZWQgPyBcIiRhdXRvLlwiICsgaW5kZXggOiBvQWN0aW9uLmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHRcdFx0b0FjdGlvblByb21pc2UgPSBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKG9BY3Rpb24sIG1QYXJhbWV0ZXJzLCBiR2V0Qm91bmRDb250ZXh0LCBzR3JvdXBJZCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgYWN0aW9ucyBmcm9tIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc1RyaWdnZXJBY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlcXVlc3Qgc2lkZSBlZmZlY3RzIGZvciB0aGlzIGFjdGlvblxuXHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlU2luZ2xlQWN0aW9uID0gZnVuY3Rpb24gKG9BY3Rpb246IGFueSwgaW5kZXg6IGFueSwgb1NpZGVFZmZlY3Q6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGV0IG9Mb2NhbFByb21pc2U7XG5cdFx0XHRcdFx0Y29uc3QgYUxvY2FsUHJvbWlzZSA9IFtdO1xuXHRcdFx0XHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRcdHNHcm91cElkID0gXCJhcGlNb2RlXCIgKyBpbmRleDtcblx0XHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMob0FjdGlvbiwgbVBhcmFtZXRlcnMsIGJHZXRCb3VuZENvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0XHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzVHJpZ2dlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0XHRcdFx0XHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRcdFx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2UgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMsIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHRcdFx0XHRcdG9Mb2NhbFByb21pc2Vcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0XHRQcm9taXNlLmFsbChhTG9jYWxQcm9taXNlKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHM6IGFueSkge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBjb250ZXh0LCBtQmluZGluZ1BhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdHJldHVybiBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24ob0FjdGlvbiwgaSwge1xuXHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgb0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGlkID0gKytqO1xuXHRcdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQsIGlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlUmVzdWx0cygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYkdyb3VwZWQpIHtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiLCBlbnN1cmUgdGhhdCBlYWNoIGFjdGlvbiBhbmQgbWF0Y2hpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIGFyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBuZXh0IHNldCBpcyBzdWJtaXR0ZWQuIFdvcmthcm91bmQgdW50aWwgSlNPTiBiYXRjaCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdC8vIEFsbG93IGFsc28gZm9yIExpc3QgUmVwb3J0LlxuXHRcdFx0XHRmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoYUNvbnRleHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhQ29udGV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KHNBY3Rpb25OYW1lICsgXCIoLi4uKVwiLCBhQ29udGV4dHNbaV0sIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKG9BY3Rpb24sIGFDb250ZXh0cy5sZW5ndGggPD0gMSA/IG51bGwgOiBpLCB7XG5cdFx0XHRcdFx0XHRjb250ZXh0OiBhQ29udGV4dHNbaV0sXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoYUFjdGlvblByb21pc2VzKTtcblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYUFjdGlvblByb21pc2VzLm1hcChmbkRpZmZlcmVudGlhdGUpKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVJlamVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZXNvbHZlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRsZXQgaVJlc3VsdENvdW50O1xuXHRcdFx0XHRcdFx0Zm9yIChpUmVzdWx0Q291bnQgPSAwOyBpUmVzdWx0Q291bnQgPCByZXN1bHRzLmxlbmd0aDsgaVJlc3VsdENvdW50KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGFSZWplY3RlZEl0ZW1zLnB1c2gocmVzdWx0c1tpUmVzdWx0Q291bnRdLnJlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0c1tpUmVzdWx0Q291bnRdLnN0YXR1cyA9PT0gXCJyZXNvbHZlZFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZCB0aGUgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCBzbyB0aGF0IGNyZWF0ZSBuZXcgYWN0aW9uIGNhbiB3b3JrIGluIGJvdGggY2FzZXMgLSB3aXRoIGFuZCB3aXRob3V0IGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVzZWQgZm9yIE5ld0FjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0c1tpUmVzdWx0Q291bnRdLmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXJlc3VsdHMgfHwgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhUmVqZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGJSZXR1cm5Bc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtcyk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY29udGV4dCBpcyBnaXZlbiBkaXJlY3RseSB3aXRob3V0IGFuIGFycmF5IHNvIGFsc28gbm8gYXJyYXkgaXMgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKGFSZXNvbHZlZEl0ZW1zWzBdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlZEl0ZW1zOiBhUmVzb2x2ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRyZWplY3RlZEl0ZW1zOiBhUmVqZWN0ZWRJdGVtc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0fVxuXHRcdH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KFwiL1wiICsgc0FjdGlvbk5hbWUgKyBcIiguLi4pXCIpO1xuXHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJhY3Rpb25JbXBvcnRcIjtcblx0XHRjb25zdCBvQWN0aW9uUHJvbWlzZSA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIG1QYXJhbWV0ZXJzLmxhYmVsLCBvTW9kZWwpXG5cdFx0KTtcblx0XHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdChcblx0XHRcdFx0Zm5PblJlc3BvbnNlIHx8XG5cdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHR9XG5cdFx0XHQpKCk7XG5cdFx0fSk7XG5cdH1cbn1cbmZ1bmN0aW9uIF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0OiBhbnksIHNBY3Rpb25OYW1lOiBhbnkpIHtcblx0bGV0IHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpO1xuXHRzUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpID8gc1BhdGguc3BsaXQoXCJAJHVpNS5vdmVybG9hZFwiKVswXSA6IHNQYXRoLnNwbGl0KFwiLzBcIilbMF07XG5cdHJldHVybiBzUGF0aC5zcGxpdChcIi9cIiArIHNBY3Rpb25OYW1lKVswXTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIHRvIGNhbGwgT0RhdGEgYWN0aW9ucyAoYm91bmQvaW1wb3J0KSBhbmQgZnVuY3Rpb25zIChib3VuZC9pbXBvcnQpXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHRleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzOiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl19
|
|
1348
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIkNvbnN0YW50cyIsIkZFTGlicmFyeSIsIkludm9jYXRpb25Hcm91cGluZyIsIkFjdGlvbiIsIk1lc3NhZ2VCb3giLCJjYWxsQm91bmRBY3Rpb24iLCJzQWN0aW9uTmFtZSIsImNvbnRleHRzIiwib01vZGVsIiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwibGVuZ3RoIiwiUHJvbWlzZSIsInJlamVjdCIsIkFycmF5IiwiaXNBcnJheSIsImJSZXR1cm5Bc0FycmF5Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNBY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwib0JvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJhQ29udGV4dHMiLCJpc0NyaXRpY2FsQWN0aW9uIiwiZ2V0SXNBY3Rpb25Dcml0aWNhbCIsImNhbGxBY3Rpb24iLCJjYWxsQWN0aW9uSW1wb3J0IiwiYmluZENvbnRleHQiLCJvQWN0aW9uSW1wb3J0IiwiZ2V0T2JqZWN0IiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJzRnVuY3Rpb25OYW1lIiwiY29udGV4dCIsInNGdW5jdGlvblBhdGgiLCJvQm91bmRGdW5jdGlvbiIsIl9leGVjdXRlRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJyZXNvbHZlIiwib0Z1bmN0aW9uSW1wb3J0Iiwib0Z1bmN0aW9uIiwic0dyb3VwSWQiLCJFcnJvciIsIm9GdW5jdGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJiSXNTYW1lRW50aXR5Iiwib1JldHVyblR5cGUiLCJhY3Rpb25EZWZpbml0aW9uIiwiZ2V0QWN0aW9uUGFyYW1ldGVycyIsIl9zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwiY29uZmlybUNyaXRpY2FsQWN0aW9uIiwiZm5PblN1Ym1pdHRlZCIsIm9uU3VibWl0dGVkIiwiZm5PblJlc3BvbnNlIiwib25SZXNwb25zZSIsImFjdGlvbk5hbWUiLCJtb2RlbCIsImJHZXRCb3VuZENvbnRleHQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJzZWxlY3RlZEl0ZW1zIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJwYXRoRXhwcmVzc2lvbnMiLCJmaW5kSW5kZXgiLCJleHAiLCIkaXNDb2xsZWN0aW9uIiwiZ2V0TW9kZWwiLCIkVHlwZSIsIm1CaW5kaW5nUGFyYW1ldGVycyIsIiRzZWxlY3QiLCJzcGxpdCIsImluZGV4T2YiLCJwdXNoIiwidHJpZ2dlckFjdGlvbnMiLCJzcGxpY2UiLCJiR3JvdXBlZCIsImludm9jYXRpb25Hcm91cGluZyIsIkNoYW5nZVNldCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiaXNDcmVhdGVBY3Rpb24iLCJiT2JqZWN0UGFnZSIsImNvbnRyb2xJZCIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImVudGl0eVNldE5hbWUiLCJtZXNzYWdlSGFuZGxlciIsIl9leGVjdXRlQWN0aW9uIiwib09wZXJhdGlvblJlc3VsdCIsIiRJc0JvdW5kIiwiaXNTdGF0aWMiLCIkUGFyYW1ldGVyIiwic29tZSIsImFQYXJhbWV0ZXIiLCIkRW50aXR5U2V0UGF0aCIsIiROYW1lIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJjYXRjaCIsIm9BY3Rpb25Db250ZXh0Iiwib1BhcmVudENvbnRyb2wiLCJib3VuZEFjdGlvbk5hbWUiLCJzdWZmaXhSZXNvdXJjZUtleSIsIm9SZXNvdXJjZUJ1bmRsZSIsImdldENvbnRyb2xsZXIiLCJzQ29uZmlybWF0aW9uVGV4dCIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJjb25maXJtIiwib25DbG9zZSIsInNBY3Rpb24iLCJPSyIsIm9PcGVyYXRpb24iLCJvRXJyb3IiLCJzaG93TWVzc2FnZURpYWxvZyIsInNQYXRoIiwiX2dldFBhdGgiLCJtZXRhTW9kZWwiLCJlbnRpdHlTZXRDb250ZXh0Iiwic0FjdGlvbk5hbWVQYXRoIiwiYWN0aW9uTmFtZUNvbnRleHQiLCJzRnJhZ21lbnROYW1lIiwib0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJvUGFyYW1ldGVyTW9kZWwiLCJKU09OTW9kZWwiLCIkZGlzcGxheU1vZGUiLCJhRmllbGRJbnZhbGlkIiwiYUZvcm1FbGVtZW50cyIsIm1GaWVsZFZhbHVlTWFwIiwidmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMiLCJhbGwiLCJmaWx0ZXIiLCJvRm9ybUVsZW1lbnQiLCJvRmllbGQiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlU3RhdGUiLCJtYXAiLCJ2YWx1ZSIsImlzQSIsImdldEl0ZW1zIiwiZ2V0VmFsdWUiLCJ1bmRlZmluZWQiLCJnZXRMYWJlbCIsImdldFRleHQiLCJhUmVzdWx0cyIsIl92YWxpZGF0ZU1lc3NhZ2VzIiwiaW52YWxpZEZpZWxkcyIsImJDbGVhclRhcmdldCIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFNZXNzYWdlcyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib0FjdGlvblBhcmFtZXRlcnMiLCJzUGFyYW1ldGVyIiwib01lc3NhZ2UiLCJzUGFyYW0iLCJyZXBsYWNlIiwiY29udHJvbElkcyIsImdldENvbnRyb2xJZCIsImluY2x1ZGVzIiwicmVtb3ZlTWVzc2FnZXMiLCJ0YXJnZXQiLCJvQ29udHJvbGxlciIsImhhbmRsZUNoYW5nZSIsIm9FdmVudCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImdldFNvdXJjZSIsInNGaWVsZElkIiwiZ2V0UGFyYW1ldGVyIiwib0ZpZWxkUHJvbWlzZSIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiYWN0aW9uIiwiZW50aXR5U2V0IiwibW9kZWxzIiwiY3JlYXRlZEZyYWdtZW50IiwiYUZ1bmN0aW9uUGFyYW1zIiwib09wZXJhdGlvbkJpbmRpbmciLCJzZXRVc2VyRGVmYXVsdHMiLCJGcmFnbWVudCIsImxvYWQiLCJkZWZpbml0aW9uIiwiY29udHJvbGxlciIsIm9EaWFsb2dDb250ZW50Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwiY29udGVudCIsImVzY2FwZUhhbmRsZXIiLCJjbG9zZSIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiZ2VuZXJhdGUiLCJ0ZXh0IiwiX2dldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUiLCJ0eXBlIiwicHJlc3MiLCJhRW1wdHlNYW5kYXRvcnlGaWVsZHMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9iamVjdCIsImtleXMiLCJzS2V5IiwidlBhcmFtZXRlclZhbHVlIiwib1BhcmFtZXRlckNvbnRleHQiLCJnZXRQYXJhbWV0ZXJDb250ZXh0IiwiaSIsImFNVkZDb250ZW50IiwiZ2V0UHJvcGVydHkiLCJhS2V5VmFsdWVzIiwiaiIsIktleSIsIm1lc3NhZ2VzIiwibWVzc2FnZUhhbmRsaW5nIiwiZ2V0TWVzc2FnZXMiLCJjb25jYXQiLCJlcnJvclRhcmdldHNJbkFQRCIsIm1lc3NhZ2UiLCJnZXRUYXJnZXQiLCJkZXN0cm95Iiwic3VidGl0bGVDb2x1bW4iLCJnZXRNZXNzYWdlQ29sdW1uIiwiZXJyb3JDb250ZXh0IiwibWVzc2FnZVRhcmdldHMiLCJnZXRUYXJnZXRzIiwiZmluZCIsIm9Db250ZXh0IiwiYWRkaXRpb25hbFRleHQiLCJpc09wZW4iLCJzaG93RXJyb3JJbkFQRCIsImJTaG93TWVzc2FnZUJveCIsImJIYXNFdGFnTWVzc2FnZSIsIm1vZGlmeUVUYWdNZXNzYWdlc09ubHkiLCJzaG93TWVzc2FnZXMiLCJpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW4iLCJtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjayIsInVubG9jayIsIm9NZXNzYWdlcyIsImNvZGUiLCJjdXN0b21NZXNzYWdlcyIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJlbmRCdXR0b24iLCJiZWZvcmVPcGVuIiwib0Nsb25lRXZlbnQiLCJhc3NpZ24iLCJnZXREZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uIiwiZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2ciLCJzQmluZGluZ1BhcmFtZXRlciIsInNCb3VuZEZ1bmN0aW9uTmFtZSIsInByZWZpbGxQYXJhbWV0ZXIiLCJzUGFyYW1OYW1lIiwidlBhcmFtRGVmYXVsdFZhbHVlIiwiaW5SZXNvbHZlIiwiJFBhdGgiLCJyZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkiLCJ2UGFyYW1WYWx1ZSIsInNQYXRoRm9yQ29udGV4dCIsInBhcmFtTmFtZSIsImJOb1Bvc3NpYmxlVmFsdWUiLCJyZXF1ZXN0UHJvcGVydHkiLCJMb2ciLCJlcnJvciIsImJMYXRlUHJvcGVydHlFcnJvciIsIm9EYXRhIiwiZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwic0FjdGlvblBhcmFtZXRlckFubm90YXRpb25QYXRoIiwiZ2V0UGFyYW1ldGVyUGF0aCIsIm9QYXJhbWV0ZXJBbm5vdGF0aW9ucyIsIm9QYXJhbWV0ZXJEZWZhdWx0VmFsdWUiLCJhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlIiwidlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFQcmVmaWxsUGFyYW1Qcm9taXNlcyIsImFFeGVjRnVuY3Rpb25Qcm9taXNlcyIsIm9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiRlBNSGVscGVyIiwiYWN0aW9uV3JhcHBlciIsImFQcm9taXNlcyIsImN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSIsImZ1bmN0aW9uUGFyYW1zIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsImhhc093blByb3BlcnR5Iiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJvVmFsdWUiLCJzVGV4dCIsIndhcm5pbmciLCJjb250ZW50V2lkdGgiLCJmbkFzeW5jQmVmb3JlT3BlbiIsImFQYXJhbWV0ZXJzIiwicmVxdWVzdE9iamVjdCIsIm9Db250ZXh0T2JqZWN0IiwiYWZ0ZXJDbG9zZSIsImdldEFnZ3JlZ2F0aW9uIiwic2V0TW9kZWwiLCJiaW5kRWxlbWVudCIsInBhdGgiLCJvTVZGTW9kZWwiLCJhZGREZXBlbmRlbnQiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdEJpbmRpbmciLCJvcGVuIiwic2xpY2UiLCJ2QWN0aW9uQ3JpdGljYWwiLCJzQ3JpdGljYWxQYXRoIiwiYUJpbmRpbmdQYXJhbXMiLCJhUGF0aHMiLCJiQ29uZGl0aW9uIiwib1BhcmFtcyIsImluZGV4Iiwiam9pbiIsInNFbnRpdHlTZXROYW1lIiwiYUFjdGlvbk5hbWUiLCJiUmVzb3VyY2VLZXlFeGlzdHMiLCJjaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMiLCJhQ3VzdG9tQnVuZGxlcyIsImV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMiLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJvUHJvcGVydHkiLCIka2luZCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsIm9wZXJhdGlvbnMiLCJpRXhpc3RpbmdNZXNzYWdlcyIsImZuRGlmZmVyZW50aWF0ZSIsInByb21pc2UiLCJyZXNwb25zZSIsInN0YXR1cyIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFBY3Rpb25Qcm9taXNlcyIsImZuRXhlY3V0ZUFjdGlvbiIsImFjdGlvbkNvbnRleHQiLCJvU2lkZUVmZmVjdCIsImdldFVwZGF0ZUdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJmblJlcXVlc3RTaWRlRWZmZWN0cyIsImZuRXhlY3V0ZVNpbmdsZUFjdGlvbiIsImFjdGlvblJlc29sdmUiLCJhTG9jYWxQcm9taXNlIiwiZm5FeGVjdXRlU2VxdWVudGlhbGx5IiwiY29udGV4dHNUb0V4ZWN1dGUiLCJub29wIiwicHJvY2Vzc09uZUFjdGlvbiIsImFjdGlvbkluZGV4Iiwib0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlIiwiaWQiLCJmbkhhbmRsZVJlc3VsdHMiLCJyZXN1bHRzIiwiYVJlamVjdGVkSXRlbXMiLCJhUmVzb2x2ZWRJdGVtcyIsImlSZXN1bHRDb3VudCIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJyZXNvbHZlZEl0ZW1zIiwicmVqZWN0ZWRJdGVtcyIsImZpbmFsbHkiLCJzaG93RGlhbG9nIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIm9Mb2NhbFByb21pc2UiLCJzVHJpZ2dlckFjdGlvbiIsImV4ZWN1dGVBY3Rpb24iLCJnZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJvcGVyYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxuY29uc3QgQ29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0SW52b2NhdGlvbkdyb3VwaW5nID0gRkVMaWJyYXJ5Lkludm9jYXRpb25Hcm91cGluZztcbmNvbnN0IEFjdGlvbiA9IChNZXNzYWdlQm94IGFzIGFueSkuQWN0aW9uO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnMuY2FsbEJvdW5kQWN0aW9uXG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBjb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgT0RhdGEgTW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSAgW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtICBbbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVyc10gQSBtYXAgb2YgcGFyYW1ldGVycyB0byBiZSBzZW50IGZvciBldmVyeSBhY3Rpb24gY2FsbFxuICogQHBhcmFtICBbbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzXSBBIG1hcCBvZiBiaW5kaW5nIHBhcmFtZXRlcnMgdGhhdCB3b3VsZCBiZSBwYXJ0IG9mICRzZWxlY3QgYW5kICRleHBhbmQgY29taW5nIGZyb20gc2lkZSBlZmZlY3RzIGZvciBib3VuZCBhY3Rpb25zXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0XSBBcnJheSBvZiBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgaW4gYWRkaXRpb24gdG8gYWN0dWFsIHRhcmdldCBwcm9wZXJ0aWVzIG9mIHRoZSBzaWRlIGVmZmVjdFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiBDaGFuZ2VzZXQgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCBJc29sYXRlZCB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHMsIGRlZmF1bHRzIHRvIElzb2xhdGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSAgW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQgdGhlIGRpYWxvZ3MgYXJlIGFkZGVkIGFzIGRlcGVuZGVudCBvZiB0aGUgcGFyZW50IGNvbnRyb2xcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dF0gSWYgc3BlY2lmaWVkIHRoZSBhY3Rpb24gcHJvbWlzZSByZXR1cm5zIHRoZSBib3VuZCBjb250ZXh0XG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEJvdW5kQWN0aW9uKHNBY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHRzOiBhbnksIG9Nb2RlbDogYW55LCBvQXBwQ29tcG9uZW50OiBvYmplY3QsIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0aWYgKCFjb250ZXh0cyB8fCBjb250ZXh0cy5sZW5ndGggPT09IDApIHtcblx0XHQvL0luIEZyZWVzdHlsZSBhcHBzIGJvdW5kIGFjdGlvbnMgY2FuIGhhdmUgbm8gY29udGV4dFxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGFjdGlvbnMgYWx3YXlzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb250ZXh0XCIpO1xuXHR9XG5cdC8vIHdlIGV4cGVjdCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHNcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udGV4dHMpKSB7XG5cdFx0bVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXkgPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vYWN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGlzIGNvbnRleHQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmcgc28gVUkgZmllbGRzIGFyZSB1cGRhdGVkIHdpdGggcmVzcG9uc2UgZGF0YVxuXHRcdGNvbnRleHRzID0gW2NvbnRleHRzXTtcblx0fVxuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNBY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0c1swXS5nZXRQYXRoKCkpfS8ke3NBY3Rpb25OYW1lfWAsXG5cdFx0b0JvdW5kQWN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzQWN0aW9uUGF0aH0vQCR1aTUub3ZlcmxvYWQvMGApO1xuXHRtUGFyYW1ldGVycy5hQ29udGV4dHMgPSBjb250ZXh0cztcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIGNvbnRleHRzLCBvQm91bmRBY3Rpb24pO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbXBvcnQgdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIFttUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzXSBBIG1hcCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgYWN0aW9uIGltcG9ydFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IGFueSwgb0FwcENvbXBvbmVudDogb2JqZWN0LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmICghb01vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQWN0aW9uIGV4cGVjdHMgYSBtb2RlbC9jb250ZXh0IGZvciBleGVjdXRpb25cIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzQWN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgLyR7c0FjdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9BY3Rpb25JbXBvcnQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHtvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkQWN0aW9uXCIpfS8wYCk7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBnZXRJc0FjdGlvbkNyaXRpY2FsKG9NZXRhTW9kZWwsIGAke3NBY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZGApO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgb01vZGVsLCBvQWN0aW9uSW1wb3J0LCBvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycyk7XG59XG5mdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IGFueSwgb01vZGVsOiBhbnkpIHtcblx0aWYgKCFjb250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgZnVuY3Rpb25zIGFsd2F5cyByZXF1aXJlcyBhIGNvbnRleHRcIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRnVuY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSl9LyR7c0Z1bmN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnkpIHtcblx0aWYgKCFzRnVuY3Rpb25OYW1lKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgLyR7c0Z1bmN0aW9uTmFtZX1gKS5nZXRQYXRoKCksXG5cdFx0b0Z1bmN0aW9uSW1wb3J0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7b01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkRnVuY3Rpb25cIil9LzBgKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvRnVuY3Rpb25JbXBvcnQpO1xufVxuZnVuY3Rpb24gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBhbnksIG9Nb2RlbDogYW55LCBvRnVuY3Rpb246IGFueSwgY29udGV4dD86IGFueSkge1xuXHRsZXQgc0dyb3VwSWQ7XG5cdGlmICghb0Z1bmN0aW9uIHx8ICFvRnVuY3Rpb24uZ2V0T2JqZWN0KCkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGdW5jdGlvbiAke3NGdW5jdGlvbk5hbWV9IG5vdCBmb3VuZGApKTtcblx0fVxuXHRpZiAoY29udGV4dCkge1xuXHRcdG9GdW5jdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtzRnVuY3Rpb25OYW1lfSguLi4pYCwgY29udGV4dCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uR3JvdXBcIjtcblx0fSBlbHNlIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9KC4uLilgKTtcblx0XHRzR3JvdXBJZCA9IFwiZnVuY3Rpb25JbXBvcnRcIjtcblx0fVxuXHRjb25zdCBvRnVuY3Rpb25Qcm9taXNlID0gb0Z1bmN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRyZXR1cm4gb0Z1bmN0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gb0Z1bmN0aW9uLmdldEJvdW5kQ29udGV4dCgpO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IGFueSwgb01vZGVsOiBhbnksIG9BY3Rpb246IGFueSwgb0FwcENvbXBvbmVudDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdGxldCBhQWN0aW9uUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLmFjdGlvblBhcmFtZXRlcnMgfHwgW107XG5cdFx0bGV0IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBhbnkgPSB7fTtcblx0XHRsZXQgZm5EaWFsb2c7XG5cdFx0bGV0IG9BY3Rpb25Qcm9taXNlO1xuXHRcdGNvbnN0IHNBY3Rpb25MYWJlbCA9IG1QYXJhbWV0ZXJzLmxhYmVsO1xuXHRcdGxldCBiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyA9IG1QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c7XG5cdFx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzO1xuXHRcdGNvbnN0IGJJc0NyZWF0ZUFjdGlvbiA9IG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZUFjdGlvbjtcblx0XHRjb25zdCBiSXNDcml0aWNhbEFjdGlvbiA9IG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb247XG5cdFx0bGV0IG9NZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDogYW55O1xuXHRcdGxldCBpTWVzc2FnZVNpZGVFZmZlY3Q7XG5cdFx0bGV0IGJJc1NhbWVFbnRpdHk7XG5cdFx0bGV0IG9SZXR1cm5UeXBlO1xuXHRcdGNvbnN0IGFjdGlvbkRlZmluaXRpb24gPSBvQWN0aW9uLmdldE9iamVjdCgpO1xuXHRcdGlmICghb0FjdGlvbiB8fCAhb0FjdGlvbi5nZXRPYmplY3QoKSkge1xuXHRcdFx0cmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEFjdGlvbiAke3NBY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdFx0fVxuXG5cdFx0YUFjdGlvblBhcmFtZXRlcnMgPSBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb24pO1xuXG5cdFx0YlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPSBfc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZywgYUFjdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGJTaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nKSB7XG5cdFx0XHRmbkRpYWxvZyA9IHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c7XG5cdFx0fSBlbHNlIGlmIChiSXNDcml0aWNhbEFjdGlvbikge1xuXHRcdFx0Zm5EaWFsb2cgPSBjb25maXJtQ3JpdGljYWxBY3Rpb247XG5cdFx0fVxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0Zm5PblN1Ym1pdHRlZDogbVBhcmFtZXRlcnMub25TdWJtaXR0ZWQsXG5cdFx0XHRmbk9uUmVzcG9uc2U6IG1QYXJhbWV0ZXJzLm9uUmVzcG9uc2UsXG5cdFx0XHRhY3Rpb25OYW1lOiBzQWN0aW9uTmFtZSxcblx0XHRcdG1vZGVsOiBvTW9kZWwsXG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVyczogYUFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRiR2V0Qm91bmRDb250ZXh0OiBtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0LFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOiBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24sXG5cdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRzZWxlY3RlZEl0ZW1zOiBtUGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zXG5cdFx0fTtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGFDb250ZXh0c1swXS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRpTWVzc2FnZVNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChleHA6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBleHAgPT09IFwic3RyaW5nXCIgJiYgZXhwID09PSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRvUmV0dXJuVHlwZSA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFJldHVyblR5cGVcIik7XG5cdFx0XHRcdFx0YklzU2FtZUVudGl0eSA9XG5cdFx0XHRcdFx0XHRvUmV0dXJuVHlwZSAmJiAhb1JldHVyblR5cGUuJGlzQ29sbGVjdGlvbiAmJiBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0T2JqZWN0KHNNZXRhUGF0aCkuJFR5cGUgPT09IG9SZXR1cm5UeXBlLiRUeXBlO1xuXG5cdFx0XHRcdFx0aWYgKGlNZXNzYWdlU2lkZUVmZmVjdCA+IC0xIHx8IGJJc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBtZXNzYWdlIHBhdGggaXMgYW5ub3RhdGVkIGFzIHNpZGUgZWZmZWN0LiBBcyB0aGVyZSdzIG5vIGJpbmRpbmcgZm9yIGl0IGFuZCB0aGUgbW9kZWwgZG9lcyBjdXJyZW50bHkgbm90IGFsbG93XG5cdFx0XHRcdFx0XHQvLyB0byBhZGQgaXQgYXQgYSBsYXRlciBwb2ludCBvZiB0aW1lIHdlIGhhdmUgdG8gdGFrZSBjYXJlIGl0J3MgcGFydCBvZiB0aGUgJHNlbGVjdCBvZiB0aGUgUE9TVCwgdGhlcmVmb3JlIG1vdmluZyBpdC5cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRvQWN0aW9uLmdldE9iamVjdChgJFJldHVyblR5cGUvJFR5cGUvJHtzTWVzc2FnZXNQYXRofWApICYmXG5cdFx0XHRcdFx0XHRcdCghbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgfHxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdC5zcGxpdChcIixcIikuaW5kZXhPZihzTWVzc2FnZXNQYXRoKSA9PT0gLTEpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0OiBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgc2lkZSBlZmZlY3RzIGF0IGVudGl0eSBsZXZlbCBiZWNhdXNlICRzZWxlY3Qgc3RvcHMgdGhlc2UgYmVpbmcgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHRcdFx0XHRcdFx0XHQvLyBPbmx5IGlmIG5vIG90aGVyIHNpZGUgZWZmZWN0cyB3ZXJlIGFkZGVkIGZvciBNZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5wdXNoKFwiKlwiKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5sZW5ndGggPT09IDAgJiYgaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBubyB0cmlnZ2VyIGFjdGlvbiB0aGVyZWZvcmUgbm8gbmVlZCB0byByZXF1ZXN0IG1lc3NhZ2VzIGFnYWluXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLnNwbGljZShpTWVzc2FnZVNpZGVFZmZlY3QsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFDb250ZXh0cztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iR3JvdXBlZCA9IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyA9PT0gSW52b2NhdGlvbkdyb3VwaW5nLkNoYW5nZVNldDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdH1cblx0XHRpZiAoZm5EaWFsb2cpIHtcblx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZm5EaWFsb2coXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRzQWN0aW9uTGFiZWwsXG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0b0FjdGlvbixcblx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9BY3Rpb25Qcm9taXNlID0gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0FjdGlvblByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvT3BlcmF0aW9uUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzLmxlbmd0aCAmJlxuXHRcdFx0XHRcdGFjdGlvbkRlZmluaXRpb24uJElzQm91bmRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly9jaGVjayBmb3Igc2tpcHBpbmcgc3RhdGljIGFjdGlvbnNcblx0XHRcdFx0XHRjb25zdCBpc1N0YXRpYyA9IChhY3Rpb25EZWZpbml0aW9uLiRQYXJhbWV0ZXIgfHwgW10pLnNvbWUoKGFQYXJhbWV0ZXI6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0YWN0aW9uRGVmaW5pdGlvbi4kRW50aXR5U2V0UGF0aCAmJlxuXHRcdFx0XHRcdFx0XHRhY3Rpb25EZWZpbml0aW9uLiRFbnRpdHlTZXRQYXRoID09PSBhUGFyYW1ldGVyLiROYW1lICYmXG5cdFx0XHRcdFx0XHRcdGFQYXJhbWV0ZXIuJGlzQ29sbGVjdGlvblxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIWlzU3RhdGljKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXMsXG5cdFx0XHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IGFueSxcblx0c0FjdGlvbkxhYmVsOiBhbnksXG5cdG1QYXJhbWV0ZXJzOiBhbnksXG5cdGFBY3Rpb25QYXJhbWV0ZXJzOiBhbnksXG5cdG9BY3Rpb25Db250ZXh0OiBhbnksXG5cdG9QYXJlbnRDb250cm9sOiBhbnksXG5cdGVudGl0eVNldE5hbWU6IGFueSxcblx0bWVzc2FnZUhhbmRsZXI6IGFueVxuKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0bGV0IGJvdW5kQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBudWxsO1xuXHRcdGJvdW5kQWN0aW9uTmFtZSA9XG5cdFx0XHRib3VuZEFjdGlvbk5hbWUuaW5kZXhPZihcIi5cIikgPj0gMCA/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXSA6IGJvdW5kQWN0aW9uTmFtZTtcblx0XHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBlbnRpdHlTZXROYW1lID8gYCR7ZW50aXR5U2V0TmFtZX18JHtib3VuZEFjdGlvbk5hbWV9YCA6IFwiXCI7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRjb25zdCBzQ29uZmlybWF0aW9uVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XCJDX09QRVJBVElPTlNfQUNUSU9OX0NPTkZJUk1fTUVTU0FHRVwiLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0bnVsbCxcblx0XHRcdHN1ZmZpeFJlc291cmNlS2V5XG5cdFx0KTtcblxuXHRcdE1lc3NhZ2VCb3guY29uZmlybShzQ29uZmlybWF0aW9uVGV4dCwge1xuXHRcdFx0b25DbG9zZTogYXN5bmMgZnVuY3Rpb24gKHNBY3Rpb246IGFueSkge1xuXHRcdFx0XHRpZiAoc0FjdGlvbiA9PT0gQWN0aW9uLk9LKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9PcGVyYXRpb24gPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycywgb1BhcmVudENvbnRyb2wpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uKTtcblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nKFxuXHRzQWN0aW9uTmFtZTogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBhbnksXG5cdHNBY3Rpb25MYWJlbDogYW55LFxuXHRtUGFyYW1ldGVyczogYW55LFxuXHRhQWN0aW9uUGFyYW1ldGVyczogYW55LFxuXHRvQWN0aW9uQ29udGV4dDogYW55LFxuXHRvUGFyZW50Q29udHJvbDogYW55LFxuXHRlbnRpdHlTZXROYW1lOiBhbnksXG5cdG1lc3NhZ2VIYW5kbGVyOiBhbnlcbikge1xuXHRjb25zdCBzUGF0aCA9IF9nZXRQYXRoKG9BY3Rpb25Db250ZXh0LCBzQWN0aW9uTmFtZSksXG5cdFx0bWV0YU1vZGVsID0gb0FjdGlvbkNvbnRleHQuZ2V0TW9kZWwoKS5vTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCksXG5cdFx0c0FjdGlvbk5hbWVQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIilcblx0XHRcdD8gb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiL0AkdWk1Lm92ZXJsb2FkLzBcIilbMF1cblx0XHRcdDogb0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiLzBcIilbMF0sXG5cdFx0YWN0aW9uTmFtZUNvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvbk5hbWVQYXRoKSxcblx0XHRiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyZWF0ZUFjdGlvbixcblx0XHRzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9BY3Rpb25QYXJhbWV0ZXJEaWFsb2dcIjtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRjb25zdCBvRnJhZ21lbnQgPSBYTUxUZW1wbGF0ZVByb2Nlc3Nvci5sb2FkVGVtcGxhdGUoc0ZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRjb25zdCBvUGFyYW1ldGVyTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHtcblx0XHRcdCRkaXNwbGF5TW9kZToge31cblx0XHR9KTtcblx0XHRsZXQgYUZpZWxkSW52YWxpZDogYW55W10gPSBbXTtcblx0XHRsZXQgYUZvcm1FbGVtZW50czogYW55W10gPSBbXTtcblx0XHRjb25zdCBtRmllbGRWYWx1ZU1hcDogYW55ID0ge307XG5cdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRjb25zdCBhUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0Zvcm1FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZCA9IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0UmVxdWlyZWQoKSAmJiBvRmllbGQuZ2V0VmFsdWVTdGF0ZSgpICE9PSBcIkVycm9yXCI7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uIChvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIilcblx0XHRcdFx0XHRcdFx0PyBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0SXRlbXMoKVxuXHRcdFx0XHRcdFx0XHQ6IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvRm9ybUVsZW1lbnQuZ2V0TGFiZWwoKS5nZXRUZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gYVJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0ICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IF92YWxpZGF0ZU1lc3NhZ2VzID0gZnVuY3Rpb24gKGFjdGlvblBhcmFtZXRlcnM6IGFueSwgaW52YWxpZEZpZWxkczogYW55LCBiQ2xlYXJUYXJnZXQ/OiBib29sZWFuKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXG5cdFx0XHRpbnZhbGlkRmllbGRzID0gaW52YWxpZEZpZWxkcyB8fCBbXTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGludmFsaWRGaWVsZHMgPSBbXTtcblx0XHRcdH1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAob0FjdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdFx0XHRjb25zdCBzUGFyYW1ldGVyID0gb0FjdGlvblBhcmFtZXRlcnMuJE5hbWU7XG5cdFx0XHRcdGFNZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhcmFtID0gc1BhcmFtZXRlci5yZXBsYWNlKFwiLWlubmVyXCIsIFwiXCIpO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9NZXNzYWdlLmNvbnRyb2xJZHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0KG9NZXNzYWdlLmdldENvbnRyb2xJZCgpLmluY2x1ZGVzKGBBUERfOjoke3NQYXJhbWV0ZXJ9YCkgfHxcblx0XHRcdFx0XHRcdFx0KG9NZXNzYWdlLmdldENvbnRyb2xJZCgpLmluY2x1ZGVzKGBBUERfOjoke3NQYXJhbWV0ZXJ9aW5uZXJgKSAmJiBpbnZhbGlkRmllbGRzLmluZGV4T2YoYEFQRF86OiR7c1BhcmFtfWApIDwgMCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAoYkNsZWFyVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpbnZhbGlkRmllbGRzLnB1c2goYEFQRF86OiR7c1BhcmFtfWApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBIYW5kbGUgbWVzc2FnZXMgcmVsYXRlZCB0byBpbnB1dCB3aXRoIGludmFsaWQgdG9rZW5cblx0XHRcdFx0XHRpZiAob01lc3NhZ2UudGFyZ2V0LmluY2x1ZGVzKGBBUERfOjoke3NQYXJhbWV0ZXJ9YCkpIHtcblx0XHRcdFx0XHRcdGludmFsaWRGaWVsZHMucHVzaChgQVBEXzo6JHtzUGFyYW19YCk7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZS50YXJnZXQgPSBiQ2xlYXJUYXJnZXQgPyBcIlwiIDogb01lc3NhZ2UudGFyZ2V0O1xuXHRcdFx0XHRcdFx0aWYgKGJDbGVhclRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBpbnZhbGlkRmllbGRzO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0XHRjb25zdCBzRmllbGRJZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJpZFwiKTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkUHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpO1xuXHRcdFx0XHRpZiAob0ZpZWxkUHJvbWlzZSkge1xuXHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IG9GaWVsZFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3ZhbGlkYXRlTWVzc2FnZXMoYUFjdGlvblBhcmFtZXRlcnMsIGFGaWVsZEludmFsaWQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY3JlYXRlZEZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdG9GcmFnbWVudCxcblx0XHRcdFx0eyBuYW1lOiBzRnJhZ21lbnROYW1lIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogb0FjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dCxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRhY3Rpb25OYW1lOiBhY3Rpb25OYW1lQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBlbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IGVudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRjb25zdCBhQ29udGV4dHM6IGFueVtdID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRcdFx0Y29uc3QgYUZ1bmN0aW9uUGFyYW1zOiBhbnlbXSA9IFtdO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuXHRcdFx0bGV0IG9PcGVyYXRpb25CaW5kaW5nOiBhbnk7XG5cdFx0XHRhd2FpdCBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMob0FwcENvbXBvbmVudCwgYUFjdGlvblBhcmFtZXRlcnMsIG9QYXJhbWV0ZXJNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRjb25zdCBvRGlhbG9nQ29udGVudCA9IChhd2FpdCBGcmFnbWVudC5sb2FkKHsgZGVmaW5pdGlvbjogY3JlYXRlZEZyYWdtZW50LCBjb250cm9sbGVyOiBvQ29udHJvbGxlciB9KSkgYXMgQ29udHJvbDtcblx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IG9QYXJlbnRDb250cm9sLmdldENvbnRyb2xsZXIoKS5vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh1bmRlZmluZWQsIHtcblx0XHRcdFx0dGl0bGU6IHNBY3Rpb25MYWJlbCB8fCBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19USVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIk9rXCJdKSwge1xuXHRcdFx0XHRcdHRleHQ6IGJJc0NyZWF0ZUFjdGlvblxuXHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdDogX2dldEFjdGlvblBhcmFtZXRlckFjdGlvbk5hbWUob1Jlc291cmNlQnVuZGxlLCBzQWN0aW9uTGFiZWwsIHNBY3Rpb25OYW1lLCBlbnRpdHlTZXROYW1lKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYUVtcHR5TWFuZGF0b3J5RmllbGRzID0gYXdhaXQgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZXMgPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b01lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUVtcHR5TWFuZGF0b3J5RmllbGRzW2ldXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6IDIwMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJFcnJvclwiXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IG9NZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGFGaWVsZEludmFsaWQgPSBfdmFsaWRhdGVNZXNzYWdlcyhhQWN0aW9uUGFyYW1ldGVycywgYUZpZWxkSW52YWxpZCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFGaWVsZEludmFsaWQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGluZy5zaG93VW5ib3VuZE1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBkdWUgdG8gdXNpbmcgdGhlIHNlYXJjaCBhbmQgdmFsdWUgaGVscHMgb24gdGhlIGFjdGlvbiBkaWFsb2cgdHJhbnNpZW50IG1lc3NhZ2VzIGNvdWxkIGFwcGVhclxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIG5lZWQgYW4gVVggZGVzaWduIGZvciB0aG9zZSB0byBzaG93IHRoZW0gdG8gdGhlIHVzZXIgLSBmb3Igbm93IHJlbW92ZSB0aGVtIGJlZm9yZSBjb250aW51aW5nXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbW92ZSBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gRGlhbG9nIChTaW1wbGVGb3JtKSB0byBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGluIHRoZSBvcGVyYXRpb24gYmluZGluZ3MgZm9yIGFsbCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdGxldCB2UGFyYW1ldGVyVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUFjdGlvblBhcmFtZXRlcnNbaV0uJGlzQ29sbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IG9EaWFsb2cuZ2V0TW9kZWwoXCJtdmZ2aWV3XCIpLmdldFByb3BlcnR5KGAvJHthQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZX1gKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhS2V5VmFsdWVzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaiBpbiBhTVZGQ29udGVudCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFLZXlWYWx1ZXMucHVzaChhTVZGQ29udGVudFtqXS5LZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IGFLZXlWYWx1ZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSBvUGFyYW1ldGVyQ29udGV4dC5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS52YWx1ZSA9IHZQYXJhbWV0ZXJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubGFiZWwgPSBzQWN0aW9uTGFiZWw7XG5cdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9PcGVyYXRpb24gPSBhd2FpdCBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycywgb1BhcmVudENvbnRyb2wpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IG1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VzLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQhbVBhcmFtZXRlcnMuYkdyb3VwZWQgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0ISghbVBhcmFtZXRlcnMuY29udHJvbC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmIGFDb250ZXh0cy5sZW5ndGggPT09IDEpICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvclRhcmdldHNJbkFQRCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1swXS4kTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvclRhcmdldHNJbkFQRCA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yVGFyZ2V0c0luQVBEID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VidGl0bGVDb2x1bW4gPSBDb21tb25VdGlscy5nZXRNZXNzYWdlQ29sdW1uKG1QYXJhbWV0ZXJzLmNvbnRyb2wpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBlcnJvckNvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGVycm9yVGFyZ2V0c0luQVBEID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlVGFyZ2V0cyA9IG1lc3NhZ2UuZ2V0VGFyZ2V0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG1lc3NhZ2VUYXJnZXRzICYmIG1lc3NhZ2VUYXJnZXRzLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlVGFyZ2V0c1swXS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDb250ZXh0ID0gYUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG9Db250ZXh0LmdldFBhdGgoKSkgIT09IC0xO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGVycm9yQ29udGV4dCA/IGVycm9yQ29udGV4dC5nZXRPYmplY3QoKVtzdWJ0aXRsZUNvbHVtbl0gOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0KCkuaW5kZXhPZihtUGFyYW1ldGVycy5hY3Rpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG1QYXJhbWV0ZXJzLmFBY3Rpb25QYXJhbWV0ZXJzWzBdLiROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JUYXJnZXRzSW5BUEQgPT09IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JUYXJnZXRzSW5BUEQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vaXNvbGF0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxIHx8ICFlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGRvZXMgbm90IG1hdHRlciBpZiBlcnJvciBpcyBpbiBBUEQgb3Igbm90LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29udGV4dHMgc2VsZWN0ZWQgb3IgaWYgdGhlIGVycm9yIGlzIG5vdCB0aGUgQVBELCB3ZSBjbG9zZSBpdC5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMuYkdyb3VwZWQgJiYgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vY2hhbmdlc2V0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hvd0Vycm9ySW5BUEQgPSBvRGlhbG9nLmlzT3BlbigpICYmIGVycm9yVGFyZ2V0c0luQVBEO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBiU2hvd01lc3NhZ2VCb3ggPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzWzBdLmdldFRhcmdldCgpICE9PSB1bmRlZmluZWQgJiYgbWVzc2FnZXNbMF0uZ2V0VGFyZ2V0KCkgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJTaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gbWVzc2FnZUhhbmRsaW5nLm1vZGlmeUVUYWdNZXNzYWdlc09ubHkob01lc3NhZ2VNYW5hZ2VyLCBvUmVzb3VyY2VCdW5kbGUsIHVuZGVmaW5lZCk7XG5cblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe1xuXHRcdFx0XHRcdFx0XHRcdFx0Ykhhc0V0YWdNZXNzYWdlOiBiSGFzRXRhZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0OiBtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0sXG5cdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IG9EaWFsb2cuaXNPcGVuKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlUGFnZU5hdmlnYXRpb25DYWxsYmFjazogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0Vycm9ySW5BUEQ6IHNob3dFcnJvckluQVBELFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNob3dNZXNzYWdlQm94OiBiU2hvd01lc3NhZ2VCb3hcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZyAmJiBiSGFzRXRhZ01lc3NhZ2UgJiYgb0RpYWxvZy5pc09wZW4oKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpOyAvL2Nsb3NlIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBhZnRlciByZWZyZXNoIG9mIHRoZSBjb250ZXh0IGFmdGVyIGV0YWcgbWlzbWF0Y2hcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJDYW5jZWxcIl0pLCB7XG5cdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0X3ZhbGlkYXRlTWVzc2FnZXMoYUFjdGlvblBhcmFtZXRlcnMsIGFGaWVsZEludmFsaWQsIHRydWUpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRyZWplY3QoQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0YmVmb3JlT3BlbjogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXRoID0gb0FjdGlvbkNvbnRleHQuc1BhdGggJiYgb0FjdGlvbkNvbnRleHQuc1BhdGguc3BsaXQoXCIvQFwiKVswXSxcblx0XHRcdFx0XHRcdFx0c0RlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0XHRcdGAke3NBY3Rpb25QYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNEZWZhdWx0VmFsdWVzRnVuY3Rpb247XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyA9IGFzeW5jIGZ1bmN0aW9uIChzQmluZGluZ1BhcmFtZXRlcj86IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0JvdW5kRnVuY3Rpb25OYW1lID0gZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gZnVuY3Rpb24gKHNQYXJhbU5hbWU6IGFueSwgdlBhcmFtRGVmYXVsdFZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIGZ1bmN0aW9uIChpblJlc29sdmUpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDYXNlIDE6IFRoZXJlIGlzIGEgUGFyYW1ldGVyRGVmYXVsdFZhbHVlIGFubm90YXRpb25cblx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtRGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMCAmJiB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdlBhcmFtVmFsdWUgPSBhd2FpdCBDb21tb25VdGlscy5yZXF1ZXN0U2luZ2xldG9uUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodlBhcmFtVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbVZhbHVlID0gYXdhaXQgb09wZXJhdGlvbkJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFByb3BlcnR5KHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIG11bHRpIHNlbGVjdCwgbmVlZCB0byBsb29wIG92ZXIgYUNvbnRleHRzIChhcyBjb250ZXh0cyBjYW5ub3QgYmUgcmV0cmlldmVkIHZpYSBiaW5kaW5nIHBhcmFtZXRlciBvZiB0aGUgb3BlcmF0aW9uIGJpbmRpbmcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc1BhdGhGb3JDb250ZXh0ID0gdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNQYXRoRm9yQ29udGV4dC5pbmRleE9mKGAke3NCaW5kaW5nUGFyYW1ldGVyfS9gKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzUGF0aEZvckNvbnRleHQgPSBzUGF0aEZvckNvbnRleHQucmVwbGFjZShgJHtzQmluZGluZ1BhcmFtZXRlcn0vYCwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzW2ldLmdldFByb3BlcnR5KHNQYXRoRm9yQ29udGV4dCkgIT09IHZQYXJhbVZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250ZXh0cyBhcmUgbm90IGFsbCB0aGUgc2FtZSwgZG8gbm90IHByZWZpbGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJOb1Bvc3NpYmxlVmFsdWU6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJlc29sdmUoeyBwYXJhbU5hbWU6IHNQYXJhbU5hbWUsIHZhbHVlOiB2UGFyYW1WYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVhZGluZyBkZWZhdWx0IGFjdGlvbiBwYXJhbWV0ZXJcIiwgc1BhcmFtTmFtZSwgbVBhcmFtZXRlcnMuYWN0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTGF0ZVByb3BlcnR5RXJyb3I6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxLjI6IFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBkZWZpbmVzIGEgZml4ZWQgc3RyaW5nIHZhbHVlIChpLmUuIHZQYXJhbURlZmF1bHRWYWx1ZSA9ICdzb21lU3RyaW5nJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdlBhcmFtRGVmYXVsdFZhbHVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob1BhcmFtZXRlck1vZGVsICYmIChvUGFyYW1ldGVyTW9kZWwgYXMgYW55KS5vRGF0YVtzUGFyYW1OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAyOiBUaGVyZSBpcyBubyBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgYW5ub3RhdGlvbiAoPT4gbG9vayBpbnRvIHRoZSBGTFAgVXNlciBEZWZhdWx0cylcblxuXHRcdFx0XHRcdFx0XHRcdFx0aW5SZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogKG9QYXJhbWV0ZXJNb2RlbCBhcyBhbnkpLm9EYXRhW3NQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5SZXNvbHZlKHsgcGFyYW1OYW1lOiBzUGFyYW1OYW1lLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBnZXRQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbiAoc1BhcmFtTmFtZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhcmFtZXRlckFubm90YXRpb25QYXRoID0gQ29tbW9uVXRpbHMuZ2V0UGFyYW1ldGVyUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCksIHNQYXJhbU5hbWUpICsgXCJAXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0FjdGlvblBhcmFtZXRlckFubm90YXRpb25QYXRoKSxcblx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyRGVmYXVsdFZhbHVlID1cblx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJBbm5vdGF0aW9ucyAmJiBvUGFyYW1ldGVyQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUGFyYW1ldGVyRGVmYXVsdFZhbHVlXCJdOyAvLyBlaXRoZXIgeyAkUGF0aDogJ3NvbWVQYXRoJyB9IG9yICdzb21lU3RyaW5nJ1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGNvbnN0IGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUgPSBbXTtcblx0XHRcdFx0XHRcdGxldCBzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFBY3Rpb25QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0dlBhcmFtZXRlckRlZmF1bHRWYWx1ZSA9IGdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZShzUGFyYW1OYW1lKTtcblx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZS5wdXNoKHByZWZpbGxQYXJhbWV0ZXIoc1BhcmFtTmFtZSwgdlBhcmFtZXRlckRlZmF1bHRWYWx1ZSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgJiYgYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNCb3VuZEZ1bmN0aW9uTmFtZSAmJiBzQm91bmRGdW5jdGlvbk5hbWUubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc0JvdW5kRnVuY3Rpb25OYW1lID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpIGluIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zLnB1c2goY2FsbEJvdW5kRnVuY3Rpb24oc0JvdW5kRnVuY3Rpb25OYW1lLCBhQ29udGV4dHNbaV0sIG1QYXJhbWV0ZXJzLm1vZGVsKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGFQcmVmaWxsUGFyYW1Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUpO1xuXHRcdFx0XHRcdFx0bGV0IGFFeGVjRnVuY3Rpb25Qcm9taXNlczogUHJvbWlzZTxhbnlbXT4gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdFx0XHRcdFx0bGV0IG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlO1xuXHRcdFx0XHRcdFx0aWYgKGFGdW5jdGlvblBhcmFtcyAmJiBhRnVuY3Rpb25QYXJhbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRhRXhlY0Z1bmN0aW9uUHJvbWlzZXMgPSBQcm9taXNlLmFsbChhRnVuY3Rpb25QYXJhbXMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzTW9kdWxlID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHQuc3Vic3RyaW5nKDAsIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24ubGFzdEluZGV4T2YoXCIuXCIpICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZSA9IEZQTUhlbHBlci5hY3Rpb25XcmFwcGVyKG9DbG9uZUV2ZW50LCBzTW9kdWxlLCBzRnVuY3Rpb25OYW1lLCB7XG5cdFx0XHRcdFx0XHRcdFx0XCJjb250ZXh0c1wiOiBhQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdFx0XHRcdFx0XHRhUHJlZmlsbFBhcmFtUHJvbWlzZXMsXG5cdFx0XHRcdFx0XHRcdFx0YUV4ZWNGdW5jdGlvblByb21pc2VzLFxuXHRcdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlXG5cdFx0XHRcdFx0XHRcdF0pO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWU6IGFueSA9IGFQcm9taXNlc1swXTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnVuY3Rpb25QYXJhbXMgPSBhUHJvbWlzZXNbMV07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdCA9IGFQcm9taXNlc1syXTtcblx0XHRcdFx0XHRcdFx0bGV0IHNEaWFsb2dQYXJhbU5hbWU7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdHNEaWFsb2dQYXJhbU5hbWUgPSBhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAob0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ICYmIG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eShzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0W3NEaWFsb2dQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldICYmIGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsIGN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBoYWQgbm90IGJlZW4gcHJldmlvdXNseSBkZXRlcm1pbmVkIGR1ZSB0byBkaWZmZXJlbnQgY29udGV4dHMsIHdlIGRvIG5vdGhpbmcgZWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmICFjdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0uYk5vUG9zc2libGVWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHdlIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNhbWUgcGFyYW0gdmFsdWUgZm9yIGFsbCB0aGUgY29udGV4dHM6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGogPCBhQ29udGV4dHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqICsgMV0gJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uUGFyYW1zW2pdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbaiArIDFdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aisrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9wYXJhbSB2YWx1ZXMgYXJlIGFsbCB0aGUgc2FtZTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT09IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZ1bmN0aW9uUGFyYW1zWzBdICYmIGZ1bmN0aW9uUGFyYW1zWzBdLmdldE9iamVjdChzRGlhbG9nUGFyYW1OYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL09ubHkgb25lIGNvbnRleHQsIHRoZW4gdGhlIGRlZmF1bHQgcGFyYW0gdmFsdWVzIGFyZSB0byBiZSB2ZXJpZmllZCBmcm9tIHRoZSBmdW5jdGlvbjpcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25QYXJhbXNbMF0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJFcnJvckZvdW5kID0gY3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVmFsdWUuYkxhdGVQcm9wZXJ0eUVycm9yO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdC8vIElmIGF0IGxlYXN0IG9uZSBEZWZhdWx0IFByb3BlcnR5IGlzIGEgTGF0ZSBQcm9wZXJ0eSBhbmQgYW4gZVRhZyBlcnJvciB3YXMgcmFpc2VkLlxuXHRcdFx0XHRcdFx0XHRpZiAoYkVycm9yRm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfTEFURV9QUk9QRVJUWVwiLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhzVGV4dCwgeyBjb250ZW50V2lkdGg6IFwiMjVlbVwiIH0gYXMgYW55KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGFyYW1ldGVyXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmbkFzeW5jQmVmb3JlT3BlbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRQYXJhbWV0ZXJcIik7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gYVBhcmFtZXRlcnNbMF0gJiYgYVBhcmFtZXRlcnNbMF0uJE5hbWU7XG5cblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dE9iamVjdCA9IGF3YWl0IGFDb250ZXh0c1swXS5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoc0JpbmRpbmdQYXJhbWV0ZXIsIG9Db250ZXh0T2JqZWN0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Zm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2coc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhcmFtZXRlclwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRmbkFzeW5jQmVmb3JlT3BlbigpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRhRm9ybUVsZW1lbnRzID0gKG9EaWFsb2dDb250ZW50IGFzIGFueSlcblx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybVwiKVxuXHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtQ29udGFpbmVyc1wiKVswXVxuXHRcdFx0XHQuZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCkub01vZGVsKTtcblx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob1BhcmFtZXRlck1vZGVsLCBcInBhcmFtc01vZGVsXCIpO1xuXHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHRtb2RlbDogXCJwYXJhbXNNb2RlbFwiXG5cdFx0XHR9KTtcblx0XHRcdC8vIGVtcHR5IG1vZGVsIHRvIGFkZCBlbGVtZW50cyBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIE1WRiBmaWVsZHMgZGVmaW5lZCBvbiB0aGUgZGlhbG9nXG5cdFx0XHRjb25zdCBvTVZGTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRcdG9EaWFsb2cuc2V0TW9kZWwob01WRk1vZGVsLCBcIm12ZnZpZXdcIik7XG5cblx0XHRcdGxldCBzQWN0aW9uUGF0aCA9IGAke3NBY3Rpb25OYW1lfSguLi4pYDtcblx0XHRcdGlmICghYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRzQWN0aW9uUGF0aCA9IGAvJHtzQWN0aW9uUGF0aH1gO1xuXHRcdFx0fVxuXHRcdFx0b0RpYWxvZy5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdHBhdGg6IHNBY3Rpb25QYXRoXG5cdFx0XHR9KTtcblx0XHRcdGlmIChvUGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBpcyBhIHBhcmVudCBjb250cm9sIHNwZWNpZmllZCBhZGQgdGhlIGRpYWxvZyBhcyBkZXBlbmRlbnRcblx0XHRcdFx0b1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQoYUNvbnRleHRzWzBdKTsgLy8gdXNlIGNvbnRleHQgb2YgZmlyc3Qgc2VsZWN0ZWQgbGluZSBpdGVtXG5cdFx0XHR9XG5cdFx0XHRvT3BlcmF0aW9uQmluZGluZyA9IG9EaWFsb2cuZ2V0T2JqZWN0QmluZGluZygpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fSk7XG59XG5mdW5jdGlvbiBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb246IGFueSkge1xuXHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdGlmIChvQWN0aW9uLmdldE9iamVjdChcIiRJc0JvdW5kXCIpKSB7XG5cdFx0XHQvL2luIGNhc2Ugb2YgYm91bmQgYWN0aW9ucywgaWdub3JlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIGNvbnNpZGVyIHRoZSByZXN0XG5cdFx0XHRyZXR1cm4gYVBhcmFtZXRlcnMuc2xpY2UoMSwgYVBhcmFtZXRlcnMubGVuZ3RoKSB8fCBbXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFQYXJhbWV0ZXJzO1xufVxuZnVuY3Rpb24gZ2V0SXNBY3Rpb25Dcml0aWNhbChvTWV0YU1vZGVsOiBhbnksIHNQYXRoOiBhbnksIGNvbnRleHRzPzogYW55LCBvQm91bmRBY3Rpb24/OiBhbnkpIHtcblx0Y29uc3QgdkFjdGlvbkNyaXRpY2FsID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0FjdGlvbkNyaXRpY2FsYCk7XG5cdGxldCBzQ3JpdGljYWxQYXRoID0gdkFjdGlvbkNyaXRpY2FsICYmIHZBY3Rpb25Dcml0aWNhbC4kUGF0aDtcblx0aWYgKCFzQ3JpdGljYWxQYXRoKSB7XG5cdFx0Ly8gdGhlIHN0YXRpYyB2YWx1ZSBzY2VuYXJpbyBmb3IgaXNBY3Rpb25Dcml0aWNhbFxuXHRcdHJldHVybiAhIXZBY3Rpb25Dcml0aWNhbDtcblx0fVxuXHRjb25zdCBhQmluZGluZ1BhcmFtcyA9IG9Cb3VuZEFjdGlvbiAmJiBvQm91bmRBY3Rpb24uZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKSxcblx0XHRhUGF0aHMgPSBzQ3JpdGljYWxQYXRoICYmIHNDcml0aWNhbFBhdGguc3BsaXQoXCIvXCIpLFxuXHRcdGJDb25kaXRpb24gPVxuXHRcdFx0YUJpbmRpbmdQYXJhbXMgJiYgYUJpbmRpbmdQYXJhbXMubGVuZ3RoICYmIHR5cGVvZiBhQmluZGluZ1BhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiBzQ3JpdGljYWxQYXRoICYmIGNvbnRleHRzICYmIGNvbnRleHRzLmxlbmd0aDtcblx0aWYgKGJDb25kaXRpb24pIHtcblx0XHQvL2luIGNhc2UgYmluZGluZyBwYXRhbWV0ZXJzIGFyZSB0aGVyZSBpbiBwYXRoIG5lZWQgdG8gcmVtb3ZlIGVnOiAtIF9pdC9pc1ZlcmlmaWVkID0+IG5lZWQgdG8gcmVtb3ZlIF9pdCBhbmQgdGhlIHBhdGggc2hvdWxkIGJlIGlzVmVyaWZpZWRcblx0XHRhQmluZGluZ1BhcmFtcy5maWx0ZXIoZnVuY3Rpb24gKG9QYXJhbXM6IGFueSkge1xuXHRcdFx0Y29uc3QgaW5kZXggPSBhUGF0aHMgJiYgYVBhdGhzLmluZGV4T2Yob1BhcmFtcy4kTmFtZSk7XG5cdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRhUGF0aHMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRzQ3JpdGljYWxQYXRoID0gYVBhdGhzLmpvaW4oXCIvXCIpO1xuXHRcdHJldHVybiBjb250ZXh0c1swXS5nZXRPYmplY3Qoc0NyaXRpY2FsUGF0aCk7XG5cdH0gZWxzZSBpZiAoc0NyaXRpY2FsUGF0aCkge1xuXHRcdC8vaWYgc2NlbmFyaW8gaXMgcGF0aCBiYXNlZCByZXR1cm4gdGhlIHBhdGggdmFsdWVcblx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0T2JqZWN0KHNDcml0aWNhbFBhdGgpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lKG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUsIHNBY3Rpb25MYWJlbDogc3RyaW5nLCBzQWN0aW9uTmFtZTogc3RyaW5nLCBzRW50aXR5U2V0TmFtZTogc3RyaW5nKSB7XG5cdGxldCBib3VuZEFjdGlvbk5hbWU6IGFueSA9IHNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBudWxsO1xuXHRjb25zdCBhQWN0aW9uTmFtZSA9IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIik7XG5cdGJvdW5kQWN0aW9uTmFtZSA9IGJvdW5kQWN0aW9uTmFtZS5pbmRleE9mKFwiLlwiKSA+PSAwID8gYUFjdGlvbk5hbWVbYUFjdGlvbk5hbWUubGVuZ3RoIC0gMV0gOiBib3VuZEFjdGlvbk5hbWU7XG5cdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIHNFbnRpdHlTZXROYW1lID8gYCR7c0VudGl0eVNldE5hbWV9fCR7Ym91bmRBY3Rpb25OYW1lfWAgOiBcIlwiO1xuXHRjb25zdCBzS2V5ID0gXCJBQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19BQ1RJT05fTkFNRVwiO1xuXHRjb25zdCBiUmVzb3VyY2VLZXlFeGlzdHMgPVxuXHRcdG9SZXNvdXJjZUJ1bmRsZSAmJiBDb21tb25VdGlscy5jaGVja0lmUmVzb3VyY2VLZXlFeGlzdHMoKG9SZXNvdXJjZUJ1bmRsZSBhcyBhbnkpLmFDdXN0b21CdW5kbGVzLCBgJHtzS2V5fXwke3N1ZmZpeFJlc291cmNlS2V5fWApO1xuXHRpZiAoc0FjdGlvbkxhYmVsKSB7XG5cdFx0aWYgKGJSZXNvdXJjZUtleUV4aXN0cykge1xuXHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KHNLZXksIG9SZXNvdXJjZUJ1bmRsZSwgbnVsbCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUgJiZcblx0XHRcdENvbW1vblV0aWxzLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cygob1Jlc291cmNlQnVuZGxlIGFzIGFueSkuYUN1c3RvbUJ1bmRsZXMsIGAke3NLZXl9fCR7c0VudGl0eVNldE5hbWV9YClcblx0XHQpIHtcblx0XHRcdHJldHVybiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChzS2V5LCBvUmVzb3VyY2VCdW5kbGUsIG51bGwsIGAke3NFbnRpdHlTZXROYW1lfWApO1xuXHRcdH0gZWxzZSBpZiAob1Jlc291cmNlQnVuZGxlICYmIENvbW1vblV0aWxzLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cygob1Jlc291cmNlQnVuZGxlIGFzIGFueSkuYUN1c3RvbUJ1bmRsZXMsIGAke3NLZXl9YCkpIHtcblx0XHRcdHJldHVybiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChzS2V5LCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gc0FjdGlvbkxhYmVsO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfT0tcIiwgb1Jlc291cmNlQnVuZGxlKTtcblx0fVxufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVwZW5kaW5nT25TZWxlY3RlZENvbnRleHRzKFxuXHRvQWN0aW9uOiBhbnksXG5cdG1QYXJhbWV0ZXJzOiBhbnksXG5cdGJHZXRCb3VuZENvbnRleHQ6IGJvb2xlYW4sXG5cdHNHcm91cElkOiBzdHJpbmcsXG5cdG9SZXNvdXJjZUJ1bmRsZTogYW55XG4pIHtcblx0bGV0IG9BY3Rpb25Qcm9taXNlLFxuXHRcdGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IHRydWU7XG5cdGlmIChiR2V0Qm91bmRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQWN0aW9uLmdldEJvdW5kQ29udGV4dCgpLmdldFBhdGgoKTtcblx0XHRjb25zdCBzTWV0YVBhdGggPSBvQWN0aW9uLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9BY3Rpb24uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3Qoc01ldGFQYXRoKTtcblx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eVswXT8uJGtpbmQgIT09IFwiQWN0aW9uXCIpIHtcblx0XHRcdC8vZG8gbm90IGVuYWJsZSB0aGUgc3RyaWN0IGhhbmRsaW5nIGlmIGl0cyBub3QgYW4gYWN0aW9uXG5cdFx0XHRiRW5hYmxlU3RyaWN0SGFuZGxpbmcgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoXG5cdFx0KG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA+IDEpIHx8XG5cdFx0IWJFbmFibGVTdHJpY3RIYW5kbGluZ1xuXHQpIHtcblx0XHRvQWN0aW9uUHJvbWlzZSA9IGJHZXRCb3VuZENvbnRleHRcblx0XHRcdD8gb0FjdGlvbi5leGVjdXRlKHNHcm91cElkKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdCAgfSlcblx0XHRcdDogb0FjdGlvbi5leGVjdXRlKHNHcm91cElkKTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uUHJvbWlzZSA9IGJHZXRCb3VuZENvbnRleHRcblx0XHRcdD8gb0FjdGlvblxuXHRcdFx0XHRcdC5leGVjdXRlKFxuXHRcdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChvcGVyYXRpb25zLCBzR3JvdXBJZCwgbVBhcmFtZXRlcnMsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdDogb0FjdGlvbi5leGVjdXRlKFxuXHRcdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChvcGVyYXRpb25zLCBzR3JvdXBJZCwgbVBhcmFtZXRlcnMsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdCAgKTtcblx0fVxuXG5cdHJldHVybiBvQWN0aW9uUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlQWN0aW9uKG9BcHBDb21wb25lbnQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgb1BhcmVudENvbnRyb2w/OiBhbnkpIHtcblx0Y29uc3QgYUNvbnRleHRzID0gbVBhcmFtZXRlcnMuYUNvbnRleHRzIHx8IFtdO1xuXHRjb25zdCBvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0Y29uc3QgaUV4aXN0aW5nTWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKS5sZW5ndGggfHwgMDtcblx0Y29uc3QgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycyB8fCBbXTtcblx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBtUGFyYW1ldGVycy5hY3Rpb25OYW1lO1xuXHRjb25zdCBmbk9uU3VibWl0dGVkID0gbVBhcmFtZXRlcnMuZm5PblN1Ym1pdHRlZDtcblx0Y29uc3QgZm5PblJlc3BvbnNlID0gbVBhcmFtZXRlcnMuZm5PblJlc3BvbnNlO1xuXHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IG9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5jb3JlLm12Yy5WaWV3XCIpICYmIG9QYXJlbnRDb250cm9sLmdldENvbnRyb2xsZXIoKS5vUmVzb3VyY2VCdW5kbGU7XG5cdGxldCBvQWN0aW9uOiBhbnk7XG5cdC8vIGxldCBjb250ZXh0SW5kZXggPSAwO1xuXHQvLyBsZXQgYU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXG5cdGZ1bmN0aW9uIGZuRGlmZmVyZW50aWF0ZShwcm9taXNlOiBhbnkpIHtcblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKFxuXHRcdFx0ZnVuY3Rpb24gKHJlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0bGV0IGFNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpO1xuXHRcdFx0XHRhTWVzc2FnZXMgPSBhTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0XHRcdC8vIEFjdGlvbiBEaWFsb2cgbXVzdCByZW1haW4gb3BlbiBpZiB0aGVyZSBhcmUgcmVzcG9uc2UgZXJyb3ItbWVzc2FnZXMsIGJlY2F1c2UgaW4gdGhlIGphdmEgc3RhY2sgdGhlIGRpYWxvZyB3b3VsZCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkuXG5cdFx0XHRcdGlmIChhTWVzc2FnZXMubGVuZ3RoID4gaUV4aXN0aW5nTWVzc2FnZXMgJiYgYU1lc3NhZ2VzW2FNZXNzYWdlcy5sZW5ndGggLSAxXS50eXBlID09PSBcIkVycm9yXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZWplY3RlZFwiIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlLCBzdGF0dXM6IFwicmVzb2x2ZWRcIiB9O1xuXHRcdFx0fSxcblx0XHRcdGZ1bmN0aW9uIChyZXNwb25zZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCkge1xuXHRcdGlmIChhQWN0aW9uUGFyYW1ldGVycyAmJiBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGgpIHtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKCFhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoYUFjdGlvblBhcmFtZXRlcnNbal0uJFR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uU3RyaW5nXCI6XG5cdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MTZcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdC8vIHRiY1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG9BY3Rpb24uc2V0UGFyYW1ldGVyKGFBY3Rpb25QYXJhbWV0ZXJzW2pdLiROYW1lLCBhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycztcblx0XHRcdGNvbnN0IGJHcm91cGVkID0gbVBhcmFtZXRlcnMuYkdyb3VwZWQ7XG5cdFx0XHRjb25zdCBiUmV0dXJuQXNBcnJheSA9IG1QYXJhbWV0ZXJzLmJSZXR1cm5Bc0FycmF5O1xuXHRcdFx0Y29uc3QgYkdldEJvdW5kQ29udGV4dCA9IG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQ7XG5cdFx0XHRjb25zdCBhQWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgb0FjdGlvblByb21pc2U7XG5cdFx0XHRsZXQgaTtcblx0XHRcdGxldCBzR3JvdXBJZDogc3RyaW5nO1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlQWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbkNvbnRleHQ6IGFueSwgaW5kZXg6IGFueSwgb1NpZGVFZmZlY3Q6IGFueSkge1xuXHRcdFx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiIG5lZWQgYmF0Y2ggZ3JvdXAgcGVyIGFjdGlvbiBjYWxsXG5cdFx0XHRcdHNHcm91cElkID0gIWJHcm91cGVkID8gYCRhdXRvLiR7aW5kZXh9YCA6IGFjdGlvbkNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBmblJlcXVlc3RTaWRlRWZmZWN0cy5iaW5kKG9wZXJhdGlvbnMsIG9BcHBDb21wb25lbnQsIG9TaWRlRWZmZWN0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhcblx0XHRcdFx0XHRhY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFBY3Rpb25Qcm9taXNlcy5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgb1NpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZm5FeGVjdXRlU2luZ2xlQWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbkNvbnRleHQ6IGFueSwgaW5kZXg6IGFueSwgb1NpZGVFZmZlY3Q6IGFueSkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKGFjdGlvblJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBhTG9jYWxQcm9taXNlOiBhbnkgPSBbXTtcblx0XHRcdFx0XHRzZXRBY3Rpb25QYXJhbWV0ZXJEZWZhdWx0VmFsdWUoKTtcblx0XHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIgbmVlZCBiYXRjaCBncm91cCBwZXIgYWN0aW9uIGNhbGxcblx0XHRcdFx0XHRzR3JvdXBJZCA9IGBhcGlNb2RlJHtpbmRleH1gO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IGZuUmVxdWVzdFNpZGVFZmZlY3RzLmJpbmQoXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25zLFxuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdGFMb2NhbFByb21pc2Vcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gZXhlY3V0ZURlcGVuZGluZ09uU2VsZWN0ZWRDb250ZXh0cyhcblx0XHRcdFx0XHRcdGFjdGlvbkNvbnRleHQsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGJHZXRCb3VuZENvbnRleHQsXG5cdFx0XHRcdFx0XHRzR3JvdXBJZCxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0Zm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudCwgb1NpZGVFZmZlY3QsIG1QYXJhbWV0ZXJzLCBzR3JvdXBJZCwgYUxvY2FsUHJvbWlzZSk7XG5cdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0XHRQcm9taXNlLmFsbChhTG9jYWxQcm9taXNlKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uUmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhY3Rpb25SZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRmdW5jdGlvbiBmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoY29udGV4dHNUb0V4ZWN1dGU6IGFueSkge1xuXHRcdFx0XHQvLyBPbmUgYWN0aW9uIGFuZCBpdHMgc2lkZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBuZXh0IGFjdGlvbiBpcyBleGVjdXRlZFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0XHRcdGZ1bmN0aW9uIG5vb3AoKSB7XG5cdFx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpKGFBY3Rpb25Qcm9taXNlcyk7XG5cdFx0XHRcdGZ1bmN0aW9uIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dDogYW55LCBhY3Rpb25JbmRleDogYW55KSB7XG5cdFx0XHRcdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtzQWN0aW9uTmFtZX0oLi4uKWAsIGNvbnRleHQsIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0cmV0dXJuIGZuRXhlY3V0ZVNpbmdsZUFjdGlvbihvQWN0aW9uLCBhY3Rpb25JbmRleCwge1xuXHRcdFx0XHRcdFx0Y29udGV4dDogY29udGV4dCxcblx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgb0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0Y29udGV4dHNUb0V4ZWN1dGUuZm9yRWFjaChmdW5jdGlvbiAoY29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgaWQgPSArK2o7XG5cdFx0XHRcdFx0b0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlID0gb0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dCwgaWQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFiR3JvdXBlZCkge1xuXHRcdFx0XHQvLyBGb3IgaW52b2NhdGlvbiBncm91cGluZyBcImlzb2xhdGVkXCIsIGVuc3VyZSB0aGF0IGVhY2ggYWN0aW9uIGFuZCBtYXRjaGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gYXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIG5leHQgc2V0IGlzIHN1Ym1pdHRlZC4gV29ya2Fyb3VuZCB1bnRpbCBKU09OIGJhdGNoIGlzIGF2YWlsYWJsZS5cblx0XHRcdFx0Ly8gQWxsb3cgYWxzbyBmb3IgTGlzdCBSZXBvcnQuXG5cdFx0XHRcdGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoYCR7c0FjdGlvbk5hbWV9KC4uLilgLCBhQ29udGV4dHNbaV0sIG1CaW5kaW5nUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0Zm5FeGVjdXRlQWN0aW9uKG9BY3Rpb24sIGFDb250ZXh0cy5sZW5ndGggPD0gMSA/IG51bGwgOiBpLCB7XG5cdFx0XHRcdFx0XHRjb250ZXh0OiBhQ29udGV4dHNbaV0sXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChcblx0XHRcdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkoYUFjdGlvblByb21pc2VzKTtcblx0XHRcdFx0Zm5IYW5kbGVSZXN1bHRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGZuSGFuZGxlUmVzdWx0cygpIHtcblx0XHRcdFx0UHJvbWlzZS5hbGwoYUFjdGlvblByb21pc2VzLm1hcChmbkRpZmZlcmVudGlhdGUpKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVJlamVjdGVkSXRlbXMgPSBbXTtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZXNvbHZlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRsZXQgaVJlc3VsdENvdW50O1xuXHRcdFx0XHRcdFx0Zm9yIChpUmVzdWx0Q291bnQgPSAwOyBpUmVzdWx0Q291bnQgPCByZXN1bHRzLmxlbmd0aDsgaVJlc3VsdENvdW50KyspIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGFSZWplY3RlZEl0ZW1zLnB1c2gocmVzdWx0c1tpUmVzdWx0Q291bnRdLnJlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0c1tpUmVzdWx0Q291bnRdLnN0YXR1cyA9PT0gXCJyZXNvbHZlZFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZCB0aGUgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCBzbyB0aGF0IGNyZWF0ZSBuZXcgYWN0aW9uIGNhbiB3b3JrIGluIGJvdGggY2FzZXMgLSB3aXRoIGFuZCB3aXRob3V0IGRpYWxvZ1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVzZWQgZm9yIE5ld0FjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0c1tpUmVzdWx0Q291bnRdLmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXJlc3VsdHMgfHwgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhUmVqZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGJSZXR1cm5Bc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtcyk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY29udGV4dCBpcyBnaXZlbiBkaXJlY3RseSB3aXRob3V0IGFuIGFycmF5IHNvIGFsc28gbm8gYXJyYXkgaXMgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKGFSZXNvbHZlZEl0ZW1zWzBdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlZEl0ZW1zOiBhUmVzb2x2ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRyZWplY3RlZEl0ZW1zOiBhUmVqZWN0ZWRJdGVtc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0fVxuXHRcdH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvQWN0aW9uID0gb01vZGVsLmJpbmRDb250ZXh0KGAvJHtzQWN0aW9uTmFtZX0oLi4uKWApO1xuXHRcdHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJhY3Rpb25JbXBvcnRcIjtcblx0XHRjb25zdCBvQWN0aW9uUHJvbWlzZSA9IG9BY3Rpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQob3BlcmF0aW9ucywgc0dyb3VwSWQsIHsgbGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLCBtb2RlbDogb01vZGVsIH0sIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHQpO1xuXHRcdG9Nb2RlbC5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0Ly8gdHJpZ2dlciBvblN1Ym1pdHRlZCBcImV2ZW50XCJcblx0XHQoXG5cdFx0XHRmbk9uU3VibWl0dGVkIHx8XG5cdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHQvKiovXG5cdFx0XHR9XG5cdFx0KShvQWN0aW9uUHJvbWlzZSk7XG5cdFx0cmV0dXJuIG9BY3Rpb25Qcm9taXNlLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fVxufVxuZnVuY3Rpb24gX2dldFBhdGgob0FjdGlvbkNvbnRleHQ6IGFueSwgc0FjdGlvbk5hbWU6IGFueSkge1xuXHRsZXQgc1BhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCk7XG5cdHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgPyBzUGF0aC5zcGxpdChcIkAkdWk1Lm92ZXJsb2FkXCIpWzBdIDogc1BhdGguc3BsaXQoXCIvMFwiKVswXTtcblx0cmV0dXJuIHNQYXRoLnNwbGl0KGAvJHtzQWN0aW9uTmFtZX1gKVswXTtcbn1cblxuZnVuY3Rpb24gX3Nob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2coc2hvd0RpYWxvZzogYm9vbGVhbiwgYWN0aW9uUGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55PltdKTogYm9vbGVhbiB7XG5cdGlmIChzaG93RGlhbG9nIHx8IGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChcblx0XHRcdCFhY3Rpb25QYXJhbWV0ZXJzIHx8XG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCB8fFxuXHRcdFx0KGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAxICYmIGFjdGlvblBhcmFtZXRlcnNbMF0uJE5hbWUgPT09IFwiUmVzdWx0SXNBY3RpdmVFbnRpdHlcIilcblx0XHQpIHtcblx0XHRcdHNob3dEaWFsb2cgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc2hvd0RpYWxvZztcbn1cblxuZnVuY3Rpb24gZm5SZXF1ZXN0U2lkZUVmZmVjdHMob0FwcENvbXBvbmVudDogYW55LCBvU2lkZUVmZmVjdDogYW55LCBtUGFyYW1ldGVyczogYW55LCBzR3JvdXBJZDogYW55LCBhTG9jYWxQcm9taXNlPzogYW55KSB7XG5cdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRsZXQgb0xvY2FsUHJvbWlzZTtcblx0Ly8gdHJpZ2dlciBhY3Rpb25zIGZyb20gc2lkZSBlZmZlY3RzXG5cdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucyAmJiBvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzVHJpZ2dlckFjdGlvbjogYW55KSB7XG5cdFx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0b0xvY2FsUHJvbWlzZSA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRpZiAoYUxvY2FsUHJvbWlzZSkge1xuXHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8vIHJlcXVlc3Qgc2lkZSBlZmZlY3RzIGZvciB0aGlzIGFjdGlvblxuXHQvLyBhcyB3ZSBtb3ZlIHRoZSBtZXNzYWdlcyByZXF1ZXN0IHRvIFBPU1QgJHNlbGVjdCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBhbiBlbXB0eSBhcnJheVxuXHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0b0xvY2FsUHJvbWlzZSA9IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucywgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdGlmIChhTG9jYWxQcm9taXNlKSB7XG5cdFx0XHRhTG9jYWxQcm9taXNlLnB1c2gob0xvY2FsUHJvbWlzZSk7XG5cdFx0fVxuXHRcdG9Mb2NhbFByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCAmJiBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuc2VsZWN0ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU2LjBcbiAqL1xuY29uc3Qgb3BlcmF0aW9ucyA9IHtcblx0Y2FsbEJvdW5kQWN0aW9uOiBjYWxsQm91bmRBY3Rpb24sXG5cdGNhbGxBY3Rpb25JbXBvcnQ6IGNhbGxBY3Rpb25JbXBvcnQsXG5cdGNhbGxCb3VuZEZ1bmN0aW9uOiBjYWxsQm91bmRGdW5jdGlvbixcblx0Y2FsbEZ1bmN0aW9uSW1wb3J0OiBjYWxsRnVuY3Rpb25JbXBvcnQsXG5cdGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHM6IGV4ZWN1dGVEZXBlbmRpbmdPblNlbGVjdGVkQ29udGV4dHMsXG5cdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IF9zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nLFxuXHRnZXRBY3Rpb25QYXJhbWV0ZXJBY3Rpb25OYW1lOiBfZ2V0QWN0aW9uUGFyYW1ldGVyQWN0aW9uTmFtZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgb3BlcmF0aW9ucztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0lBQ0E7O0lBQ0QsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO01BQzFCLE9BQU9GLE1BQU0sQ0FB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
|